盤點前,財務都會確認收料科目(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
;
沒有留言:
張貼留言