1

一部の列に NULL 値があるデータ リポジトリに対してレポートを作成しています。問題は、表現の構築がホルモンのおばあさんのように気まぐれであり、機能の混合が気に入らないことです。

フィールド内のデータが null または何もない場合に機能しない、私が書いた式を次に示します。

=IIF(
    IsNumeric(Fields!ADataField.Value),
    RunningValue(
        IIF(
            DatePart("q", Fields!CreatedOn.Value) = "2",
            Fields!ADataField.Value,
            0
        ),
    Sum,
    Nothing
    ),
    Sum(0)
)

(疑似コード) 「データが有効で、そのデータがその年の第 2 四半期に作成されたものである場合は、それを全体の合計に追加します。そうでない場合は、合計にゼロを追加します。」

かなりまっすぐに見えます。そして、表現の個々の部分はそれ自体で機能します。IE: IsNumeric()、DatePart() など。しかし、それらをすべてまとめると、式でエラーがスローされます。

上に示したもののすべての順列を試みましたが、すべて役に立ちませんでした。Fields!ADataField.Value に Null 値があると、エラーが発生します。

生成された特定のエラー:

「textrun の値式 '' は、数値ではないデータに対して数値集計関数を使用しています。数値集計関数 (Sum、Avg、StDev、Var、StDevP、および VarP) は、数値データのみを集計できます。」

考え?

4

4 に答える 4

1

これを使用してみてください:

=SUM(IIF(ISNothing(Fields!ADataField.Value), 0, 
(IIF(IsNumeric(Fields!ADataField.Value), IIF(DatePart("q", Fields!CreatedOn.Value) = "2", Fields!ADataField.Value, 0), 0)
)))
于 2012-12-11T15:33:43.220 に答える
1

次を使用して発生するNULL値を処理できます。

Iif(Fields!ADataField.Value Is Nothing, 0, Fields!ADataField.Value)

そうすれば、任意のNull値を別の値(上記の例では0)に置き換えることができます。これを表現のコンテキストに入れるには、次のようになります。

=Iif(Fields!ADataField.Value Is Nothing,0,
    RunningValue(
        IIF(
            DatePart("q", Fields!CreatedOn.Value) = "2",
            Fields!ADataField.Value,
            0
        ),
    Sum,
    Nothing
    )
)
于 2012-12-11T15:35:26.520 に答える
1

SSRS の式の VB は短絡評価を行いません。つまり、ステートメントの3 つのパラメーターすべてIIFが評価され、それらのいずれかが例外 ( #Error) をスローすると、式全体でエラーがスローされます)。

したがって、ADataField の値が何であれ、この部分が評価されます。

RunningValue(
        IIF(
            DatePart("q", Fields!CreatedOn.Value) = "2",
            Fields!ADataField.Value,
            0
        ),
    Sum,
    Nothing
    ),

これは、コードIsNumeric(Fields!ADataField.Value)が falseの場合など、結果を返す方法がない場合でも発生します。

そのため、常に RunningValue 関数を実行することになります。CreatedOn フィールドが第 2 四半期にあるときに ADataField に数値以外のデータがあると、すべての呼び出しでエラーが発生します。

代わりにこれを試してください:

=IIF(
    IsNumeric(Fields!ADataField.Value),
    RunningValue(
        IIF(
            DatePart("q", Fields!CreatedOn.Value) = "2"
              AND IsNumeric(Fields!ADataField.Value),
            Fields!ADataField.Value,
            0
        ),
    Sum,
    Nothing
    ),
    Sum(0)
)
于 2012-12-11T15:49:17.923 に答える
0

わかりました。私は解決策を考え出しました。すべての素晴らしい提案に感謝します。それらのほとんどは、ここに投稿する前にすでに試していました。したがって、健全性チェックは非常に価値がありました。

なんらかの非論理的な理由で、これを修正したのは、フィールドが既に数値であることが確認された後でも、CInt() でフィールドをラップしていたことです。これがないと、フィールドに対して Sum() を実行できません。最終的に取ったコードは次のとおりです。

=Sum(
    IIF(
        IsNumeric(Fields!ADataField.Value) And
        DatePart("q", Fields!createdon.Value) = "1",
        CInt(Fields!ADataField.Value),
        0
    )
)

ここで試したすべての順列 (RunningValue() を含む順列を含む) はすべて、IIF() の「真」の部分を CInt() でラップした後に機能します。

なぜこれが機能するのか、それなしではうまくいかない理由を私に教えないでください。最も基本的な表現以外は、常に非常に気まぐれに見えます。

ありがとうございました。回答済みの質問は、チャット中にさらに一歩進んだ GShenanigan に送られます。でもみんなにあげたらいいのに。あなたたちは素晴らしいです。

于 2012-12-11T18:57:54.580 に答える