Oracle EBS PO API po_change_api1_s.update_po修改PO行資訊
Purpose
本文介紹了po_change_api1_s.update_po API的使用方法,本文中分析基於11.5.10.2而來,R12的API稍微有點不同,具體請參考metalink
Applies To
RDBMS : 10.2.0.5.0
Oracle Applications : 11.5.10.2
沒有在更高的版本上試過,但是應該可以使用的。
Abstract
使用者提出了一個需求,希望能批量的修改PO行上的資訊。po_change_api1_s.update_po這個API以前是經常看到的,但是一直沒有自己使用過。這個API能實現修改quantity,price,promised_date,在11i中不能修改need_by_date,在R12中是可以修改need_by_date的。API可以在修改成功後自動提交審批。
Solution
一、 直接上程式碼
API比較簡單,直接上程式碼。
DECLARE
l_user_id NUMBER := 15393; --User ID?Sysadmin
x_api_errors po_api_errors_rec_type; --11.5.10
l_result NUMBER;
BEGIN
--Should initialize before po_change_api1_s.update_po
apps.fnd_global.apps_initialize(user_id => l_user_id
,resp_id => 50245
,resp_appl_id => 201);
l_result := po_change_api1_s.update_po(x_po_number => '1225488'
,x_release_number => NULL
,x_revision_number => 0
,x_line_number => 1
,x_shipment_number => 1
,new_quantity => 700
,new_price => NULL
,new_promised_date => NULL
,launch_approvals_flag => 'N'
,update_source => 'Test Only'
,version => '1.0'
,x_override_date => NULL
,x_api_errors => x_api_errors
,p_buyer_name => NULL);
IF l_result <> 1
THEN
dbms_output.put_line(l_result);
FOR i IN 1 .. x_api_errors.message_name.count
LOOP
dbms_output.put_line(x_api_errors.message_name(i));
dbms_output.put_line(x_api_errors.message_text(i));
dbms_output.put_line(x_api_errors.table_name(i));
dbms_output.put_line(x_api_errors.column_name(i));
dbms_output.put_line(x_api_errors.entity_type(i));
dbms_output.put_line(x_api_errors.entity_id(i));
dbms_output.put_line(x_api_errors.processing_date(i));
dbms_output.put_line(x_api_errors.message_type(i));
END LOOP;
END IF;
END;
二、 幾個需要說明的問題
2.1 執行API前,請確認PO在能修改的狀態下
所謂能修改的狀態,比如incomplete,approved,need reapproved等。如果PO關閉,取消,或者In process,執行API或報錯。這個與介面上效果一直。
2.2 審批問題
launch_approvals_flag為N時,不啟動審批,為Y時,API正常執行後會自動提交審批。注意,這裡提交時是不會驗證工作流是否有效,或者是否有有效的審批組的(貌似在介面上提交時也不會強制驗證)。也就是說,如果PO的審批配置有問題,這裡是不會報錯的,而且會依然提交,造成的結果就是,PO在IN PROCESS狀態,PO的工作流異常。
這裡只是提交工作流審批,而不是執行審批,並且是按照預設的審批層次提交。
2.3 PO版本問題
API使用時,必須得指定PO的版本號,不然會報錯。在版本上,API的執行效果,和在介面上修改PO行的效果是一致的,即,如果PO是已審批,則API執行後,會修改PO版本,如果PO沒審批,則API執行不會修改PO版本。
2.4 API一次只能修改一行
API一次只能修改一個PO行,所以,如果需要同時修改一個PO號下的多行,請確認在最後一行處理完成後,再提交審批。否則在每次執行一行修改後,程式就會提交一個審批工作流。如果能自動審批,則有幾個PO行,就會自動審批幾次,同時版本號也會做對應的變更。如果不能自動審批,則在第一次提交審批後,PO會進入in process的狀態,在第二次執行API時,就會報錯。
三、 其他要說明的問題
這個API比較簡單,正常情況下,隨意調調就能調通。但是實際使用過程中,會出現一些奇奇怪怪的錯誤,因此,使用的時候一定要多測。
在11i中,這個API不能修改need_by_date,12.0.0的版本就可以。這個需要注意。
oracle提供了另外一個API po_document_update_grp.update_document來批量修改PO行。這個API的功能比較強大,除了可以批量修改PO行以外,還能修改行上大部分的資訊。詳情見metalink 1406047.1