在记录选择中使用报告参数

时间:2013-05-09 00:08:49

标签: crystal-reports report selection record in-clause

我有一个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}] 

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

可能有另一种解决此问题的方法,但我无法在在线帮助中找到它,阅读用户指南甚至Google搜索。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:0)

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

{DriverMotionView.GROUPID} in split({?GroupIDListParmeter},",")

答案 1 :(得分:0)

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

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

答案 2 :(得分: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的类型相匹配,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);
}

甚至可能有更简洁的方法来做这件事,但我只有很多时间来调查。

享受