层次百分比的计算(1)

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明

作者:xixi

出处:http://blog.csdn.net/slowgrace/archive/2009/04/16/4084636.aspx

一、什么是层次百分比

举个例子吧,比如:所购买的商品,大类里分中类,中类里分小类,小类里又分小小类,如此不停地细分下去,最后最底层是具体的商品和购买金额。用户问
      a)共花了多少钱,各大类各花了多少,占总开销的百分比是多少?
      b)每个大类里各中类又各花了多少,占该大类总开销的百分比是多少?
      c)每个中类里各小类又各花了多少,占该中类总开销的百分比是多少?
      d)每个小类里各小小类又各花了多少,占该小类总开销的百分比是多少?
      ......

这些问题可以一直问下去,对每个层次的节点都希望知道它占对应的上一层次的父节点的总和金额的百分比。这就是我说的层次化百分比的含义。

这里面要进行百分比计算的基础数据是层次化的,可以形象地把它们想象成一棵树。父节点是上一层的类别,子节点是下一层的类别。现在要求出每个节点占自己的父节点的百分比。注意,这里除了最底层的叶子节点(也就是基础节点),其它节点实际上是没有自己的金额数据的,它的金额数据实际上是所有属于它这个类别的商品(也就是叶子节点)的金额的总计。

 

二、计算层次百分比的基本思路

可以一次性地通过递归把所有节点的百分比计算出来,并把结果保存在数据库里,然后在程序运行期间根据用户的输入动态地维护这些值。这里面主要涉及两个计算过程:一个是一开始的一次性全计算,一个是之后的动态维护。理论上,一次性全计算就运行一次,之后就用动态维护进行维护就行了。不过,难免有程序上的bug或这样那样的特别情况,导致数据不正确了,这时候就调用一次性全计算整体刷新一下金额数据就可以了。所以用户界面上要安排一个菜单什么的,供用户要求进行一次性全计算;而动态维护的计算则是全自动地进行的。在后面的小节将详细分析这两个过程。

 

三、和层次百分比相关的数据结构

数据库的节点表里有两个字段:一个是金额字段sngValue,用来记录本节点的所有子节点的金额之和;一个是百分比字段sngPercent,用来记录本节点的金额占父节点金额的百分比。为了让所有节点的总金额有地方存放,于是在表中加一个虚拟的根节点,作为lngNodeId为1的节点,其sngValue存的是所有节点的总金额,sngPercent为100%,lngFatherId为0,节点名为该节点表名。

在基础类型的节点细节表里也加入一个sngValue字段,用来记录基础节点的金额。

另外,treeview节点的text也相应的加上金额标志位百分比标志位,形式为:名字=金额=百分比。如:名字=98=1%。另外CTreeCtl加2个布尔型的类成员变量,用来指示是否显示金额和百分比,当这两个变量全为false时,则不需要动态维护层次百分比。

 

四、百分比一次性计算的迭代过程

从根节点开始,把它的所有孩子的金额加起来,得到自己的金额;然后计算并设置自己的每个孩子的百分比(孩子的金额/自己的金额)。其中,孩子的金额的得到是一个递归调用,这样层层迭代下去,直到没有孩子的叶子节点,它们的金额等于0(非基础节点)或者等于节点细节表里得到的金额(基础节点)。

(未完待续)

更多树类文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值