有关对DBGRID中的数计算的问题? 200分(200)

  • 主题发起人 kristy811203
  • 开始时间
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
列: 日产 累计 行: 1 20 20 2 30 50 3 10 60 .. 10 10 ? 请教:当在DBGRID的 日产 列 内输入数值,后面自动生成或者单击 累计 的按钮后生成 相应的累计数值。例如:行1 日产是20 累计为20+0=20,行2 日产30 累计为20+30=50,行3 日产是10 累计为10+50=60,这个怎么实现? 很着急啊,谢谢!
 
F

ftlifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
我觉得你还是用StringGrid比较好计算,如果用DBGrid的话,我看应该是累加DataSet的字段值,需要循环DataSet
 
Z

znxia

Unregistered / Unconfirmed
GUEST, unregistred user!
定义全局变量 DealIng:Boolean=false;
RC,ChgValue:Double;在DataSet.BeforeEdit事件中编写代码:begin
if DealIng then
Exit;
RC:= dataset.fieldbyname('日产').asfloat;
end;
BeforePost中编写代码begin
if DealIng then
Exit;
ChgValue := RC - dataset.fieldbyname('日产').asfloat;
Dataset.FieldByName('累计').asfloat := Dataset.FieldByName('累计').asfloat+ChgValue;
end;
在DataSet.AfterPost事件中编写代码:begin
if DealIng then
Exit;
DealIng :=True;
try Dataset.next;
While Not Dataset.Eofdo
begin
Dataset.edit;
Dataset.FieldByName('累计').asfloat := Dataset.FieldByName('累计').asfloat+ChgValue;
Dataset.post;
Dataset.next;
end;
finally DealIng:=false;
end;
end;
----------------------最好是在afterPost之后调用存储过程,后台处理数据,然后前台刷新数据。
 
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
znxia, 你给的代码,是能是实现这个功能,但是,累计的列下面显示的都是最后一个累计值,并且不能修改日产,一旦重新修改,累计值就全都错了,对不上了?
 
Z

zkktom

Unregistered / Unconfirmed
GUEST, unregistred user!
最后一个是计算字段计算事件上加上q.first;f:=0;while not q.eofdo
begin
f:=q.fieldbyname('je').asfloat+f;
q.fieldbyname('zje').asfloat:=f;
q.next;
end;
 
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
zkktom ,请问应该加在什么地方?谢谢!
 
Z

znxia

Unregistered / Unconfirmed
GUEST, unregistred user!
他是在保存之后调用:begin
if DealIng then
Exit;
DealIng :=True;
try q.first;
f:=0;
while not q.eofdo
begin
f:=q.fieldbyname('je').asfloat+f;
q.fieldbyname('zje').asfloat:=f;
q.next;
end;
finally DealIng:=false;
end;
end;
如果你有1000条记录,你更改了第998条记录,它依旧刷新了1000条记录的数据。
 
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
我想,只输入 日产 时,后面 有 累计 值。不输入日产的地方,后面 的累计值 为 0,这个应该怎么解决。
 
A

amao800613

Unregistered / Unconfirmed
GUEST, unregistred user!
在数据集上做处理:1、加一个数据字段“日产”,在 其 OnsetText事件里面做处理给累计变量赋值 2、加一个计算字段“累计”在 数据集的OnCalcFields事件里面设置值即可。如果你要依次按照顺序来改的话,就得用一个循环了处理了。var lsum:Float;
begin
lsum:= 0;
with ADOTable1do
begin
DisableControls;//不至于改完数据后找不到原来的数据行了 First;
while not Eofdo
begin
Edit;
FieldByName('累计').AsFloat:= FieldByName('日产').AsFloat+ lsum;
post;
lsum:= FieldByName('累计').AsFloat;
Next;
end;
EnableControls;
end;
end;
 
H

HJ.Yao

Unregistered / Unconfirmed
GUEST, unregistred user!
你的表设计有问题,应该要这样来想期初|日产|期末0 20 2020 30 5050 10 60……如果这样,你就好弄了,你再仔细想想吧只要在DBGrid1ColExit事件中加入IF 字段=[日产] and DBGrid1.DataSource.DataSet.State in [dsInsert,dsEdit]then
begin
Ends:=期初+日产;{Ends是一个全局Int变量}end;
{这里还要仔细调试下,可能还要加些东西}然后在DBGrid1.DataSource.DataSet的AfterInsert事件中写:{xx=DBGrid1.DataSource.DataSet} XX.FieldByName().AsInteger:=Ends;就可以了你就不该直接用DBGrid来输入这样有字段计算的输入,应该用DBEdit配合来完成嘛本来是一个很简单的东西,因为你的风格问题,变得麻烦了
 
S

skandy10220

Unregistered / Unconfirmed
GUEST, unregistred user!
select aa.序号,aa.日产,sum(lj.日产) as 累计from 表名 lj inner join (select * from 表名) aa on lj.序号<=aa.序号where (aa.序号>='1') group by aa.序号,aa.日产order by aa.序号
 
S

skandy10220

Unregistered / Unconfirmed
GUEST, unregistred user!
select aa.序号,aa.日产,sum(lj.日产) as 累计from 表 lj inner join (select * from 表) aa on lj.序号<=aa.序号where (aa.序号>='1')group by aa.序号,aa.日产order by aa.序号
 
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 
顶部