我已经很久没有用Table1(以前用Query1)
现在用ADOQuery1(也不用ADOTable1)
你不是可以用SQL查询实现吗?
为什么要用索引呢?
是不是"a11"换成字符类型就可以了?

解决方案 »

  1.   

    好象问题很多嘛,你这个A11怎么是数值型,还有你这个程序是要做查询吧,为何不改用SQL呢,用ADO也行啊!
      

  2.   

    我主要想实现这种思路:字段A11数值型的是学生总成绩(xsk.db),其中有一字符型字段MC专门是存放总成绩名次用的,因为我要从xsk.db主表中提出一部分到数据到xsktem.db中(这个我可以实现),关键是这个名次不会加进去,因为还要考虑到总分相同的学生名次当然也要相同了,所以我必须对xsktem.db这个表先进行排序,后再用语句将名次加进MC中,不知道怎么做才好,请多指教!谢谢各位了!!!
      

  3.   

    那个字段建立索引了吗?TableName没有指定。
      

  4.   

    var
      R: Real;
      I: Integer;
    begin
    //Query1(select * from xsk order by a11)
    //QueryTemp(delete from xsktmp) (select * from xsktmp)
      I := 1;
      R := Query1('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp['MC'] := I;
        if Query1('a11').AsFloat <> R then Inc(I);
        R := Query1('a11').AsFloat;
        Query1.Next;
      end;
    end;
      

  5.   

    TableName已经指定了,再说明如下:有2个表,结构都是一样的,主表xsb.db,临时表xsbtem.db
    dm,mc字段是字符型的,a1是学生总成绩数值型的。
    其中:xsb.db中的数据是:
    dm    a1   mc
    001  570  
    002  450
    003  620
    004  460
    005  540
    006  570将xsb.db的数据复制到xsbtem.db中,数据如下:
    dm    a1   mc
    001  570  
    002  450
    003  620
    004  460
    005  540
    006  570而后在xsbtem.db中对mc(名次)字段进行操作,得到如下结果:
    dm    a1   mc
    001  570   2  
    002  450   5
    003  620   1
    004  460   4
    005  540   3
    006  570   2
    主要就是上面这步自动加入MC(名次)不会做,请高手再看看!
      

  6.   

    Query1.FieldByName('a11').AsFloat
    //    ~~~~~~~~~~~~
      

  7.   

    如果A11是整数请用 FieldByName().AsInteger
      

  8.   

    zswang(伴水)(伤心中)您好!我还有点不懂,比如说您语句中的query1和querytem是怎么建立起来的?
    其实主表xsk.db中有很多记录,只是需要将满足条件的记录复制到xsktem.db中,而后在xsktem.db中进行操作,并得到以mc(名次)排序后的结果如下,以便于打印输出。
    dm    a1  mc
    003  620  1
    001  570  2  
    006  570  2
    005  540  3
    004  460  4
    002  450  5
      

  9.   

    你在窗体上放两个Query(Query1,QueryTemp<要可以写>)
    select * from xsk.db where <还可以加条件呀> order by a11
      

  10.   

    看过了,还不怎么懂,我再试试,谢谢您的帮助,我以前一直用的VFP。
    如果使用vfp就可以轻松的实现
    CLEAR
    use xsk
    sort on a1 to xsktem for ......
    use xsktem
    i=1
    do while not eof()
     xy=a1
      do while a1=xy
       repl a1 with str(i)
       skip
      enddo
     i=i+1
    enddo
    我刚接触delphi,还请各位高手多帮助。
      

  11.   

    var
      R: Real;
      I: Integer;
      vFieldNames: string;
    begin
      QueryTemp.RequestLive := True;
      QueryTemp.SQL.Text := 'SELECT * FROM czbtem';
      QueryTemp.Open;  Query1.SQL.Text := 'SELECT * FROM tem ORDER BY a11';
      Query1.Open;  vFieldNames := StringReplace(Tirm(Query1.FieldList.Text), #13#10, ';', [rfReplaceAll]);  I := 1;
      R := Query1('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp.Append;
        QueryTemp[vFieldNames ] := Query1[vFieldNames ];
        QueryTemp['MC'] := I;
        QueryTemp.Post;
        if Query1.FieldByName('a11').AsFloat <> R then Inc(I);
        R := Query1.FieldByName('a11').AsFloat;
        Query1.Next;
      end;
    end;
      

  12.   

    回复人: zswang(伴水)(伤心中)您好!
    请问Query1.SQL.Text := 'SELECT * FROM tem ORDER BY a11';这语句中的“tem”不知道是那个表?我只有主表czb.db和临时表czbtem.db两个表,当然czbtem.db表中已经存在了从czb.db表中按条件复制过来的数据了。我语句如下,第一次运行时数据代不进去,再按一次按钮时就能代进去了,但还有空的在里面。
    语句如下:
    procedure TForm1.Button4Click(Sender: TObject);
    var
      R: Real;
      I: Integer;
      vFieldNames: string;
    begin
      QueryTemp.RequestLive := True;
      QueryTemp.SQL.Text := 'SELECT * FROM czbtem';
      QueryTemp.Open;  Query1.SQL.Text := 'SELECT * FROM czbtem ORDER BY a11';
      Query1.Open;  vFieldNames := StringReplace(Trim(Query1.FieldList.Text), #13#10, ';', [rfReplaceAll]);  I := 1;
      R :=Query1.FieldByName('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp.Append;
        QueryTemp[vFieldNames ] := Query1[vFieldNames ];
        QueryTemp['MC'] := I;
        QueryTemp.Post;
        if Query1.FieldByName('a11').AsFloat <> R then Inc(I);
        R := Query1.FieldByName('a11').AsFloat;
        Query1.Next;
      end;
    end;
      

  13.   

    begin
      Query1.Close;
      QueryTemp.RequestLive := True;
      QueryTemp.SQL.Text := 'DELETE FROM czbtem';
      QueryTemp.ExecSQL;
      QueryTemp.SQL.Text := 'SELECT * FROM czbtem';
      QueryTemp.Open;
      //....
      Query1.Close;
      Query1.SQL.Text := 'SELECT * FROM czbtem ORDER BY a11';
      Query1.Open
      //....
    end;//你看csb有没有空记录?
    //有的话清掉
      

  14.   

    下一句运行是正常的
    Query1.SQL.Text := 'SELECT * FROM czb ORDER BY a11';而下面这句加上条件后就出借了,我想将czb.db中的满足datea(字符型)为“199912”的数据进行排序后加入到query1的SQL中,怎么就是不行呢。
    Query1.SQL.Text := 'SELECT * FROM czb ORDER BY a11 where datea="199912"';
      

  15.   

    zswang(伴水)(伤心中)您好!按照您的方法,我基本实现了,只是还有个小小的问题,就是得出的结果如下:
       A11    MC
    6335.00  164
    3292.80  165
    6000.88  166
    6000.00  167
    6000.00  168 //这行的MC也应该是167
    6000.00  168 //这行的MC也应该是167
    5867.84  168 //这行的MC才是168 
    5815.78  169
    请问您上面的问题应该怎么解决,我的语句如下:
    procedure TForm1.Button4Click(Sender: TObject);
    var
      R: Real;
      I: Integer;
      vFieldNames: string;
    begin
      QueryTemp.RequestLive := True;
      Querytemp.Close;
      querytemp.sql.clear;
      QueryTemp.SQL.add('DELETE FROM czbtem');
      QueryTemp.ExecSQL;
      querytemp.close;
      querytemp.sql.clear;
      QueryTemp.SQL.add('SELECT * FROM czbtem');
      QueryTemp.Open;  query1.Close;
      query1.sql.Clear;
      query1.sql.add('SELECT * FROM czb where datea=''199912''  ORDER BY a11 desc');
      query1.open;  vFieldNames := StringReplace(Trim(Query1.FieldList.Text), #13#10, ';', [rfReplaceAll]);  I := 1;
      R :=Query1.FieldByName('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp.Append;
        QueryTemp[vFieldNames ] := Query1[vFieldNames ];
        QueryTemp['MC'] := I;
        QueryTemp.Post;
        if Query1.FieldByName('a11').AsFloat <> R then Inc(I);
        R := Query1.FieldByName('a11').AsFloat;
        Query1.Next;
      end;
      query1.open;
    end;
      

  16.   

    zswang(伴水)(伤心中)您好!按照您的方法,我基本实现了,只是还有个小小的问题,就是得出的结果如下:
       A11    MC
    6335.00  164
    3292.80  165
    6000.88  166
    6000.00  167
    6000.00  168 //这行的MC也应该是167
    6000.00  168 //这行的MC也应该是167
    5867.84  168 //这行的MC才是168 
    5815.78  169
    请问您上面的问题应该怎么解决,我的语句如下:
    procedure TForm1.Button4Click(Sender: TObject);
    var
      R: Real;
      I: Integer;
      vFieldNames: string;
    begin
      QueryTemp.RequestLive := True;
      Querytemp.Close;
      querytemp.sql.clear;
      QueryTemp.SQL.add('DELETE FROM czbtem');
      QueryTemp.ExecSQL;
      querytemp.close;
      querytemp.sql.clear;
      QueryTemp.SQL.add('SELECT * FROM czbtem');
      QueryTemp.Open;  query1.Close;
      query1.sql.Clear;
      query1.sql.add('SELECT * FROM czb where datea=''199912''  ORDER BY a11 desc');
      query1.open;  vFieldNames := StringReplace(Trim(Query1.FieldList.Text), #13#10, ';', [rfReplaceAll]);  I := 1;
      R :=Query1.FieldByName('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp.Append;
        QueryTemp[vFieldNames ] := Query1[vFieldNames ];
        QueryTemp['MC'] := I;
        QueryTemp.Post;
        if Query1.FieldByName('a11').AsFloat <> R then Inc(I);
        R := Query1.FieldByName('a11').AsFloat;
        Query1.Next;
      end;
      query1.open;
    end;
      

  17.   

    这是浮点数的问题//我也经常碰到//if 1.00 = 1.00 then { 不执行!}
    你可以用Trunc {or} Round换成解决
    if Trunc(Query1.FieldByName('a11').AsFloat * 100) <> Trunc(R * 100) then Inc(I);
    // ~~~~~~
    6000.00  167
    6000.00  168 //这行的MC也应该是167
    if 6000.00 <> 6000.00 then { 执行了! }
      

  18.   

    zswang(伴水)(伤心中)您好!按您的语句好好象还没有变化,如果如下:
     A11   MC
    253.49  288
    196.20  289
    196.20  290
    178.98  290
    150.00  291
    150.00  292
    150.00  292
      0.00  292
      0.00  293
    我看出有一个规律:比如上面结果是196.20第2次出现时还应该是289名,可出现的是290名,总觉得当数值相同时第一次出现的名次是正确的,而同数值的第二次出现的名次就+1了,当数值不同时又将上一名次的数值代到这个数据中了,比如最后的150.00名次是292,而下面的0.00也是292名,这可能要修改一下语句,可我还无法修改,还请您再看看应该怎么修改。谢谢您了!!
      

  19.   

    zswang(伴水)(伤心中)您好,我终于实现了,主要是将Query1.Next;这句放在QueryTemp.Post;语句的下面即可实现,谢谢您的帮助。我觉得你的SQL用得太爽了,以后希望您多多帮助我。
      I := 1;
      R :=Query1.FieldByName('a11').AsFloat;
      while not Query1.Eof do begin
        QueryTemp.Append;
        QueryTemp[vFieldNames ] := Query1[vFieldNames ];
        QueryTemp['MC'] := I;
        QueryTemp.Post;
        Query1.Next;
        if Query1.FieldByName('a11').AsFloat <> R then Inc(I);
        R := Query1.FieldByName('a11').AsFloat;
      end;
      query1.open;
    end;
    还有一点不太懂,就是这句Query1.FieldByName('a11').AsFloat,一般我会用Query1.FieldByName('a11').Asstring;请问这两句的区别在那里?
    另外:
    Inc(I)这是什么类型转向什么类型的函数呢?
    QueryTemp['MC'] := I;这句中的MC是字符型的,而I是数值型的怎么也能代入呢?
      

  20.   

    //看来是我的代码有虫呀,嘻嘻嘻嘻嘻
    //你知道原理就可以了QueryTemp['MC']相当于
    QueryTemp.FieldByName('MC').Value //Variant(变体)类型QueryTemp.FieldByName('MC').AsString相当于
    String(QueryTemp.FieldByName('MC').Value)QueryTemp.FieldByName('MC').AsInteger相当于
    Integer(QueryTemp.FieldByName('MC').Value)在给变量赋值的时候有一个原则
    小范围的赋给相同或大的范围的
    <Byte> := <Integer>; //会丢失数据//Byte(0..255)..Integer(大于-32767..+32768)
    所以建议
    <Variant> := <Integer>|<string>|<Extended,Real>
    即用
    QueryTemp['MC'] := I;
    不要用
    I := QueryTemp['MC']; //用I := QueryTemp.FieldByName('MC').AsInteger;QueryTemp['MC;A11']; //这是两个字段的值是一个变体数组
    QueryTemp['MC;A11'][0]; //就是QueryTemp['MC']
    QueryTemp['MC;A11'][1]; //就是QueryTemp['A11']
    QueryTemp[vFieldNames]; //就是这条记录所有数据TQuery、TTable、TADOQuery、TADOTable都是从TDataSet继承下来的所以都可以用如上语句
      

  21.   

    zswang(伴水)(伤心中)您好!非常感谢您对我的帮助!如果你不介意,我希望我们成为好朋友!
    再请教你一个问题:
    说明:2个表中有两样的字段DW(单位),要用czbtem1(去年数据)中的单位去到czbtem(今年数据)中找到相同的单位后,将czbtem1中的A11代入到czbtem中的A13,即
    将去年同期(A11)代入到本年度的“去年同期”A13中去,用VFP我是这样写的,不知道delphi怎么写才能达到目的,我在语句中将czbtem设定为query1,将czbtem1设定为querytemp,请帮助!!use czbtem in 0 excl alias czbtem1 //今年数据
    sele czbtem
    use czbtem1 in 0 excl alias czbtem  //去年数据
    sele czbtem1
    do while not eof()
     dw_tem=dw
     a11_tem=a11
     sele czbtem
     locate for allt(dw)=allt(dw_tem)
     if not eof()
       repl a13 with a11_tem
     endif
     sele czbtem1
     skip
    enddo
    不好意思,经常麻烦您