[英]Using a CustomExpression in a DynamicJasper chart
我有一个使用DynamicJasper创建报告的项目。 到目前为止,它仍然可以正常工作,但是当我想向以前的功能报告中添加图表时,遇到了问题。
我不断得到这个:
net.sf.jasperreports.engine.design.JRValidationException:报告设计无效:1.找不到字段:net.sf处net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)处的customExpression_for_Ganancia。 net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)上的jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140)at ar.com.fdvs.dj.core.DynamicJasperHelper(generate) ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:279)上的DynamicJasperHelper.java:519)ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:232)
Ganancia是图表中唯一的CustomExpression列。 如果我不将此列作为系列添加到图表中,则图表将正确呈现。 该图表似乎不适用于表达式...
我的代码片段:
private DynamicReport buildSalesReport() throws ColumnBuilderException, ClassNotFoundException, ChartBuilderException {
DynamicReportBuilder drb = new DynamicReportBuilder();
drb.setReportName("Reporte de Ventas")
.setTitle("Reporte de ventas")
.setSubtitle("Este reporte fue generado el " + new Date())
.setPrintColumnNames(false)
.setIgnorePagination(true)
.setMargins(10, 10, 10, 10)
.setUseFullPageWidth(true);
Style groupOneStyle = new Style();
groupOneStyle.setFont(Font.ARIAL_BIG);
groupOneStyle.setHorizontalAlign(HorizontalAlign.LEFT);
groupOneStyle.setVerticalAlign(VerticalAlign.MIDDLE);
AbstractColumn columnDisplayName = ColumnBuilder.getNew()
.setColumnProperty("bookingType.displayName", String.class.getName())
.setTitle("Tipo").setWidth(new Integer(40))
.setStyle(groupOneStyle)
.build();
AbstractColumn columnDestiny = ColumnBuilder.getNew()
.setColumnProperty("bookedObject.destiny", String.class.getName())
.setTitle("Destino").setWidth(new Integer(40))
.build();
Style priceStyle = new Style();
priceStyle.setHorizontalAlign(HorizontalAlign.RIGHT);
AbstractColumn columnCurrency = ColumnBuilder.getNew()
.setColumnProperty("bookedObject.currency.displayName", String.class.getName())
.setTitle("Cotizacion").setWidth(new Integer(5))
.setShowText(false)
.build();
Style footerStyle = new Style();
footerStyle.setFont(Font.ARIAL_MEDIUM);
footerStyle.setBorderTop(Border.THIN);
footerStyle.setHorizontalAlign(HorizontalAlign.RIGHT);
footerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
AbstractColumn columnPrice = ColumnBuilder.getNew()
.setColumnProperty("bookedObject.price", Double.class.getName())
.setStyle(priceStyle)
.setPattern("$ 0.00")
.setTitle("Precio").setWidth(new Integer(25))
.build();
AbstractColumn columnCount = ColumnBuilder.getNew()
.setColumnProperty("count", Integer.class.getName())
.setStyle(priceStyle)
.setTitle("Cantidad").setWidth(new Integer(25))
.build();
columnCount.setName("Cantidad");
AbstractColumn columnProfit = ColumnBuilder.getNew()
.setCustomExpression(this.getProfitExpression())
.setStyle(priceStyle)
.setTitle("Ganancia").setWidth(new Integer(20))
.setPattern("$ 0.00")
.build();
columnProfit.setName("Ganancia");
GroupBuilder groupBookingTypeBuilder = new GroupBuilder();
DJGroup groupBookingType =
groupBookingTypeBuilder.setCriteriaColumn((PropertyColumn) columnDisplayName)
.setGroupLayout(GroupLayout.VALUE_IN_HEADER_WITH_HEADERS_AND_COLUMN_NAME)
.build();
GroupBuilder groupCurrencyBuilder = new GroupBuilder();
DJGroup groupCurrency =
groupCurrencyBuilder.setCriteriaColumn((PropertyColumn) columnCurrency)
.addFooterVariable(columnCount,DJCalculation.SUM,footerStyle)
.addFooterVariable(columnProfit,DJCalculation.SUM,footerStyle)
.setGroupLayout(GroupLayout.VALUE_IN_HEADER)
.build();
drb.addColumn(columnDisplayName)
.addColumn(columnCurrency)
.addColumn(columnDestiny)
.addColumn(columnCount)
.addColumn(columnPrice)
.addColumn(columnProfit)
.addGroup(groupBookingType)
.addGroup(groupCurrency)
.setPrintBackgroundOnOddRows(true);
DJAxisFormat categoryAxisFormat = new DJAxisFormat("Destino");
categoryAxisFormat.setLabelFont(Font.ARIAL_SMALL);
categoryAxisFormat.setLabelColor(Color.DARK_GRAY);
categoryAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
categoryAxisFormat.setTickLabelColor(Color.DARK_GRAY);
categoryAxisFormat.setTickLabelMask("");
categoryAxisFormat.setLineColor(Color.DARK_GRAY);
DJAxisFormat valueAxisFormat = new DJAxisFormat("Ventas / Ingresos");
valueAxisFormat.setLabelFont(Font.ARIAL_SMALL);
valueAxisFormat.setLabelColor(Color.DARK_GRAY);
valueAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
valueAxisFormat.setTickLabelColor(Color.DARK_GRAY);
valueAxisFormat.setTickLabelMask("#,##0");
valueAxisFormat.setLineColor(Color.DARK_GRAY);
DJChart djChart = new DJBarChartBuilder()
//chart
.setX(20)
.setY(10)
.setWidth(500)
.setHeight(250)
.setCentered(false)
.setBackColor(Color.LIGHT_GRAY)
.setShowLegend(true)
.setPosition(DJChartOptions.POSITION_FOOTER)
.setTitle(new StringExpression() {
@Override
public Object evaluate(Map fields, Map variables, Map parameters) {
return variables.get("bookingType.displayName");
}
})
.setTitleColor(Color.DARK_GRAY)
.setTitleFont(Font.ARIAL_BIG_BOLD)
.setSubtitle("subtitle")
.setSubtitleColor(Color.DARK_GRAY)
.setSubtitleFont(Font.COURIER_NEW_BIG_BOLD)
.setLegendColor(Color.DARK_GRAY)
.setLegendFont(Font.COURIER_NEW_MEDIUM_BOLD)
.setLegendBackgroundColor(Color.WHITE)
.setLegendPosition(DJChartOptions.EDGE_BOTTOM)
.setTitlePosition(DJChartOptions.EDGE_TOP)
.setLineStyle(DJChartOptions.LINE_STYLE_DOTTED)
.setLineWidth(1)
.setLineColor(Color.DARK_GRAY)
.setPadding(5)
//dataset
.setCategory((PropertyColumn) columnDestiny)
.addSerie(columnCount, "Cantidad")
.addSerie(columnProfit, "Ganancia") // IF I COMMENT THIS LINE THE CHART IS RENDERED
//plot
.setCategoryAxisFormat(categoryAxisFormat)
.setValueAxisFormat(valueAxisFormat)
.build();
drb.addChart(djChart);
HashMap vars = new HashMap();
vars.put(columnCount, new JRDesignVariable());
vars.put(columnProfit, new JRDesignVariable());
JRDesignGroup group = new JRDesignGroup();
djChart.transform(new DynamicJasperDesign(), "", group, group, vars, 0);
DynamicReport dr = drb.build();
return dr;
}
public JasperPrint getJasperPrint(String status, String userOwner,
String hourFrom, String hourTo, String dateFrom, String dateTo)
throws ColumnBuilderException, ClassNotFoundException, JRException, ChartBuilderException {
DynamicReport dr = this.buildSalesReport();
JRDataSource ds = new JRBeanCollectionDataSource(
this.bookService.getReportBooks(status, userOwner, hourFrom, hourTo, dateFrom, dateTo));
return DynamicJasperHelper.generateJasperPrint(dr , new ClassicLayoutManager(), ds);
}
/**
*
* @return
*/
@SuppressWarnings("serial")
private CustomExpression getProfitExpression() {
return new CustomExpression() {
@SuppressWarnings("rawtypes")
@Override
public Object evaluate(Map fields, Map variables, Map parameters) {
Double amount = (Integer)fields.get("count") * (Double)fields.get("bookedObject.price");
return amount;
}
@Override
public String getClassName() {
return Double.class.getName();
}
};
就像我说过的那样,该报告在没有图表的情况下正确显示,只有在将表达式列作为系列包含时,该报告才会失败。
任何想法都欢迎!
刚刚在提交05243a3中推送了DJ 4.0.1的更改
今天的某个时候还将推动DJ 3.X
我已经通过以下方法解决了这个非常相同的问题:
JRDesignExpression表达式=新的JRDesignExpression();
String property = ((PropertyColumn) col).getFieldDescription();
//(((PropertyColumn)col).getColumnProperty()。getProperty();
expression.setText("$F{" + property + "}"); expression.setValueClass(clazz);
3。 正如您已经知道的那样,您必须为此任务创建自己的LayoutManager。 4。 这可能不是最佳解决方案,它只是如何填补DynamicJasper空白的一个示例。
我遇到了同样的问题,但解决方案略有不同。 Column类的类型不同,但是AbstractLayoutManager
仅支持针对图表的PropertyColumn
类。 我发现,当您使用CustomExpression
时,使用的基础Column
类是ExpressionColumn
。 因此,我修改了ar.com.fdvs.dj.core.layout.AbstractLayoutManager
的“受保护的map registerChartVariable()
方法”以支持ExpressionColumn
。
我在该方法中更改了以下3行代码:
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{" + ((PropertyColumn) col).getColumnProperty().getProperty() + "}");
expression.setValueClass(clazz);
要以下内容:
if (col instanceof ExpressionColumn) {
ExpressionColumn expCol = (ExpressionColumn) col;
expression.setText(expCol.getTextForExpression());
expression.setValueClassName(expCol.getExpression().getClassName());
} else {
expression.setText("$F{" + ((PropertyColumn) col).getColumnProperty().getProperty() + "}");
expression.setValueClass(clazz);
}
这为我解决了问题,并且我不再收到“ 找不到字段 ”消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.