我有一个允许多个值的参数。它用于我的数据库中的名称字段。我希望能够做的是允许用户输入一个名称,然后让水晶找到任何名称,就像他们输入的任何名字一样。因此,例如,您可以输入4个姓氏,而水晶将返回名称字段中具有任何这些名称的任何人。我可以让“喜欢”工作得很好,但只有当数组中有一个字符串时。这是我选择的公式:
numbervar counter := 1;
numbervar positionCount:=count({?Customer Name}); //I'm not sure what to put
here. Count? UBound?
if {?Customer Name}[1] <> 'ALL'
then
(
while(counter <= positionCount)
do
(
{NAMEFIELD} like '*' & {?Customer Name}[counter] & '*';
counter := counter + 1;
);
)
else
if {?Customer Name}[1] = 'ALL'
then
true
)
此公式返回所有名称,而不是参数中的名称。关于我做错了什么想法?
答案 0 :(得分:3)
使用以下属性创建多值参数({?客户名称}):
在参数的选择列表网格中添加一行;提供'ALL'和'ALL'(不带单引号)
使用以下文字创建自定义函数(名为“Delimit”):
// Delimit()
// enclose each value in array in **, returning an array
Function (Stringvar Array params)
Split("*" + Join(params, "*,*") + "*", ",")
修改报告的记录选择公式:
If {?Customer Name}<>"ALL" Then
{TABLE.CUSTOMER_NAME} LIKE Delimit({?Customer Name})
Else
True
(可选)创建公式以使用此文本显示参数的值:
//{@Customer Name}
Join( Delimit({?Customer Name}), ";")
答案 1 :(得分:2)
幸运的是,CR可以自动处理这种情况(至少在CR2008,我刚刚确认它)。你可以{?Customer Name}="All" or {NAMEFIELD} like {?Customer Name}
。
最终用户可以正确使用通配符,但您可以在参数的帮助文本中添加blurb或使用编辑掩码强制使用* Name *格式。
答案 2 :(得分:0)
另一种方法(我认为创建一个单独的答案是有意义的),如果你有Oracle,就是使用REGEXP_LIKE表达式。
SELECT customer_name FROM customers WHERE ( '{?QUERY}'='ALL' OR REGEXP_LIKE(customer_name, '{?QUERY}') )
'A|B|C'
相当于LIKE '%A%' OR LIKE '%B%' OR LIKE '%C%'
。