From 2184a3f3dea9a604a0d516739f6ab91227bf7c69 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 21 Aug 2013 18:01:45 -0500 Subject: [PATCH 1/4] IDEMPIERE-1271 Bug of read only logic for tab / fix quick entry broken --- org.adempiere.base/src/org/compiere/model/GridField.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridField.java b/org.adempiere.base/src/org/compiere/model/GridField.java index 73cc4df99f..c432a7077c 100644 --- a/org.adempiere.base/src/org/compiere/model/GridField.java +++ b/org.adempiere.base/src/org/compiere/model/GridField.java @@ -434,7 +434,8 @@ public class GridField } //check tab context - if (checkContext && getGridTab() != null) + if (checkContext && getGridTab() != null && + ! "Y".equals(Env.getContext(Env.getCtx(), getWindowNo(), "_QUICK_ENTRY_MODE_"))) { if (getGridTab().isReadOnly()) { From be0f3bfdc5771eb8bec46eb5af969b27de40e1dc Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 22 Aug 2013 16:49:37 +0800 Subject: [PATCH 2/4] IDEMPIERE-497 2Pack SQL Statement Handler improvements for Postgresql. Handle scenario where savepoint become invalid because there's commit or rollback clause in the sql statement. --- .../src/org/compiere/model/PO.java | 4 +- .../handler/SQLStatementElementHandler.java | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index daa6810f66..33fac330ef 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -2644,10 +2644,10 @@ public abstract class PO else { if (m_trxName == null) - log.log(Level.WARNING, "#" + no + log.log(Level.WARNING, "Update return " + no + " instead of 1" + " - " + p_info.getTableName() + "." + where); else - log.log(Level.WARNING, "#" + no + log.log(Level.WARNING, "Update return " + no + " instead of 1" + " - [" + m_trxName + "] - " + p_info.getTableName() + "." + where); } return ok; diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java index 4ba2cf0a1c..519c16932f 100644 --- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java @@ -49,15 +49,13 @@ public class SQLStatementElementHandler extends AbstractElementHandler { sql = sql.substring(0, sql.length() - 1); Savepoint savepoint = null; PreparedStatement pstmt = null; + X_AD_Package_Imp_Detail impDetail = null; try { // NOTE Postgres needs to commit DDL statements // add a SQL command just with COMMIT if you want to simulate the Oracle behavior (commit on DDL) // Use savepoint here so that SQL exception would not rollback the whole process - if (DB.isPostgreSQL()) - { - Trx trx = Trx.get(getTrxName(ctx), true); - savepoint = trx.setSavepoint(null); - } + Trx trx = Trx.get(getTrxName(ctx), true); + savepoint = trx.setSavepoint(null); pstmt = DB.prepareStatement(sql, getTrxName(ctx)); if (DBType.equals("ALL")) { @@ -86,27 +84,23 @@ public class SQLStatementElementHandler extends AbstractElementHandler { DB.close(stmt); stmt = null; } - } - - X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", - 0); - logImportDetail (ctx, impDetail, 1, "SQLStatement",1,"Execute"); + } } catch (Exception e) { - if (DB.isPostgreSQL()) { - // rollback immediately postgres on exception to avoid a wrong SQL stop the whole process - if (savepoint != null) - { - Trx trx = Trx.get(getTrxName(ctx), false); - try { - trx.rollback(savepoint); - } catch (SQLException e1) {} - savepoint = null; + // rollback immediately on exception to avoid a wrong SQL stop the whole process + if (savepoint != null) + { + Trx trx = Trx.get(getTrxName(ctx), false); + try { + if (trx.getConnection() != null) + trx.getConnection().rollback(savepoint); + } catch (SQLException e1) { + //a rollback or commit have happens making the savepoint becomes invalid. + //rollback trx to continue + trx.rollback(); } + savepoint = null; } log.log(Level.SEVERE,"SQLSatement", e); - X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", - 0); - logImportDetail (ctx, impDetail, 0, "SQLStatement",1,"Execute"); } finally { DB.close(pstmt); pstmt = null; @@ -114,9 +108,18 @@ public class SQLStatementElementHandler extends AbstractElementHandler { Trx trx = Trx.get(getTrxName(ctx), false); try { trx.releaseSavepoint(savepoint); - } catch (SQLException e) {} + } catch (SQLException e) { + if (DB.isPostgreSQL()) { + //a commit or rollback have happens that make the savepoint invalid. + //need to call rollback to continue + trx.commit(); + } + } } } + impDetail = createImportDetail(ctx, element.qName, "", + 0); + logImportDetail (ctx, impDetail, 1, "SQLStatement",1,"Execute"); } public void endElement(PIPOContext ctx, Element element) throws SAXException { From 72e84378b8dfb7caf6be8090944ac5dffa9e29e1 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 22 Aug 2013 20:41:46 +0800 Subject: [PATCH 3/4] Backed out of changeset 9552:c071e95a73ab --- .../adempiere/webui/adwindow/AbstractADWindowContent.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java index ee8e104e9d..e3966e8c6f 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java @@ -1389,7 +1389,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements boolean changed = e.isChanged() || e.isInserting(); boolean readOnly = adTabbox.getSelectedGridTab().isReadOnly(); - boolean processed = "Y".equals(Env.getContext(Env.getCtx(), getWindowNo(), "Processed", true)); boolean insertRecord = !readOnly; if (!detailTab) { @@ -1402,7 +1401,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements } toolbar.enableNew(!changed && insertRecord && !tabPanel.getGridTab().isSortTab()); toolbar.enableRefresh(!changed); - toolbar.enableDelete(!changed && !readOnly && !tabPanel.getGridTab().isSortTab() && !processed); + toolbar.enableDelete(!changed && !readOnly && !tabPanel.getGridTab().isSortTab()); // if (readOnly && adTabbox.getSelectedGridTab().isAlwaysUpdateField()) { @@ -1411,7 +1410,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements } else { - adTabbox.updateDetailPaneToolbar(changed, readOnly || processed); + adTabbox.updateDetailPaneToolbar(changed, readOnly); } toolbar.enableIgnore(adTabbox.needSave(true, false) || adTabbox.getSelectedGridTab().isNew() || From 49d501692c6f59a8b7be92b435649ff8670580a2 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 22 Aug 2013 23:11:45 +0800 Subject: [PATCH 4/4] IDEMPIERE-1268 Payment Allocation is getting deleted from completed Payment record. Fixed handling of readonly logic for detailpane and processed flag for header tab. --- .../org/adempiere/webui/adwindow/AbstractADWindowContent.java | 3 ++- .../WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java index e3966e8c6f..aabf0bd83c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java @@ -1389,6 +1389,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements boolean changed = e.isChanged() || e.isInserting(); boolean readOnly = adTabbox.getSelectedGridTab().isReadOnly(); + boolean processed = adTabbox.getSelectedGridTab().isProcessed(); boolean insertRecord = !readOnly; if (!detailTab) { @@ -1401,7 +1402,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements } toolbar.enableNew(!changed && insertRecord && !tabPanel.getGridTab().isSortTab()); toolbar.enableRefresh(!changed); - toolbar.enableDelete(!changed && !readOnly && !tabPanel.getGridTab().isSortTab()); + toolbar.enableDelete(!changed && !readOnly && !tabPanel.getGridTab().isSortTab() && !processed); // if (readOnly && adTabbox.getSelectedGridTab().isAlwaysUpdateField()) { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java index d2d73ff822..fb052fc091 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java @@ -542,7 +542,7 @@ public class DetailPane extends Panel implements EventListener, IdSpace { Toolbar toolbar = (Toolbar) tabpanel.getFirstChild(); IADTabpanel adtab = getADTabpanel(index); - if (adtab!=null && adtab.getGridTab().isSortTab()) + if (adtab!=null && (adtab.getGridTab().isSortTab() || adtab.getGridTab().isReadOnly())) readOnly = true; boolean insertRecord = !readOnly;