Как отфильтровать числовое поле по множественному строковому параметру или массиву строк?

У нас есть 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]".

Мне нужен какой-то способ передать эти критерии на сервер базы данных, не делая параметры более запутанными для пользователей.

Если это имеет значение, мы используем Crystal Reports 11.0.0.895 для базы данных Progress OpenEdge 10.1B03.


person LeBleu    schedule 10.08.2009    source источник


Ответы (1)


Решение, которое я нашел, которое, кажется, работает, состоит в том, чтобы создать выражение SQL с именем OrderNumStr со следующим выражением:

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}
 ...

Это, по крайней мере, отправило критерии на серверную сторону, хотя это не позволяет серверу базы данных использовать индексы, поэтому это не идеально. Это все еще значительное улучшение производительности по сравнению с тем, что было раньше.

P.S. (Мне нужно было переименовать таблицу из bar в bar1 в эксперте по базам данных, чтобы выражение SQL заработало. Хотя это может быть специфично для Progress.)

person LeBleu    schedule 10.08.2009