1

DataTable 列で条件付き SUM を実行しようとしています。以下のコードでは、適切な結果が得られません。

var d = Convert.ToDouble(myDataTable.Compute("SUM(qty_o)", "itemmaster1_id=4636 AND batch=15789")) // returns 0

myDataTable.Select("itemmaster1_id=4636 AND batch=15789") // return 0 rows

「myDataTable」にはフィルター条件「itemmaster1_id=4636 AND batch=15789」を満たすレコードがあり、DataTable ビジュアライザーでデバッグ中に確認できます。

DataTable は、データ入力に使用される DataViewGrid にバインドされます。

助けが必要。

[編集]これについてさらにデバッグと調査を行いました。詳細を共有します。DataTable には 3 つの行があります。myDataTable.Select() を実行すると、3 行が表示されます。フィルター式を使用せずに .Compute を呼び出して列の値を合計すると、適切な結果が得られます。しかし、3行目をフィルタリング(.Select)しようとすると、0行になります。最初の 2 行をフィルタリングしようとすると、完全にうまく機能します。ちなみに、3行目はDataGridViewに入力しています。したがって、問題のデータ行 (3 行目) がコミットされていない可能性があります。しかし、データをデータソース/データテーブルに永続化/コミットするために必要なすべてのことを行っています。これは、正しい結果を返す .Select() 呼び出しと .Compute("SUM(qty_o)", null) 呼び出しによって証明されます。私は混乱しています。

たまたまこの未解決のバグも見ました - http://connect.microsoft.com/VisualStudio/feedback/details/477331/filter-expression-in-datatable-compute-datatable-select-failedとこれ - http:// support.microsoft.com/kb/891742/en-us . これが .NET 4.0 の問題でないことを祈っています。

[2013 年 8 月 22 日編集] 適切な回避策を見つけるのにまだ苦労しています。助けてください。

[2014 年 7 月 16 日編集] この問題が再び発生しました。以下の Datatable Compute メソッドでは、間違った答えが返されます。

double d = Convert.ToDouble(this.DataSourceAsDataTable.Compute("SUM(amount)", "jobtype=1"));

以下のLINQクエリは完全に機能し、正しい答えが得られます。

double n = this.DataSourceAsDataTable
                .AsEnumerable()
                .Where(r => ((r["jobtype"] != DBNull.Value) ? Convert.ToInt32(r["jobtype"]) : 0) == 1)
                .Sum(r => (r["amount"] != DBNull.Value) ? Convert.ToDouble(r["amount"]) : 0);
4

1 に答える 1

0

.Compute のすぐ上に以下のコード行を追加すると、問題は修正されました。

(this.DataSource as BindingSource).EndEdit();

どうやら、グリッド セル (ここでは jobtype 列) のデータは、基になるデータソースにコミットされていません。EndEdit はそのトリックを行いました。

于 2015-06-16T09:14:56.410 に答える