CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

太奇怪了,可以是基础太差,请各位请进。

楼主sbxt(初学者)2001-12-02 19:52:42 在 Delphi / VCL组件开发及应用 提问

表名为start.db,按照下面的语句写运行到第3句时就出错,其中A11是数值型字段,请问各位高手应该怎么处理?  
  table1.close;  
  table1.indexfieldnames:='a11';  
  table1.open;          
  我需要将表建立索引,而后再打开来使用。  
     
   
     
  问题点数:20、回复次数:27Top

1 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 19:57:39 得分 0

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

2 楼line(一千弯线)回复于 2001-12-02 20:03:07 得分 0

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

3 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:07:00 得分 0

如果是bit就不能Top

4 楼sbxt(初学者)回复于 2001-12-02 20:09:10 得分 0

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

5 楼taxi(当时明月在,曾照彩云归)回复于 2001-12-02 20:10:42 得分 0

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

6 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:23:32 得分 0

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;Top

7 楼sbxt(初学者)回复于 2001-12-02 20:24:17 得分 0

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(名次)不会做,请高手再看看!  
  Top

8 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:24:28 得分 0

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

9 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:25:58 得分 0

试试我的方法告诉我行不行!?Top

10 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:28:42 得分 0

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

11 楼sbxt(初学者)回复于 2001-12-02 20:40:49 得分 0

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  
  Top

12 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:46:05 得分 20

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

13 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:49:26 得分 0

你看看我以前给你答的帖子Top

14 楼sbxt(初学者)回复于 2001-12-02 20:53:29 得分 0

看过了,还不怎么懂,我再试试,谢谢您的帮助,我以前一直用的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,还请各位高手多帮助。Top

15 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:54:10 得分 0

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;  
  Top

16 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-02 20:57:36 得分 0

我以前也是玩vf5.0的Top

17 楼sbxt(初学者)回复于 2001-12-02 22:04:38 得分 0

回复人: 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;  
  Top

18 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-03 09:21:02 得分 0

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有没有空记录?  
  //有的话清掉  
  Top

19 楼sbxt(初学者)回复于 2001-12-03 11:08:23 得分 0

下一句运行是正常的  
  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"';  
   
  Top

20 楼sbxt(初学者)回复于 2001-12-03 12:38:05 得分 0

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;  
   
  Top

21 楼sbxt(初学者)回复于 2001-12-03 12:42:32 得分 0

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;  
   
  Top

22 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-03 13:03:57 得分 0

这是浮点数的问题//我也经常碰到//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   {   执行了!   }  
  Top

23 楼sbxt(初学者)回复于 2001-12-03 14:12:23 得分 0

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名,这可能要修改一下语句,可我还无法修改,还请您再看看应该怎么修改。谢谢您了!!Top

24 楼sbxt(初学者)回复于 2001-12-03 14:29:44 得分 0

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是数值型的怎么也能代入呢?  
   
  Top

25 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-03 15:43:34 得分 0

//看来是我的代码有虫呀,嘻嘻嘻嘻嘻  
  //你知道原理就可以了  
   
  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继承下来的所以都可以用如上语句  
  Top

26 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-03 15:47:21 得分 0

实践实践实践实践实践实践实践实践实践实践  
  实践实践实践实践实践实践实践实践实践实践  
  实践实践实践实践实践实践实践实践实践实践  
  实践实践实践实践实践实践实践实践实践实践  
  Top

27 楼sbxt(初学者)回复于 2001-12-03 18:53:48 得分 0

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  
  不好意思,经常麻烦您Top

相关问题

  • !!!奇怪,奇怪,各位大虾看看!!!
  • 基础太差,请教大家一个初级问题
  • 哎~c基础太差,高手们来帮我分析一下这段代码
  • 奇怪,各位请看一下
  • 一句奇怪的printf,各位瞧瞧
  • 请教各位,奇怪的问题
  • 奇怪的问题,各位帮帮忙!
  • 奇怪问题请教各位高手!
  • 各位好,一个很奇怪问题
  • 奇怪的问题,请教各位

关键词

  • 语句
  • 字段
  • 数值
  • 数据
  • 字符
  • a11
  • querytemp
  • query1
  • czbtem
  • 实践实践实践实践

得分解答快速导航

  • 帖主:sbxt
  • zswang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo