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

你可能感兴趣的:(PO,接口,EBS,11i)