Crystal reports Crystal Reports:根据子字符串值筛选的多值参数

Crystal reports Crystal Reports:根据子字符串值筛选的多值参数,crystal-reports,crystal-reports-2008,Crystal Reports,Crystal Reports 2008,我有一个Crystal Reports 2008文件,其中包含一个接受多个值的字符串参数。我需要在记录选择中使用此选项。我知道一般来说你可以做这样的事情 {MyTable.MyField} In Join( {?MyParam}, "," ) 但我需要用户输入可能出现在更长字段值中的值,即通过子字符串。我试过了 NumberVar index; For index := 1 To UBound( {?MyParam} ) Do ( {?MyParam}[index] In {MyTab

我有一个Crystal Reports 2008文件,其中包含一个接受多个值的字符串参数。我需要在记录选择中使用此选项。我知道一般来说你可以做这样的事情

{MyTable.MyField} In Join( {?MyParam}, "," )
但我需要用户输入可能出现在更长字段值中的值,即通过子字符串。我试过了

NumberVar index;
For index := 1 To UBound( {?MyParam} ) Do (
    {?MyParam}[index] In {MyTable.MyField}
)
虽然它不会抛出错误,但似乎对记录选择没有任何影响(也就是说,不管报告显示多少条记录)


更具体地说,假设
MyTable
有三条记录,
MyField
分别包含文本
红蓝绿
绿黄紫
红黄橙
。使用该参数,用户应能够键入值
红色
蓝色
,以便向下过滤到第一个和第三个记录。

创建自定义公式,以比较两个阵列的重叠值:

//Array_Overlap
Function (Stringvar Array a0, Stringvar Array a1)

    Local Numbervar i;
    Local Numbervar j;
    Local Booleanvar found:=false;

    For i := 1 To Ubound(a0) Do (
        For j := 1 To Ubound(a1) Do (
            If a0[i]=a1[j] Then (
                found:=true;
                Exit For;
            )
        )
    );

    found;
在您的记录选择公式(RSF)中引用它:


您不需要手动分隔值,Crystal Reports会自动执行:{code>{MyParam}中的
{MyTable.MyField}。在第二个示例中,记录选择公式不会传递到数据库(逻辑太复杂)。因此,您将看到从数据库中读取相同数量的记录。假设您的逻辑正确,它将在从数据库读取记录时丢弃记录(
WhileReadingRecords
),我应该说是“显示”,而不是“读入”(已更新)。两种方式都显示相同的记录<{?MyParam}
中的code>{MyTable.MyField}用于直接相等,但如果我希望基于子字符串进行匹配,则不适用。
// space delimited
AND Array_Overlap( Split({MyTable.MyField}, " "), {?MyParam} ) = TRUE