SFZH=[141027197802163033]

*-- 判断身份证长度
IF LEN(SFZH)!=18
   MESSAGEBOX([身份证号码长度为 ]+TRANSFORM(LEN(SFZH))+[ ])
ENDIF

*-- 判断年
NYEAR=INT(VAL(SUBSTR(SFZH,7,4)))
IF NOT BETWEEN(NYEAR,1900,YEAR(DATE()))
   MESSAGEBOX([身份证  错误 ]+TRANSFORM(NYEAR)+[])
   RETURN NYEAR
ELSE
   *-- 判断月
   NMONTH=INT(VAL(SUBSTR(SFZH,11,2)))
   IF NOT BETWEEN(NMONTH,1,12)
      MESSAGEBOX([身份证  错误 ]+TRANSFORM(NMONTH)+[])
      RETURN NMONTH
   ELSE
      *-- 判断日
      NDAY=INT(VAL(SUBSTR(SFZH,13,2)))
      RQ=DATE(NYEAR,NMONTH,1)
      IF NOT BETWEEN(NDAY,1,GOMONTH(RQ,1)-RQ)
         MESSAGEBOX([身份证  错误 ]+TRANSFORM(NDAY)+[ 本月只有 ]+TRANSFORM(GOMONTH(RQ,1)-RQ)+[ ])
         RETURN NDAY
      ENDIF
   ENDIF
ENDIF

*-- 获取校验码
X=[7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2]
NUM=0
FOR I=1 TO 17
    NUM=NUM+INT(VAL(SUBSTR(SFZH,I,1)))*INT(VAL(GETWORDNUM(X,I,[ ])))
ENDFOR
*   Y值: 0 1 2 3 4 5 6 7 8 9 10
*校验码: 1 0 X 9 8 7 6 5 4 3 2
XYM=[1 0 X 9 8 7 6 5 4 3 2]
CXYM=GETWORDNUM(XYM,MOD(NUM,11)+1,[ ]) &&提取的第18位校验码
MESSAGEBOX([生成的第18位数字为【]+CXYM+[]+IIF(SUBSTR(SFZH,18,1)==CXYM,[与身份证相符],[与身份证不相符])+[]+SUBSTR(SFZH,18,1)+[])