3

これは私が評価しようとしている式です:

Sum(IIF(QUALITY<=9.0,1.0,0.0))

問題はそれです

string expr = "Sum(IIF(QUALITY<=9.0,1.0,0.0))";
dataTable.Compute(expr, "")

エラーをスローします

Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.


主な課題は、式がRDLファイルから文字列でプログラムに送られるため、式を手動で書き直すことができないことです。そのため、元々は次のようになります。

Sum(IIF(Fields!QUALITY.Value<=9.0,1.0,0.0))

私のプログラムは、それをに渡されたときに有効な式となる文字列に自動的に変換する必要がありますdataTable.Compute()。マイクロソフトのComputeメソッドのドキュメントから、C#は「フィールド」が気に入らないと判断しました。または構文の「.Value」部分。これらを削除することで、より単純な式が正常に機能するようになります。たとえば、これらのステートメントは両方とも期待値を返します。

dataTable.Compute("Sum(QUALITY)");
dataTable.Compute("Count(QUALITY)");


私がやろうとしていることをすることは可能ですか?それが機能するためには、どこかで構文を少し変更する必要があるように感じますが、インターネットで答えを見つけることができず、かなりイライラしています。

これが私がこれまでに試したことのいくつかですが、役に立ちませんでした:

Sum(IIF([QUALITY]<=9.0,1.0,0.0))
Sum(Convert(IIF(QUALITY<=9.0,1.0,0.0), 'System.Double'))
Sum(IIF(Convert(QUALITY, 'System.Double')<=9.0,1.0,0.0))    
4

2 に答える 2

5

DataTableこれを行う 1 つの方法は、[式] を に設定して集計列を に追加することIIF(QUALITY<=9.0,1.0,0.0)です。

dataTable.Columns.Add("AggregateColumn", typeof(double), "IIF(QUALITY<=9.0,1.0,0.0)");

次に、集計列を合計またはカウントします。

于 2012-07-05T20:49:48.367 に答える
2

IIF(condition, value1, value2)が true のvalue1場合を返し、そうでない場合は返します。したがって、元のステートメントは、値 <= 9 のすべてのフィールドの数をカウントします。これを達成するために、パラメーターを含むオーバーロードを使用できます。conditionvalue2Qualityfilter

dataTable.Compute("Count(QUALITY)","QUALITY <= 9");

MSDN ドキュメント

編集:最初のラウンドで動的要件を逃しました。

このエラーは、IIF がこれを 2 列操作にし、Compute集計関数内で 2 列操作を許可しないために発生します。それCompute("IIF(Quality <= 9, 1, 0)")は有効ですが、そうでCompute("Sum(IIF(Quality <= 9, 1, 0))")はありません。IIF(Quality <= 9, Quality, SomeOtherColumn)の後の 2 つの引数としてリテラルの代わりに使用できますがIIF、パーサーはその違いを認識していないようです。

Joe のソリューションを使用するか、さらに文字列処理を追加して条件を分離し、それらをフィルター パラメーターに移動することができます。ジョーの答えは、 の舞台裏で行われる文字列解析を再実装しようとするよりもはるかに賢明ですCompute

于 2012-07-05T20:39:46.047 に答える