2012-01-26 7 views
0

私は、実際の予算と比較して分散を示す簡単な財務テーブルを作成しようとしています。どのようにして2つのデータセット間の分散を得ることができますか?

**Variance** 
ID   Revenue 
1   -20 
2   +20 

これは私が今の私の二つのテーブルのセットアップを得た方法である:

 // Make the Actual table 
     DataTable allActual = new DataTable("actualTable"); 
     DataRow rowActual; 

     // Create columns and add to the DataTable. 
     allActual.Columns.Add("Title", typeof(string)); 
     allActual.Columns.Add("Revenue", typeof(string)); 

     // Add rows to the Actual grid 
     foreach (SPListItem item in actualItems) 
     { 
      rowActual = allActual.Rows.Add(); 
      rowActual["Title"] = item["Title"].ToString(); 
      rowActual["Revenue"] = item["Revenue"].ToString(); 
     } 


     // Make the Budget table 
     DataTable allBudget = new DataTable("budgetTable"); 
     DataRow rowBudget; 

     // Create columns and add to the DataTable. 
     allBudget.Columns.Add("Title", typeof(string)); 
     allBudget.Columns.Add("Revenue", typeof(string)); 

     // Add rows to the Actual grid 
     foreach (SPListItem item in budgetItems) 
     { 
      rowBudget = allBudget.Rows.Add(); 
      rowBudget["Title"] = item["Title"].ToString(); 
      rowBudget["Revenue"] = item["Revenue"].ToString(); 
     } 

は、私は私を指し内の任意の助けをいただければ幸いです

**Actual** 
ID   Revenue 
1   100 
2   120 

**Budget** 
ID   Revenue 
1   120 
2   100 

比べたら、それは私にこのテーブルを与えます正しい答えに。ありがとう。

+0

減算を行うには、データベースでビューを作成することはどうですか? –

+0

データはSharePointリスト内に保持されます。 – regularroutine

答えて

1

あなたは違いを取得するためにLINQツーDataSetを使用することができます

編集:ここで辞書 - アプローチのC#バージョンが(この匿名型のリストを取得するには、単純なToListを使用)です。

var diff = (from aRow in tblActual.AsEnumerable() 
      join bRow in tblBudget.AsEnumerable() 
      on aRow["ID"] equals bRow["ID"] 
      let aRev = (int)aRow["Revenue"] 
      let bRev = (int)bRow["Revenue"] 
      where aRev != bRev 
      select new 
      { 
       ID = (int)aRow["ID"], 
       Diff = aRev - bRev 
      }).ToDictionary(r => r.ID, r=> r.Diff); 

VB.NET:

Dim diff = (From aRow In tblActual 
      Join bRow In tblBudget _ 
      On aRow("ID") Equals bRow("ID") 
      Let aRev = DirectCast(aRow("Revenue"), Int32) 
      Let bRev = DirectCast(bRow("Revenue"), Int32) 
      Where aRev <> bRev 
      Select New With {.ID = DirectCast(aRow("ID"), Int32), 
          .Diff = aRev - bRev}).ToList 


For Each d In diff 
    Dim id = d.ID 
    Dim revDifference = d.Diff 
Next 

それとも、diffeを検索したい場合は(のInt32の、Int32)をDictioaryを作成指定されたIDのrence:

Dim diff = (From aRow In tblActual 
      Join bRow In tblBudget _ 
      On aRow("ID") Equals bRow("ID") 
      Let aRev = DirectCast(aRow("Revenue"), Int32) 
      Let bRev = DirectCast(bRow("Revenue"), Int32) 
      Where aRev <> bRev 
      Select New With {.ID = DirectCast(aRow("ID"), Int32), 
          .Diff = aRev - bRev}). 
          ToDictionary(Function(r) (r.ID), 
             Function(r) (r.Diff)) 

' returns diff for a given ID ' 
Dim diffForID2 = diff(2) 
' iterate all dictionary entries ' 
For Each d In diff 
    Dim id = d.Key 
    Dim revDifference = d.Value 
Next 
+0

ありがとうございます。私はC#でこれを書く方法を知らないので、私はこの答えを受け入れることができません。 – regularroutine

+0

@David:一般的なツールではできませんが、C#への翻訳を試みることができます。 –

+0

@David:私の編集を参照してください。 –

0

実績と予算の間にまっすぐ進む1対1の関係は、各リスト項目を読みながら、なぜ計算を実行しないと仮定すると、一覧表示されますか?ここにいくつかの疑似コードがあります:

//actuals contains all the list items from the Actuals list 
//budget contains all the list items from the Budget list 
//variance is an array of numbers with the same length as the actuals list 
for (i=0; i<actuals.length; i++) 
{ 
diff = actuals[i].value - budget[i].value; 
variance[i] = diff; 
} 
関連する問題