我想针对下面的一个表进行操作,有2个问题,请各位大侠帮帮忙!
原来的表是这样的: 
              编号                性别    婚否      档案号    档案级别 
1556494565321651        男        是 
1556484565321651        男        是 
1556474565321651        女        否 
1556474565321651        女        是 
现在我需要实现这样的结果: 
          编号                    性别    婚否        档案号            档案级别 
1556494565321651        男        是        945-65-32              0 
1556484565321651        男        是        845-65-32              1 
1556474565321651        女        否        745-65-32              2 
1556474565321651        女        是        745-65-32              2 ------------------------------------------------------------------------------------
[举例] 
          编号                    性别    婚否        档案号            档案级别 
1556494565321651        男        是        945-65-32              0 [问题及说明] 
1、提取'编号'字段中第6位开始的连续7位数字(即9456532),并用短线隔开,来最为档案号;然后把结果写入'档案号'字段内。 
2、判断'编号'字段中第6位开始的连续3数字(即945),是否在一定范围内,然后确定级别,然后把结果写入'档案级别 '字段内。如我这样规定,945~1044范围内即为0,845~944为1,745~844为2,645~744为3,……; 我是一个菜鸟,所以需要各部分完整代码,谢谢啦!

解决方案 »

  1.   

    代码如下:var
      s,t1,t2,t3:string;
    begin
      with adoquery1 do
      begin
        first;
        while not eof do
        begin
          s:=copy(fieldbyname('编号').asstring,6,7);
          t1:=copy(s,1,3);
          t2:=copy(s,4,2);
          t3:=copy(s,6,2);
          append;
          edit;
          fieldbyname('档案号').asstring:=t1+'-'+t2+'-'+t3;
          if (strtoint(s)>=945) and (strtoint(s)<=1044) then fieldbyname('档案级别').value:=0
          else if (strtoint(s)>=845) and (strtoint(s)<=944) then fieldbyname('档案级别').value:=1
          else if (strtoint(s)>=745) and (strtoint(s)<=844) then fieldbyname('档案级别').value:=2
          else if (strtoint(s)>=645) and (strtoint(s)<=744) then fieldbyname('档案级别').value:=3;// 此处你自己再加
          post; 
        end;
        next;
      end; 
    end;
      

  2.   

    不好意思,代码中的那个“append;”多余了,你把它去掉吧,否则就出错了。另外,不管别人给你的代码是否正确,你在测试前,最好先把数据库文件另存一下,做个备份,以免错误的代码会把数据搞乱
      

  3.   

    比较简单的方法是直接用SQL语句处理。
    以SQL SERVER为例:update t
    set 档案号 = substring(编号,6,3) + '-' + substring(编号,9,2) + '-' + substring(编号,11,2)
    档案级别 = (CASE 
    WHEN substring(编号,6,3)>='945' AND substring(编号,6,3)<='999' THEN 0
    WHEN substring(编号,6,3)>='845' AND substring(编号,6,3)<='944' THEN 1
    WHEN substring(编号,6,3)>='745' AND substring(编号,6,3)<='844' THEN 2
    END)(三位字符怎么会有1044?)
      

  4.   

    来个总结吧,1楼,4楼的方法都可以,用sql的方法会快一些,在没有sql解决不了的情况下,还是用sql吧,用代码可能速度受影响(很可能要循环处理)
      

  5.   

    谢谢楼上各位高手的热心帮助,问题已经得到解决。
    我首先用了xinxinshou2009 (新新手)的方法,后又用了windindance(风舞轻扬·白首为功名)的方法,因为我的数据只有几千条,所以在速度上没什么区别。不过从这里我学到的远不止这个问题的答案本身,还有一些设计上的思路该如何做。
    这几天我整优秀党员材料来交去了,所以晚了些结贴,不好意思了。有你们的帮助,我没有理由停滞不前。我要向你们学习,以后我能帮助人的时候,一定热心去帮助人的。