问题描述:
     假如有职员A,旗下发展了10个职员,这10个职员中每个职员所买出的产品的金额必须抽出10%的提成给A职员,,
     而这10个职员的一个职员B,旗下发展了20个职员,这20个职员所买出的产品的金额必须抽出10%的提成给职员B,,以此类推,,
    加入这样连锁反应,每一个职员只要卖出产品,所以职员的提成都发生变化。假如,客户要你做这样的一个数据库统计软件,如何设计表和算法??

解决方案 »

  1.   

    之需要一个职员表,一个明细表职员表将职员代码设置为xx.xx.xx.xx..的掩码格式,每个职员在上一个职员的代码后面加上自己的代码 比如 a旗下b,b旗下c,d
    a:01
    b:0101
    c:010101
    d:010102
    --------------买出产品根据代码长度计算他的深度(级别)在计算各自提成
      

  2.   

    jinjazz(我是jin),你描述的只是编码方式而不是算法,没有道理假定顶级的人只有10个;而且没有道理假定最初是底层的人不会变化为更高等级;何况你的编码没有处理0101101这样的编码是“01.011.01”还是"01.01101”的问题
    跟本不必要设计一个全局的编码,每个人都有一个下线的列表,抽成的时候挨个下线取就好了,下线的销售额还是取自己的下线,这样递归调用,直到没有下线的为止(也就是被坑的人,别给我说人人都有的赚,如果那样永动机早就开发出来了)。想一想你copy一个有多层的文件夹时windows是怎么处理的就明白了。
    再次声明,本人反对传销。传销非法,不知道给传销作软件属于什么性质的行为。
      

  3.   

    xx就最大时10吗?00-zz有多少 36*36不够的话可以xxx,我说的只是个思路而已你也可以说是编码方式,不是算法,但也是数据库表结构设想,如果按你说的每人一个下线表,你不回让你的数据库有10000个表吧,别说你的传销队伍人不可能上那么多..
    你似乎不知道一个数据库表可以和自己做连接查询的..另外这也不是什么递归,这是从下往上计算的而且根据length(id)可以知道产品是被哪一层卖出的,就可以计算它所有上线的提成.....这是个很有意思的题目,只作研究探讨用.不做任何商业行为
      

  4.   

    jinjazz(我是jin) :呵呵,你的编码里首字0不是用来分隔的嘛,也许我理解错了。我知道你说得只是一个思路,不够可以再加。但是万一是开始以为够了,有了几万个人员以后忽然发现要扩充呢?
    根据Length(id)判断哪一层也是不可靠的,比如哪个上线走掉了,有可能号码不变只是少了一个层次而已,更何况每个级别的抽成的规则未必一样,更何况就算一样未必将来一样也未必不会随时改变。
    每人一个下线表,不是说就需要一个数据库中的表啊。照你这么说,如果我要保存一个树行就得每一层建立一个表了?每一个城市都有它的周边城市列表,你要保存地图难道要为每一个城市再建一张周边表?你不是自己都说了嘛,可以和自己连接查询的嘛,每个人记得自己的上线,查一下不就出来了,这是1对1的情况,象城市这样多对多的情况,也就需要一个相邻关系表,每个相邻记录一条就好了。
    对你的回答提出建议主要是不太赞同这种通过精确设定的数据结构和规约来作为程序的构架基础。因为这些都只是根据问题而得到的一个方案而已,但是当人们把注意力完全集中在方案上时,往往会以为方案就是要解决的问题。而在最终方案不合适的时候(比如最初的了解不够全面,或者由于限制条件的变化,最初出于某种权衡而设计的方案在新的情况下显得不适当,甚至无效),由于过于依赖这种假设的约定造成难以应对改变。所以就会悲哀“需求变更”,其实,我觉得以前看到的一句话更有道理“需求很少真的变更,变化的是我们对需求的认识”。因而就要求我们以更加直接的能够表示问题领域的方式建立程序的模型。暴露每个实体对外提供的服务和它在协作中担任的角色,而不是在数据结构上的一个投影。
    你可以自己考虑在这个问题上如果出现变化(或者说是更多了解)的时候,采取不同方式的程序可以适应的程度。比如:用户需要唯一的标识号码,但是级别,上线可能是改变的;可能因为不同的级别以及不同的下线数目,或者不同上线的区域,有不同的分成策略;如果有矩阵式的结构出现,比如针对一个特殊产品的垂直管理……,当然了,这个问题本身并不复杂,这些变化也未必是会发生的。我想说的是不要寄希望于在最初就了解了所有,更不要让你的程序依赖于这种希望。就现在这个问题来说,是一个典型的数据结构和算法的题目。谈不上有意思,更不用说什么挑战了。
      

  5.   

    Procedure OnWorking(Sender: TObject);
    var
      I:TChinese;
    begin
      if not (Sender is TChinese) then exit;
      I:=TChinese(Sender);
      if I.headship=boss then
        I.PlayingGame
      Else
        I.Phone.Call('110');
    end;
      

  6.   

    Procedure OnWorking(Sender: TObject);
    var
      I:TChinese;
    begin
      if not (Sender is TChinese) then exit;
      I:=TChinese(Sender);
      if I.headship=boss then
      begin
        I.CalculateMoney;
        I.PlayingGame;
      end
      Else
        I.Phone.Call('110');
    end;
      

  7.   

    楼上的阿,我们这里讨论问题也不至于就  I.Phone.Call('110') 吧,怕怕
      

  8.   

    A所得的就是 T*(10%)的N次方,B就是T*(10%)的N-1次方,。
      

  9.   

    其实这是打着网络营销的幌子搞传销,
    不过想想传销软件也挺麻烦的,不光是楼主所描述的那样简单,还有哪个下线超过了上线了,这个上线一次性拿多少MONEY了,以后又该如何如何了....
      

  10.   

    这种软件我在5年前就做好了,当时用的FoxPro+UCDOS
    Delphi那个时候几乎没有楼主的设计思想有问题,计算的切入点是从下到上而不是从上到下!
    至于表,一个足已!
    A、B、C、D、E、F、GF发展一个会员和D发展一个会员的提成是不同的,F的会员一路上行的A这样算才正确。其实我在5年前的贴子里都有了,当时那个所谓的TreeView问题其实很容易解决嘛!