0

我有一个 Java 应用程序,它通过其 Java 库调用 Crystal Reports。其中一份报告的记录选择器中有以下子句:

and ({DriverMotionView.GROUPID} = {?GroupID1Parameter}
or {DriverMotionView.GROUPID} = {?GroupID2Parameter}
or {DriverMotionView.GROUPID} = {?GroupID3Parameter}
or {DriverMotionView.GROUPID} = {?GroupID4Parameter}
or {DriverMotionView.GROUPID} = {?GroupID5Parameter}
or {DriverMotionView.GROUPID} = {?GroupID6Parameter}
or {DriverMotionView.GROUPID} = {?GroupID7Parameter}
or {DriverMotionView.GROUPID} = {?GroupID8Parameter}
or {DriverMotionView.GROUPID} = {?GroupID9Parameter}
or {DriverMotionView.GROUPID} = {?GroupID10Parameter}
)

每个 GroupIDnParameter 都是一个整数 groupID,通过从 UI 中的树结构中选择一个组名来创建。UI 将这些转换为 groupID 并将它们传递到报告中。现在,此记录选择器可以工作,但将所选组的数量限制为 10。

我想取消这个限制。为了检查可能解决方案的语法,我首先尝试了以下

and {DriverMotionView.GROUPID} in [-1, 1618, 1608, 1610, -1]

这确实选择了 groupID 1618、1608 和 1610 的记录。

所以然后我尝试了类似的东西

and {DriverMotionView.GROUPID} in {?GroupIDListParameter}

其中 GroupIDListParameter 作为字符串 [-1, 1618, 1608, 1610, -1] 传入。这会导致运行时 Crystal Reports 错误。

我试过了

and {DriverMotionView.GROUPID} in [{?GroupIDListParameter}] 

但该子句在语法上不正确,并导致语法检查时出现“数组必须下标”错误。

可能有另一种方法可以解决这个问题,但我无法在在线帮助、阅读用户指南甚至谷歌搜索中找到它。

任何建议,将不胜感激。

4

3 回答 3

0

您需要将您设置{?GroupIDListParameter}为多值参数(参数本身的属性)。这会将其视为一个数组,因此您可以{DriverMotionView.GROUPID} in {?GroupIDListParameter}像您已经尝试过的那样简单地进行记录选择。

无需分隔值或使用方括号。

于 2013-05-09T01:49:59.480 回答
0

您说过 {?GroupIDListParameter} 作为字符串传入,其中包括值周围的括号 ([ ])。你是用代码输入/做的吗?无论你在做什么来获得括号,我都会删除它们,然后围绕放在 {?GroupIDListParameter} 中的逗号分隔的数字字符串尝试这个:

{DriverMotionView.GROUPID} in split({?GroupIDListParmeter},",")
于 2013-05-09T00:27:45.113 回答
0

这是答案。我换了

and ({DriverMotionView.GROUPID} = {?GroupID1Parameter}
or {DriverMotionView.GROUPID} = {?GroupID2Parameter}
or {DriverMotionView.GROUPID} = {?GroupID3Parameter}
or {DriverMotionView.GROUPID} = {?GroupID4Parameter}
or {DriverMotionView.GROUPID} = {?GroupID5Parameter}
or {DriverMotionView.GROUPID} = {?GroupID6Parameter}
or {DriverMotionView.GROUPID} = {?GroupID7Parameter}
or {DriverMotionView.GROUPID} = {?GroupID8Parameter}
or {DriverMotionView.GROUPID} = {?GroupID9Parameter}
or {DriverMotionView.GROUPID} = {?GroupID10Parameter}
)

and ({DriverMotionView.GROUPID} in {?GroupIDArrayParameter})

其中 GroupIDArrayParameter 被声明为允许离散值和多个值的数字参数。允许自定义值,但我认为这并不重要。关键是 GroupIDArrayParameter (number) 的类型与 DriverMotionView.GROUPID 的类型相匹配,后者也是一个数字。

设置 GroupIDArrayParameter 的代码基本上如下:

 Fields fields = new Fields ();
 ... //Set other parameters here
 setDiscreteArrayParameter(fields, "GroupIDArrayParameter", "",  
                           getIntGroupIDs(groups));

 ...

 // Convert String groupIDs to Integers
 private Integer[] getIntGroupIDs(String[] s) {
     Integer[] result = new Integer[s.length];
     for (int i = 0; i < s.length; i++) {
        result[i] = Integer.parseInt(s[i]);
     }
     return result;
}

...

private void setDiscreteArrayParameter(Fields fields, String paramName, 
                           String reportName, Object[] parameterValues) {
    logger.debug("DescreteParameter - Name: " + paramName);
    // Create parameter field
    ParameterField parmeterField = new ParameterField();
    // Set report name
    parmeterField.setReportName(reportName);
    // Set parameter name
    parmeterField.setName(paramName);
    // Create value     
    Values values = new Values();
    for (int i = 0; i < parameterValues.length; i++) {
        ParameterFieldDiscreteValue discreteValue = new ParameterFieldDiscreteValue();
        discreteValue.setValue(parameterValues[i]);
        values.add(discreteValue);
     }
 parmeterField.setCurrentValues(values);
     fields.add(parmeterField);
}

甚至可能有更清洁的方法可以做到这一点,但我只有这么多时间来调查。

享受

于 2013-05-13T21:22:29.787 回答