本文介绍了po_change_api1_s.update_po API的使用方法,本文中分析基于11.5.10.2而来,R12的API稍微有点不同,具体请参考metalink
RDBMS : 10.2.0.5.0
Oracle Applications : 11.5.10.2
没有在更高的版本上试过,但是应该可以使用的。
用户提出了一个需求,希望能批量的修改PO行上的信息。po_change_api1_s.update_po这个API以前是经常看到的,但是一直没有自己使用过。这个API能实现修改quantity,price,promised_date,在11i中不能修改need_by_date,在R12中是可以修改need_by_date的。API可以在修改成功后自动提交审批。
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;
所谓能修改的状态,比如incomplete,approved,need reapproved等。如果PO关闭,取消,或者In process,执行API或报错。这个与界面上效果一直。
launch_approvals_flag为N时,不启动审批,为Y时,API正常运行后会自动提交审批。注意,这里提交时是不会验证工作流是否有效,或者是否有有效的审批组的(貌似在界面上提交时也不会强制验证)。也就是说,如果PO的审批配置有问题,这里是不会报错的,而且会依然提交,造成的结果就是,PO在IN PROCESS状态,PO的工作流异常。
这里只是提交工作流审批,而不是执行审批,并且是按照默认的审批层次提交。
API使用时,必须得指定PO的版本号,不然会报错。在版本上,API的执行效果,和在界面上修改PO行的效果是一致的,即,如果PO是已审批,则API执行后,会修改PO版本,如果PO没审批,则API执行不会修改PO版本。
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