【问题标题】:Compound columns evaluation in DynamicJasperDynamicJasper 中的复合列评估
【发布时间】:2014-04-30 13:23:09
【问题描述】:

我使用 JRXML 模板和 dynamic 输入参数作为输入来生成高级 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 时,它会尝试将这些字符串与现有字段匹配,但此时由于字符串包含复合项而失败。

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

【问题讨论】:

  • 您能否提供工作示例来重现您的问题?

标签: java jasper-reports dynamic-jasper


【解决方案1】:

您可以为此使用 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);

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

【讨论】:

  • 是的,这行得通。但问题是我不想参与其中,我宁愿把这项工作留给 Jasper。我唯一想要的就是告诉 DynamicJasper 在运行时应该使用哪些列。
【解决方案2】:

通过实现CustomColumn

解决
public class DynamicColumn extends AbstractColumn {
    ...

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

问题在于,AbstractColumn 的所有现有实现都假定将单个参数传递给列属性,并用 $F{...} 覆盖该参数。通过覆盖 textForExpression,该属性成功地转到了输出 JRXML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2016-08-19
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多