📄 reportengine.java
字号:
whereClause = "";
//
AD_Table_ID = rs.getInt(3);
TableName = rs.getString(4); // required for query
AD_PrintFormat_ID = rs.getInt(5); // required
IsForm = "Y".equals(rs.getString(6)); // required
Client_ID = rs.getInt(7);
}
rs.close();
pstmt.close();
}
catch (SQLException e1)
{
log.log(Level.SEVERE, "(1) - " + sql, e1);
}
// Nothing found
if (AD_ReportView_ID == 0)
{
// Check Print format in Report Directly
sql = "SELECT t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.IsForm "
+ "FROM AD_PInstance pi"
+ " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)"
+ " INNER JOIN AD_PrintFormat pf ON (p.AD_PrintFormat_ID=pf.AD_PrintFormat_ID)"
+ " INNER JOIN AD_Table t ON (pf.AD_Table_ID=t.AD_Table_ID) "
+ "WHERE pi.AD_PInstance_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, pi.getAD_PInstance_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
whereClause = "";
AD_Table_ID = rs.getInt(1);
TableName = rs.getString(2); // required for query
AD_PrintFormat_ID = rs.getInt(3); // required
IsForm = "Y".equals(rs.getString(4)); // required
Client_ID = AD_Client_ID;
}
rs.close();
pstmt.close();
}
catch (SQLException e1)
{
log.log(Level.SEVERE, "(2) - " + sql, e1);
}
if (AD_PrintFormat_ID == 0)
{
log.log(Level.SEVERE, "Report Info NOT found AD_PInstance_ID=" + pi.getAD_PInstance_ID()
+ ",AD_Client_ID=" + AD_Client_ID);
return null;
}
}
// Create Query from Parameters
MQuery query = null;
if (IsForm && pi.getRecord_ID() != 0) // Form = one record
query = MQuery.getEqualQuery(TableName + "_ID", pi.getRecord_ID());
else
query = MQuery.get (ctx, pi.getAD_PInstance_ID(), TableName);
// Add to static where clause from ReportView
if (whereClause.length() != 0)
query.addRestriction(whereClause);
// Get PrintFormat
MPrintFormat format = null;
if (AD_PrintFormat_ID != 0)
{
// We have a PrintFormat with the correct Client
if (Client_ID == AD_Client_ID)
format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
else
format = MPrintFormat.copyToClient (ctx, AD_PrintFormat_ID, AD_Client_ID);
}
if (format != null && format.getItemCount() == 0)
{
log.info("No Items - recreating: " + format);
format.delete(true);
format = null;
}
// Create it
if (format == null && AD_ReportView_ID != 0)
format = MPrintFormat.createFromReportView(ctx, AD_ReportView_ID, pi.getTitle());
if (format == null)
return null;
//
PrintInfo info = new PrintInfo (pi);
info.setAD_Table_ID(AD_Table_ID);
return new ReportEngine(ctx, format, query, info);
} // get
/*************************************************************************/
public static final int ORDER = 0;
public static final int SHIPMENT = 1;
public static final int INVOICE = 2;
public static final int PROJECT = 3;
public static final int RFQ = 4;
//
public static final int REMITTANCE = 5;
public static final int CHECK = 6;
public static final int DUNNING = 7;
private static final String[] DOC_TABLES = new String[] {
"C_Order_Header_v", "M_InOut_Header_v", "C_Invoice_Header_v", "C_Project_Header_v",
"C_RfQResponse_v",
"C_PaySelection_Check_v", "C_PaySelection_Check_v",
"C_DunningRunEntry_v" };
private static final String[] DOC_BASETABLES = new String[] {
"C_Order", "M_InOut", "C_Invoice", "C_Project",
"C_RfQResponse",
"C_PaySelectionCheck", "C_PaySelectionCheck",
"C_DunningRunEntry" };
private static final String[] DOC_IDS = new String[] {
"C_Order_ID", "M_InOut_ID", "C_Invoice_ID", "C_Project_ID",
"C_RfQResponse_ID",
"C_PaySelectionCheck_ID", "C_PaySelectionCheck_ID",
"C_DunningRunEntry_ID" };
private static final int[] DOC_TABLE_ID = new int[] {
X_C_Order.Table_ID, X_M_InOut.Table_ID, X_C_Invoice.Table_ID, X_C_Project.Table_ID,
X_C_RfQResponse.Table_ID,
X_C_PaySelectionCheck.Table_ID, X_C_PaySelectionCheck.Table_ID,
X_C_DunningRunEntry.Table_ID };
/**************************************************************************
* Get Document Print Engine for Document Type.
* @param ctx context
* @param type document type
* @param Record_ID id
* @return Report Engine or null
*/
public static ReportEngine get (Properties ctx, int type, int Record_ID)
{
// Order - Print Shipment or Invoice
if (type == ORDER)
{
int[] what = getDocumentWhat (Record_ID);
if (what != null)
{
type = what[0];
Record_ID = what[1];
}
} // Order
//
String JobName = DOC_BASETABLES[type] + "_Print";
int AD_PrintFormat_ID = 0;
int C_BPartner_ID = 0;
String DocumentNo = null;
int copies = 1;
// Language
MClient client = MClient.get(ctx);
Language language = client.getLanguage();
// Get Document Info
String sql = null;
if (type == CHECK)
sql = "SELECT bad.Check_PrintFormat_ID," // 1
+ " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo " // 2..5
+ "FROM C_PaySelectionCheck d"
+ " INNER JOIN C_PaySelection ps ON (d.C_PaySelection_ID=ps.C_PaySelection_ID)"
+ " INNER JOIN C_BankAccountDoc bad ON (ps.C_BankAccount_ID=bad.C_BankAccount_ID AND d.PaymentRule=bad.PaymentRule)"
+ " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ "WHERE d.C_PaySelectionCheck_ID=?"; // info from BankAccount
else if (type == DUNNING)
sql = "SELECT dl.Dunning_PrintFormat_ID,"
+ " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,dr.DunningDate "
+ "FROM C_DunningRunEntry d"
+ " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
+ " INNER JOIN C_DunningRun dr ON (d.C_DunningRun_ID=dr.C_DunningRun_ID)"
+ " INNER JOIN C_DunningLevel dl ON (dl.C_DunningLevel_ID=dr.C_DunningLevel_ID) "
+ "WHERE d.C_DunningRunEntry_ID=?"; // info from Dunning
else if (type == REMITTANCE)
sql = "SELECT pf.Remittance_PrintFormat_ID,"
+ " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo "
+ "FROM C_PaySelectionCheck d"
+ " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ "WHERE d.C_PaySelectionCheck_ID=?" // info from PrintForm
+ " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
else if (type == PROJECT)
sql = "SELECT pf.Project_PrintFormat_ID,"
+ " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.Value "
+ "FROM C_Project d"
+ " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ "WHERE d.C_Project_ID=?" // info from PrintForm
+ " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
else if (type == RFQ)
sql = "SELECT COALESCE(t.AD_PrintFormat_ID, pf.AD_PrintFormat_ID),"
+ " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,rr.Name "
+ "FROM C_RfQResponse rr"
+ " INNER JOIN C_RfQ r ON (rr.C_RfQ_ID=r.C_RfQ_ID)"
+ " INNER JOIN C_RfQ_Topic t ON (r.C_RfQ_Topic_ID=t.C_RfQ_Topic_ID)"
+ " INNER JOIN AD_Client c ON (rr.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN C_BPartner bp ON (rr.C_BPartner_ID=bp.C_BPartner_ID),"
+ " AD_PrintFormat pf "
+ "WHERE pf.AD_Client_ID IN (0,rr.AD_Client_ID)"
+ " AND pf.AD_Table_ID=725 AND pf.IsTableBased='N'" // from RfQ PrintFormat
+ " AND rr.C_RfQResponse_ID=? " // Info from RfQTopic
+ "ORDER BY t.AD_PrintFormat_ID, pf.AD_Client_ID DESC, pf.AD_Org_ID DESC";
else // Get PrintFormat from Org or 0 of document client
sql = "SELECT pf.Order_PrintFormat_ID,pf.Shipment_PrintFormat_ID," // 1..2
// Prio: 1. BPartner 2. DocType, 3. PrintFormat (Org) // see InvoicePrint
+ " COALESCE (bp.Invoice_PrintFormat_ID,dt.AD_PrintFormat_ID,pf.Invoice_PrintFormat_ID)," // 3
+ " pf.Project_PrintFormat_ID, pf.Remittance_PrintFormat_ID," // 4..5
+ " c.IsMultiLingualDocument, bp.AD_Language," // 6..7
+ " COALESCE(dt.DocumentCopies,0)+COALESCE(bp.DocumentCopies,1), " // 8
+ " dt.AD_PrintFormat_ID,bp.C_BPartner_ID,d.DocumentNo " // 9..11
+ "FROM " + DOC_BASETABLES[type] + " d"
+ " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
+ " LEFT OUTER JOIN C_DocType dt ON (d.C_DocType_ID=dt.C_DocType_ID) "
+ "WHERE d." + DOC_IDS[type] + "=?" // info from PrintForm
+ " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) "
+ "ORDER BY pf.AD_Org_ID DESC";
//
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, Record_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) // first record only
{
if (type == CHECK || type == DUNNING || type == REMITTANCE
|| type == PROJECT || type == RFQ)
{
AD_PrintFormat_ID = rs.getInt(1);
copies = 1;
// Set Language when enabled
String AD_Language = rs.getString(3);
if (AD_Language != null)// && "Y".equals(rs.getString(2))) // IsMultiLingualDocument
language = Language.getLanguage(AD_Language);
C_BPartner_ID = rs.getInt(4);
if (type == DUNNING)
{
Timestamp ts = rs.getTimestamp(5);
DocumentNo = ts.toString();
}
else
DocumentNo = rs.getString(5);
}
else
{
// Set PrintFormat
AD_PrintFormat_ID = rs.getInt(type+1);
if (rs.getInt(9) != 0) // C_DocType.AD_PrintFormat_ID
AD_PrintFormat_ID = rs.getInt(9);
copies = rs.getInt(8);
// Set Language when enabled
String AD_Language = rs.getString(7);
if (AD_Language != null) // && "Y".equals(rs.getString(6))) // IsMultiLingualDocument
language = Language.getLanguage(AD_Language);
C_BPartner_ID = rs.getInt(10);
DocumentNo = rs.getString(11);
}
}
rs.close();
pstmt.close();
}
catch (Exception e)
{
log.log(Level.SEVERE, "Record_ID=" + Record_ID + ", SQL=" + sql, e);
}
if (AD_PrintFormat_ID == 0)
{
log.log(Level.SEVERE, "No PrintFormat found for Type=" + type + ", Record_ID=" + Record_ID);
return null;
}
// Get Format & Data
MPrintFormat format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
format.setLanguage(language); // BP Language if Multi-Lingual
// if (!Env.isBaseLanguage(language, DOC_TABLES[type]))
format.setTranslationLanguage(language);
// query
MQuery query = new MQuery(DOC_TABLES[type]);
query.addRestriction(DOC_IDS[type], MQuery.EQUAL, new Integer(Record_ID));
// log.config( "ReportCtrl.startDocumentPrint - " + format, query + " - " + language.getAD_Language());
//
if (DocumentNo == null || DocumentNo.length() == 0)
DocumentNo = "DocPrint";
PrintInfo info = new PrintInfo(
DocumentNo,
DOC_TABLE_ID[type],
Record_ID,
C_BPartner_ID);
info.setCopies(copies);
info.setDocumentCopy(false); // true prints "Copy" on second
info.setPrinterName(format.getPrinterName());
// Engine
ReportEngine re = new ReportEngine(ctx, format, query, info);
return re;
} // get
/**
* Determine what Order document to print.
* @param C_Order_ID id
* @return int Array with [printWhat, ID]
*/
private static int[] getDocumentWhat (int C_Order_ID)
{
int[] what = new int[2];
what[0] = ORDER;
what[1] = C_Order_ID;
//
String sql = "SELECT dt.DocSubTypeSO "
+ "FROM C_DocType dt, C_Order o "
+ "WHERE o.C_DocType_ID=dt.C_DocType_ID"
+ " AND o.C_Order_ID=?";
String DocSubTypeSO = null;
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_Order_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
DocSubTypeSO = rs.getString(1);
rs.close();
pstmt.close();
}
catch (SQLException e1)
{
log.log(Level.SEVERE, "(1) - " + sql, e1);
return null; // error
}
if (DocSubTypeSO == null)
DocSubTypeSO = "";
// WalkIn Receipt, WalkIn Invoice,
if (DocSubTypeSO.equals("WR") || DocSubTypeSO.equals("WI"))
what[0] = INVOICE;
// WalkIn Pickup,
else if (DocSubTypeSO.equals("WP"))
what[0] = SHIPMENT;
// Offer Binding, Offer Nonbinding, Standard Order
else
return what;
// Get Record_ID of Invoice/Receipt
if (what[0] == INVOICE)
sql = "SELECT C_Invoice_ID REC FROM C_Invoice WHERE C_Order_ID=?" // 1
+ " ORDER BY C_Invoice_ID DESC";
else
sql = "SELECT M_InOut_ID REC FROM M_InOut WHERE C_Order_ID=?" // 1
+ " ORDER BY M_InOut_ID DESC";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_Order_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
// if (i == 1 && ADialog.ask(0, null, what[0] == INVOICE ? "PrintOnlyRecentInvoice?" : "PrintOnlyRecentShipment?")) break;
what[1] = rs.getInt(1);
}
else // No Document Found
what[0] = ORDER;
rs.close();
pstmt.close();
}
catch (SQLException e2)
{
log.log(Level.SEVERE, "(2) - " + sql, e2);
return null;
}
log.fine("Order => " + what[0] + " ID=" + what[1]);
return what;
} // getDocumentWhat
/**
* Print Confirm.
* Update Date Printed
* @param type document type
* @param Record_ID record id
*/
public static void printConfirm (int type, int Record_ID)
{
StringBuffer sql = new StringBuffer();
if (type == ORDER || type == SHIPMENT || type == INVOICE)
sql.append("UPDATE ").append(DOC_BASETABLES[type])
.append(" SET DatePrinted=SysDate, IsPrinted='Y' WHERE ")
.append(DOC_IDS[type]).append("=").append(Record_ID);
//
if (sql.length() > 0)
{
int no = DB.executeUpdate(sql.toString(), null);
if (no != 1)
log.log(Level.SEVERE, "Updated records=" + no + " - should be just one");
}
} // printConfirm
/*************************************************************************
* Test
* @param args args
*/
public static void main(String[] args)
{
org.compiere.Compiere.startupEnvironment(true);
//
int AD_Table_ID = 100;
MQuery q = new MQuery("AD_Table");
q.addRestriction("AD_Table_ID", "<", 108);
//
MPrintFormat f = MPrintFormat.createFromTable(Env.getCtx(), AD_Table_ID);
PrintInfo i = new PrintInfo("test", AD_Table_ID, 108, 0);
i.setAD_Table_ID(AD_Table_ID);
ReportEngine re = new ReportEngine(Env.getCtx(), f, q, i);
re.layout();
/**
re.createCSV(new File("C:\\Temp\\test.csv"), ',', Language.getLanguage());
re.createHTML(new File("C:\\Temp\\test.html"), false, Language.getLanguage());
re.createXML(new File("C:\\Temp\\test.xml"));
re.createPS(new File ("C:\\Temp\\test.ps"));
re.createPDF(new File("C:\\Temp\\test.pdf"));
/****/
re.print();
// re.print(true, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
// re.print(true, 1, false, "HP LaserJet 3300 Series PCL 6"); // Dialog
// re.print(false, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
System.exit(0);
} // main
} // ReportEngine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -