树结构的统计请大家帮忙提供一个思路

big_net 2003-11-24 11:01:05
在以下的程序中我用我的思路统计3000个下线大约需要1分多钟的时间,我感觉这样的效率不是太好,想请教一下各位有没有更好的思路

业务需求:要求在一个传销模式的网中(即一个树状的结构),对所有的销售人员发放工资,或者是列出某个销售人员的所有下线(下线数超过几万,甚至更多)
发放工资的要求:该销售人员的销售额加上下线的销售额的和超过M(M为变量,该变量已经设置好金额)就可以发放工资
表结构:
销售人员的表(部分字段已经省略)
CREATE TABLE [dbo].[销售人员] (
[id] [decimal](18, 0) IDENTITY (1, 1) NOT NULL ,
[编号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[上线名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[上线编号] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
销售明细表
CREATE TABLE [dbo].[销售明细] (
[id] [decimal](18, 0) IDENTITY (1, 1) NOT NULL ,
[编号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[销售金额] [money] NOT NULL ,
[录入时间] [datetime] NOT NULL ,
[上线编号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
我的思路:
(1)列出某个销售人员的所有的下线
a.用一个递归函数把该销售人员所有下线的编号插入到一个临时表中
b.在销售人员数据窗口retrieve的时候 先setsqlselect("select * from 销售人员 where 销售人员.编号 in (select 编号 from 临时表 )")
其中递归函数的代码:
function uf_shopNode_count(string s_id)
s_sql="select 编号 from 销售人员 where 编号 ="+"'"+us_id+"'"
ds=uff_createDs(s_sql) //创建一个datastore,引用外部的函数
i_rowCount =ds.rowCount()
for i=1 to i_rowCount
s_id=ds.getItemString(i,"编号")
INSERT INTO 临时表
( id )
VALUES ( :s_id ) ;
uf_shopNode_count(s_id) //函数名称
next
end function
(2)发放工资的思路
a.用递归算出每个销售人员的总额,把编号和金额插入到临时表中
b.处理临时表中的数据,然后发放工资
问题:
如果用我现在的思路如果数据量比较大(超过几万),系统地速度会很慢
...全文
29 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
big_net 2003-11-27
  • 打赏
  • 举报
回复
谢谢 klbt(快乐白兔)
如果曾数不多,这个办法的确是个好办法。
可手头的程序管理一个很大的营销网络,在需求说明里提到该网络可能在覆盖全国很多地方,上万的销售人数肯定会有。编号的长度本身就不短,再加上层次数也不少,这个编号看来也不能短了。
klbt 2003-11-25
  • 打赏
  • 举报
回复
但如果下线数量成千上万那这个编号的位数也就成千上万了?
-------------------------------------------------------
我的意思你可能误解了,下线数量何以很多,但层次并不多。举例:10个下线:
01
0101
010101
010102
0102
010201
01020101
01020102
010202
01020201
01020202
其实只有三层,所以编码不会太长。
big_net 2003-11-25
  • 打赏
  • 举报
回复
哪位老大给指点一下阿!
hzhxxx 2003-11-24
  • 打赏
  • 举报
回复
建议使用存储过程
big_net 2003-11-24
  • 打赏
  • 举报
回复
klbt(快乐白兔):
我考虑过这种方式,但如果下线数量成千上万那这个编号的位数也就成千上万了?

hzhxxx(程序方程) :
我也从存储过程的方面考虑过,不过我在存储过程中用递归统计下线的时候没能实现(使用游标)。
不知道能不能描述的详细点
klbt 2003-11-24
  • 打赏
  • 举报
回复
关键在于编号规则设计,如果你用类似于01020304(每两位一层)的思路设计编号,甚至可以不用“上线编号”列,此时用数据窗口做统计易如反掌。

1,093

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧