6

我有一个允许多个值的参数。它用于我数据库中的名称字段。我想要做的是允许用户输入一个名称,然后让水晶找到任何名称,就像他们输入的任何名称一样。因此,例如,您可以输入 4 个姓氏,并且水晶会返回在姓名字段中具有任何这些名字的任何人。我可以让“like”正常工作,但前提是数组中有一个字符串。这是我的选择公式:

    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
    )

此公式返回所有名称,而不是参数中的名称。关于我做错了什么的任何想法?

4

3 回答 3

4

使用以下属性创建一个多值参数 ({?Customer Name}):

  • 默认值:全部
  • 所有多个值:TRUE

在参数的选择列表网格中添加一行;提供 '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}), ";")
于 2012-04-11T12:13:34.757 回答
2

幸运的是 CR 可以自动处理这种情况(至少在我刚刚确认的 CR2008 中)。你可以这样做{?Customer Name}="All" or {NAMEFIELD} like {?Customer Name}

最终用户可以适当地使用通配符,但您可以在参数的帮助文本中添加简介或使用编辑掩码强制使用 *Name* 格式。

于 2012-04-10T19:11:10.747 回答
0

如果您有 Oracle,另一种方法(我认为创建一个单独的答案是有意义的)是使用REGEXP_LIKE表达式。

  • 创建使用命令的报告。
  • 在命令面板中创建一个字符串参数({?QUERY});将默认值设置为“ALL”(不带单引号)。
  • 将查询添加到命令中;参考参数:

SELECT customer_name FROM customers WHERE ( '{?QUERY}'='ALL' OR REGEXP_LIKE(customer_name, '{?QUERY}') )

  • 像往常一样向报告添加字段
  • 出现提示时(运行报告),​​在 QUERY 参数中输入正则表达式。该模式'A|B|C'等价于LIKE '%A%' OR LIKE '%B%' OR LIKE '%C%'
于 2012-04-11T18:44:56.067 回答