delphi+access一个计算问题! ( 积分: 100 )

  • 主题发起人 主题发起人 yangnan5922
  • 开始时间 开始时间
Y

yangnan5922

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库1
字段名 公式
应发合计 adoquery1.FieldValues['基本工资']*10000+adoquery1.FieldValues['提成']

数据库2
基本工资 提成 应发合计
10 20 0
以上数据库都是char和float的

我的全部程序是这样的
var i:integer;
s_field,s_cal:string;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from wage');
adoquery1.Open;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from cal');
while not adoquery2.Eof do
begin
s_field:=adoquery2.FieldByName('字段名').AsString;
s_cal:=adoquery2.fieldbyname('公式').AsString;
while not adoquery1.Eof do
begin
adoquery1.Edit;
adoquery1.FieldByName(s_field).Value:=s_cal;
adoquery1.UpdateRecord;
adoquery1.Next;
end;
adoquery2.Next;
end;
showmessage('成功');
end;

一共2个数据库 大哥们能看懂什么意思吗?
请大家帮帮忙!!!谢谢谢谢!!!万分感谢!!
 
貌似直接用一条sql语句就可以,不用这么麻烦
 
var s_cal;
s_cal := '(test1*10000+test2)';
sqlstr := 'update wage set s_field=' + 's_cal'+ '';
就可以了
数据库尽量避免循环.
 
汗...你这个是公式啊......当然不能转成float类型了
为什么不直接adoquery1.FieldValues[s_field]:=adoquery1.FieldValues['test1']*10000+adoquery1.FieldValues['test2'];?

按你原来程序的思路,改成这样,不过我完全不理解你为什么要做这么一步,完全没有意义:
var
s_field,
s_cal:string;
fv,f1,f2:double;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from wage');
adoquery1.Open;
s_field:='test';
f1:=adoquery1.FieldValues[''test1''];
f2:=adoquery1.FieldValues[''test2''];
fv:=f1*10000+f2;
while not adoquery1.Eof do
begin
adoquery1.edit;
adoquery1.FieldValues[s_field]:=fv;
adoquery1.Next;
end;
adoquery1.UpdateBatch(arAll);
end;
 
其实我的全部程序是这样的
var i:integer;
s_field,s_cal:string;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from wage');
adoquery1.Open;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from cal');
while not adoquery2.Eof do
begin
s_field:=adoquery2.FieldByName('字段名').AsString;
s_cal:=adoquery2.fieldbyname('公式').AsString;
while not adoquery1.Eof do
begin
adoquery1.Edit;
adoquery1.FieldByName(s_field).Value:=s_cal;
adoquery1.UpdateRecord;
adoquery1.Next;
end;
adoquery2.Next;
end;
showmessage('成功');
end;

一共2个数据库 大哥们能看懂什么意思吗?
请大家帮帮忙!!!谢谢谢谢!!!万分感谢!!
 
。。。。从程序上看,我理解的是,你cal表里记的是字段对应的公式
循环修改wage表里第一条纪录的字段值? 可是你wage表里的字段值也应该是公式才对啊,为什么你要定义成float
 
var s_field,s_cal:string;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from wage');
adoquery1.Open;
s_field:='test';
s_cal:='adoquery1.FieldValues[''test1'']*10000+adoquery1.FieldValues[''test2'']';]
////////////////////取出来的是什么类型?如果是字符型就是s_cal:=
inttostr( strtoint('adoquery1.FieldValues[''test1''])*10000+strtoint(adoquery1.FieldValues[''test2'']));

如果是数字型,就是s_cal:=inttostr('adoquery1.FieldValues[''test1'']*10000+adoquery1.FieldValues[''test2'']);
///////////////////
while not adoquery1.Eof do
begin
adoquery1.edit;
adoquery1.FieldValues[s_field]:=strtofloat(s_cal);
//
要加:adoquery1.post;
//

adoquery1.Next;
end;
adoquery1.UpdateBatch(arAll);
end;

抱错 is not a valid floating point value

如果把 adoquery1.FieldValues[s_field]:=strtofloat(s_cal);
改成 adoquery1.FieldValues[s_field]:=adoquery1.FieldValues['test1']*10000+adoquery1.FieldValues['test2']; 就一切OK!

但是 我就是想让计算公式先付值给 s_cal 然后根据s_cal 进行计算
希望大家帮帮忙!!! N天没有搞定了
实在没有办法了!!!
////////////
结论:注意字符型和数值型的转换.inttostr()和strtoint()
小数就是:strtofloat()或者floattostr()
 
???????你自己都不知道是什么类型?数据库设置的字段类型是什么啊.....汗

另外,你哪来的公式?
adoquery1.FieldValues[''test1'']*10000+adoquery1.FieldValues[''test2''];本身就是数值啊
前后加引号就变成字符串了
 
数据库1
字段名 公式
应发合计 adoquery1.FieldValues['基本工资']*10000+adoquery1.FieldValues['提成']

数据库2
基本工资 提成 应发合计
10 20 0
以上数据库都是char和float的

我的全部程序是这样的
var i:integer;
s_field,s_cal:string;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from wage');
adoquery1.Open;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from cal');
while not adoquery2.Eof do
begin
s_field:=adoquery2.FieldByName('字段名').AsString;
s_cal:=adoquery2.fieldbyname('公式').AsString;
while not adoquery1.Eof do
begin
adoquery1.Edit;
adoquery1.FieldByName(s_field).Value:=s_cal;
adoquery1.UpdateRecord;
adoquery1.Next;
end;
adoquery2.Next;
end;
showmessage('成功');
end;

一共2个数据库 大哥们能看懂什么意思吗?
请大家帮帮忙!!!谢谢谢谢!!!万分感谢!!
 
后退
顶部