details: https://code.openbravo.com/erp/devel/pi/rev/7091c40b9be0 changeset: 25778:7091c40b9be0 user: Eduardo Argal Guibert <eduardo.argal <at> openbravo.com> date: Wed Jan 21 13:14:46 2015 +0100 summary: Fixed issue 27160: C_Order_Post poor performance
details: https://code.openbravo.com/erp/devel/pi/rev/aa854421dcf5 changeset: 25779:aa854421dcf5 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Fri Jan 30 11:44:11 2015 +0100 summary: Related to issue 27160 code review fixed pls to work with oracle, update Copyright, add missing .class files. diffstat: referencedata/sampledata/F_B_International_Group/M_WAREHOUSE_RULE.xml | 3 + referencedata/sampledata/QA_Testing/M_WAREHOUSE_RULE.xml | 3 + src-db/database/model/functions/MA_PRODUCTIONRUN_STANDARD.xml | 27 +- src-db/database/model/functions/MRP_RUN_INITIALIZE.xml | 28 +- src-db/database/model/functions/M_GET_STOCK.xml | 250 +---- src-db/database/model/functions/M_GET_STOCK_PARAM.xml | 597 ++++++++++ src-db/database/model/functions/M_INOUT_CREATE.xml | 30 +- src-db/database/model/functions/M_PRODUCTION_RUN.xml | 30 +- src-db/database/model/functions/M_RESERVATION_POST.xml | 22 +- src-db/database/model/functions/M_RESERVATION_REALLOCATE.xml | 104 +- src-db/database/model/functions/M_RESERVE_STOCK_AUTO.xml | 32 +- src-db/database/model/functions/M_RESERVE_STOCK_MANUAL.xml | 4 +- src-db/database/model/tables/AD_EXTENSION_POINTS.xml | 2 +- src-db/database/model/tables/M_STOCK_PROPOSED.xml | 3 - src-db/database/model/tables/M_STORAGE_DETAIL.xml | 8 + src-db/database/model/tables/M_WAREHOUSE_RULE.xml | 4 + src-db/database/model/triggers/M_RESERVATION_STOCK_TRG.xml | 40 +- src-db/database/model/triggers/M_RESERVATION_TRG.xml | 50 +- src-db/database/sourcedata/AD_COLUMN.xml | 120 +- src-db/database/sourcedata/AD_ELEMENT.xml | 28 + src-db/database/sourcedata/AD_EXTENSION_POINTS.xml | 12 +- src-db/database/sourcedata/AD_FIELD.xml | 32 +- src-db/database/sourcedata/AD_REFERENCE.xml | 12 + src-db/database/sourcedata/AD_REF_LIST.xml | 25 + src-util/modulescript/build/classes/org/openbravo/modulescript/InitializeReservationColumnsForStorageDetail.class | 0 src-util/modulescript/build/classes/org/openbravo/modulescript/InitializeReservationColumnsForStorageDetailData.class | 0 src-util/modulescript/src/org/openbravo/modulescript/InitializeReservationColumnsForStorageDetail.java | 51 + src-util/modulescript/src/org/openbravo/modulescript/InitializeReservationColumnsForStorageDetail_data.xsql | 77 + src/org/openbravo/dal/core/OBContext.java | 6 +- src/org/openbravo/erpCommon/utility/OBMessageUtils.java | 29 +- src/org/openbravo/materialmgmt/ReservationUtils.java | 10 +- 31 files changed, 1136 insertions(+), 503 deletions(-) diffs (truncated from 2277 to 300 lines): diff -r f8292e9b2d8b -r aa854421dcf5 referencedata/sampledata/F_B_International_Group/M_WAREHOUSE_RULE.xml --- a/referencedata/sampledata/F_B_International_Group/M_WAREHOUSE_RULE.xml Fri Jan 30 14:01:23 2015 +0100 +++ b/referencedata/sampledata/F_B_International_Group/M_WAREHOUSE_RULE.xml Fri Jan 30 11:44:11 2015 +0100 @@ -12,6 +12,7 @@ <NAME><![CDATA[Default Warehouse Rule]]></NAME> <PROCEDURENAME><![CDATA[M_WAREHOUSE_DEFAULT_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Useful to overwrite a warehouse rule defined at warehouse on specific documents.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> <M_WAREHOUSE_RULE> @@ -26,6 +27,7 @@ <NAME><![CDATA[Unique Attribute]]></NAME> <PROCEDURENAME><![CDATA[M_UNIQUEATTRIBUTE_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Returns stock of the first attribute set instance in the warehouse with enough stock.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> <M_WAREHOUSE_RULE> @@ -40,6 +42,7 @@ <NAME><![CDATA[Unique Storage Bin]]></NAME> <PROCEDURENAME><![CDATA[M_UNIQUELOCATOR_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Returns stock of the first storage bin in the warehouse with enough stock.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> </data> diff -r f8292e9b2d8b -r aa854421dcf5 referencedata/sampledata/QA_Testing/M_WAREHOUSE_RULE.xml --- a/referencedata/sampledata/QA_Testing/M_WAREHOUSE_RULE.xml Fri Jan 30 14:01:23 2015 +0100 +++ b/referencedata/sampledata/QA_Testing/M_WAREHOUSE_RULE.xml Fri Jan 30 11:44:11 2015 +0100 @@ -12,6 +12,7 @@ <NAME><![CDATA[Unique Storage Bin]]></NAME> <PROCEDURENAME><![CDATA[M_UNIQUELOCATOR_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Returns stock of the first storage bin in the warehouse with enough stock.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> <M_WAREHOUSE_RULE> @@ -26,6 +27,7 @@ <NAME><![CDATA[Unique Attribute]]></NAME> <PROCEDURENAME><![CDATA[M_UNIQUEATTRIBUTE_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Returns stock of the first attribute set instance in the warehouse with enough stock.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> <M_WAREHOUSE_RULE> @@ -40,6 +42,7 @@ <NAME><![CDATA[Default Warehouse Rule]]></NAME> <PROCEDURENAME><![CDATA[M_WAREHOUSE_DEFAULT_RULE]]></PROCEDURENAME> <DESCRIPTION><![CDATA[Useful to overwrite a warehouse rule defined at warehouse on specific documents.]]></DESCRIPTION> + <TYPE><![CDATA[I]]></TYPE> </M_WAREHOUSE_RULE> </data> diff -r f8292e9b2d8b -r aa854421dcf5 src-db/database/model/functions/MA_PRODUCTIONRUN_STANDARD.xml --- a/src-db/database/model/functions/MA_PRODUCTIONRUN_STANDARD.xml Fri Jan 30 14:01:23 2015 +0100 +++ b/src-db/database/model/functions/MA_PRODUCTIONRUN_STANDARD.xml Fri Jan 30 11:44:11 2015 +0100 @@ -16,7 +16,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU -* All portions are Copyright (C) 2001-2014 Openbravo SLU +* All portions are Copyright (C) 2001-2015 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************/ @@ -309,34 +309,13 @@ v_warehouse_rule_id VARCHAR2(32); BEGIN v_AD_Pinstance_ID := GET_UUID(); - INSERT INTO AD_PINSTANCE ( - AD_PINSTANCE_ID, AD_PROCESS_ID, RECORD_ID, ISACTIVE, - AD_USER_ID, AD_CLIENT_ID, AD_ORG_ID, CREATED, CREATEDBY, - UPDATED, UPDATEDBY - ) VALUES ( - v_AD_Pinstance_ID,'FF80818132C964E30132C9747257002E',v_Record_ID,'Y', - v_User_ID, v_Client_ID, v_PlanOrg_ID, now(), v_User_ID, - now(), v_User_ID - ); - - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '10', 'AD_Client_ID', v_Client_ID, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '20', 'M_Product_ID', v_Product_old, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '30', 'C_Uom_ID', v_UOM_old, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '40', 'M_Product_Uom_ID', v_Product_UOM_old, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '50', 'AD_Org_ID', v_PlanOrg_ID, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '60', 'AuxID', v_Production_ID, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '70', 'TableId', '325', null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '80', 'LineNo', null, null, v_PlanLine, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '90', 'ProcessID', '800105', null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '100', 'Quantity', null, null, v_DoneQuantity*Cur_WRPUsed.MovementQty, null, null, null); SELECT COALESCE(wrpp.m_warehouse_rule_id, sp.m_warehouse_rule_id) INTO v_warehouse_rule_id FROM ma_wrphaseproduct wrpp JOIN ma_sequenceproduct sp ON wrpp.ma_sequenceproduct_id = sp.ma_sequenceproduct_id WHERE wrpp.ma_wrphaseproduct_id = cur_wrpused.ma_wrphaseproduct_id; - AD_PINSTANCE_PARA_INSERT(v_AD_Pinstance_ID, '110', 'M_Warehouse_Rule_ID', v_warehouse_rule_id, null, null, null, null, null); - - M_GET_STOCK(v_AD_Pinstance_ID, 'N'); + --Review no warehouse as parameter + M_GET_STOCK_PARAM(v_AD_Pinstance_ID, v_Record_ID, v_DoneQuantity*Cur_WRPUsed.MovementQty, v_Product_old, null, null, null, v_PlanOrg_ID, null, v_User_ID, v_Client_ID, v_warehouse_rule_id, v_UOM_old, v_Product_UOM_old, '325', v_Production_ID, v_PlanLine, '800105', null, 'N', v_pinstance_result, v_pinstance_msg); -- Check result SELECT result, errormsg INTO v_pinstance_result, v_pinstance_msg diff -r f8292e9b2d8b -r aa854421dcf5 src-db/database/model/functions/MRP_RUN_INITIALIZE.xml --- a/src-db/database/model/functions/MRP_RUN_INITIALIZE.xml Fri Jan 30 14:01:23 2015 +0100 +++ b/src-db/database/model/functions/MRP_RUN_INITIALIZE.xml Fri Jan 30 11:44:11 2015 +0100 @@ -52,7 +52,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU -* All portions are Copyright (C) 2001-2014 Openbravo SLU +* All portions are Copyright (C) 2001-2015 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************/ @@ -182,33 +182,9 @@ v_pinstance_msg AD_PInstance.errormsg%TYPE; BEGIN v_ad_pinstance_id := GET_UUID(); - INSERT INTO ad_pinstance ( - ad_pinstance_id, ad_process_id, record_id, isactive, - ad_user_id, ad_client_id, ad_org_id, created, createdby, - updated, updatedby - ) VALUES ( - v_ad_pinstance_id,'FF80818132C964E30132C9747257002E',p_run,'Y', - p_user_id, p_client_id, p_org_id, now(), p_user_id, - now(), p_user_id - ); - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '10', 'AD_Client_ID', p_client_id, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '20', 'AD_Org_ID', p_org_id, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '30', 'M_Product_ID', Cur_Product.M_Product_ID, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '60', 'AuxID', p_Run, null, null, null, null, null); - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '70', 'TableId', '800219', null, null, null, null, null); - IF (p_production = 'Y') THEN - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '80', 'ProcessID', '800162', null, null, null, null, null); - ELSE - AD_PINSTANCE_PARA_INSERT(v_ad_pinstance_id, '90', 'ProcessID', '800164', null, null, null, null, null); - END IF; - - M_GET_STOCK(v_ad_pinstance_id, 'N'); + M_GET_STOCK_PARAM(v_ad_pinstance_id, p_run, null, Cur_Product.M_Product_ID, null, null, null, p_org_id, null, p_user_id, p_client_id, null, null, null, '800219', p_Run, null, case when p_production = 'Y' then '800162' else '800164' end, null, 'N', v_pinstance_result, v_pinstance_msg); -- Check result - SELECT result, errormsg - INTO v_pinstance_result, v_pinstance_msg - FROM ad_pinstance - WHERE ad_pinstance_id = v_ad_pinstance_id; IF (v_pinstance_result = 0) THEN -- Error on m_get_stock RAISE_APPLICATION_ERROR(-20000, v_pinstance_msg); diff -r f8292e9b2d8b -r aa854421dcf5 src-db/database/model/functions/M_GET_STOCK.xml --- a/src-db/database/model/functions/M_GET_STOCK.xml Fri Jan 30 14:01:23 2015 +0100 +++ b/src-db/database/model/functions/M_GET_STOCK.xml Fri Jan 30 11:44:11 2015 +0100 @@ -19,7 +19,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU -* All portions are Copyright (C) 2011-2012 Openbravo SLU +* All portions are Copyright (C) 2011-2015 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************/ @@ -32,10 +32,6 @@ -- Parameter TYPE RECORD IS REF CURSOR; Cur_Parameter RECORD; - Cur_Stock RECORD; - Cur_MStock RECORD; - cur_warehouse RECORD; - cur_allocated RECORD; -- Parameter Variables v_Quantity NUMBER(10); @@ -130,248 +126,8 @@ END LOOP; -- Get Parameter DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID) ; - IF (v_reservation_id IS NOT NULL) THEN - -- If a reservation is given first consume allocated stock. - FOR cur_allocated IN ( - SELECT rs.quantity, rs.releasedqty, sd.m_storage_detail_id - FROM m_reservation_stock rs - JOIN m_reservation r ON rs.m_reservation_id = r.m_reservation_id - JOIN m_storage_detail sd ON sd.m_product_id = r.m_product_id - AND sd.c_uom_id = r.c_uom_id - AND sd.m_product_uom_id IS NULL - AND sd.m_locator_id = rs.m_locator_id - AND COALESCE(sd.m_attributesetinstance_id, '0') = COALESCE(rs.m_attributesetinstance_id, '0') - WHERE r.m_reservation_id = v_reservation_id - AND rs.isallocated = 'Y' - AND rs.quantity > 0 - AND rs.quantity <> COALESCE(rs.releasedqty, 0) - AND rs.m_locator_id IS NOT NULL - ) LOOP - INSERT INTO m_stock_proposed ( - m_stock_proposed_id, ad_client_id, ad_org_id, isactive, - created , createdby, updated, updatedby, - ad_pinstance_id, priority, m_storage_detail_id, quantity, qtyorder, - isfinal - ) VALUES ( - get_uuid(), v_ClientID, v_OrgID, 'Y', - now(), v_AD_User_ID, now(), v_AD_User_ID, - pinstance_id, v_Count, cur_allocated.m_storage_detail_id, cur_allocated.quantity - COALESCE(cur_allocated.releasedqty, 0), null, - 'Y' - ); - v_Count:=v_Count+1; - END LOOP; - END IF; - - -- Insert Values from Auxiliar STOCK - FOR Cur_Stock IN ( - SELECT ms.m_storage_detail_id, COALESCE(ms.quantity, 0) AS qty, ms.qtyorder AS qtyorder, ms.UPDATED AS lastupdated - FROM m_storage_detail t - JOIN m_stock_aux ms ON t.m_storage_detail_id = ms.m_storage_detail_id - JOIN m_locator l ON t.m_locator_id = l.m_locator_id - JOIN m_warehouse w ON l.m_warehouse_id = w.m_warehouse_id - JOIN ad_org_warehouse ow ON w.m_warehouse_id = ow.m_warehouse_id - LEFT JOIN m_attributesetinstance asi ON t.m_attributesetinstance_id = asi.m_attributesetinstance_id - LEFT JOIN m_product_uom pu ON t.m_product_uom_id = pu.m_product_uom_id - LEFT JOIN c_uom u ON pu.c_uom_id = u.c_uom_id - WHERE t.m_product_id = v_productid - AND ms.aux_id = v_auxid - AND ms.ad_table_id = v_tableid - AND ms.line < v_lineno - AND COALESCE(t.c_uom_id, '-1') = COALESCE(v_uomid, t.c_uom_id, '-1') - AND COALESCE(t.m_product_uom_id, '-1') = COALESCE(v_productuomid, t.m_product_uom_id, '-1') - AND COALESCE(t.m_attributesetinstance_id, '-1') = COALESCE(v_attributesetinstanceid, t.m_attributesetinstance_id, '-1') - AND COALESCE(l.m_locator_id, '-1') = COALESCE(v_locatorid, l.m_locator_id, '-1') - AND COALESCE(w.m_warehouse_id, '-1') = COALESCE(v_warehouseid, w.m_warehouse_id, '-1') - AND ow.ad_org_id = v_orgid - AND COALESCE(ms.quantity, 0)>0 - ORDER BY CASE w.m_warehouse_id WHEN COALESCE(v_PriorityWarehouseID, '-1') THEN 0 ELSE 1 END, ow.priority, l.priorityno, asi.created, t.created - ) LOOP - INSERT INTO m_stock_proposed ( - m_stock_proposed_id, ad_client_id, ad_org_id, isactive, - created , createdby, updated, updatedby, - ad_pinstance_id, priority, m_storage_detail_id, quantity, qtyorder, - isfinal - ) VALUES ( - get_uuid(), v_ClientID, v_OrgID, 'Y', - now(), v_AD_User_ID, now(), v_AD_User_ID, - pinstance_id, v_Count, Cur_Stock.M_STORAGE_DETAIL_ID, Cur_Stock.Qty, Cur_Stock.qtyorder, - 'Y' - ); - v_Count:=v_Count+1; - END LOOP; - - -- Insert Values from Storage Detail - FOR Cur_Stock IN ( - SELECT t.m_storage_detail_id, COALESCE(t.qtyonhand - COALESCE(res.reservedqty, 0), 0) AS qty, t.qtyorderonhand AS qtyorder, l.priorityno, t.UPDATED AS lastupdated, - t.qtyonhand, COALESCE(res.reservedqty, 0) as reservedqty - FROM m_storage_detail t - JOIN m_locator l ON t.m_locator_id=l.m_locator_id - JOIN m_warehouse w ON l.m_warehouse_id = w.m_warehouse_id - JOIN ad_org_warehouse ow ON w.m_warehouse_id = ow.m_warehouse_id - LEFT JOIN m_attributesetinstance asi ON t.m_attributesetinstance_id = asi.m_attributesetinstance_id - LEFT JOIN m_product_uom pu ON t.m_product_uom_id = pu.m_product_uom_id - LEFT JOIN c_uom u ON pu.c_uom_id = u.c_uom_id - LEFT JOIN m_reservation r ON r.m_reservation_id = v_reservation_id AND r.m_product_id = t.m_product_id AND r.c_uom_id = t.c_uom_id - LEFT JOIN ( - SELECT r.m_product_id, r.c_uom_id, rs.m_locator_id, COALESCE(rs.m_attributesetinstance_id, '0') as m_attributesetinstance_id, - SUM(rs.quantity - COALESCE(rs.releasedqty, 0)) AS reservedqty - FROM m_reservation r - JOIN m_reservation_stock rs ON r.m_reservation_id = rs.m_reservation_id - WHERE r.m_product_id = v_productid - AND r.c_uom_id = COALESCE(v_uomid, r.c_uom_id) - AND rs.m_locator_id IS NOT NULL - AND rs.m_locator_id = COALESCE(v_locatorid, rs.m_locator_id) - AND COALESCE(rs.m_attributesetinstance_id, '0') = COALESCE(v_attributesetinstanceid, rs.m_attributesetinstance_id, '0') - AND r.res_status NOT IN ('CL', 'DR') - AND ((v_reservation_id IS NOT NULL AND rs.isallocated = 'Y') - OR v_reservation_id IS NULL) - GROUP BY r.m_product_id, r.c_uom_id, rs.m_locator_id, COALESCE(rs.m_attributesetinstance_id, '0') - ) res ON t.m_product_id = res.m_product_id - AND t.c_uom_id = res.c_uom_id - AND COALESCE(t.m_attributesetinstance_id, '0') = res.m_attributesetinstance_id - AND t.m_locator_id = res.m_locator_id - WHERE t.m_product_id=v_productid - AND COALESCE(t.c_uom_id, '-1') = COALESCE(v_uomid, t.c_uom_id, '-1') - AND COALESCE(t.m_product_uom_id, '-1') = COALESCE(v_productuomid, t.m_product_uom_id, '-1') - AND COALESCE(t.m_attributesetinstance_id, '-1') = COALESCE(v_attributesetinstanceid, t.m_attributesetinstance_id, '-1') - AND COALESCE(l.m_locator_id, '-1') = COALESCE(v_locatorid, l.m_locator_id, '-1') - AND COALESCE(w.m_warehouse_id, '-1') = COALESCE(v_warehouseid, w.m_warehouse_id, '-1') - AND ow.ad_org_id = v_orgid - AND COALESCE(t.qtyonhand, 0)>0 - AND t.qtyonhand - COALESCE(res.reservedqty, 0) > 0 - AND w.m_warehouse_id = COALESCE(r.m_warehouse_id, w.m_warehouse_id) - AND l.m_locator_id = COALESCE(r.m_locator_id, l.m_locator_id) - AND asi.m_attributesetinstance_id = COALESCE(r.m_attributesetinstance_id, asi.m_attributesetinstance_id) - ORDER BY CASE w.m_warehouse_id WHEN COALESCE(v_PriorityWarehouseID, '-1') THEN 0 ELSE 1 END, ow.priority, l.priorityno, asi.created, t.created - ) LOOP - IF (cur_stock.qtyonhand > cur_stock.reservedqty) THEN - INSERT INTO m_stock_proposed ( - m_stock_proposed_id, ad_client_id, ad_org_id, isactive, - created , createdby, updated, updatedby, - ad_pinstance_id, priority, m_storage_detail_id, quantity, qtyorder, - isfinal - ) VALUES ( - get_uuid(), v_ClientID, v_OrgID, 'Y', - now(), v_AD_User_ID, now(), v_AD_User_ID, ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Openbravo-commits mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbravo-commits
