日期:2009-11-22  浏览次数:20786 次

我的问题:

1.一个销售系统,设有各级代理商,每个代理商的表是这样设计的

数据库结构
表1: 代理商资料表
[id] 自动编号 编号
[lishu] 长整型 隶属字段
[xiaoshoue] 长整型 销售额
[ticheng] 长整型 提成
[add_date] 日期/时间 代理商添加时间

要求
1.让代理商分级,指出某个代理商可以算出他的上级代理商和下级代理商.

2.提成的比例按照销售额的多少来定,销售额2000以下的提成比例是20%,销售额在2000到6000之间的提成比例是25%,销售额在6000到18000之间的提成比例是30%,销售额在18000到30000之间的提成比例是35%,销售额在30000到60000之间的提成比例是40%,销售额在60000以上的提成比例是45%.

3.提成是这样算的,比如说第一个月的销售额是2000,那么他的提成是2000*20%=400,然后如果第二个月的销售额又是2000,那么他的总销售额就是第一个月加第二个月的2000+2000=4000,因为4000界于2000到6000之间,所以他这个月的提成比例应该是25%,那么他这个月的提成是本月的销售额乘以25%,就是2000*25%=500

4.下级代理商新增的销售额要添加到他上级代理商的销售额里面,比如说A为一级代理商,B为A的下级代理商,也就是二级代理商,B这个月的销售额是2000,A这个月的销售额也是3000,但因为B是A的下级代理商,所以A本月的销售额就是B本月的的销售额加上他自己本月的销售额.2000+3000=4000
但是A本月的提成不应该是5000乘以25%,应该是他本月自己的销售额3000*25%然后加上他的下级代理商给他增加的提成差额2000*25%-2000*20%整个算下来A这个月的应得提成就是3000*25%+2000*25%-2000*20%=5000*25%-2000*20%=850,但是A不可能只有B一个代理商,他和它其它所有的下级代理商的提成差额都是这样计算的.如果A这个月自己的销售额为0,B的销售额是2000那么A这个月的应得提成就是2000*20%-2000*20%=0,也就是如果A和B同一销售额段的话A就不会从B那里得到差额提成.但A不可能就B一个下级代理,所以A的就算自己这个月本身销售额为0,他有2个下级代理商,并且每个下级代理商销售额为2000,他这个月的应得提成就是4000*25%-2000*20%-2000*20%=200

5.如果某代理商的下级代理商有1个销售额在6000以上的,那么他们属于同一个提成比例段的,所以他们之间没有差额提成,但是如果有3个下级代理商的销售额在60000以上的,那么他可以从这3个下级代理商各自的多余60000的部分的5%的提成.

还有一些其它详细的要求,我先不说了,其中1.2.3.5和4的部分功能我已经实现了.主要是4的算法太难,感觉又要重新设计数据结构似的,要不就算我一点一点做出来,效率一定会很慢的,大家看看要求4的具体实现有没有比较经典的算法和解决方案,谢谢指点了,如果实在是太麻烦偶短时间学不会的话,这个工程偶就不做了,就算以前编的部分是自己锻炼自己了.

烦劳各位老大都费一些心思,真是太感谢了.

我知道是用递归,可是打开每个下代理商的数据库要打开好多次呀,这样性能非常差的,应该先把本身的记录集存储到数组里,然后以后调用,再分别打开每个下级代理商的记录集,经过计算和第一次的记录集比较和计算

我都乱了,想不出来到底建立多少个RECORDSET,递归多少次,怎么让一个数据同时更新到两个记录集中,好多麻烦的东西,没有头绪了。

个功能是不是很好的实现呀,我感觉怎么也得用存储过程或者数组之类的解决.我现在的作法是同时打开两个数据库链接,但是这样操作的同错几率很大,最好这样来,先打开一个链接,取出所需数据,存进数组.再打开第二个链接,循环上面的数组,进行操作.如果需要更新第一个链接,在最后进行更新,原理知道了,就是写不出来.复杂的递归算法我真的弄不出来,尤其是什么FOR循环里面还弄着几个IF嵌套,我看一段就不知道数据到底是哪个状态了,请问一下这样的情况又没有什么分析上的技巧呀 .

下面是江一在线的回复。



这是一个多级的树(TREE)罢了,其实原理是类似于俺们这个论坛的结构,俺们是这样来实现的

主要数据结构
[ id ] 长整型
[ num_replied ] 双精度型
[ num_followed ] 双精度型
[ num_lasttime ] 双精度型


当一个客户是最上层的:一级客户时,应该是
num_replied=num_followed

如果是二级的客户应该是:
num_replied=新的时间码
num_followed=上一级的num_replied
也就是说呢,二级或者并非一级分类的客户应该是num_replied<>num_followed的

而新增加一个客户或者一个下级客户时
更新num_lasttime的时间码,通过这个来保证整个客户树的完整
也就是说,只要num_lasttime相同的,必定是同一个主分类的客户

这样来得出一个完整的客户树是很容易的
第一步,得到该分类的num_lasttime
第二步,根据两个时间码,整理出整个树形结构

但问题是:
假如我们要得出某一个客户的所有上级或者所有下级怎么办?

根据上面的数据结构,一个客户是可以存在并列关系的同级客户的,只要他不是一级分类
也就是说,所有num_replied相同,并且num_lasttime相同的客户都是一个级别的;但他们可能并不属于同一个上级客户,所有,上面的结构不能直接来完成你的要求,进行如下改动:

改动后的数据结构
[ id ] 长整型
[ mark ] 长整型
[ num_replied ] 双精度型
[ num_followed ] 双精度型
[ num_lasttime ] 双精度型


增加了一个MARK字段,用于表示这个客户的级数,一级客户用0表示,二级用1表示,依此类推……
那么,得出一个客户的所有下级可能这样来
1.num_lasttime相同,表示同一个一级客户
2.mark>该客户的mark
3.num_replied>该客户的num_replied

到这里,得出一个客户的所有上级你也应该知道怎么做了吧

如果你觉得太麻烦,希望像你的数据结构那样,用一个字段来表示隶属关系
我上次已经说过了,那你得学习如何科学高效的进行编码
我们可以来32位的二进制串来表示一个客户代号
比如:
0111 0010 0001 0100 0111 0001 0101 0111
前四位用来表示一级的客户
如果是一级的客户,那他