Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DynamicReports reportParameters.getFieldValue()返回错误的值_Java_Jasper Reports_Dynamic Reports - Fatal编程技术网

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);
我仍然不知道为什么变量能按预期工作,而字段不能