300大分,关于DBgrid中字段的计算问题,急急!!!(300分)

  • 主题发起人 主题发起人 阿九
  • 开始时间 开始时间

阿九

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟正在做一个关于会计方面的项目, 以下是DBgrid的显示内容.我用的是Query 控件
年初余额 本期发生额 期初余额
科目代码 科目名称 借 贷 借 借
101 现金 20000 10000 ?
102 银行存款 ?
10201 工商银行 50000
10202 中国银行 20000
103 ... -30000 ?
(1)就是说102 的值等于10201+10202的值,怎么实现?
(2)我想把103 的负值去掉,然后放到贷方栏目,怎么实现 ?
(3)怎样计算20000+10000=? (期初余额)?
 
我的土办法:
(1)在查询完毕,显示前,判断科目码,然后在102的对应字段作计算
(2)还是要判断一下,然后将借的字段设为0,贷的字段设为 + 的数;
(3)用query1.field[5].value:=query1.field[2].value+query1.fiedl[4].value;
 
你遇到的问题,很好解决。其实只要能操纵数据库中的数据就行。
也就是通过定位行与列,便可定位一个数据。
1)定位行有好多种方法:
比如:locate(子段名,值,参数);
find();
或用query组件:
with query1 do
begin
sql.add('select * where 科目代码=10201')
end;
2)找到行之后,然后确定字段。办法:
可右击query部件,选中fields editor,添加要计算的字段(比如name)。
这样在unit的type中就可看到query1name:Tfield。
3)然后可计算:
目标行的 query1借.value:=行1的query1借.value+行2的query1借.value
遵循这个思路,自己稍微摸索一下,很快就会解决。
 
另一种方法:
with query1 do
begin
Try
if Active then Close;
SQL.Clear;
Sql.Add('Drop Table #Temp');
ExecSQL;
Except
end;
if Active then Close;
SQL.Clear;
SQL.Add('SELECT * INTO #Temp FROM TALBELNAME')
ExecSQL;
if Active then Close;
SQL.Clear;
{1}SQL.Add('UpDate #Temp SET 借=( Select Sum(借) from TableName where 科目代码='10201' or 科目代码='10202') where 科目代码='102' ');
ExecSQL;
if Active then Close;
SQL.Clear;
{2}SQL.Add('UpDate #Temp Set 贷=Abs(借) where 科目代码='103' ');
ExecSQL;
{3} ....
SQL.Clear;
SQL.Add('Select * from #Temp');
Open;
end;
 
(1) var x:real;
with Query1 do
begin
locate('科目代码','10201',[loCaseInsensitive, loPartialKey]);
x:=fieldbyname('科目代码').value;
locate('科目代码','10202',[loCaseInsensitive, loPartialKey]);
x:=x+fieldbyname('科目代码').value;
end;
(2) with Query1 do
begin
first;
while not eof do
begin
if fieldbyname('借').value<0 then
edit;
fieldbyname('贷').value=abs(fieldbyname('借').value);
fieldbyname('借').value=0;
post;
next;
end;
end;
(3)
with Query do
begin
locate('科目代码','101',[loCaseInsensitive, loPartialKey]);
edit;
query1.field[5].value:=query1.field[2].value+query1.fiedl[4].value;
post;
end;

 
to NO.9:
楼上几位朋友的观点看了。
在实际应用中表的结构是动态改变的。
按照forpro中的通常作法:
1。根据报表结构字典生成一张具体的报表。
在里指明每一表项的性质:
(1)项目名称(2)项目代号(3)是否汇总项 ......
2.根据报表结构字典的汇总项对实际报表动态生成SQL进行汇总计算。
(楼上的朋友是固态的)
怎样动态生成SQL,涉及范围怎样取值的问题:一是在汇总项目直接指定(不推荐)
二是根据项目号的大小
sql.add('select * where 科目代码 like :xmh')
query1.parambyname(xhm)=xxxx (可能不对只是思路)
3。关于借贷方的关系,应遵从科目字典
你是怎么解决的,发个给我: ok923@163.net
ok后 300分补给你
 
是不是可以使用功能强大的sql语句?
求累计:由于在科目编码中常常采用位数递增来区分明细科目,字段长度可以用来作为
分组的依据;
借贷分开: case 语句可以十分方便地使用分组累计的功能;
合计求期初余额: use sum

据此:
细部求和 (解决借贷分开和细部求和)
select substring(ltrim(kmdm),1,3),
sum(case where money > 0 then money else 0 end) as jiefang,
sum(case where money <= 0 then abs(money) else 0) as daifang
from db
where datalength(ltrim(kmdm)) > 3
group by substring(ltrim(kmdm),1,3)

 
提问者:
如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明 http://www.delphibbs.com/delphibbs/rules.asp
 
建议还是通过SQL来实现,
其实就是子查询/like/case或iif/sum等的应用,写得挺累,不知你还看不看?[:)]
 
建议把数据库的结构改一改,单独保存科目代码和金额,进行联合查询即可。
 
我基本同意masks的意见,但据 阿九 的具体问题而言,认为可作如下改动:
{1}SQL.Add('UpDate #Temp SET 借=( Select Sum(借) from TableName where 科目代码='10201' or 科目代码='10202') where 科目代码='102' ');
改为:
{1}SQL.Add('UpDate #Temp SET 借=( Select Sum(借) from TableName where 科目代码 like '102__' );
即在102之后加两个下划线。
其它代码不便;

 
给你一个思路:要是不想改数据库中的内容的话,在dbgrid中的ondrawcolumncell(定义
了column)或在ondrawdatacell事件中操作。
 
土办法:
查询,编历,计算
 
太长时间了,半年了,结掉吧。
 
结掉吧。[:)]
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部