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;
你在窗体上放两个Query(Query1,QueryTemp<要可以写>) select * from xsk.db where <还可以加条件呀> order by a11
看过了,还不怎么懂,我再试试,谢谢您的帮助,我以前一直用的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,还请各位高手多帮助。
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;
回复人: 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;
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有没有空记录? //有的话清掉
下一句运行是正常的 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"';
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;
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;
这是浮点数的问题//我也经常碰到//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 { 执行了! }
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是数值型的怎么也能代入呢?
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 不好意思,经常麻烦您
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;
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(名次)不会做,请高手再看看!
// ~~~~~~~~~~~~
其实主表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
select * from xsk.db where <还可以加条件呀> order by a11
如果使用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,还请各位高手多帮助。
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;
请问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;
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有没有空记录?
//有的话清掉
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"';
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;
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;
你可以用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 { 执行了! }
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名,这可能要修改一下语句,可我还无法修改,还请您再看看应该怎么修改。谢谢您了!!
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是数值型的怎么也能代入呢?
//你知道原理就可以了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继承下来的所以都可以用如上语句
再请教你一个问题:
说明: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
不好意思,经常麻烦您