我们有一个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})
,则会出现错误“此数组必须下标。例如:Array [i]。”
我需要一些方法来使这个标准转到数据库服务器,而不会让参数更容易让用户感到困惑。
如果重要,我们对Progress OpenEdge 10.1B03数据库使用Crystal Reports 11.0.0.895。
答案 0 :(得分:0)
我发现似乎有效的解决方案是使用以下表达式创建名为OrderNumStr的SQL表达式:
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特定的。)