我有一个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搜索。
任何建议都将不胜感激。
答案 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);
}
甚至可能有更简洁的方法来做这件事,但我只有很多时间来调查。
享受