2010-03-27 2 views
0

Я разрабатываю небольшое программное обеспечение в C# WPF для консалтинга, который делает бизнес цепочки. У меня есть кодовая древовидная структура, чтобы показать, кто кого называет. Теперь у него есть комиссия в зависимости от уровня. Если 1 указано 2 & 3, то 1 получит комиссию уровня 1. Если 2 указано 4, 5 & 3, то 6, 7, затем 1 получит комиссию уровня 2. Эта цепочка будет продолжаться до определенного общего числа. Моя проблема заключается в том, как я буду реализовывать эту логику; Я могу рассчитать, кто указал, сколько членов через UDF написано для добавления TreeViewItem в TreeView. Или скажите мне, как я могу подсчитать элементы в древовидной структуре определенного уровня? Узел добавления UDF:Как рассчитать комиссию на основе упомянутых memebrs?

Я использую MySQL и имеет элементы таблицы, которые состоят из столбцов - id, fullname, 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

ответ

1

Вычисление такого рода вещей путем подсчета узлов в древовидной структуре довольно глупо, вы будете выполнять вычисления после привязки его к элементу пользовательского интерфейса.

В данном конкретном случае, я тоже не любитель делать это с помощью LINQ, в то время как LINQ будет делать это очень хорошо, он имеет следующие недостатки:

  • вы должны позволить серверу базы данных выполните тяжелая работа , где это возможно, это то, что он для
  • , если уровни будут добавлены или изменены на каком-то этапе в будущем, это означает, что у вас есть еще несколько мест, которые нужно рефакторинга
  • может быть проще раскатать изменение в хранимой программе базы данных, чем изменение скомпилированного кода

Вы не указали, какую базу данных вы используете, я собираюсь взять 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 для каждого уровня 2 направления:

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 

Все, что я сделать, это соединить таблицу на себя для каждого возможного уровня комиссии, если вы должны были ввести комиссию для рефералов 3-го уровня, то вы бы просто добавить еще один присоединиться.

Если вы запустите это утверждение, вы заметите, что у 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  | 
_____________________________________________________________________________ 
Смежные вопросы