DynamicJasper中的复合列评估

时间:2014-04-30 13:23:10

标签: java jasper-reports dynamic-jasper

我使用JRXML模板和动态输入参数作为输入来生成高级JRXML。稍后这个JRXML由JasperServer处理和处理。主要想法是让用户选择他想要的任何列并自定义它们。

DynamicJasper提供了用于构建自定义列的良好API,但我遇到了复合列的问题。

例如,用户想要他的专栏' A'计算如下:

$F{INSTRUMENT} + " (" + $F{SECURITY_IDENTIFIER} + ")"

$F{QUANTITY} == null ?0:$F{QUANTITY}.setScale(2, RoundingMode.HALF_UP)

所以在继续之后输出JRXML会在其details / band标签下有这样的记录:

<textField isStretchWithOverflow="true">
    <reportElement key="DK_Instrument" x="0" y="0" width="184" height="12">
    </reportElement>
    <textElement/>
    <textFieldExpression><![CDATA[$F{INSTRUMENT} + " (" + $F{SECURITY_IDENTIFIER} + ")"]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
    <reportElement key="DK_Quantity" x="220" y="0" width="56" height="12">
    </reportElement>
    <textElement/>
    <textFieldExpression><![CDATA[$F{QUANTITY} == null ?0:$F{QUANTITY}.setScale(2, RoundingMode.HALF_UP)]]></textFieldExpression>
</textField>

DynamicJasper中的 AbstractColumn 具有以下方法:

setColumnProperty(fieldName, className)
setCustomExpression(CustomExpression)
setCustomExpressionForCalculation(CustomExpression)

但不适用于我。

当DynamicJasper生成JasperReport时,它会尝试将这些字符串与现有字段匹配,此时失败,因为字符串包含复合项。

任何想法/建议都会很棒。

2 个答案:

答案 0 :(得分:0)

您可以使用JRDesignTextFieldJRDesignExpression类。

JRDesignTextField textField = new JRDesignTextField();
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{INSTRUMENT} + \"( \" + $F{SECURITY_IDENTIFIER} +\" ) \"");
//or expression.setText("$F{QUANTITY} == null ?0:$F{QUANTITY}.setScale(2, RoundingMode.HALF_UP)");
textField.setExpression(expression);

我认为这会对你有所帮助。 检查语法,我没有运行代码,但它会给你一些想法。

答案 1 :(得分:0)

通过实施 CustomColumn

解决
public class DynamicColumn extends AbstractColumn {
    ...

    @Override
    public String getTextForExpression() {
        return getColumnProperty().getProperty();
    }
    @Override
    public String getValueClassNameForExpression() {
        return getColumnProperty().getValueClassName();
    }
}

问题是 AbstractColumn 的所有现有实现都假定传递给column属性的单个参数,并且它使用 $ F {...} 覆盖参数。通过重写 textForExpression ,该属性成功转到输出JRXML。