2016-07-27 18 views
0

的如何比較值我想驗證兩個數據表數量列。下面給出的是示例數據表。我想利用每一個項目的數量總和從dtItems,並與同一項目的dtMasterItem的數量進行比較。如果dtItems數量變得比dtMasterItem更大量的話,我想表現出像可用數量的消息是1000 itemcode2分數據表列

dtMasterItem

ItemCode  Quantity 

    A   3000  
    B   5000  
    C   6000 

dtItems

ItemCode  Quantity 

    A   2000 
    A   1000 
    A   500 
    B   3000 
    B   2000 
    C   6000 

按我的邏輯,如果我們確認上述表中的數據輸出會像可用數量是3000一個

+0

是不是也許500可用? (2000 + 1000 + 500)-3000 – Neil

+0

如果你在這裏嘗試了一些你已經嘗試過的代碼,會更容易。 – Ash

回答

3

你的問題不說清楚,但據我從它的理解這應該爲你做。

 foreach (DataRow rowMasterItems in dtMasterItem.Rows) 
     { 
      int lintSumOfItems = 0; 
      foreach (DataRow rowItems in dtItems.Rows) 
      { 
       if (rowMasterItems["ItemCode"].ToString().Equals(rowItems["ItemCode"].ToString())) 
       { 
        lintSumOfItems += Convert.ToInt16(rowItems["Quantity"]); 
       } 
      } 
      if (Convert.ToInt16(rowMasterItems["Quantity"]) >= lintSumOfItems) 
       MessageBox.Show("OK"); 
      else 
       MessageBox.Show("Available quantity is " + Convert.ToInt16(rowMasterItems["Quantity"]) + " for itemcode: " + rowMasterItems["ItemCode"].ToString()); 
     } 
1

試試這個代碼,它的工作對我來說:

 DataTable dt1 = new DataTable(); 
     DataTable dt2 = new DataTable(); 
     dt1.Columns.Add("ItemCode", typeof(string)); 
     dt1.Columns.Add("Quantity", typeof(int)); 
     dt2.Columns.Add("ItemCode", typeof(string)); 
     dt2.Columns.Add("Quantity", typeof(int)); 
     dt1.Rows.Add("A", 3000); 
     dt1.Rows.Add("B", 5000); 
     dt1.Rows.Add("C", 6000); 
     dt2.Rows.Add("A", 2000); 
     dt2.Rows.Add("A", 1000); 
     dt2.Rows.Add("A", 500); 
     dt2.Rows.Add("B", 3000); 
     dt2.Rows.Add("B", 2000); 
     dt2.Rows.Add("c", 6000); 

     var query = from row in dt2.AsEnumerable() 
        group row by row.Field<string>("ItemCode") into grp 
        select new 
        { 
         ItemCode = grp.Key, 
         Quantity = grp.Sum(r => r.Field<int>("Quantity")) 
        }; 
     int i = 0; 
     foreach (var item in query) 
     { 
      if (Convert.ToInt32(item.Quantity) > Convert.ToInt32(dt1.Rows[i]["Quantity"])) 
      { 
       Console.WriteLine("Available quantity is "+ dt1.Rows[i]["Quantity"].ToString()+ " for "+item.ItemCode); 
      } 
      i++; 
     } 

     Console.Read(); 
1

試試這個使用LINQ查詢

DataTable dt1 = new DataTable("dtMasterItem"); 
    dt1.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = "ItemCode" }); 
    dt1.Columns.Add(new DataColumn() { DataType = typeof(int), ColumnName = "Quantity" }); 

    DataTable dt2 = new DataTable("dtItems"); 
    dt2.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = "ItemCode" }); 
    dt2.Columns.Add(new DataColumn() { DataType = typeof(int), ColumnName = "Quantity" }); 

    dt1.Rows.Add("A", 3000); 
    dt1.Rows.Add("B", 5000); 
    dt1.Rows.Add("C", 6000); 

    dt2.Rows.Add("A", 2000); 
    dt2.Rows.Add("A", 1000); 
    dt2.Rows.Add("A", 500); 
    dt2.Rows.Add("B", 3000); 
    dt2.Rows.Add("B", 2000); 
    dt2.Rows.Add("C", 6000); 

    var result = (from k in 
        (from x in dt2.AsEnumerable() 
          group x by x["ItemCode"] into entryGroup 
          select new 
          { 
           ItemCode = entryGroup.Key, 
           Quantity = entryGroup.Sum(i => Convert.ToInt32(i["Quantity"])) 
          }) 
         join y in dt1.AsEnumerable() on k.ItemCode equals y["ItemCode"] into DataGroup 
         from item in DataGroup.DefaultIfEmpty() 
         select new 
         { 
          ItemCode = k.ItemCode, 
          Q1 = k.Quantity, 
          Q2 = item["Quantity"], 
          Remarks = Convert.ToInt32(item["Quantity"]) < k.Quantity ? "Available quantity is " + k.Quantity + " for " + k.ItemCode : null 
         }).AsEnumerable().Where(i => i.Remarks != null); 

輸出:

enter image description here