openbravo bug fix: tarik Sales Order di Sales Invoice lambat.

ada bugs di openbravo, dimana tarik sales order di sales invoice terasa begitu lambar. bugs ini baru muncul kalau jumlah datanya cukup banyak (diatas 500 record).

cara mereporduksi ulang bugs ini:

  1. buatlah sales order yang cukup banyak, misalnya dari 10 business partner, dengan masing masing business partner ada 10 sales order, dan di setiap sales order ada 5 lines, sehingga total ada 500 sales order line.
  2. pastikan sales order memiliki invoice term immediate.
  3. pastikan sales order sudah complete.
  4. buatlah 1 sales invoice, dengan business partner salah 1 dari 10 business partner di langkah 1.
  5. klik tombol create lines from di pojok kanan atas sales invoice.

selanjutnya bugs akan muncul dengan ciri-ciri berikut ini:

  1. pop up akan muncul, dan proses render ini sangat lambat. kasus yang saya alami, proses render memerlukan waktu 2.5 menit.
  2. setelah pop-up muncul, pada drop down sales order, pilih 1 sales order, bisa sales order mana saja (kita akan menarik sales order ke sales invoice). selanjutnya openbravo akan menarik sales order line untuk ditampilkan di grid pada pop-up ini. namun, proses penarikan data ini juga berjalan lambat. kasus yang saya alami, proses penarikan data untuk ditampilakn di pop-up ini memerlukan waktu 2 menit.

apa yang terjadi?

  1. saat kita klik tombol create lines from dari window sales invoice, openbravo memanggil 1 buah pop-up window. pada pop-up window ini terdapat sebuah dropdown yang berisi daftar sales order header yang valid untuk ditarik ke sales invoice ini. untuk mengisi dropdown ini, openbravo menjalankan static method CreateFromInvoiceData.selectFromPOSOTrxCombo. static method ini memiliki sub-query yang memang tidak efisien.
  2. dari penjelasan nomor 1, saya simpulkan bugs ini paten (reproducable), bukan subtle bugs.

cara perbaikan:

saya mengganti query standard openbravo menjadi query yang lebih efisien. select pada multiple table saya ganti dengan join. sedangkan sub-query yang menggandung aggregate table, saya ganti dengan join dan select aggregate table, namun tidak pakai sub-query, saya pakai klausa having.

query yang bermasalah pada bugs ini terdapat pada file CreateFrom_Invoice_data.xsql di src/org/openbravo/erpCommon/ad_actionButton.

code snippet yang bermasalah:

  <SqlMethod name="selectFromPOSOTrxCombo" type="preparedStatement" return="multiple">
 <SqlMethodComment></SqlMethodComment>
 <Sql>
 <![CDATA[
 SELECT o.C_ORDER_ID as ID, Ad_Column_Identifier(to_char('C_Order'), to_char(o.c_order_id), to_char(?)) AS NAME 
 FROM C_INVOICE_CANDIDATE_V ic,
 C_ORDER o JOIN m_pricelist pl ON o.m_pricelist_id = pl.m_pricelist_id
 WHERE o.C_ORDER_ID = ic.C_ORDER_ID 
 AND ic.AD_Client_ID IN ('1') 
 AND ic.AD_Org_ID IN ('1') 
 AND ic.C_BPartner_ID = ?
 AND pl.istaxincluded = ? 
 AND o.C_Order_Id = ic.C_Order_Id
 AND ((ic.term = 'D' AND ic.qtydelivered <>0) OR (ic.term = 'I' AND exists (SELECT 1 FROM C_ORDERLINE ol WHERE ol.C_ORDER_ID = o.C_ORDER_ID group by ol.c_orderline_id having SUM(ol.QTYORDERED)-SUM(ol.QTYINVOICED)<>0)) OR (ic.term <> 'N' AND (ic.term IN ('O','S') AND (ic.qtyordered = ic.qtydelivered) )) )
 GROUP BY o.C_ORDER_ID, o.DocumentNo, o.DateOrdered, o.GrandTotal 
 ORDER BY NAME
 ]]>
 </Sql>
 <Parameter name="language"/>
 <Parameter name="adUserClient" type="replace" optional="true" after="ic.AD_Client_ID IN (" text="'1'"/>
 <Parameter name="adOrgClient" type="replace" optional="true" after="ic.AD_Org_ID IN (" text="'1'"/>
 <Parameter name="cBpartnerId"/>
 <Parameter name="isTaxIncluded"/>
 </SqlMethod>

saya ganti code snippet diatas supaya query-nya lebih efisien:

  <SqlMethod name="selectFromPOSOTrxCombo" type="preparedStatement" return="multiple">
 <SqlMethodComment></SqlMethodComment>
 <Sql>
 <![CDATA[
 (SELECT o.C_ORDER_ID as ID, Ad_Column_Identifier(to_char('C_Order'), to_char(o.c_order_id), to_char(?)) AS NAME
 FROM C_INVOICE_CANDIDATE_V ic
 JOIN C_ORDER o ON o.C_ORDER_ID = ic.C_ORDER_ID 
 JOIN m_pricelist pl ON o.m_pricelist_id = pl.m_pricelist_id
 JOIN C_ORDERLINE OL ON OL.C_ORDER_ID=O.C_ORDER_ID
 WHERE ic.AD_Client_ID IN ('1') 
 AND ic.AD_Org_ID IN ('1') 
 AND ic.C_BPartner_ID = ?
 AND pl.istaxincluded = ? 
 AND (CASE WHEN (ic.term = 'D') THEN (ic.qtydelivered <>0)
 WHEN (ic.term <> 'N' AND (ic.term IN ('O','S'))) THEN (ic.qtyordered = ic.qtydelivered)
 ELSE 1=1 END)
 GROUP BY o.C_ORDER_ID, o.DocumentNo, o.DateOrdered, o.GrandTotal 
 HAVING SUM(ol.QTYORDERED)-SUM(ol.QTYINVOICED)<>0
 ORDER BY NAME)
 ]]>
 </Sql>
 <Parameter name="language"/>
 <Parameter name="adUserClient" type="replace" optional="true" after="ic.AD_Client_ID IN (" text="'1'"/>
 <Parameter name="adOrgClient" type="replace" optional="true" after="ic.AD_Org_ID IN (" text="'1'"/>
 <Parameter name="cBpartnerId"/>
 <Parameter name="isTaxIncluded"/>
 </SqlMethod>

file CreateFrom_Invoice_data.xsql yang sudah diperbaiki bisa di download disini.

kalau sudah di download, timpa saja file original-nya, lalu compile dengan perintah ant smartbuild. restart tomcat dan bugs sudah selesai diperbaiki.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s