2010-03-27 39 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  | 
_____________________________________________________________________________