Java DynamicReports reportParameters.getFieldValue()返回错误的值
我有以下Java DynamicReports reportParameters.getFieldValue()返回错误的值,java,jasper-reports,dynamic-reports,Java,Jasper Reports,Dynamic Reports,我有以下AbstractSimpleExpression为一些文本着色: private class UtilisationExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1L; private String variableName; private String fieldName; public
AbstractSimpleExpression
为一些文本着色:
private class UtilisationExpression extends AbstractSimpleExpression<Boolean> {
private static final long serialVersionUID = 1L;
private String variableName;
private String fieldName;
public UtilisationExpression(String variableName, String fieldName) {
this.variableName = variableName;
this.fieldName = fieldName;
}
@Override
public Boolean evaluate(ReportParameters reportParameters) {
return ((Double) reportParameters.getVariableValue(variableName)
/ (Double) reportParameters.getFieldValue(fieldName) * 100) > 100;
}
}
然后我们在报告中有了用法,这有点复杂,因为我使用分组等。我将包括我认为必要的所有内容:
VariableBuilder<Double> valueInEurSumGrp = DynamicReports.variable("marketValueSum", valueInEurColumn,
Calculation.SUM);
CustomGroupBuilder bookGroup = grp.group("bucketGroup", new BucketExpression()).groupByDataType()
.setShowColumnHeaderAndFooter(true).setHeaderLayout(GroupHeaderLayout.VALUE).setPadding(0)
.setStyle(titleStyle).addHeaderComponent(cmp.filler().setFixedHeight(5))
.addFooterComponent(cmp.filler().setFixedHeight(10)).setReprintHeaderOnEachPage(true)
.setMinHeightToStartNewPage(15)
.setPrintSubtotalsWhenExpression(new PrintSubtotalsExpression(valueInEurSumGrp)).keepTogether();
valueInEurSumGrp.setResetGroup(bookGroup);
valueInEurSumGrp.setResetType(Evaluation.GROUP);
FieldBuilder<Double> marketValueLimitField = field("bucket.marketValueLimit", type.doubleType());
// Usage in subtotals
builder.setSubtotalStyle(subTotalStyleNoBordersLeft)
.subtotalsAtGroupFooter(bookGroup,
ReportCommon.createSubtotalColumns(subTotalStyleNoBordersLeft,
ReportCommon.convertSubtotalsToList(
sbt.text("Limit", bookColumn).setStyle(subTotalStyleNoBordersLeft), sbt
.aggregate(marketValueLimitField, valueInEurColumn,
Calculation.NOTHING)
.setStyle(subTotalStyleNoBordersRight).setPattern("#,##0")),
columns.toArray(new TextColumnBuilder<?>[] {})))
.setSubtotalStyle(subTotalStyleBottomBordersLeft)
.subtotalsAtGroupFooter(bookGroup, ReportCommon.createSubtotalColumns(
subTotalStyleBottomBordersLeft,
ReportCommon.convertSubtotalsToList(
sbt.text("Utilisation", bookColumn).setStyle(subTotalStyleBottomBordersLeft),
sbt.aggregate(
new PercentageExpression("bucket.marketValueLimit", valueInEurSumGrp),
valueInEurColumn, Calculation.NOTHING)
.setStyle(subTotalStyleBottomBordersRightRedColorMarketValue)),
columns.toArray(new TextColumnBuilder<?>[] {})))
.addSummary(cmp.filler().setFixedHeight(15));
我省略了一些代码,如列初始化和其他样式,以及报告本身的一部分,因为这与当前的问题无关
实际问题是,usilizationexpression
中的reportParameters.getFieldValue(“bucket.marketValueLimit”)
一旦将数据分组到多个块中,就会获取错误的值。如果我只有一个组,它工作得很好,但只要我有两个或更多组,该方法就无法获取正确的值
我做了一些代码挖掘,发现错误的方法调用委托到jractractscriptlet#getFieldValue(stringfieldname)
。在该方法中,它查看Map fieldsMap代码>包含所有字段。然后我找到了我正在搜索的字段,并检查了JRFillField
,其中包含以下值字段:
private Object previousOldValue;
private Object oldValue;
private Object value;
private Object savedValue;
previousOldValue
和value
是错误的值,而savedValue
为空,并且oldValue
保留我期望的值。在小计正确完成当前组之前,似乎已经为下一组设置了值。如果可以直接访问JRFillField
的话,似乎实际上可以访问oldValue
,但我也找不到一种方法
我已经尝试过像PercentageExpression
(使用VariableBuilder
)那样设置它,但它具有相同的效果
有人知道为什么方法调用会为每个组返回错误的值吗?如何解决此问题?
很抱歉我在这里发布了这些信息,我不确定解决这个问题需要什么。如果您需要更多信息,只需询问我找到了规避此问题的方法。我没有使用FieldBuilder
,而是从字段中创建了VariableBuilder
,并更新了AbstractSimpleExpression
,如下所示:
@Override
public Boolean evaluate(ReportParameters reportParameters) {
return ((Double) reportParameters.getVariableValue(variableName)
/ (Double) reportParameters.getVariableValue(fieldName) * 100) > 100;
}
设置颜色:
conditionalFontColorRedMarketValue = stl
.conditionalStyle(new UtilisationExpression("marketValueLimit", "bucketMarketValueLimit"))
.setForegroudColor(Color.RED);
conditionalFontColorRedRiskValue = stl
.conditionalStyle(new UtilisationExpression("valueAtRiskLimit", "bucketValueAtRiskLimit"))
.setForegroudColor(Color.RED);
以及设置字段/变量:
FieldBuilder<Double> marketValueLimitField = field("bucket.marketValueLimit", type.doubleType());
FieldBuilder<Double> valueAtRiskLimitField = field("bucket.valueAtRiskLimit", type.doubleType());
VariableBuilder<Double> marketValueLimitVariable = DynamicReports.variable("bucketMarketValueLimit",
marketValueLimitField, Calculation.NOTHING);
VariableBuilder<Double> valueAtRiskLimitVariable = DynamicReports.variable("bucketValueAtRiskLimit",
valueAtRiskLimitField, Calculation.NOTHING);
FieldBuilder-marketValueLimitField=field(“bucket.marketValueLimit”,type.doubleType());
FieldBuilder valueAtRiskLimitField=字段(“bucket.valueAtRiskLimit”,type.doubleType());
VariableBuilder marketValueLimitVariable=DynamicReports.variable(“bucketMarketValueLimit”,
marketValueLimitField,Calculation.NOTHING);
VariableBuilder valueAtRiskLimitVariable=DynamicReports.variable(“bucketValueAtRiskLimit”,
ValueAskLimitField,Calculation.NOTHING);
我仍然不知道为什么变量按预期工作,字段不按预期工作我找到了一种规避此问题的方法。我没有使用FieldBuilder
,而是从字段中创建了VariableBuilder
,并更新了AbstractSimpleExpression
,如下所示:
@Override
public Boolean evaluate(ReportParameters reportParameters) {
return ((Double) reportParameters.getVariableValue(variableName)
/ (Double) reportParameters.getVariableValue(fieldName) * 100) > 100;
}
设置颜色:
conditionalFontColorRedMarketValue = stl
.conditionalStyle(new UtilisationExpression("marketValueLimit", "bucketMarketValueLimit"))
.setForegroudColor(Color.RED);
conditionalFontColorRedRiskValue = stl
.conditionalStyle(new UtilisationExpression("valueAtRiskLimit", "bucketValueAtRiskLimit"))
.setForegroudColor(Color.RED);
以及设置字段/变量:
FieldBuilder<Double> marketValueLimitField = field("bucket.marketValueLimit", type.doubleType());
FieldBuilder<Double> valueAtRiskLimitField = field("bucket.valueAtRiskLimit", type.doubleType());
VariableBuilder<Double> marketValueLimitVariable = DynamicReports.variable("bucketMarketValueLimit",
marketValueLimitField, Calculation.NOTHING);
VariableBuilder<Double> valueAtRiskLimitVariable = DynamicReports.variable("bucketValueAtRiskLimit",
valueAtRiskLimitField, Calculation.NOTHING);
FieldBuilder-marketValueLimitField=field(“bucket.marketValueLimit”,type.doubleType());
FieldBuilder valueAtRiskLimitField=字段(“bucket.valueAtRiskLimit”,type.doubleType());
VariableBuilder marketValueLimitVariable=DynamicReports.variable(“bucketMarketValueLimit”,
marketValueLimitField,Calculation.NOTHING);
VariableBuilder valueAtRiskLimitVariable=DynamicReports.variable(“bucketValueAtRiskLimit”,
ValueAskLimitField,Calculation.NOTHING);
我仍然不知道为什么变量能按预期工作,而字段不能