2010-03-27 20 views
0

我正在C#WPF中开发一个小型软件,以进行链系统业务咨询。我编码树结构来显示谁引荐谁。现在它已经根据等级进行了佣金。如果1指2 & 3则1将获得1级佣金。如果2指的是4,那么5指的是6,那么1就会得到2级的佣金。这个链将继续到一定的总数。我的问题是我如何实现这个逻辑;我能够计算谁已经通过UDF编写了将TreeViewItem添加到TreeView的成员数量。或者告诉我如何在特定级别的树视图中计数项目? 添加UDF的节点:如何根据推荐的memebrs计算commision?

我使用MySQL,它有表成员,其中包括列id,全名,refercode。

public void AddNodes(int uid, TreeViewItem tSubNode) 
    { 
     string query = "select fullname, id from members where refCode=" + uid + ";"; 
     MySqlCommand cmd = new MySqlCommand(query, db.conn); 
     MySqlDataAdapter _DA = new MySqlDataAdapter(cmd); 
     DataTable _DT = new DataTable(); 
     tSubNode.IsExpanded = true; 
     _DA.Fill(_DT); 

     foreach (DataRow _dr in _DT.Rows) 
     { 
      TreeViewItem tNode = new TreeViewItem();     
      tNode.Header = _dr["fullname"].ToString()+" ("+_dr["id"].ToString()+")";     
      tSubNode.Items.Add(tNode); 

      if (db.HasMembers(Convert.ToInt32(_dr["id"].ToString()))) 
      { 
       AddNodes(Convert.ToInt32(_dr["id"]), tNode); 
      } 
     } 
     //This line tracks who has referred how many members 
     Console.WriteLine("Tree node Count : "+tSubNode.Items.Count.ToString()+", UID "+uid);      
    } 

请帮助我!!!!

+1

为什么要在这里重新发明轮子?您正在使用.net 3.5+,并且应该尝试使用LINQ to SQL,以便为您构建正确的模型。您的问题的答案是递归导航成员佣金树。 – xandy 2010-03-27 06:52:45

回答

1

通过计算treeview中的节点来计算这种事情是非常愚蠢的,你将在绑定到UI元素后进行计算。

在这种特殊情况下,我也没有使用LINQ做它的粉丝,而LINQ会做的非常好,它有以下缺点:

  • 你应该让数据库服务器做拼搏如果可能的话,它是什么它是
  • 如果水平增加或在未来的某个阶段改变,这意味着你有几个是需要重构
  • 多个位置可以更容易推出一个更改为数据库存储过程,而不是编译代码
  • 01的更改

你还没有指定你正在使用的数据库,我将假设SQL。 如果您有人员名称和谁引用他们在数据库中的自引用表中的关键,您应该很容易能够计算出来。

你的表格看起来就像这样:

int    RecordID 
varchar(100) Name 
int    ReferrerID 

那么对于数据会看起来像这样(用你的例子从上面):

_______________________________________________ 
| RecordID | Name    | ReferrerID | 
_______________________________________________ 
|  1 | Person 1   |  null | 
|  2 | Person 2   |   1 | 
|  3 | Person 3   |   1 | 
|  4 | Person 4   |   2 | 
|  5 | Person 5   |   2 | 
|  6 | Person 6   |   3 | 
|  7 | Person 7   |   3 | 
_______________________________________________ 

我也将使用一个表称为Levels包含每个级别的佣金数额。在这个表我对每个二级转诊分配0.50每级1转介,和0.25:

int LevelID 
money LevelAmount 

现在用你的自我引用表,就可以计算出你通过加入它需要的1级和2级本身两次。这个SQL会给你的初始表:

SELECT p.RecordID 
     ,p.PersonName 
     ,Level1Referral.PersonName 
     ,Level1Commission.LevelAmount   
     ,Level2Referral.PersonName 
     ,Level2Commission.LevelAmount 
FROM People p 
    LEFT JOIN People Level1Referral 
    ON Level1Referral.ReferrerID = p.RecordID 
    LEFT JOIN Levels Level1Commission 
     ON Level1Referral.ReferrerID IS NOT NULL 
       AND Level1Commission.LevelID = 1 
    LEFT JOIN People Level2Referral 
    ON Level2Referral.ReferrerID = Level1Referral.RecordID 
    LEFT JOIN Levels Level2Commission 
     ON Level2Referral.ReferrerID IS NOT NULL 
       AND Level2Commission.LevelID = 2 

我要做的就是加入了桌子上本身对每个可能的佣金水平,如果你要引入一个委员会第三级转介,你想补充另一个加盟。

如果您运行此声明,您会注意到虽然Level1Referral.PersonName对于每个2级推介都有重复条目,但这并不是最优的,并且不容易将其与分组排除在外。然而,我们可以做的是有一个周围的SELECT语句并对其应用一些分组,并在此过程中计算每个级别的佣金数量。下面是最后一条SQL语句,它可以满足你的需求:

SELECT CommissionEarnerID 
    ,CommissionEarnerName 
    ,COUNT(DISTINCT L1Referral)   AS [Number Of L1 Referrals] 
    ,COUNT(DISTINCT L1Referral) 
     * (SELECT LevelAmount 
      FROM Levels 
      WHERE LevelID = 1)   AS [Level 1 Commission] 
    ,COUNT(DISTINCT L2Referral)   AS [Number Of L2 Referrals] 
    ,COUNT(DISTINCT L2Referral) 
     * (SELECT LevelAmount 
      FROM Levels 
      WHERE LevelID = 2)   AS [Level 2 Commission] 
FROM (

    SELECT p.RecordID     AS CommissionEarnerID 
      ,p.PersonName    AS CommissionEarnerName 
      ,Level1Referral.RecordID AS L1Referral 
      ,Level1Referral.PersonName AS L1ReferralName 
      ,Level2Referral.RecordID AS L2Referral 
      ,Level2Referral.PersonName AS L2ReferralName 
    FROM People p 
     LEFT JOIN People Level1Referral 
      ON Level1Referral.ReferrerID = p.RecordID 

     LEFT JOIN People Level2Referral 
      ON Level2Referral.ReferrerID = Level1Referral.RecordID 
    ) x 
GROUP BY  CommissionEarnerID 
      ,CommissionEarnerName    

我整理了一下这个声明,并加入了一些列名。这产生如下结果集:

_____________________________________________________________________________ 
| Commission | Commission | Number | Level 1 | Number | Level 2 | 
| Earner ID | Earner  | of L1  | Commission | of L2  | Commission | 
|   | Name  | Referrals |   | Referrals |   | 
_____________________________________________________________________________ 
| 1   | Person 1 | 2  | 1.00  | 4  | 1.00  | 
| 2   | Person 2 | 2  | 1.00  | 0  | 0.00  | 
| 3   | Person 3 | 2  | 1.00  | 0  | 0.00  | 
| 4   | Person 4 | 0  | 0.00  | 0  | 0.00  | 
| 5   | Person 5 | 0  | 0.00  | 0  | 0.00  | 
| 6   | Person 6 | 0  | 0.00  | 0  | 0.00  | 
| 7   | Person 7 | 0  | 0.00  | 0  | 0.00  | 
_____________________________________________________________________________