Crystal reports 循环通过多值参数数组
我有一个允许多个值的参数。它用于数据库中的名称字段。我希望能够做到的是允许用户输入一个名称,然后让crystal查找任何名称,就像他们输入的任何名称一样。例如,您可以输入4个姓氏,crystal将返回在name字段中有这些姓氏的任何人。我可以让“like”很好地工作,但是只有当数组中有一个字符串时。以下是我的选择公式:Crystal reports 循环通过多值参数数组,crystal-reports,Crystal Reports,我有一个允许多个值的参数。它用于数据库中的名称字段。我希望能够做到的是允许用户输入一个名称,然后让crystal查找任何名称,就像他们输入的任何名称一样。例如,您可以输入4个姓氏,crystal将返回在name字段中有这些姓氏的任何人。我可以让“like”很好地工作,但是只有当数组中有一个字符串时。以下是我的选择公式: numbervar counter := 1; numbervar positionCount:=count({?Customer Name}); //I'm n
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%”
{?Customer Name}=“All”或{NAMEFIELD}如'*'+{?Customer Name}+'*'
这样用户就不必输入通配符:)@LeeTickett尽管看起来正确,但实际上不起作用。“+”运算符在字符串数组上的工作方式与在字符串上的不同。它基本上是将两个“*”字符串作为数组中的附加项来处理,因此您将匹配每个记录。如果您尝试以相同的方式使用“&”串联运算符,CR将给您一个错误。