diff --git a/migration/360lts-release/oracle/905_IDEMPIERE-270.sql b/migration/360lts-release/oracle/905_IDEMPIERE-270.sql new file mode 100644 index 0000000000..9545e2d09a --- /dev/null +++ b/migration/360lts-release/oracle/905_IDEMPIERE-270.sql @@ -0,0 +1,42 @@ +-- Sep 6, 2012 7:37:01 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('I','Current Row Only',200037,'D','fdab48f5-7599-4421-8877-a9b0df4ab6d5','CurrentRowOnly','Y',TO_DATE('2012-09-06 19:36:59','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-06 19:36:59','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:37:01 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200037 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:37:21 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('I','All Columns',200038,'D','fdb4bafe-6270-40b1-a6e3-c52a0eaf9292','AllColumns','Y',TO_DATE('2012-09-06 19:37:20','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-06 19:37:20','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:37:21 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200038 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:38:06 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Print Format is Mandatory',200039,'D','c5f497b6-fdbd-4773-9710-38f50940c319','PrintFormatMandatory','Y',TO_DATE('2012-09-06 19:38:05','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-06 19:38:05','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:38:06 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200039 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:38:23 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Export File of Type is Mandatory',200040,'D','32ee772e-1109-4698-ba38-9f0ba0a6a24a','ExportFileTypeMandatory','Y',TO_DATE('2012-09-06 19:38:23','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-06 19:38:23','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:38:23 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200040 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('905_IDEMPIERE-270.sql') FROM dual +; \ No newline at end of file diff --git a/migration/360lts-release/postgresql/905_IDEMPIERE-270.sql b/migration/360lts-release/postgresql/905_IDEMPIERE-270.sql new file mode 100644 index 0000000000..9d8f3e0f44 --- /dev/null +++ b/migration/360lts-release/postgresql/905_IDEMPIERE-270.sql @@ -0,0 +1,42 @@ +-- Sep 6, 2012 7:37:01 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('I','Current Row Only',200037,'D','fdab48f5-7599-4421-8877-a9b0df4ab6d5','CurrentRowOnly','Y',TO_TIMESTAMP('2012-09-06 19:36:59','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-06 19:36:59','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:37:01 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200037 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:37:21 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('I','All Columns',200038,'D','fdb4bafe-6270-40b1-a6e3-c52a0eaf9292','AllColumns','Y',TO_TIMESTAMP('2012-09-06 19:37:20','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-06 19:37:20','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:37:21 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200038 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:38:06 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Print Format is Mandatory',200039,'D','c5f497b6-fdbd-4773-9710-38f50940c319','PrintFormatMandatory','Y',TO_TIMESTAMP('2012-09-06 19:38:05','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-06 19:38:05','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:38:06 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200039 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Sep 6, 2012 7:38:23 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Export File of Type is Mandatory',200040,'D','32ee772e-1109-4698-ba38-9f0ba0a6a24a','ExportFileTypeMandatory','Y',TO_TIMESTAMP('2012-09-06 19:38:23','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-06 19:38:23','YYYY-MM-DD HH24:MI:SS')) +; + +-- Sep 6, 2012 7:38:23 PM SGT +-- IDEMPIERE-270 Reports should inherit search filter from window +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200040 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('905_IDEMPIERE-270.sql') FROM dual +; \ No newline at end of file diff --git a/org.adempiere.base/src/org/compiere/print/MPrintFormat.java b/org.adempiere.base/src/org/compiere/print/MPrintFormat.java index 5271dcf264..cd18c4687d 100644 --- a/org.adempiere.base/src/org/compiere/print/MPrintFormat.java +++ b/org.adempiere.base/src/org/compiere/print/MPrintFormat.java @@ -21,15 +21,21 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.List; import java.util.Properties; import java.util.logging.Level; import javax.sql.RowSet; +import org.adempiere.model.MTabCustomization; +import org.compiere.model.GridField; +import org.compiere.model.GridTab; +import org.compiere.model.GridTable; import org.compiere.model.MQuery; import org.compiere.model.MRole; -import org.compiere.model.PO; import org.compiere.model.X_AD_PrintFormat; import org.compiere.util.CCache; import org.compiere.util.CLogger; @@ -447,7 +453,148 @@ public class MPrintFormat extends X_AD_PrintFormat return "NULL"; return value.toString(); } // saveNewSpecial + + static public MPrintFormat createFromGridLayout(Properties ctx, GridTab gridTab, boolean allColumns) + { + int AD_Client_ID = Env.getAD_Client_ID(ctx); + MPrintFormat pf = new MPrintFormat(ctx, 0, null); + pf.setAD_Table_ID(gridTab.getAD_Table_ID()); + // Get Info + String sql = "SELECT TableName," // 1 + + " (SELECT COUNT(*) FROM AD_PrintFormat x WHERE x.AD_Table_ID=t.AD_Table_ID AND x.AD_Client_ID=c.AD_Client_ID) AS Count," + + " COALESCE (cpc.AD_PrintColor_ID, pc.AD_PrintColor_ID) AS AD_PrintColor_ID," // 3 + + " COALESCE (cpf.AD_PrintFont_ID, pf.AD_PrintFont_ID) AS AD_PrintFont_ID," + + " COALESCE (cpp.AD_PrintPaper_ID, pp.AD_PrintPaper_ID) AS AD_PrintPaper_ID " + + "FROM AD_Table t, AD_Client c" + + " LEFT OUTER JOIN AD_PrintColor cpc ON (cpc.AD_Client_ID=c.AD_Client_ID AND cpc.IsDefault='Y')" + + " LEFT OUTER JOIN AD_PrintFont cpf ON (cpf.AD_Client_ID=c.AD_Client_ID AND cpf.IsDefault='Y')" + + " LEFT OUTER JOIN AD_PrintPaper cpp ON (cpp.AD_Client_ID=c.AD_Client_ID AND cpp.IsDefault='Y')," + + " AD_PrintColor pc, AD_PrintFont pf, AD_PrintPaper pp " + + "WHERE t.AD_Table_ID=? AND c.AD_Client_ID=?" // #1/2 + + " AND pc.IsDefault='Y' AND pf.IsDefault='Y' AND pp.IsDefault='Y'"; + boolean error = true; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, gridTab.getAD_Table_ID()); + pstmt.setInt(2, AD_Client_ID); + rs = pstmt.executeQuery(); + if (rs.next()) + { + // Name + String TableName = rs.getString(1); + String ColumnName = TableName + "_ID"; + String s = ColumnName; + if (!ColumnName.equals("T_Report_ID")) + { + s = Msg.translate (ctx, ColumnName); + if (ColumnName.equals (s)) // not found + s = Msg.translate (ctx, TableName); + } + int count = rs.getInt(2); + if (count > 0) + s += "_" + (count+1); + pf.setName(s); + // + pf.setAD_PrintColor_ID(rs.getInt(3)); + pf.setAD_PrintFont_ID(rs.getInt(4)); + pf.setAD_PrintPaper_ID(rs.getInt(5)); + // + error = false; + } + else + s_log.log(Level.SEVERE, "No info found " + gridTab.getAD_Table_ID()); + } + catch (SQLException e) + { + s_log.log(Level.SEVERE, sql, e); + } + finally { + DB.close(rs, pstmt); + rs = null; pstmt = null; + } + if (error) + return null; + + // Save & complete + if (!pf.save()) + return null; + + GridField[] gridFields = null; + + GridTable tableModel = gridTab.getTableModel(); + GridField[] tmpFields = tableModel.getFields(); + MTabCustomization tabCustomization = MTabCustomization.get(Env.getCtx(), Env.getAD_User_ID(Env.getCtx()), gridTab.getAD_Tab_ID(), null); + if (!allColumns && tabCustomization != null && tabCustomization.getAD_Tab_Customization_ID() > 0 + && tabCustomization.getCustom() != null && tabCustomization.getCustom().trim().length() > 0) + { + String custom = tabCustomization.getCustom().trim(); + String[] customComponent = custom.split(";"); + String[] fieldIds = customComponent[0].split("[,]"); + List fieldList = new ArrayList(); + for(String fieldIdStr : fieldIds) + { + fieldIdStr = fieldIdStr.trim(); + if (fieldIdStr.length() == 0) continue; + int AD_Field_ID = Integer.parseInt(fieldIdStr); + for(GridField gridField : tmpFields) + { + if (gridField.getAD_Field_ID() == AD_Field_ID) + { + if(gridField.isDisplayedGrid()) + fieldList.add(gridField); + + break; + } + } + } + gridFields = fieldList.toArray(new GridField[0]); + } + else + { + ArrayList gridFieldList = new ArrayList(); + + for(GridField field:tmpFields) + { + if(field.isDisplayedGrid()) + gridFieldList.add(field); + } + + Collections.sort(gridFieldList, new Comparator() { + @Override + public int compare(GridField o1, GridField o2) { + return o1.getSeqNoGrid()-o2.getSeqNoGrid(); + } + }); + + gridFields = new GridField[gridFieldList.size()]; + gridFieldList.toArray(gridFields); + } + + ArrayList printFormatItemList = new ArrayList(); + int seqNo = 1; + for (GridField gridField : gridFields) + { + if (gridField.getAD_Column_ID() <= 0) + continue; + + MPrintFormatItem pfi = MPrintFormatItem.createFromColumn (pf, gridField.getAD_Column_ID(), seqNo++); + if (pfi != null) + { + printFormatItemList.add (pfi); + s_log.finest("Tab: " + pfi); + } + } + + MPrintFormatItem[] printFormatItems = new MPrintFormatItem[printFormatItemList.size()]; + printFormatItemList.toArray(printFormatItems); + pf.setItems(printFormatItems); + + return pf; + } /************************************************************************** * Create MPrintFormat for Table diff --git a/org.adempiere.base/src/org/compiere/process/ProcessInfo.java b/org.adempiere.base/src/org/compiere/process/ProcessInfo.java index b1724ba3ea..0e058a2633 100644 --- a/org.adempiere.base/src/org/compiere/process/ProcessInfo.java +++ b/org.adempiere.base/src/org/compiere/process/ProcessInfo.java @@ -124,6 +124,18 @@ public class ProcessInfo implements Serializable private boolean m_reportingProcess = false; //FR 1906632 private File m_pdf_report = null; + + /** Record IDs */ + private int[] m_Record_IDs; + + /** Export */ + private boolean m_export = false; + + /** Export File Extension */ + private String m_exportFileExtension = null; + + /** Export File */ + private File m_exportFile = null; /** * String representation @@ -684,7 +696,69 @@ public class ProcessInfo implements Serializable public File getPDFReport() { return m_pdf_report; - } - + } + /** + * Is this a export or print process? + * @return + */ + public boolean isExport() + { + return m_export; + } + + /** + * Set Export + * @param export + */ + public void setExport(boolean export) + { + this.m_export = export; + } + + /** + * Get Export File Extension + * @param + */ + public String getExportFileExtension() + { + return m_exportFileExtension; + } + + /** + * Set Export File Extension + * @param exportFileOfType + */ + public void setExportFileExtension(String exportFileExtension) + { + m_exportFileExtension = exportFileExtension; + } + + /** + * Get Export File + * @return + */ + public File getExportFile() + { + return m_exportFile; + } + + /** + * Set Export File + * @param exportFile + */ + public void setExportFile(File exportFile) + { + m_exportFile = exportFile; + } + + public int[] getRecord_IDs() + { + return m_Record_IDs; + } + + public void setRecord_IDs(int[] Record_IDs) + { + m_Record_IDs = Record_IDs; + } } // ProcessInfo diff --git a/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java b/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java index 67869abd7f..020c54fb4c 100644 --- a/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java +++ b/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java @@ -48,29 +48,42 @@ import javax.print.attribute.standard.JobName; import net.sf.jasperreports.engine.DefaultJasperReportsContext; import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JRParameter; import net.sf.jasperreports.engine.JRPropertiesUtil; +import net.sf.jasperreports.engine.JRQuery; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.design.JRDesignQuery; +import net.sf.jasperreports.engine.design.JasperDesign; +import net.sf.jasperreports.engine.export.JRCsvExporter; +import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.JRPrintServiceExporter; import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter; +import net.sf.jasperreports.engine.export.JRTextExporter; +import net.sf.jasperreports.engine.export.JRXlsExporter; +import net.sf.jasperreports.engine.export.JRXmlExporter; import net.sf.jasperreports.engine.fill.JRSwapFileVirtualizer; import net.sf.jasperreports.engine.util.JRLoader; import net.sf.jasperreports.engine.util.JRSwapFile; import net.sf.jasperreports.engine.util.LocalJasperReportsContext; +import net.sf.jasperreports.engine.xml.JRXmlLoader; +import net.sf.jasperreports.engine.xml.JRXmlWriter; import org.adempiere.base.Service; import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.DBException; -import org.adempiere.util.IProcessUI; +import org.adempiere.util.IProcessUI; import org.compiere.model.MAttachment; import org.compiere.model.MAttachmentEntry; import org.compiere.model.MProcess; +import org.compiere.model.MQuery; import org.compiere.model.MSysConfig; +import org.compiere.model.MTable; import org.compiere.model.PrintInfo; import org.compiere.model.X_AD_PInstance_Para; import org.compiere.print.MPrintFormat; @@ -405,6 +418,68 @@ public class ReportStarter implements ProcessCall, ClientProcess } params.put("SUBREPORT_DIR", resourcePath); params.put("RESOURCE_DIR", resourcePath); + + if (jasperReport != null && pi.getTable_ID() > 0 && Record_ID <= 0 && pi.getRecord_IDs() != null && pi.getRecord_IDs().length > 0) + { + try + { + JRQuery originalQuery = jasperReport.getQuery(); + if (originalQuery != null) + { + String originalQueryText = originalQuery.getText(); + if (originalQueryText != null) + { + MTable table = new MTable(ctx, pi.getTable_ID(), trxName); + String tableName = table.getTableName(); + String originalQueryTemp = originalQueryText.toUpperCase(); + int index1 = originalQueryTemp.indexOf(" " + tableName.toUpperCase()); + if (index1 != -1) + { + int index2 = originalQueryTemp.substring(index1).indexOf(","); + if (index2 != -1) + { + String tableVariable = originalQueryTemp.substring(index1 + tableName.length() + 1, index1 + index2); + tableVariable = tableVariable.trim(); + + if (tableVariable.length() == 0) + tableVariable = tableName; + + MQuery query = new MQuery(tableName); + for (int recordId : pi.getRecord_IDs()) + query.addRestriction(tableVariable + "." + query.getTableName() + "_ID" + MQuery.EQUAL + recordId, false, 0); + + String newQueryText = null; + int index3 = originalQueryTemp.indexOf("WHERE"); + if (index3 != -1) + newQueryText = originalQueryText + " AND " + query.toString(); + else + newQueryText = originalQueryText + " WHERE " + query.toString(); + + File jrxmlFile = File.createTempFile(makePrefix(jasperReport.getName()), ".jrxml"); + JRXmlWriter.writeReport(jasperReport, new FileOutputStream(jrxmlFile), "UTF-8"); + + JasperDesign jasperDesign = JRXmlLoader.load(jrxmlFile); + + JRDesignQuery newQuery = new JRDesignQuery(); + newQuery.setText(newQueryText); + jasperDesign.setQuery(newQuery); + + JasperReport newJasperReport = JasperCompileManager.compileReport(jasperDesign); + if (newJasperReport != null) + { + data.jasperReport = newJasperReport; + jasperReport = newJasperReport; + } + } + } + } + } + } + catch(Exception e) + { + log.severe("Failed to modify the report query"); + } + } if (jasperReport != null) { File[] subreports; @@ -529,72 +604,120 @@ public class ReportStarter implements ProcessCall, ClientProcess DefaultJasperReportsContext jasperContext = DefaultJasperReportsContext.getInstance(); JRPropertiesUtil.getInstance(jasperContext).setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true"); JasperPrint jasperPrint = JasperFillManager.fillReport( jasperReport, params, conn); - if (reportData.isDirectPrint()) + + if (!processInfo.isExport()) { - log.info( "ReportStarter.startProcess print report -" + jasperPrint.getName()); - //RF 1906632 - if (!processInfo.isBatch()) { - - // Get printer job - PrinterJob printerJob = PrintUtil.getPrinterJob(printerName); - // Set print request attributes - - // Paper Attributes: - PrintRequestAttributeSet prats = new HashPrintRequestAttributeSet(); - - // add: copies, job-name, priority - if (printInfo == null || printInfo.isDocumentCopy() || printInfo.getCopies() < 1) // @Trifon - prats.add (new Copies(1)); - else - prats.add (new Copies(printInfo.getCopies())); - Locale locale = Language.getLoginLanguage().getLocale(); - // @Trifon - String printFormat_name = printFormat == null ? "" : printFormat.getName(); - int numCopies = printInfo == null ? 0 : printInfo.getCopies(); - prats.add(new JobName(printFormat_name + "_" + pi.getRecord_ID(), locale)); - prats.add(PrintUtil.getJobPriority(jasperPrint.getPages().size(), numCopies, true)); - - // Create print service exporter - JRPrintServiceExporter exporter = new JRPrintServiceExporter();; - // Set parameters - exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); - exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE, printerJob.getPrintService()); - exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printerJob.getPrintService().getAttributes()); - exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, prats); - exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE); - exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE); - // Print report / document - exporter.exportReport(); - - } - else - { - // You can use JasperPrint to create PDF - // Used For the PH - try - { - File PDF = File.createTempFile(makePrefix(jasperPrint.getName()), ".pdf"); - DefaultJasperReportsContext jrContext = DefaultJasperReportsContext.getInstance(); - LocalJasperReportsContext ljrContext = new LocalJasperReportsContext(jrContext); - ljrContext.setClassLoader(this.getClass().getClassLoader()); - JRPdfExporter exporter = new JRPdfExporter(ljrContext); - exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); - exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, PDF.getAbsolutePath()); - exporter.exportReport(); - processInfo.setPDFReport(PDF); - } - catch (IOException e) - { - log.severe("ReportStarter.startProcess: Can not make PDF File - "+ e.getMessage()); - } + if (reportData.isDirectPrint()) + { + log.info( "ReportStarter.startProcess print report -" + jasperPrint.getName()); + //RF 1906632 + if (!processInfo.isBatch()) { + + // Get printer job + PrinterJob printerJob = PrintUtil.getPrinterJob(printerName); + // Set print request attributes + + // Paper Attributes: + PrintRequestAttributeSet prats = new HashPrintRequestAttributeSet(); + + // add: copies, job-name, priority + if (printInfo == null || printInfo.isDocumentCopy() || printInfo.getCopies() < 1) // @Trifon + prats.add (new Copies(1)); + else + prats.add (new Copies(printInfo.getCopies())); + Locale locale = Language.getLoginLanguage().getLocale(); + // @Trifon + String printFormat_name = printFormat == null ? "" : printFormat.getName(); + int numCopies = printInfo == null ? 0 : printInfo.getCopies(); + prats.add(new JobName(printFormat_name + "_" + pi.getRecord_ID(), locale)); + prats.add(PrintUtil.getJobPriority(jasperPrint.getPages().size(), numCopies, true)); + + // Create print service exporter + JRPrintServiceExporter exporter = new JRPrintServiceExporter();; + // Set parameters + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE, printerJob.getPrintService()); + exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printerJob.getPrintService().getAttributes()); + exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, prats); + exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE); + exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE); + // Print report / document + exporter.exportReport(); + + } + else + { + // You can use JasperPrint to create PDF + // Used For the PH + try + { + File PDF = File.createTempFile(makePrefix(jasperPrint.getName()), ".pdf"); + DefaultJasperReportsContext jrContext = DefaultJasperReportsContext.getInstance(); + LocalJasperReportsContext ljrContext = new LocalJasperReportsContext(jrContext); + ljrContext.setClassLoader(this.getClass().getClassLoader()); + JRPdfExporter exporter = new JRPdfExporter(ljrContext); + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, PDF.getAbsolutePath()); + exporter.exportReport(); + processInfo.setPDFReport(PDF); + } + catch (IOException e) + { + log.severe("ReportStarter.startProcess: Can not make PDF File - "+ e.getMessage()); + } + } + + // You can use JasperPrint to create PDF + // JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf"); + } else { + log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName()); + JRViewerProvider viewerLauncher = Service.locate(JRViewerProvider.class); + viewerLauncher.openViewer(jasperPrint, pi.getTitle()+" - " + reportPath); + } } + else + { + try + { + String ext = pi.getExportFileExtension(); + if (ext == null) + ext = "pdf"; + + File file = File.createTempFile(makePrefix(jasperPrint.getName()), "." + ext); + DefaultJasperReportsContext jrContext = DefaultJasperReportsContext.getInstance(); + LocalJasperReportsContext ljrContext = new LocalJasperReportsContext(jrContext); + ljrContext.setClassLoader(this.getClass().getClassLoader()); - // You can use JasperPrint to create PDF -// JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf"); - } else { - log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName()); - JRViewerProvider viewerLauncher = Service.locate(JRViewerProvider.class); - viewerLauncher.openViewer(jasperPrint, pi.getTitle()+" - " + reportPath); + JRExporter exporter = null; + if (ext.equals("pdf")) + exporter = new JRPdfExporter(ljrContext); + else if (ext.equals("ps")) + exporter = new JRPrintServiceExporter(ljrContext); + else if (ext.equals("xml")) + exporter = new JRXmlExporter(ljrContext); + else if (ext.equals("csv") || ext.equals("ssv")) + exporter = new JRCsvExporter(ljrContext); + else if (ext.equals("txt")) + exporter = new JRTextExporter(ljrContext); + else if (ext.equals("html") || ext.equals("htm")) + exporter = new JRHtmlExporter(ljrContext); + else if (ext.equals("xls")) + exporter = new JRXlsExporter(ljrContext); + else + log.severe("FileInvalidExtension="+ext); + + if (exporter == null) + exporter = new JRPdfExporter(ljrContext); + + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream(file)); + exporter.exportReport(); + processInfo.setExportFile(file); + } + catch (IOException e) + { + log.severe("ReportStarter.startProcess: Can not export PDF File - "+ e.getMessage()); + } } } catch (JRException e) { log.severe("ReportStarter.startProcess: Can not run report - "+ e.getMessage()); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java index 0654ff4f67..a82c56d2fd 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java @@ -54,6 +54,7 @@ import org.adempiere.webui.event.DialogEvents; import org.adempiere.webui.event.ToolbarListener; import org.adempiere.webui.exception.ApplicationException; import org.adempiere.webui.panel.action.ExportAction; +import org.adempiere.webui.panel.action.ReportAction; import org.adempiere.webui.part.AbstractUIPart; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.window.CustomizeGridViewDialog; @@ -2067,7 +2068,9 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To } private void onReport0() { - // Query + ReportAction reportAction = new ReportAction(this); + reportAction.show(); +/* // Query MQuery query = new MQuery(curTab.getTableName()); // Link for detail records String queryColumn = curTab.getLinkColumnName(); @@ -2101,6 +2104,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To } new WReport (curTab.getAD_Table_ID(), query, toolbar.getEvent().getTarget(), curWindowNo, curTab.getWhereExtended()); +*/ } /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ChangePasswordPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ChangePasswordPanel.java index 19ba6dc653..8a8e54a6e0 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ChangePasswordPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/ChangePasswordPanel.java @@ -1,3 +1,18 @@ +/****************************************************************************** + * Copyright (C) 2012 Elaine Tan * + * Copyright (C) 2012 Trek Global + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ + + package org.adempiere.webui.panel; import java.util.Properties; @@ -27,6 +42,11 @@ import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zul.Image; +/** + * Change Password Panel + * @author Elaine + * @date August 30, 2012 + */ public class ChangePasswordPanel extends Window implements EventListener { /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java new file mode 100644 index 0000000000..47068bc6d5 --- /dev/null +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java @@ -0,0 +1,400 @@ +/****************************************************************************** + * Copyright (C) 2012 Elaine Tan * + * Copyright (C) 2012 Trek Global + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ + + +package org.adempiere.webui.panel.action; + +import static org.compiere.model.SystemIDs.WINDOW_PRINTFORMAT; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.StringWriter; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.logging.Level; + +import javax.sql.RowSet; + +import org.adempiere.webui.apps.AEnv; +import org.adempiere.webui.apps.WProcessCtl; +import org.adempiere.webui.component.Checkbox; +import org.adempiere.webui.component.ConfirmPanel; +import org.adempiere.webui.component.Label; +import org.adempiere.webui.component.ListItem; +import org.adempiere.webui.component.Listbox; +import org.adempiere.webui.component.Window; +import org.adempiere.webui.panel.AbstractADWindowPanel; +import org.adempiere.webui.window.FDialog; +import org.compiere.model.GridTab; +import org.compiere.model.MQuery; +import org.compiere.model.MRole; +import org.compiere.model.PrintInfo; +import org.compiere.print.MPrintFormat; +import org.compiere.print.ReportCtl; +import org.compiere.print.ReportEngine; +import org.compiere.process.ProcessInfo; +import org.compiere.process.ServerProcessCtl; +import org.compiere.util.CLogger; +import org.compiere.util.Env; +import org.compiere.util.KeyNamePair; +import org.compiere.util.Msg; +import org.zkoss.util.media.AMedia; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Div; +import org.zkoss.zul.Filedownload; +import org.zkoss.zul.Hbox; +import org.zkoss.zul.Vbox; + +/** + * @author Elaine + * @date September 6, 2012 + */ +public class ReportAction implements EventListener +{ + private static CLogger log = CLogger.getCLogger(ReportAction.class); + + private AbstractADWindowPanel panel; + + private Window winReport = null; + private ConfirmPanel confirmPanel = new ConfirmPanel(true); + private Listbox cboPrintFormat = new Listbox(); + private Listbox cboExportType = new Listbox(); + private Checkbox chkCurrentRowOnly = new Checkbox(); + private Checkbox chkExport = new Checkbox(); + private Checkbox chkAllColumns = new Checkbox(); + + private ArrayList printFormatList = new ArrayList(); + + public ReportAction(AbstractADWindowPanel panel) + { + this.panel = panel; + getPrintFormats(panel.getActiveGridTab().getAD_Table_ID()); + } + + public void show() + { + if(winReport == null) + { + winReport = new Window(); + winReport.setTitle(Msg.getMsg(Env.getCtx(), "Export") + ": " + panel.getActiveGridTab().getName()); + winReport.setWidth("450px"); + winReport.setClosable(true); + winReport.setBorder("normal"); + winReport.setStyle("position:absolute"); + + cboPrintFormat.setMold("select"); + cboPrintFormat.getItems().clear(); + for (KeyNamePair printFormat : printFormatList) + cboPrintFormat.appendItem(printFormat.getName(), printFormat.getKey()); + if (cboPrintFormat.getItemCount() > 0) + cboPrintFormat.setSelectedIndex(0); + + cboExportType.setMold("select"); + cboExportType.getItems().clear(); + cboExportType.appendItem("ps" + " - " + Msg.getMsg(Env.getCtx(), "FilePS"), "ps"); + cboExportType.appendItem("xml" + " - " + Msg.getMsg(Env.getCtx(), "FileXML"), "xml"); + cboExportType.appendItem("pdf" + " - " + Msg.getMsg(Env.getCtx(), "FilePDF"), "pdf"); + cboExportType.appendItem("html" + " - " + Msg.getMsg(Env.getCtx(), "FileHTML"), "html"); + cboExportType.appendItem("txt" + " - " + Msg.getMsg(Env.getCtx(), "FileTXT"), "txt"); + cboExportType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv"); + cboExportType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv"); + ListItem li = cboExportType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls"); + cboExportType.setSelectedItem(li); + cboExportType.setVisible(false); + + chkCurrentRowOnly.setLabel(Msg.getMsg(Env.getCtx(), "CurrentRowOnly")); + chkCurrentRowOnly.setSelected(false); + + chkExport.setLabel(Msg.getMsg(Env.getCtx(), "Export")); + chkExport.setSelected(false); + + chkAllColumns.setLabel(Msg.getMsg(Env.getCtx(), "AllColumns")); + chkAllColumns.setSelected(false); + li = cboPrintFormat.getSelectedItem(); + if (li != null && li.getValue() != null) + { + int AD_PrintFormat_ID = Integer.valueOf(li.getValue().toString()); + chkAllColumns.setVisible(AD_PrintFormat_ID == -1); + } + + Vbox vb = new Vbox(); + vb.setWidth("100%"); + winReport.appendChild(vb); + + Hbox hb = new Hbox(); + hb.setAlign("center"); + Div div = new Div(); + div.appendChild(new Label(Msg.translate(Env.getCtx(), "AD_PrintFormat_ID"))); + hb.appendChild(div); + hb.appendChild(cboPrintFormat); + cboPrintFormat.setWidth("100%"); + cboPrintFormat.addEventListener(Events.ON_SELECT, this); + vb.appendChild(hb); + + vb.appendChild(chkCurrentRowOnly); + + hb = new Hbox(); + hb.setAlign("center"); + hb.appendChild(chkExport); + chkExport.addEventListener(Events.ON_CHECK, this); + hb.appendChild(cboExportType); + cboExportType.setWidth("100%"); + vb.appendChild(hb); + + vb.appendChild(chkAllColumns); + + vb.appendChild(confirmPanel); + confirmPanel.addActionListener(this); + } + + winReport.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED); + AEnv.showWindow(winReport); + } + + @Override + public void onEvent(Event event) throws Exception { + if(event.getTarget().getId().equals(ConfirmPanel.A_CANCEL)) + winReport.onClose(); + else if(event.getTarget().getId().equals(ConfirmPanel.A_OK)) + validate(); + else if(event.getTarget() == cboPrintFormat) + { + ListItem li = cboPrintFormat.getSelectedItem(); + if (li != null && li.getValue() != null) + { + int AD_PrintFormat_ID = Integer.valueOf(li.getValue().toString()); + chkAllColumns.setVisible(AD_PrintFormat_ID == -1); + } + } + else if(event.getTarget() == chkExport) + cboExportType.setVisible(chkExport.isChecked()); + } + + private void validate() + { + ListItem li = cboPrintFormat.getSelectedItem(); + if(li == null || li.getValue() == null) + { + FDialog.error(0, winReport, "PrintFormatMandatory"); + return; + } + + int AD_PrintFormat_ID = Integer.valueOf(li.getValue().toString()); + + boolean export = chkExport.isChecked(); + if (export) + { + li = cboExportType.getSelectedItem(); + if(li == null || li.getValue() == null) + { + FDialog.error(0, winReport, "ExportFileTypeMandatory"); + return; + } + } + + GridTab gridTab = panel.getActiveGridTab(); + + // Print Format + boolean allColumns = chkAllColumns.isChecked(); + MPrintFormat pf = null; + if (AD_PrintFormat_ID == -1) + pf = MPrintFormat.createFromGridLayout(Env.getCtx(), gridTab, allColumns); + else + pf = MPrintFormat.get (Env.getCtx(), AD_PrintFormat_ID, true); + + // Query + boolean currentRowOnly = chkCurrentRowOnly.isChecked(); + int Record_ID = 0; + int[] RecordIDs = null; + MQuery query = new MQuery(gridTab.getTableName()); + if (currentRowOnly) + { + Record_ID = gridTab.getRecord_ID(); + query.addRestriction(query.getTableName() + "_ID", MQuery.EQUAL, Record_ID); + } + else + { + RecordIDs = new int[gridTab.getRowCount()]; + for(int i = 0; i < gridTab.getRowCount(); i++) + { + RecordIDs[i] = gridTab.getKeyID(i); + query.addRestriction(query.getTableName() + "." + query.getTableName() + "_ID" + MQuery.EQUAL + RecordIDs[i], false, 0); + } + } + + PrintInfo info = new PrintInfo(pf.getName(), pf.getAD_Table_ID(), Record_ID); + info.setDescription(query.getInfo()); + + if(pf != null && pf.getJasperProcess_ID() > 0) + { + // It's a report using the JasperReports engine + ProcessInfo pi = new ProcessInfo ("", pf.getJasperProcess_ID(), pf.getAD_Table_ID(), Record_ID); + pi.setRecord_IDs(RecordIDs); + pi.setIsBatch(true); + + if (export) + { + li = cboExportType.getSelectedItem(); + String ext = li.getValue().toString(); + pi.setExportFileExtension(ext); + pi.setExport(true); + + winReport.onClose(); + ServerProcessCtl.process(null, pi, null); + + try + { + File exportFile = pi.getExportFile(); + AMedia media = new AMedia(exportFile.getName() + "." + ext, null, "application/octet-stream", exportFile, true); + Filedownload.save(media, exportFile.getName() + "." + ext); + } + catch (Exception e) + { + log.log(Level.SEVERE, "Failed to export content.", e); + } + } + else + { + winReport.onClose(); + WProcessCtl.process(gridTab.getWindowNo(), pi, null); + } + } + else + { + // It's a default report using the standard printing engine + ReportEngine re = new ReportEngine (Env.getCtx(), pf, query, info); + re.setWhereExtended(gridTab.getWhereExtended()); + re.setWindowNo(gridTab.getWindowNo()); + + if (export) + export(re); + else + print(re); + } + } + + private void print(ReportEngine re) + { + winReport.onClose(); + ReportCtl.preview(re); + } + + private void export(ReportEngine re) + { + try + { + ListItem li = cboExportType.getSelectedItem(); + if(li == null || li.getValue() == null) + { + FDialog.error(0, winReport, "FileInvalidExtension"); + return; + } + + String ext = li.getValue().toString(); + + byte[] data = null; + File inputFile = null; + + if (ext.equals("pdf")) + { + data = re.createPDFData(); + } + else if (ext.equals("ps")) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + re.createPS(baos); + data = baos.toByteArray(); + } + else if (ext.equals("xml")) + { + StringWriter sw = new StringWriter(); + re.createXML(sw); + data = sw.getBuffer().toString().getBytes(); + } + else if (ext.equals("csv") || ext.equals("ssv")) + { + StringWriter sw = new StringWriter(); + re.createCSV(sw, ',', re.getPrintFormat().getLanguage()); + data = sw.getBuffer().toString().getBytes(); + } + else if (ext.equals("txt")) + { + StringWriter sw = new StringWriter(); + re.createCSV(sw, '\t', re.getPrintFormat().getLanguage()); + data = sw.getBuffer().toString().getBytes(); + } + else if (ext.equals("html") || ext.equals("htm")) + { + StringWriter sw = new StringWriter(); + re.createHTML(sw, false, re.getPrintFormat().getLanguage()); + data = sw.getBuffer().toString().getBytes(); + } + else if (ext.equals("xls")) + { + inputFile = File.createTempFile("Export", ".xls"); + re.createXLS(inputFile, re.getPrintFormat().getLanguage()); + } + else + { + FDialog.error(0, winReport, "FileInvalidExtension"); + return; + } + + winReport.onClose(); + AMedia media = null; + if (data != null) + media = new AMedia(re.getPrintFormat().getName() + "." + ext, null, "application/octet-stream", data); + else + media = new AMedia(re.getPrintFormat().getName() + "." + ext, null, "application/octet-stream", inputFile, true); + Filedownload.save(media, re.getPrintFormat().getName() + "." + ext); + } + catch (Exception e) + { + log.log(Level.SEVERE, "Failed to export content.", e); + } + } + + private void getPrintFormats(int AD_Table_ID) + { + printFormatList.clear(); + + int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx()); + RowSet rowSet = MPrintFormat.getAccessiblePrintFormats(AD_Table_ID, -1, null); + KeyNamePair pp = null; + try + { + while (rowSet.next()) + { + pp = new KeyNamePair (rowSet.getInt(1), rowSet.getString(2)); + if (rowSet.getInt(3) == AD_Client_ID) + { + printFormatList.add(pp); + } + } + } + catch (SQLException e) + { + log.log(Level.SEVERE, e.getLocalizedMessage(), e); + } + + if (MRole.getDefault().isTableAccess(MPrintFormat.Table_ID, false) && MRole.getDefault().getWindowAccess(WINDOW_PRINTFORMAT)) + { + StringBuffer sb = new StringBuffer("** ").append(Msg.getMsg(Env.getCtx(), "NewReport")).append(" **"); + pp = new KeyNamePair(-1, sb.toString()); + printFormatList.add(pp); + } + } +}