1

トランザクション テーブルをクエリしているレポートがあります。以下のテーブルを簡略化しました。

CREATE TABLE [dbo].[NL_Trans](
    [NT_PRIMARY] [int] NOT NULL,
    [NT_CODE] [varchar][20] NOT NULL,
    [NT_CAT1] [varchar](6) NOT NULL,
    [NT_CAT2] [varchar](6) NOT NULL,
)

テーブル内のデータは次のようになります。

NT_PRIMARY -- NT_CODE --- NT_CAT1 --- NT_CAT2
---------------------------------------------
      1       AB100         123         234
      2       AB200         124         234
      3       AB300         125         235
      4       AB400         126         235

テーブルには数年のデータがあり、8 つNT_CATのフィールドがあります。これらは varchar として格納された数値です。

クエリを制限するカテゴリの大きなリストがありますが、これをテキストの範囲に制限する方法が見つかりません。これまでのところ、私は試しました:

{NL_Trans.NT_CAT1} IN "124" to "125"

AND

(CDbl ({NL_Trans.NT_CAT1}) IN 124 to 125))

どちらも結果を返しません。

場合によっては範囲が 100 項目を超えるため、OR ステートメントの大きなリストを使用することはできません。つまり、何千行も必要になります。

誰かが機能する代替手段を提供できますか(可能であればCatagoriesインデックスを活用します)、または上記のステートメントのいずれかが機能しない理由を教えてください。

4

2 に答える 2

1

まず第一に、Crystal が のようなステートメントを評価することを信頼することはできません"5" in "1" to "10"。これらの比較の根拠はわかりませんが、先頭の数字のASCII値などに基づいていると思います。

そうは言っても、double への変換は機能するはずです... NT_CAT フィールドに数字以外の文字が含まれている可能性はありますか? レコード選択式で次のようなことを試して、うまくいくかどうかを確認してください。

if not(isnull({NL_TRANS.NT_CAT1})) and isnumeric({NL_TRANS.NT_CAT1}) then cdbl({NL_TRANS.NT_CAT1}) in 124 to 125

これの欠点は、Crystal が SQL Server で処理される WHERE 句にこれを追加せず、代わりにローカル マシンで選択を行うことです。このパフォーマンス ヒットを回避するために、Crystal で文字列から数値への変換を行う SQL 式を作成できます。私は TSQL を使用しないので、Crystal コード スニペットを TSQL に変換しようとはしませんが、SQL 式 {%ConvertCAT1ToNumeric} を作成した場合は、選択式でこれを使用できます。

not(isnull({%ConvertCAT1ToNumeric})) and {%ConvertCAT1ToNumeric} in 124 to 125

幸運を。

于 2012-05-12T16:44:48.587 に答える
0

これを試して。

基準タイプの1つである**これらの行を削除します。**{NL_Trans.NT_CAT1}IN"124"から"125"までの範囲を探している可能性があります**AND

これを選択基準に入れるだけですが、最初に、数値範囲の数式に別のフィールドを選択し、数式全体をコピーして、新しい条件を作成してみてください。フィールドの名前を適切な名前に変更して、レポートを実行します。(最初に行ったダミー基準を削除することを忘れないでください)

オリジナル:(CDbl({NL_Trans.NT_CAT1})IN 124〜125))

これは、数値の範囲を計算する式だと思います(CDbl({NL_Trans.NT_CAT1})124〜125))

于 2012-05-12T05:14:13.873 に答える