1

私は rdl レポートを作成しています。3 つのチェック ボックスがあり、チェックした場合は WHERE ステートメントを変更する必要があります。何もチェックされていない場合、結果は日付範囲でのみ一致するはずです。1 つ以上がチェックされている場合、文字列に対応する変数に一致するフィールドを返す必要があります。

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND (((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
AND ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
AND ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)) 

これまでの私のコードは、何もチェックされていない場合とチェックされている場合に機能しますが、複数のチェックボックスがチェックされている場合は何も返しません。これを修正するために、コードを次のように変更しました

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND ((((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)))

その結果、選択されたものに関係なく、すべての行が返されました。誰かが私が間違っているところを教えてもらえますか?

4

3 に答える 3

1

これは正しい再編成だと思います。最初に表示されるよりもトリッキーな問題。問題は、((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)withのように行を区切るANDことで、2 つの include が true の場合、行に両方PrefixIdの 's が必要であり、これは起こり得ません。そして、それらを で区切った場合OR、false を 1 つだけ含めることは、すべての行がパスすることを意味します。代わりに、含まれているすべてのプレフィックスが行にあることを確認してください。そうでない場合は、すべてのインクルードをオフにする必要があります。

WHERE EffectiveDate BETWEEN @StartDate AND @EndDate
AND 
(
    (@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR
    (@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR 
    (@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR
    (@IncludeSEWPrefix = 0 AND @IncludePAWPrefix = 0 AND @IncludeRPLPrefix = 0)
)
于 2012-07-17T12:38:52.707 に答える
0

必要以上の括弧があります。害はありませんが、注意してください。多分これは助けることができます:

WHERE (EffectiveDate BETWEEN @StartDate AND @EndDate) 
    AND (   ((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR (@IncludeSEWPrefix = 0 AND @PrefixId <> 'SEW'))
        OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR (@IncludePAWPrefix = 0 AND @PrefixId <> 'PAW'))
        OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR (@IncludeRPLPrefix = 0 AND @PrefixId <> 'RPL'))
        )
于 2012-07-17T10:35:22.117 に答える
0

これを試して

WHERE  
(EffectiveDate BETWEEN @StartDate AND @EndDate)  
AND 
(
(@IncludeSEWPrefix = 1 AND PrefixId = 'SEW' OR @IncludeSEWPrefix = 0) AND 
(@IncludePAWPrefix = 1 AND PrefixId = 'PAW' OR @IncludePAWPrefix = 0) AND 
(@IncludeRPLPrefix = 1 AND PrefixId = 'RPL' OR @IncludeRPLPrefix = 0)
)  
于 2012-07-17T10:23:34.307 に答える