details: /erp/stable/2.50/rev/50690f747a51
changeset: 9463:50690f747a51
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Mon May 23 13:26:23 2011 +0200
summary: Issue 0016533: the invoice date, when the invoice is voided, should
be updatable
removal of dead code lines
details: /erp/stable/2.50/rev/255e4e40f94f
changeset: 9464:255e4e40f94f
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Wed May 25 17:34:14 2011 +0200
summary: Fixes issue 0016845: Invoice Total Amount not properly updated when
lines are deleted
To execute the triggers in the correct order in postgresql it has been removed
the ON DELETE CASCADE option and has been replaced simulating exactly the same
logic in the related trigger
details: /erp/stable/2.50/rev/ae161ef24390
changeset: 9465:ae161ef24390
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Thu May 26 17:38:06 2011 +0200
summary: Fixes issue 0017368: Error in Create Lines From when working wit UOM
defined as Breakdown
It has been fixed the wrong index used in dataUomIdConversion array
details: /erp/stable/2.50/rev/f8c459bb273e
changeset: 9466:f8c459bb273e
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Fri May 27 14:26:29 2011 +0200
summary: Fixes issue 0017208: It is not possible save a Project Line with
Planned Price = 0
It has been modified the related triggers in order to verify that if planned
price is zero, calculate properly related values
details: /erp/stable/2.50/rev/e4fade7cc09c
changeset: 9467:e4fade7cc09c
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Mon May 30 13:11:43 2011 +0200
summary: Fixes issue 0016845: Invoice Total Amount not properly updated when
lines are deleted
Adding comments in triggers code
diffstat:
src-db/database/model/tables/C_INVOICELINETAX.xml | 2 +-
src-db/database/model/tables/C_ORDERLINETAX.xml | 2 +-
src-db/database/model/triggers/C_INVLINE_CHK_RESTRICTIONS_TRG.xml | 4 +
src-db/database/model/triggers/C_INVOICE_TRG.xml | 2 -
src-db/database/model/triggers/C_ORDLINE_CHK_RESTRICTIONS_TRG.xml | 4 +
src-db/database/model/triggers/C_PROJECTLINE_TRG.xml | 3 +
src-db/database/model/triggers/C_PROJECTLINE_TRG3.xml | 12 +-
src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java | 442
+++++----
8 files changed, 257 insertions(+), 214 deletions(-)
diffs (truncated from 843 to 300 lines):
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/tables/C_INVOICELINETAX.xml
--- a/src-db/database/model/tables/C_INVOICELINETAX.xml Mon May 30 11:50:25
2011 +0200
+++ b/src-db/database/model/tables/C_INVOICELINETAX.xml Mon May 30 13:11:43
2011 +0200
@@ -70,7 +70,7 @@
<foreign-key foreignTable="C_INVOICE" name="C_INVOICELINETAX_C_INVOICE">
<reference local="C_INVOICE_ID" foreign="C_INVOICE_ID"/>
</foreign-key>
- <foreign-key foreignTable="C_INVOICELINE"
name="C_INVOICELINETAX_C_INVOICELINE" onDelete="cascade">
+ <foreign-key foreignTable="C_INVOICELINE"
name="C_INVOICELINETAX_C_INVOICELINE">
<reference local="C_INVOICELINE_ID" foreign="C_INVOICELINE_ID"/>
</foreign-key>
<foreign-key foreignTable="C_TAX" name="C_INVOICELINETAX_C_TAX"
onDelete="cascade">
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/tables/C_ORDERLINETAX.xml
--- a/src-db/database/model/tables/C_ORDERLINETAX.xml Mon May 30 11:50:25
2011 +0200
+++ b/src-db/database/model/tables/C_ORDERLINETAX.xml Mon May 30 13:11:43
2011 +0200
@@ -66,7 +66,7 @@
<foreign-key foreignTable="C_ORDER" name="C_ORDERLINETAX_C_ORDER"
onDelete="cascade">
<reference local="C_ORDER_ID" foreign="C_ORDER_ID"/>
</foreign-key>
- <foreign-key foreignTable="C_ORDERLINE"
name="C_ORDERLINETAX_C_ORDERLINE" onDelete="cascade">
+ <foreign-key foreignTable="C_ORDERLINE"
name="C_ORDERLINETAX_C_ORDERLINE">
<reference local="C_ORDERLINE_ID" foreign="C_ORDERLINE_ID"/>
</foreign-key>
<foreign-key foreignTable="C_TAX" name="C_ORDERLINETAX_C_TAX">
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/triggers/C_INVLINE_CHK_RESTRICTIONS_TRG.xml
--- a/src-db/database/model/triggers/C_INVLINE_CHK_RESTRICTIONS_TRG.xml Mon May
30 11:50:25 2011 +0200
+++ b/src-db/database/model/triggers/C_INVLINE_CHK_RESTRICTIONS_TRG.xml Mon May
30 13:11:43 2011 +0200
@@ -32,6 +32,10 @@
IF AD_isTriggerEnabled()='N' THEN RETURN;
END IF;
+-- Done here instead of foreign key with on delete cascade to force order of
trigger execution. Fixes issue 0016845: Invoice Total Amount not properly
updated when lines are deleted
+ IF DELETING THEN
+ DELETE FROM C_INVOICELINETAX WHERE C_INVOICELINE_ID =
:OLD.C_INVOICELINE_ID;
+ END IF;
IF INSERTING THEN
v_C_INVOICE_ID:=:NEW.C_INVOICE_ID;
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/triggers/C_INVOICE_TRG.xml
--- a/src-db/database/model/triggers/C_INVOICE_TRG.xml Mon May 30 11:50:25
2011 +0200
+++ b/src-db/database/model/triggers/C_INVOICE_TRG.xml Mon May 30 13:11:43
2011 +0200
@@ -39,8 +39,6 @@
-- If invoice is processed, is not allowed to change C_BPartner
IF UPDATING
THEN
- -- If V_Count > 0, means that this invoice was created to void another one.
- SELECT COUNT(*) INTO V_COUNT FROM C_INVOICE_REVERSE WHERE
C_INVOICE_ID=:OLD.C_INVOICE_ID;
IF(:OLD.Processed='Y'
AND ((COALESCE(:OLD.C_BPartner_ID, '0') <> COALESCE(:NEW.C_BPartner_ID,
'0'))
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/triggers/C_ORDLINE_CHK_RESTRICTIONS_TRG.xml
--- a/src-db/database/model/triggers/C_ORDLINE_CHK_RESTRICTIONS_TRG.xml Mon May
30 11:50:25 2011 +0200
+++ b/src-db/database/model/triggers/C_ORDLINE_CHK_RESTRICTIONS_TRG.xml Mon May
30 13:11:43 2011 +0200
@@ -32,6 +32,10 @@
IF AD_isTriggerEnabled()='N' THEN RETURN;
END IF;
+-- Done here instead of foreign key with on delete cascade to force order of
trigger execution. Fixes issue 0016845: Invoice Total Amount not properly
updated when lines are deleted
+ IF DELETING THEN
+ DELETE FROM C_ORDERLINETAX WHERE C_ORDERLINE_ID = :OLD.C_ORDERLINE_ID;
+ END IF;
IF INSERTING THEN
v_C_ORDER_ID:=:NEW.C_ORDER_ID;
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/triggers/C_PROJECTLINE_TRG.xml
--- a/src-db/database/model/triggers/C_PROJECTLINE_TRG.xml Mon May 30
11:50:25 2011 +0200
+++ b/src-db/database/model/triggers/C_PROJECTLINE_TRG.xml Mon May 30
13:11:43 2011 +0200
@@ -69,6 +69,9 @@
IF(v_PlannedMargin <> 0) THEN
:new.PlannedMarginAmt:=:new.PlannedAmt * v_PlannedMargin;
END IF;
+ ELSIF (:new.PlannedPrice = 0) THEN
+ :new.PlannedPOPrice := 0;
+ :new.PlannedMarginAmt := 0;
END IF;
END C_PROJECTLINE_TRG
]]></body>
diff -r 349c3e13abe0 -r e4fade7cc09c
src-db/database/model/triggers/C_PROJECTLINE_TRG3.xml
--- a/src-db/database/model/triggers/C_PROJECTLINE_TRG3.xml Mon May 30
11:50:25 2011 +0200
+++ b/src-db/database/model/triggers/C_PROJECTLINE_TRG3.xml Mon May 30
13:11:43 2011 +0200
@@ -56,7 +56,11 @@
IF(UPDATING OR DELETING) THEN
v_oldLine_PlannedQty:= COALESCE(:old.PlannedQty,0);
v_oldLine_PlannedAmt:=COALESCE(:old.PlannedAmt,0);
-
v_oldLine_PlannedMarginAmt:=COALESCE((COALESCE(:old.PLANNEDPRICE,0)-COALESCE(:old.PLANNEDPOPRICE,0))*100/COALESCE(:old.PLANNEDPRICE,1),0);
+ IF (:old.PLANNEDPRICE = 0) THEN
+ v_oldLine_PlannedMarginAmt := 0;
+ ELSE
+
v_oldLine_PlannedMarginAmt:=COALESCE((COALESCE(:old.PLANNEDPRICE,0)-COALESCE(:old.PLANNEDPOPRICE,0))*100/COALESCE(:old.PLANNEDPRICE,1),0);
+ END IF;
v_oldLine_CommittedAmt :=COALESCE(:old.CommittedAmt,0);
v_oldLine_CommittedQty :=COALESCE(:old.CommittedQty,0);
v_oldLine_InvoicedAmt :=COALESCE(:old.InvoicedAmt,0);
@@ -66,7 +70,11 @@
IF (INSERTING OR UPDATING) THEN
v_newLine_PlannedQty := COALESCE(:new.PlannedQty,0);
v_newLine_PlannedAmt:=COALESCE(:new.PlannedAmt,0);
-
v_newLine_PlannedMarginAmt:=COALESCE((COALESCE(:new.PLANNEDPRICE,0)-COALESCE(:new.PLANNEDPOPRICE,0))*100/COALESCE(:new.PLANNEDPRICE,1),0);
+ IF (:new.PLANNEDPRICE = 0) THEN
+ v_newLine_PlannedMarginAmt := 0;
+ ELSE
+
v_newLine_PlannedMarginAmt:=COALESCE((COALESCE(:new.PLANNEDPRICE,0)-COALESCE(:new.PLANNEDPOPRICE,0))*100/COALESCE(:new.PLANNEDPRICE,1),0);
+ END IF;
v_newLine_CommittedAmt :=COALESCE(:new.CommittedAmt,0);
v_newLine_CommittedQty :=COALESCE(:new.CommittedQty,0);
v_newLine_InvoicedAmt :=COALESCE(:new.InvoicedAmt,0);
diff -r 349c3e13abe0 -r e4fade7cc09c
src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java
--- a/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java Mon May
30 11:50:25 2011 +0200
+++ b/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java Mon May
30 13:11:43 2011 +0200
@@ -150,8 +150,8 @@
final String strKey = vars.getRequiredStringParameter("inpKey");
final String strTableId = vars.getStringParameter("inpTableId");
final String strProcessId = vars.getStringParameter("inpProcessId");
- final String strPath = vars.getStringParameter("inpPath", strDireccion
- + request.getServletPath());
+ final String strPath = vars.getStringParameter("inpPath",
+ strDireccion + request.getServletPath());
final String strWindowId = vars.getStringParameter("inpWindowId");
final String strTabName = vars.getStringParameter("inpTabName");
final String strDateInvoiced =
vars.getStringParameter("inpDateInvoiced");
@@ -307,9 +307,9 @@
final XmlDocument xmlDocument = xmlEngine.readXmlTemplate(
"org/openbravo/erpCommon/ad_actionButton/CreateFrom_Bank").createXmlDocument();
- final int numRows = Integer.valueOf(CreateFromBankData.countRows(this,
Utility.getContext(this,
- vars, "#User_Client", strWindowId), Utility
- .getContext(this, vars, "#User_Org", strWindowId), strcBPartner,
strPaymentRule,
+ final int numRows = Integer.valueOf(CreateFromBankData.countRows(this,
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strcBPartner, strPaymentRule,
strPlannedDateFrom, strPlannedDateTo, strAmountFrom, strAmountTo,
strIsReceipt, strBank,
strOrg, strCharge, strDocumentNo, strStatus));
final int maxRows =
Integer.valueOf(vars.getSessionValue("#RECORDRANGEINFO"));
@@ -327,19 +327,19 @@
// different limit/offset syntax in oracle and postgresql
if (this.myPool.getRDBMS().equalsIgnoreCase("ORACLE")) {
- data = CreateFromBankData.select(this,
vars.getSessionValue("#AD_SqlDateFormat"), vars
- .getLanguage(), strStatementDate, "ROWNUM", Utility.getContext(this,
vars,
- "#User_Client", strWindowId), Utility.getContext(this, vars,
"#User_Org", strWindowId),
- strcBPartner, strPaymentRule, strPlannedDateFrom, strPlannedDateTo,
strAmountFrom,
- strAmountTo, strIsReceipt, strBank, strOrg, strCharge,
strDocumentNo, strStatus, String
- .valueOf(maxRows), null);
+ data = CreateFromBankData.select(this,
vars.getSessionValue("#AD_SqlDateFormat"),
+ vars.getLanguage(), strStatementDate, "ROWNUM",
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strcBPartner, strPaymentRule,
+ strPlannedDateFrom, strPlannedDateTo, strAmountFrom, strAmountTo,
strIsReceipt, strBank,
+ strOrg, strCharge, strDocumentNo, strStatus,
String.valueOf(maxRows), null);
} else {
- data = CreateFromBankData.select(this,
vars.getSessionValue("#AD_SqlDateFormat"), vars
- .getLanguage(), strStatementDate, "1", Utility.getContext(this,
vars, "#User_Client",
- strWindowId), Utility.getContext(this, vars, "#User_Org",
strWindowId), strcBPartner,
- strPaymentRule, strPlannedDateFrom, strPlannedDateTo, strAmountFrom,
strAmountTo,
- strIsReceipt, strBank, strOrg, strCharge, strDocumentNo, strStatus,
null, String
- .valueOf(maxRows));
+ data = CreateFromBankData.select(this,
vars.getSessionValue("#AD_SqlDateFormat"),
+ vars.getLanguage(), strStatementDate, "1",
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strcBPartner, strPaymentRule,
+ strPlannedDateFrom, strPlannedDateTo, strAmountFrom, strAmountTo,
strIsReceipt, strBank,
+ strOrg, strCharge, strDocumentNo, strStatus, null,
String.valueOf(maxRows));
}
xmlDocument.setParameter("calendar", vars.getLanguage().substring(0, 2));
@@ -365,9 +365,9 @@
try {
ComboTableData comboTableData = new ComboTableData(vars, this, "LIST",
"",
- "All_Payment Rule", "", Utility
- .getContext(this, vars, "#AccessibleOrgTree", "CreateFrom"),
Utility.getContext(this,
- vars, "#User_Client", "CreateFrom"), 0);
+ "All_Payment Rule", "",
+ Utility.getContext(this, vars, "#AccessibleOrgTree", "CreateFrom"),
Utility.getContext(
+ this, vars, "#User_Client", "CreateFrom"), 0);
Utility.fillSQLParameters(this, vars, null, comboTableData,
"CreateFrom", strPaymentRule);
xmlDocument.setData("reportPaymentRule", "liststructure",
comboTableData.select(false));
comboTableData = null;
@@ -378,13 +378,13 @@
xmlDocument.setParameter("cbpartnerId_DES",
CreateFromBankData.bpartner(this, strcBPartner));
xmlDocument.setParameter("plannedDateFrom", strPlannedDateFrom);
- xmlDocument.setParameter("plannedDateFromdisplayFormat", vars
- .getSessionValue("#AD_SqlDateFormat"));
+ xmlDocument.setParameter("plannedDateFromdisplayFormat",
+ vars.getSessionValue("#AD_SqlDateFormat"));
xmlDocument
.setParameter("plannedDateFromsaveFormat",
vars.getSessionValue("#AD_SqlDateFormat"));
xmlDocument.setParameter("plannedDateTo", strPlannedDateTo);
- xmlDocument.setParameter("plannedDateTodisplayFormat", vars
- .getSessionValue("#AD_SqlDateFormat"));
+ xmlDocument.setParameter("plannedDateTodisplayFormat",
+ vars.getSessionValue("#AD_SqlDateFormat"));
xmlDocument.setParameter("plannedDateTosaveFormat",
vars.getSessionValue("#AD_SqlDateFormat"));
xmlDocument.setParameter("amountFrom", strAmountFrom);
{
@@ -415,8 +415,8 @@
try {
ComboTableData comboTableData = new ComboTableData(vars, this,
"TABLEDIR", "AD_Org_ID", "",
- "", Utility.getContext(this, vars, "#AccessibleOrgTree",
strWindowId), Utility
- .getContext(this, vars, "#User_Client", strWindowId), 0);
+ "", Utility.getContext(this, vars, "#AccessibleOrgTree",
strWindowId),
+ Utility.getContext(this, vars, "#User_Client", strWindowId), 0);
Utility.fillSQLParameters(this, vars, null, comboTableData, strWindowId,
strOrg);
xmlDocument.setData("reportAD_Org_ID", "liststructure",
comboTableData.select(false));
comboTableData = null;
@@ -470,42 +470,42 @@
if (strShipment.equals("")) {
if (vars.getLanguage().equals("en_US")) {
if (isSOTrx.equals("Y"))
- data = CreateFromInvoiceData.selectFromPOSOTrx(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strPO);
+ data = CreateFromInvoiceData.selectFromPOSOTrx(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strPO);
else
- data = CreateFromInvoiceData.selectFromPO(this,
vars.getLanguage(), Utility.getContext(
- this, vars, "#User_Client", strWindowId),
Utility.getContext(this, vars,
- "#User_Org", strWindowId), strPO);
+ data = CreateFromInvoiceData.selectFromPO(this, vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strPO);
} else {
if (isSOTrx.equals("Y"))
- data = CreateFromInvoiceData.selectFromPOTrlSOTrx(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strPO);
+ data = CreateFromInvoiceData.selectFromPOTrlSOTrx(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strPO);
else
- data = CreateFromInvoiceData.selectFromPOTrl(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strPO);
+ data = CreateFromInvoiceData.selectFromPOTrl(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strPO);
}
} else {
if (vars.getLanguage().equals("en_US")) {
if (isSOTrx.equals("Y"))
- data = CreateFromInvoiceData.selectFromShipmentSOTrx(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strShipment);
+ data = CreateFromInvoiceData.selectFromShipmentSOTrx(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strShipment);
else
- data = CreateFromInvoiceData.selectFromShipment(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strShipment);
+ data = CreateFromInvoiceData.selectFromShipment(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strShipment);
} else {
if (isSOTrx.equals("Y"))
data = CreateFromInvoiceData.selectFromShipmentTrlSOTrx(this,
vars.getLanguage(),
- Utility.getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(
- this, vars, "#User_Org", strWindowId), strShipment);
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strShipment);
else
- data = CreateFromInvoiceData.selectFromShipmentTrl(this,
vars.getLanguage(), Utility
- .getContext(this, vars, "#User_Client", strWindowId),
Utility.getContext(this,
- vars, "#User_Org", strWindowId), strShipment);
+ data = CreateFromInvoiceData.selectFromShipmentTrl(this,
vars.getLanguage(),
+ Utility.getContext(this, vars, "#User_Client", strWindowId),
+ Utility.getContext(this, vars, "#User_Org", strWindowId),
strShipment);
}
}
}
@@ -521,8 +521,8 @@
xmlDocument.setParameter("bpartnerLocation", strBPartnerLocation);
xmlDocument.setParameter("pricelist", strPriceList);
xmlDocument.setParameter("cBpartnerId", strBPartner);
- xmlDocument.setParameter("BPartnerDescription",
CreateFromShipmentData.selectBPartner(this,
- strBPartner));
+ xmlDocument.setParameter("BPartnerDescription",
+ CreateFromShipmentData.selectBPartner(this, strBPartner));
xmlDocument.setParameter("PurchaseOrder", strPO);
xmlDocument.setParameter("Shipment", strShipment);
xmlDocument.setParameter("pType", (!strShipment.equals("") ? "SHIPMENT"
@@ -535,23 +535,31 @@
xmlDocument.setData("reportPurchaseOrder", "liststructure", new
CreateFromInvoiceData[0]);
} else {
if (isSOTrx.equals("Y")) {
- xmlDocument.setData("reportShipmentReciept", "liststructure",
CreateFromInvoiceData
- .selectFromShipmentSOTrxCombo(this, vars.getLanguage(),
Utility.getContext(this, vars,
- "#User_Client", strWindowId), Utility.getContext(this, vars,
"#User_Org",
- strWindowId), strBPartner));
- xmlDocument.setData("reportPurchaseOrder", "liststructure",
CreateFromInvoiceData
- .selectFromPOSOTrxCombo(this, vars.getLanguage(),
Utility.getContext(this, vars,
- "#User_Client", strWindowId), Utility.getContext(this, vars,
"#User_Org",
- strWindowId), strBPartner));
+ xmlDocument.setData(
+ "reportShipmentReciept",
+ "liststructure",
+ CreateFromInvoiceData.selectFromShipmentSOTrxCombo(this,
vars.getLanguage(),
------------------------------------------------------------------------------
vRanger cuts backup time in half-while increasing security.
With the market-leading solution for virtual backup and recovery,
you get blazing-fast, flexible, and affordable data protection.
Download your free trial now.
http://p.sf.net/sfu/quest-d2dcopy1
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits