1. 程式人生 > >Oracle EBS PO API po_change_api1_s.update_po修改PO行資訊

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