IDEMPIERE-4868 Implement column lookup support for Jasper Report (#770)
* IDEMPIERE-4868 Implement column lookup support for Jasper Report add support for more display type Fix passing of report locale to ColumnLookup and MsgResourceBundle add alternate short notation for location, account, locator and asi.
This commit is contained in:
parent
287f41a067
commit
e27e11cfce
|
@ -10,6 +10,8 @@ Import-Package: net.sourceforge.barbecue,
|
||||||
org.apache.commons.codec.binary,
|
org.apache.commons.codec.binary,
|
||||||
org.apache.commons.logging;version="1.1.1",
|
org.apache.commons.logging;version="1.1.1",
|
||||||
org.apache.commons.logging.impl;version="1.1.1",
|
org.apache.commons.logging.impl;version="1.1.1",
|
||||||
|
org.jfree.chart,
|
||||||
|
org.jfree.chart.plot,
|
||||||
org.osgi.service.event
|
org.osgi.service.event
|
||||||
Require-Bundle: org.adempiere.base;bundle-version="0.0.0",
|
Require-Bundle: org.adempiere.base;bundle-version="0.0.0",
|
||||||
net.sf.jasperreports.engine;bundle-version="6.3.1"
|
net.sf.jasperreports.engine;bundle-version="6.3.1"
|
||||||
|
|
|
@ -24,30 +24,35 @@
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
package org.adempiere.report.jasper;
|
package org.adempiere.report.jasper;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.awt.image.BufferedImage;
|
||||||
import java.sql.ResultSet;
|
import java.math.BigDecimal;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
|
import org.adempiere.apps.graph.ChartBuilder;
|
||||||
|
import org.compiere.model.MAccount;
|
||||||
|
import org.compiere.model.MAttributeSetInstance;
|
||||||
|
import org.compiere.model.MChart;
|
||||||
import org.compiere.model.MColumn;
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MImage;
|
||||||
import org.compiere.model.MLocation;
|
import org.compiere.model.MLocation;
|
||||||
|
import org.compiere.model.MLocator;
|
||||||
import org.compiere.model.MLookup;
|
import org.compiere.model.MLookup;
|
||||||
import org.compiere.model.MLookupFactory;
|
import org.compiere.model.MLookupFactory;
|
||||||
import org.compiere.model.MLookupInfo;
|
import org.compiere.model.MLookupInfo;
|
||||||
import org.compiere.model.MTable;
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.util.CLogger;
|
|
||||||
import org.compiere.util.DB;
|
|
||||||
import org.compiere.util.DisplayType;
|
import org.compiere.util.DisplayType;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.Language;
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.NamePair;
|
import org.compiere.util.Msg;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
|
import org.jfree.chart.ChartRenderingInfo;
|
||||||
|
import org.jfree.chart.JFreeChart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author hengsin
|
* @author hengsin
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class ColumnLookup implements BiFunction<String, Object, String> {
|
public class ColumnLookup implements BiFunction<String, Object, Object> {
|
||||||
|
|
||||||
private Language language;
|
private Language language;
|
||||||
|
|
||||||
|
@ -59,7 +64,7 @@ public class ColumnLookup implements BiFunction<String, Object, String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String apply(String t, Object key) {
|
public Object apply(String t, Object key) {
|
||||||
if (!Util.isEmpty(t, true) && key != null) {
|
if (!Util.isEmpty(t, true) && key != null) {
|
||||||
String[] parts = t.split("[.]");
|
String[] parts = t.split("[.]");
|
||||||
if (parts.length == 2) {
|
if (parts.length == 2) {
|
||||||
|
@ -72,41 +77,133 @@ public class ColumnLookup implements BiFunction<String, Object, String> {
|
||||||
if (DisplayType.isList(column.getAD_Reference_ID())) {
|
if (DisplayType.isList(column.getAD_Reference_ID())) {
|
||||||
MLookupInfo linfo = MLookupFactory.getLookup_List(language, column.getAD_Reference_Value_ID());
|
MLookupInfo linfo = MLookupFactory.getLookup_List(language, column.getAD_Reference_Value_ID());
|
||||||
MLookup lookup = new MLookup(linfo, -1);
|
MLookup lookup = new MLookup(linfo, -1);
|
||||||
NamePair np = lookup.getDirect(key, false, false);
|
return lookup.getDisplay(key);
|
||||||
return np != null ? np.toString() : "";
|
|
||||||
} else if (DisplayType.isLookup(column.getAD_Reference_ID()) && (key instanceof Number)) {
|
} else if (DisplayType.isLookup(column.getAD_Reference_ID()) && (key instanceof Number)) {
|
||||||
return getLookupDisplay(column, (Number) key);
|
return getLookupDisplay(column, (Number) key);
|
||||||
|
} else if ((column.getAD_Reference_ID()==DisplayType.ChosenMultipleSelectionList
|
||||||
|
|| column.getAD_Reference_ID()==DisplayType.ChosenMultipleSelectionSearch
|
||||||
|
|| column.getAD_Reference_ID()==DisplayType.ChosenMultipleSelectionTable) && (key instanceof String)) {
|
||||||
|
return getMultiLookupDisplay(column, (String) key);
|
||||||
} else if (DisplayType.Location == column.getAD_Reference_ID() && (key instanceof Number)) {
|
} else if (DisplayType.Location == column.getAD_Reference_ID() && (key instanceof Number)) {
|
||||||
MLocation loc = MLocation.get(((Number)key).intValue());
|
return getLocation((Number) key);
|
||||||
return loc.toStringCR();
|
} else if (DisplayType.Image == column.getAD_Reference_ID() && (key instanceof Number)) {
|
||||||
|
return getImage(((Number)key).intValue());
|
||||||
|
} else if (DisplayType.YesNo == column.getAD_Reference_ID() && (key instanceof String)) {
|
||||||
|
String value = (String) key;
|
||||||
|
return getYesNoText(value);
|
||||||
|
} else if (DisplayType.Account == column.getAD_Reference_ID() && (key instanceof Number)) {
|
||||||
|
return getAccountCombination((Number) key);
|
||||||
|
} else if (DisplayType.Locator == column.getAD_Reference_ID() && (key instanceof Number)) {
|
||||||
|
return getLocator((Number) key);
|
||||||
|
} else if (DisplayType.PAttribute == column.getAD_Reference_ID() && (key instanceof Number)) {
|
||||||
|
return getAttributeSetInstance((Number) key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (t.equalsIgnoreCase("location") && (key instanceof Number)) {
|
||||||
|
return getLocation((Number) key);
|
||||||
|
} else if (t.equalsIgnoreCase("account") && (key instanceof Number)) {
|
||||||
|
return getAccountCombination((Number) key);
|
||||||
|
} else if (t.equalsIgnoreCase("locator") && (key instanceof Number)) {
|
||||||
|
return getLocator((Number) key);
|
||||||
|
} else if (t.equalsIgnoreCase("asi") && (key instanceof Number)) {
|
||||||
|
return getAttributeSetInstance((Number) key);
|
||||||
|
} else if (t.equalsIgnoreCase("AmtInWords")) {
|
||||||
|
if (key instanceof String) {
|
||||||
|
return Msg.getAmtInWords(language, (String) key);
|
||||||
|
} else if (key instanceof BigDecimal) {
|
||||||
|
String s = DisplayType.getNumberFormat(DisplayType.Amount, language).format((BigDecimal)key);
|
||||||
|
return Msg.getAmtInWords(language, s);
|
||||||
|
}
|
||||||
|
} else if (t.equalsIgnoreCase("Image") && (key instanceof Number)) {
|
||||||
|
return getImage(((Number)key).intValue());
|
||||||
|
} else if (t.equalsIgnoreCase("YesNo") && (key instanceof String)) {
|
||||||
|
return getYesNoText((String) key);
|
||||||
|
} else if (t.toLowerCase().startsWith("chart/") && (key instanceof Number)) {
|
||||||
|
parts = t.split("[/]");
|
||||||
|
if (parts.length == 3) {
|
||||||
|
int width = 0;
|
||||||
|
int height = 0;
|
||||||
|
try {
|
||||||
|
width = Integer.parseInt(parts[1]);
|
||||||
|
height = Integer.parseInt(parts[1]);
|
||||||
|
} catch (Exception e) {}
|
||||||
|
if (width > 0 && height > 0) {
|
||||||
|
return getChartImage(((Number)key).intValue(), width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object getAttributeSetInstance(Number key) {
|
||||||
|
MAttributeSetInstance asi = new MAttributeSetInstance (Env.getCtx(), key.intValue(), null);
|
||||||
|
if (asi.getM_AttributeSetInstance_ID() > 0)
|
||||||
|
return asi.getDescription();
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getLocator(Number key) {
|
||||||
|
MLocator locator = MLocator.get(key.intValue());
|
||||||
|
return locator != null ? locator.toString() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getAccountCombination(Number key) {
|
||||||
|
MAccount account = MAccount.get(key.intValue());
|
||||||
|
return account != null ? account.getCombination() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getLocation(Number key) {
|
||||||
|
MLocation loc = MLocation.get(key.intValue());
|
||||||
|
return loc.toStringCR();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getChartImage(int id, int width, int height) {
|
||||||
|
MChart mc = new MChart(Env.getCtx(), id, null);
|
||||||
|
if (mc.get_ID() == id) {
|
||||||
|
ChartBuilder chartBuilder = new ChartBuilder(mc);
|
||||||
|
JFreeChart chart = chartBuilder.createChart();
|
||||||
|
chart.getPlot().setForegroundAlpha(0.8f);
|
||||||
|
ChartRenderingInfo info = new ChartRenderingInfo();
|
||||||
|
BufferedImage bi = chart.createBufferedImage(width, height,
|
||||||
|
BufferedImage.TRANSLUCENT, info);
|
||||||
|
return bi;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getYesNoText(String value) {
|
||||||
|
if (value.equals("Y")) {
|
||||||
|
return Msg.getMsg(language, "Yes");
|
||||||
|
} else if (value.equals("N")) {
|
||||||
|
return Msg.getMsg(language, "No");
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getImage(int key) {
|
||||||
|
MImage image = MImage.get(key);
|
||||||
|
return image != null ? image.getImage() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getMultiLookupDisplay(MColumn column, String key) {
|
||||||
|
MLookupInfo mli = MLookupFactory.getLookupInfo(Env.getCtx(), -1, column.getAD_Column_ID(), column.getAD_Reference_ID(), language, column.getColumnName(),
|
||||||
|
column.getAD_Reference_Value_ID(), false, "");
|
||||||
|
|
||||||
|
MLookup lookup = new MLookup(mli, -1);
|
||||||
|
return lookup.getDisplay(key);
|
||||||
|
}
|
||||||
|
|
||||||
private String getLookupDisplay(MColumn column, Number key) {
|
private String getLookupDisplay(MColumn column, Number key) {
|
||||||
MLookupInfo mli = MLookupFactory.getLookupInfo(Env.getCtx(), -1, column.getAD_Column_ID(), column.getAD_Reference_ID(), language, column.getColumnName(),
|
MLookupInfo mli = MLookupFactory.getLookupInfo(Env.getCtx(), -1, column.getAD_Column_ID(), column.getAD_Reference_ID(), language, column.getColumnName(),
|
||||||
column.getAD_Reference_Value_ID(), false, "");
|
column.getAD_Reference_Value_ID(), false, "");
|
||||||
|
|
||||||
StringBuilder name = new StringBuilder("");
|
MLookup lookup = new MLookup(mli, -1);
|
||||||
try (PreparedStatement pstmt = DB.prepareStatement(mli.QueryDirect, null);) {
|
return lookup.getDisplay(key);
|
||||||
pstmt.setInt(1, key.intValue());
|
|
||||||
|
|
||||||
ResultSet rs = pstmt.executeQuery();
|
|
||||||
if (rs.next()) {
|
|
||||||
name.append(rs.getString(3));
|
|
||||||
boolean isActive = rs.getString(4).equals("Y");
|
|
||||||
if (!isActive)
|
|
||||||
name.insert(0, MLookup.INACTIVE_S).append(MLookup.INACTIVE_E);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
CLogger.getCLogger(getClass()).log(Level.SEVERE, e.getMessage(), e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return name.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -607,8 +607,7 @@ public class ReportStarter implements ProcessCall, ClientProcess
|
||||||
String langInfo = params.get("AD_Language") != null ? params.get("AD_Language").toString() :
|
String langInfo = params.get("AD_Language") != null ? params.get("AD_Language").toString() :
|
||||||
params.get("CURRENT_LANG").toString();
|
params.get("CURRENT_LANG").toString();
|
||||||
currLang = Language.getLanguage(langInfo);
|
currLang = Language.getLanguage(langInfo);
|
||||||
}
|
}
|
||||||
params.put("COLUMN_LOOKUP", new ColumnLookup(currLang));
|
|
||||||
|
|
||||||
String printerName = null;
|
String printerName = null;
|
||||||
MPrintFormat printFormat = null;
|
MPrintFormat printFormat = null;
|
||||||
|
@ -643,6 +642,7 @@ public class ReportStarter implements ProcessCall, ClientProcess
|
||||||
|
|
||||||
params.put("CURRENT_LANG", currLang.getAD_Language());
|
params.put("CURRENT_LANG", currLang.getAD_Language());
|
||||||
params.put(JRParameter.REPORT_LOCALE, currLang.getLocale());
|
params.put(JRParameter.REPORT_LOCALE, currLang.getLocale());
|
||||||
|
params.put("COLUMN_LOOKUP", new ColumnLookup(currLang));
|
||||||
|
|
||||||
// Resources
|
// Resources
|
||||||
File resFile = null;
|
File resFile = null;
|
||||||
|
@ -670,7 +670,7 @@ public class ReportStarter implements ProcessCall, ClientProcess
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
params.put(JRParameter.REPORT_RESOURCE_BUNDLE, new MsgResourceBundle(res));
|
params.put(JRParameter.REPORT_RESOURCE_BUNDLE, new MsgResourceBundle(res, currLang.getLocale(), currLang.getAD_Language(), Env.isSOTrx(Env.getCtx())));
|
||||||
|
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
JRSwapFileVirtualizer virtualizer = null;
|
JRSwapFileVirtualizer virtualizer = null;
|
||||||
|
|
Loading…
Reference in New Issue