DM.ADO_HM.First;  //把“号码(HM)”表移动到第一条。
for i:=0 to DM.ADO_HM.RecordCount-1 do  //一个从“号码(HM)”表第一条记录到最后一条记录的循环。
    begin
      DM.ADO_HM.Edit;   //“号码(HM)”表进入编辑状态。
      if length(DBE_SJHM.Text)=11 then //判断“手机号码(SJHM)”是不是11位。
        begin
          a:=strtoint(copy(DM.ADO_HM.FieldValues['SJHM'],length(DBE_SJHM.Text)-3,1)); //把“手机号码(SJHM)”第1位赋值给变量a。
          b:=strtoint(copy(DM.ADO_HM.FieldValues['SJHM'],length(DBE_SJHM.Text)-2,1));//把“手机号码(SJHM)”第2位赋值给变量b。
          c:=strtoint(copy(DM.ADO_HM.FieldValues['SJHM'],length(DBE_SJHM.Text)-1,1));//把“手机号码(SJHM)”第3位赋值给变量c。
          d:=strtoint(copy(DM.ADO_HM.FieldValues['SJHM'],length(DBE_SJHM.Text),1));//把“手机号码(SJHM)”第4位赋值给变量d。
          if (c=d)and(c>5)and(d>5)and(a<>c)and(b<>d)and(a<>b) then       //“大双连”,例:7899,5266。
              DM.ADO_HM.FieldByName('TSHM').AsString:='大双连'
          else if (b=c)and(c=d)and(b>5)and(c>5)and(d>5)and(a<>b) then    //“大三连”,例:7999,5666。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='大三连' 
          else if (b=c)and(c=d)and(b<=5)and(c<=5)and(d<=5)and(a<>b) then //“小三连”,例:9222,4555。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='小三连'
          else if (a=b)and(b=c)and(c=d)and(a<=5) then                    //“小四连”,例:2222,5555。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='小四连'
          else if (a=b)and(b=c)and(c=d)and(a>5) then                     //“大四连”,例:6666,9999。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='大四连'
          else if (a=b)and(c=d)then                                      //“AABB”,例:1122,4499。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='AABB'
          else if (d-c=1)and(c-b=1)and(b-a=1) then                       //“ABCD”,例:0123,6789。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='ABCD'
          else if (a=b)and(b=c)then                                      //“AAAB”,例:1112,7779。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='AAAB'
          else if (a=d)and(b=c) then                                     //“ABBA”,例:1551,9779。
                  DM.ADO_HM.FieldByName('TSHM').AsString:='ABBA'
          else DM.ADO_HM.FieldByName('TSHM').AsString:='普通号码';        //什么都不属于则为普通号码。
        end
      else DM.ADO_HM.FieldByName('TSHM').AsString:='';                   //不到11位的赋值为空。
      if not DM.ADO_HF.FieldByName('SJHM').IsNull then//在“花费(HF)”表中查找该记录,若有则为开通。          
         DM.ADO_HM.FieldByName('SFYKT').AsString:='是'
      else
         DM.ADO_HM.FieldByName('SFYKT').AsString:='否';
      DM.ADO_HM.Post;    //提交修改。
      Dm.ADO_HM.Next;    //吓一条记录。
    end;
showmessage('数据校验完毕!');//提示用户校验完毕求SQL高手把这段代码转换为SQL语言,以上这段代码在1万条记录的时候效率让人忍受不了。分不多100,万分感谢!!

解决方案 »

  1.   

    注释有错误,更改如下:
    //把“手机号码(SJHM)”倒数第4位赋值给变量a。
    //把“手机号码(SJHM)”倒数第3位赋值给变量b。
    //把“手机号码(SJHM)”倒数第2位赋值给变量c。
    //把“手机号码(SJHM)”倒数第1位赋值给变量d。
      

  2.   

    1W条应该不会慢,估计是没有将感知组件去掉界面关联引起的。DM.ADO_HM.DisableControls;
    DM.ADO_HM.First;
    ....
    DM.ADO_HM.EnableControls;这样应该不会慢。至于SQL代码,估计大概是这样:设:
    1:表名是:HMTable
    2: HMTable.SJHM唯一,或关键字select a = 0, b = 0, c = 0, d = 0, SJHM_len = len(SJHM), SJHM into #Temp from HMTable
    update #Temp set 
    a = substring(SJHM, SJHMLen - 3, 1),
    b = substring(SJHM, SJHMLen - 2, 1),
    c = substring(SJHM, SJHMLen - 1, 1),
    d = substring(SJHM, SJHMLen, 1)update HMTable set HMTable.TSHM = '大双连' 
      from #Temp T
      where T.SJHM = HMTable.SJHM and (T.c=T.d) and (T.c>5) and(T.d>5)and(T.a<>c)and(T.b<>T.d)and(T.a<>T.b)
    其它类似大概是这样,好久没写SQL了,不知对不对。