首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

请高手慈悲,救小弟我.

2012-02-19 
请高手慈悲,救我.............aa.dbf中有两个字符型字段:xh和sfzh,表单的按钮中有如下验证函数:请问如何调

请高手慈悲,救我.............
aa.dbf中有两个字符型字段:xh和sfzh,表单的按钮中有如下验证函数:请问如何调用?添加什么代码?

FUNCTION sfzyn  
  LPARAMETERS lstr &&参数:lstr 传入的号码  
  LOCAL lstr,relyn,tsfz  
  LOCAL m1,m2,m3,m4,m,i,r,c,ai,wi  
  SET TALK OFF  
  SET DATE TO ANSI  
  SET CENT ON  
  relyn=.F. &&返回值  
  tsfz=ALLT(lstr)  
  *分别用m1,m2,m3,m4表示四个条件是否成立  
  STOR .T. TO m1,m2,m3,m4  
   
  *条件1:只能是15或18位  
  m1=IIF(LEN(tsfz)=15 OR LEN(tsfz)=18,.T.,.F.)  
  IF LEN(tsfz)=15 && 15位的号码  
  FOR i=1 TO 15 &&检查每一位是否为数字  
  m=ASC(SUBS(tsfz,i,1))  
  IF m<48 OR m>57 &&数字  
  m2=.F. &&若有一位不是就不再查  
  EXIT  
  ENDIF  
  ENDFOR  
  m="19" +SUBS(tsfz, 7,2) &&早期的号都是上个世纪的  
  m=m+"."+SUBS(tsfz, 9,2)  
  m=m+"."+SUBS(tsfz,11,2)  
  m=CTOD(m)  
  IF ISNULL(m) OR isblank(m)  
  m3=.F. &&生日不正确  
  ENDIF  
  ENDIF  
  IF LEN(tsfz)=18 && 18位的号码  
  FOR i=1 TO 17  
  m=ASC(SUBS(tsfz,i,1))  
  IF m<48 OR m>57  
  m2=.F.  
  EXIT  
  ENDIF  
  ENDFOR  
  m=SUBS(tsfz,7,4)  
  m=m+"."+SUBS(tsfz,11,2)  
  m=m+"."+SUBS(tsfz,13,2)  
  m=CTOD(m)  
  IF ISNULL(m) OR isblank(m)  
  m3=.F.  
  ENDIF  
  r=0 &&计算校验位  
  FOR i=18 TO 2 STEP -1  
  ai=VAL(SUBS(tsfz,19-i,1))  
  wi=MOD(2^(i-1),11)  
  r=r+ai*wi  
  NEXT  
  r=MOD(r,11)  
  DO CASE  
  CASE r=0  
  c="1"  
  CASE r=1  
  c="0"  
  CASE r=2  
  c="X"  
  OTHER  
  c=ALLTRIM(STR(12-r))  
  ENDCASE  
  IF UPPE(SUBS(tsfz,18,1))<>c  
  m4=.F. &&校验位与原码最末位不同  
  ENDIF  
  ENDIF  
  *四个条件全成立,则返回.t.  
  relyn=IIF(m1 AND m2 AND m3 AND m4,.T.,.F.)  
  RETU relyn  
ENDFUN  



[解决办法]

探讨
非常感谢两位大版主,但我初次接触,试了很长时间还弄不好,如果能详细些,将感激不尽!如果您忙的话,我随后慢慢试,再次感谢!

[解决办法]
你的表单方法已经会添加了吧,但要保留 RETU relyn,只去掉FUNCTION sfzyn 和 ENDFUN

然后你的 校验 按钮的 Click 事件代码:


VB code
lcFile=Getfile('DBF', '', '', 0, ' ...')If Empty(lcFile) &&判断是否选择了表文件    ReturnEndifUse (lcFile) In 0 Alias MyTable &&在最小空闲工作区打开选择的表文件,别名为 MyTableSelect MyTableCopy Structure To jg.Dbf &&生成空 jg.dbf,结构同选择的文件Scan &&循环表    If !Thisform.sfzyz(sfzh) &&判断 sfzh 是否合法,如果不合法插入到 jg.dbf 表中        Insert Into jg.Dbf (xh,sfzh) Values (MyTable->xh,MyTable->sfzh)    EndifEndscanClose Databases All &&关闭打开的所有表 

热点排行