太奇怪了,可以是基础太差,请各位请进。
表名为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




