2012-07-17 75 views
0

我正在開發一個連鎖餐廳的程序,他們通常應該能夠通過連接到dbf文件的vb.net應用程序來計算其客人數和銷售額。 我的數據集被正確填寫,正如我的數據表(通過填寫datarowview =正確的數據檢查) 但是,然後我遇到了一個問題,在我的所有函數使用我的數據表,數據表跳過最後的值,在這種情況下,它是所有值從一個月,所以它可以跳過31或第30天。 嘗試while,嘗試每個,調試很多(我怎麼發現它是最後一個值)。但現在我不知道爲什麼最後的值不使用功能函數不讀取最後一個值

Public Function Getgctakeout(ByVal i_table As DataTable) 
     table = i_table 
     i = 0 
     gctakeout = 0 

    For Each row As DataRow In i_table.Rows 

     gctakeout = gctakeout + Convert.ToDouble(row(4)) 

    Next row 
     'MessageBox.Show(gctakeout) 
    Return gctakeout 
    End Function 

此功能不使用最後一行的值來計算gctakeout

在什麼名字的主人是錯誤:)

+0

你的代碼看起來很好,'For Each'應該確保每一行都被迭代。當你調試它不循環表中的最後一行? – ipr101 2012-07-17 12:30:33

+1

Nothig在此代碼中出錯。唯一可能的原因是傳入的i_table。在循環之前檢查i_table.Rows.Count。此外,空值可能會觸發異常。 – Steve 2012-07-17 12:30:57

+0

我不同意以前的評論,我不認爲這段代碼看起來不錯。當你在最後返回總和時,你爲什麼使用類成員變量來進行計算?您還缺少函數的返回類型。總而言之,這個函數看起來可能會有很多'副作用',特別是如果你的應用程序有任何併發​​的話。 – 2012-07-17 12:46:14

回答

0

假設您的DataTable確實填寫正確,您有兩個其他選項可以獲得總和。

  1. 使用舊DataTable.Compute方法與.NET < 2.0
  2. 也適用使用Linq-To-DatSet,它的Enumerable.Sum

1)

Dim Sum = CType(table.Compute("Sum(ColumnName)", Nothing), Double) 

2)

Dim Sum = table.AsEnumerable(). 
       Sum(Function(row)row.Field(Of Double)("ColumnName")) 
相關問題