数据库结构如下:
id parentid,name,money,totalmoney,submoney
0,0,根节点,0,15000,0
1,0,张山,1000,5000,0
2,0,张好,2000,7000,0
3,0,王五,3000,3000,0
4,1,黎明,4000,4000,0
5,2,老刘,5000,5000,0
通过数据库加载到tree
现在想反向计算submoney.
submoney 是当前节点的totalmoney 减去下面所有层次的money.
并且要去掉当前下级节点的money最大值。type
tmydata = record
id:integer;
parentid:integer;
name:string;
money:double;
totalmoney:double;
submoney:double;
resume:boolean;
end;
pmydata = ^tmydata;function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
d:=pcustdata(p.data);
if p.Count <1 then
begin
d.submoney := 0; //=0
result := d.money;
d.resum:=false;
exit;
end;
result := d.money;
for i:=0 to p.count -1 do
result := result + submoney(p.Item[i]);
//全部加起来以后用总数去减
d.submoney := d.totalmoney + d.money - result;
d.resum:=false;
end;
//我写的这个没有考虑下级节点的最大值。
//另外一种。
function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
d:=pcustdata(p.data);
if p.Count <1 then
begin
d.submoney := 0; //=0
result := d.money;
d.resum:=false;
exit;
end;
result := d.submoney;
for i:=0 to p.count -1 do
result := result - submoney(p.Item[i]);//这样减好像只是得到了一层节点的数据,并且减去的数是已经减了之后的数
d.submoney := result;
d.resum:=false;
end;我这两种写法都好像有错,请大伙帮忙看看
id parentid,name,money,totalmoney,submoney
0,0,根节点,0,15000,0
1,0,张山,1000,5000,0
2,0,张好,2000,7000,0
3,0,王五,3000,3000,0
4,1,黎明,4000,4000,0
5,2,老刘,5000,5000,0
通过数据库加载到tree
现在想反向计算submoney.
submoney 是当前节点的totalmoney 减去下面所有层次的money.
并且要去掉当前下级节点的money最大值。type
tmydata = record
id:integer;
parentid:integer;
name:string;
money:double;
totalmoney:double;
submoney:double;
resume:boolean;
end;
pmydata = ^tmydata;function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
d:=pcustdata(p.data);
if p.Count <1 then
begin
d.submoney := 0; //=0
result := d.money;
d.resum:=false;
exit;
end;
result := d.money;
for i:=0 to p.count -1 do
result := result + submoney(p.Item[i]);
//全部加起来以后用总数去减
d.submoney := d.totalmoney + d.money - result;
d.resum:=false;
end;
//我写的这个没有考虑下级节点的最大值。
//另外一种。
function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
d:=pcustdata(p.data);
if p.Count <1 then
begin
d.submoney := 0; //=0
result := d.money;
d.resum:=false;
exit;
end;
result := d.submoney;
for i:=0 to p.count -1 do
result := result - submoney(p.Item[i]);//这样减好像只是得到了一层节点的数据,并且减去的数是已经减了之后的数
d.submoney := result;
d.resum:=false;
end;我这两种写法都好像有错,请大伙帮忙看看
解决方案 »
- rtf移植到word问题
- delphi 执行存储过程
- 如何让DBGRID中的某一字段位于第一列,在线,急
- D5的ADO数据控件,为什么者查询的数据纪录为0的时候,关闭出错啊?
- 提教一个com调用问题!
- 请大侠们推荐个打印预览控件(拜托各位)
- 在工具栏内如delphi5的工具栏“打开”旁边的下三角如何设置?
- 机器A如何通过拨号连接另外一台机器B?可不可以具体一点,用什么控件,什么函数?
- 一个计设项目怎样分配任务比较合理?
- 急!关于database desktop的restructure命令,很简单。绝对给分
- 载入dll中的资源时遇到的灵异现象,诡异的LockResource函数
- 程序里如何根据数据库的不同而执行不同SQL语句?
并且要去掉当前下级节点的money最大值(直接子节点的最大者,还是所有子节点里的最大者)。
现在的totalmoney都算出来了。
submoney初始化的时候是0。
要求submoney=自己的totalmoney - 下面所有层次节点的money,
直接下层节点要求去掉最大的money的那一个,再以后的层次节点不去掉最大值
如果树不大,干脆每次都重新算好了
或者:
function maxsub(p:Ttreenode);
var
i:integer;
begin
result:=0;
for i:=0 to p.count-1 do
if result < Pnodedata(p.item[i].data).money then
result := Pnodedata(p.item[i].data).money;
end;
with nodedata do
begin
submoney:=money*2-totalmoney-maxsub(p);
end;
要不这样。
nodedata= record
id:integer;
parentid:integer;
name:string;
money:double;
totalmoney:double;
submoney:double;
ismax:boolean;
end;
我这里加入了一个ismax表示这个节点的最大值状态,这个ismax我最开始就已经算出来。
我刚才的逻辑描述还有点问题。
要求submoney=totalmoney-下面所有节点的money
但是要求去掉max节点和max节点的所有分支。(也就是最大节点的那个分支的所有节点都忽略不要减了)
function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
d:=pcustdata(p.data);
if p.Count <1 then
begin
d.submoney := 0; //=0
result := d.money;
exit;
end;
result := d.money;
for i:=0 to p.count -1 do
begin
if pcustdata(p.item[i]).ismax=false then
result := result + submoney(p.Item[i]);
end;
d.submoney := d.totalmoney + d.money - result;
d.resum:=false;
end;