2014年6月29日 星期日

[COST] 檢查收料科目科餘的 SQL

    我不太喜歡放 SQL 在這,畢竟熟悉 EBS 的人會覺得很簡單,沒什麼價值。不過,雖然我還很弱,可是總是會有人比我晚踏入這塊領域,所以可能多少有幫助吧 .......,希望啦。

    盤點前,財務都會確認收料科目(Oracle 文件好像是 Receiving Inspection Account)不能有餘額,偏偏這次就遇到了。


    收料科目算是一個過渡性科目,當科目餘額不是0 (尾差因素除外),通常代表存在已收料,未入庫的交易。在盤點期間,通常不會允許這樣的情況存在,也就是說,只要廠商已經交到廠內的貨物,就必須全數入庫,成為存貨。所以,財務會檢查收料科目的餘額是不是 0,藉以確認是不是所有 PO 相關交易都已經完成了。

    實際上,我們本來就有已收未入庫報表,但是每次執行要三、四個小時。這是因為,前人的寫法,是把從開帳以來的所有交易做加總。這個想法很直覺,單純從資料面的角度來看,也沒有錯,可是隨著交易越來越多,速度就會越來越慢。

    前人忽略了一個商務面重要的特性,也就是前面提到的,每半年一次的盤點,科目餘額都會變成 0。尤其每年年底會計師也會來盤,收料科目更可以肯定是會確認到 0。所以說,報表的寫法應該從年初的交易統計到現在,也就足夠了,這樣效能可以大大的改善。

    我們的AP立帳方式是 Match to Receipt,因此,以 Receipt Number 做 Grouping 加總,只要某個 Receipt Number 的收料科目餘額不是 0,就代表有問題需確認,因此 SQL 的寫法是基於此前提。

    此外,如果要更完整(或這對某些公司來說),應該還要串到 SLA,甚至 GL。不過以我們面對到的情況還不需要,因此我沒有串 SLA & GL。

    SQL 我分三段,再用 Excel 樞紐起來做分析,當然也可以寫成報表。

1. 原料PO入庫
select /*+ RULE */  rsh.receipt_num
     , sum(mta.base_transaction_value) amount
  from mtl_transaction_accounts mta
     , gl_code_combinations gcc
     , rcv_transactions rt
     , rcv_shipment_headers rsh
     , mtl_material_transactions mmt
 where mmt.transaction_date >= trunc(sysdate,'YYYY')
   and mmt.organization_id = 318
   and mta.reference_account = gcc.code_combination_id
   and gcc.segment4||'' = '1211'
   and mta.transaction_id = mmt.transaction_id
   and mmt.rcv_transaction_id = rt.transaction_id
   and rt.shipment_header_id = rsh.shipment_header_Id
 group by rsh.receipt_num
   ;
   
2. 委外加工PO Deliver 
select rsh.receipt_num
     , sum(mta.base_transaction_value) amount
  from wip_transaction_accounts mta
     , wip_transactions mmt
     , gl_code_combinations gcc
     , rcv_transactions rt
     , rcv_shipment_headers rsh
 where mta.transaction_date >= trunc(sysdate,'YYYY')
   and mta.organization_id = 318
   and mta.reference_account = gcc.code_combination_id
   and gcc.segment4 = '1211'
   and mta.transaction_id = mmt.transaction_id
   and mmt.rcv_transaction_id = rt.transaction_id
   and rt.shipment_header_id = rsh.shipment_header_Id
 group by rsh.receipt_num
   ; 
   
3. 收料
select /*+ rule */ rsh.receipt_num
     , sum(nvl(rrsl.accounted_dr,0) - nvl(rrsl.accounted_cr,0)) amount
  from rcv_receiving_sub_ledger rrsl
     , gl_code_combinations gcc
     , rcv_shipment_headers rsh
     , rcv_transactions rt
 where rt.organization_id+0 = 318
   and rt.transaction_date >= trunc(sysdate,'YYYY')
   and rt.transaction_id = rrsl.rcv_transaction_id
   and rrsl.code_combination_id = gcc.code_combination_id
   and rt.shipment_header_id = rsh.shipment_header_id
   and gcc.segment4||'' = '1211'
 group by rsh.receipt_num
   ;   
   

沒有留言: