Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Crystal reports 循环通过多值参数数组_Crystal Reports - Fatal编程技术网

Crystal reports 循环通过多值参数数组

Crystal reports 循环通过多值参数数组,crystal-reports,Crystal Reports,我有一个允许多个值的参数。它用于数据库中的名称字段。我希望能够做到的是允许用户输入一个名称,然后让crystal查找任何名称,就像他们输入的任何名称一样。例如,您可以输入4个姓氏,crystal将返回在name字段中有这些姓氏的任何人。我可以让“like”很好地工作,但是只有当数组中有一个字符串时。以下是我的选择公式: numbervar counter := 1; numbervar positionCount:=count({?Customer Name}); //I'm n

我有一个允许多个值的参数。它用于数据库中的名称字段。我希望能够做到的是允许用户输入一个名称,然后让crystal查找任何名称,就像他们输入的任何名称一样。例如,您可以输入4个姓氏,crystal将返回在name字段中有这些姓氏的任何人。我可以让“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
    )
numbervar计数器:=1;
numbervar positionCount:=计数({?客户名称})//我不知道该放什么
在这里计数乌邦?
如果{?客户名称}[1]“全部”
然后
(

而(counter幸运的是,CR可以自动处理这种情况(至少在CR2008中,我刚刚确认了这一点)。您只需执行{code>{Customer Name}=“All”或{NAMEFIELD}之类的操作{Customer Name}


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

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

  • 默认值:全部
  • 所有多个值:TRUE
向参数的拾取列表网格中添加一行;提供“全部”和“全部”(不带单引号)

使用以下文本创建自定义函数(名为“定界”):

// Delimit()
// enclose each value in array in **, returning an array
Function (Stringvar Array params)

  Split("*" + Join(params, "*,*") + "*", ",")
//{@Customer Name}
Join( Delimit({?Customer Name}), ";")
修改报告的记录选择公式:

If {?Customer Name}<>"ALL" Then
    {TABLE.CUSTOMER_NAME} LIKE Delimit({?Customer Name})
Else
    True
如果您有Oracle,另一种方法(我认为创建一个单独的答案是有意义的)是使用表达式

  • 创建使用命令的报告
  • 在命令面板中创建一个字符串参数({?QUERY});将默认值设置为“ALL”(不带单引号)
  • 将查询添加到命令;参考参数:
从客户中选择客户名称({QUERY}='ALL'或类似REGEXP(客户名称,{QUERY}'))

  • 像往常一样向报告中添加字段
  • 出现提示时(运行报表),请在查询参数中输入正则表达式。模式
    'a | B | C'
    相当于
    类似“%a%”或类似“%B%”或类似“%C%”

Ryan所说的是正确的,或者您当然可以执行
{?Customer Name}=“All”或{NAMEFIELD}如'*'+{?Customer Name}+'*'
这样用户就不必输入通配符:)@LeeTickett尽管看起来正确,但实际上不起作用。“+”运算符在字符串数组上的工作方式与在字符串上的不同。它基本上是将两个“*”字符串作为数组中的附加项来处理,因此您将匹配每个记录。如果您尝试以相同的方式使用“&”串联运算符,CR将给您一个错误。