2009-08-10 6 views
0

Crystal Reportを使用して、複数のフィールドのどれをフィルタリングするかを選択できます。レコード選択式では、我々は次のようなコードを持っている:いくつかの選択肢が文字列を使用する必要があるため複数の文字列パラメータまたは文字列配列に対して数値フィールドをフィルタリングする方法は?

if {?First Selection Type} = "CUSTOMER CODE" then {foo.CustCode} in {?First Selection Value} 
else if {?First Selection Type} = "ORDER" then {bar.OrderNum} in {?First Selection Value} 
... 

{?First Selection Value}パラメータは、複数の文字列パラメータとして定義されます。

残念ながら、bar.OrderNumフィールドは数値です。

上記のコードを入力しようとすると、Crystal Reportsに「ここに番号範囲が必要です」というエラーが表示されます。

CStr({bar.OrderNum})と入力すると、エラーなしで保存されますが、SQL文を生成するときにその条件が含まれないため、データベースからすべての注文を引き下げてクライアント側で検索するため、パフォーマンスが低下します。私はToNumber({?First Selection Value})またはCDbl({?First Selection Value})置く場合

は、それが「例えば、この配列は添字なければなりません:配列[i]とする。」というエラーを与えます

この基準をデータベースサーバーに送信するには、パラメータをユーザーにとってよりわかりやすくする必要があります。

重要な場合は、Progress OpenEdge 10.1B03データベースに対してCrystal Reports 11.0.0.895を使用しています。

CAST("bar1"."SOrderNum" AS VARCHAR(10)) 

、その後にレコード選択を変更します:少なくとも

if {?First Selection Type} = "CUSTOMER CODE" then {foo.CustCode} in {?First Selection Value} 
else if {?First Selection Type} = "ORDER" then {%OrderNumStr} in {?First Selection Value} 
... 

この私はそれが動作するようです見つけ

答えて

0

ソリューションは、次の式でOrderNumStrという名前のSQL式を作成することですデータベースサーバーがインデックスを使用するのを妨げるものの、サーバー側に条件を送信したので、理想的ではありません。それは以前のやり方よりも大幅なパフォーマンス改善です。

P.S. (私は、データベースの専門家のbarからbar1へのテーブルの名前を変更してSQL式を動作させる必要がありましたが、これはProgress固有のものです)

関連する問題