看不懂?可能怪我写得太简单,因为我是和你讨论问题,有些就省了
而且我看见前面一个也很简单,你也看懂了,所以就简单化了,抱歉
不过你要是认为这段代码没有测试过,就错了,因为这是我从我的
实际代码中提出来的
对这段代码我解释一下
Values 是个变量 TStrings
只需要做如下初始化就可以 Values := TStringList.Create;
如果说数据在数据表中,我们假设科目代码字段为Code,余额字段为
Balance. ADOQuery1: TADOQuery,操作该数据表
数据库操作这里就会省了,不会有意见吧
ADOQuery1: TADOQuery;
Values: TStrings;
Balance:do
uble;
Code: string;
KmCode: string;
i: integer;
//省了数据库的操作
//把数据库的内容读入ADOQuery1,通常用 select * from 科目表
Values := TStringList.Create;
while not ADOQuery1.Eofdo
//也可以用 for i := 0 to ADOQuery1.Count - 1do
begin
Code := ADOQuery1.FieldByName('Code').AsString;
Balance := ADOQuery1.FieldByName('Balance').AsFloat;
//取1到5级科目代码做汇总
for i := 1 to 5do
begin
KmCode := GetKmCode(Code,i);
if KmCode <> '' then
begin
if Values[KmCode] := '' then
Values.Add(KmCode + '=' + FloatToStr(Balance))
else
Values[KmCode] := FloatToStr(StrToFloat(Values[KmCode])+Balance));
end
else
break;
end;
ADOQuery1.Next;
end;
function GetKmCode(Code: string;
i: integer): string;
begin
result := '';
case i of
1: if Length(Code) >= 3 then
result := Copy(Code,1,3);
2: if Length(Code) >= 6 then
result := Copy(Code,1,6);
3: if Length(Code) >= 8 then
result := Copy(Code,1,8);
4: if Length(Code) >= 10 then
result := Copy(Code,1,10);
5: if Length(Code) >= 12 then
result := Copy(Code,1,12);
end;
end;
这会除了数据库的部分操作省略了,可都没有省略。
还是不明白?那我就在解释一下。
在这里主要是要明白TStrings这个类的用法,这有个解释
When the list of strings for the TStrings object includes strings
of the form Name=Value, use Values to get or set the value part of
a string associated with a specific name part. If the listdo
es not
contain any strings of the proper Name=Value form, or if none of
those strings matches the Name index, Values returns an empty string.
Strings of the form Name=Value are commonly found in .INI files.
For example, here are a few strings taken from a DELPHI.INI file:
DisplayGrid=1
SnapToGrid=1
GridSizeX=8
GridSizeY=8
The strings that make up the Params property of a database component
(TDatabase) have this format as well.
The Name that identifies the string is to the left of the equal sign (=),
and the current Value of the Name identifier is on the right side. There
should be no spaces present before or after the equal sign.
实际上这个算法有两点,第一,可以任意汇总,无需科目排序,比如,当读到
1710010101这个科目的时候,根据科目的设定,我们就可以把该科目分别汇总
到171、17001、17100101这些科目。当然是否汇总到1710010101这个科目,无
关紧要,因为最底层目录汇总也他一个。在汇总到171时候,就又有第二个问题,
如何找到171的科目并且汇总,这里面,我们用到了TStrings类的Values属性,
我们包汇总的结果都放入到TStrings,使汇总结果如下形式(字符串)
171=49406.85
171000=41306.85
171001=6750
171002=1350
这样,我们能就利用TString的Values属性非常方便的定位171这个科目的位置了。
由于Values变量初始为空,这样,当我们汇总的时候,就需要判断该科目是否
已经有汇总值,没有我们就加一行如“171=41306.85”,如果有,我们就把它的
值取出来,汇总,再放回去。
明白了吗?还不明白,我也没有办法了
顺便说一句,我曾开发过财务软件,现在还在卖,当然是小公司开发的。
所以,你要以为我在写天书,经不起实践,那就大错特错了
另外:如果说数据表中的所有科目都已有有数据,也就是说不是最底层的科目已经
有数据了那么,在汇总的时候需要判断当前科目是否是最底层的科目,如果是,
汇总,如果不是,忽略不汇总