SAP ABAP 采购申请取消审批 BAPI_PO_RESET_RELEASE

本文介绍了一种使用ABAP编程语言实现的SAP系统中采购订单(Purchase Order, PO)的反审批流程。该流程包括从获取采购订单的审批代码到逐级取消审批的全过程。首先,通过查询数据库获取审批组、审批策略及审批级别代码;接着,根据审批级别代码调用BAPI函数逐级取消采购订单的审批。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FORM frm_reset_release_po USING lv_ebeln TYPE ekko-ebeln  CHANGING  cs_alv TYPE ty_alv_w.

  DATA:lv_rel_code LIKE  bapimmpara-rel_code.
  DATA:lt_return TYPE TABLE OF bapireturn,
       ls_return TYPE bapireturn.
  DATA:lv_str    TYPE string,lv_offset TYPE i.
  DATA:BEGIN OF ls_grp,
         frgco TYPE t16fc-frgco,
       END OF ls_grp,
       lt_grp LIKE TABLE OF ls_grp.
  DATA:lv_times TYPE i.
  FIELD-SYMBOLS:<lfs_v1> TYPE any.

* 获取采购订单的审批代码
* 根据PO获取审批组和审批策略,然后获取审批级别代码
  SELECT k~ebeln,k~frgzu,s~frgc1,s~frgc2,s~frgc3,s~frgc4,
         s~frgc5,s~frgc6,s~frgc7,s~frgc8
    FROM t16fs AS s
    INNER JOIN ekko AS k
       ON k~frggr = s~frggr
      AND k~frgsx = s~frgsx
    WHERE k~ebeln = @lv_ebeln
*      AND k~frgrl = @abap_true "FRGRL 字段标示审批是否结束
    INTO TABLE @DATA(lt_t16fs).
  READ TABLE lt_t16fs ASSIGNING FIELD-SYMBOL(<lfs_t16fs>) INDEX 1.
  IF sy-subrc EQ 0.
    lv_times = strlen( <lfs_t16fs>-frgzu ).
    DO lv_times TIMES.
      lv_str = sy-index.
      lv_str = 'FRGC' && lv_str.
      CONDENSE lv_str NO-GAPS.
      ASSIGN COMPONENT lv_str OF STRUCTURE <lfs_t16fs> TO <lfs_v1>.
      IF sy-subrc EQ 0.
        IF <lfs_v1> IS NOT INITIAL.
          DATA(lv_x) = <lfs_t16fs>-frgzu+lv_offset(1).
          IF lv_x IS NOT INITIAL."已审批
            ls_grp-frgco = <lfs_v1>.
            APPEND ls_grp TO lt_grp.
          ENDIF.
        ENDIF.
      ENDIF.
      lv_offset = lv_offset + 1.
    ENDDO.
    CLEAR lv_str.
  ENDIF.

* 循环审批码将PO逐级release
* 调用BAPI审批PO
  SORT lt_grp DESCENDING BY frgco.
  LOOP AT lt_grp INTO ls_grp.
    CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
      EXPORTING
        purchaseorder = lv_ebeln
        po_rel_code   = ls_grp-frgco
      TABLES
        return        = lt_return.
    LOOP AT lt_return INTO ls_return
          WHERE type = 'E' OR type = 'A'.
      lv_str = lv_str && '|' && ls_return-message.
      DATA(lv_flag) = abap_true.
    ENDLOOP.
    SHIFT lv_str LEFT DELETING LEADING '|'.
    IF lv_flag EQ abap_true.
      EXIT.
    ENDIF.
    WAIT UP TO 1 SECONDS.
  ENDLOOP.

  IF lv_flag EQ abap_true."失败
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*    cs_alv-icon = icon_red_light.
*    cs_alv-msg =  '反审批出错:' && lv_str.
*    SHIFT cs_alv-msg LEFT DELETING LEADING '|'.
    MESSAGE '反审批出错'&& lv_str TYPE 'E'.
  ELSE."成功
*    cs_alv-icon = icon_green_light.
*    cs_alv-type = '3'.
*    cs_alv-msg =  '反审批通过'.
  ENDIF.
ENDFORM.

### ABAP BAPI_PO_CREATE1 错误解决方案 当遇到 `BAPI_PO_CREATE1` 报错的情况时,通常可以从以下几个方面来排查和解决问题: #### 参数验证 确保传递给 `BAPI_PO_CREATE1` 的参数完全正确。任何不匹配的数据类型或错误的输入都可能导致异常抛出[^1]。 ```abap DATA: lv_return TYPE TABLE OF bapiret2, ls_purchaseorder TYPE bapi_purord. CALL FUNCTION 'BAPI_PO_CREATE1' EXPORTING purchaseorderheader = ls_purchaseorder-header IMPORTING purCHASEORDER = ls_purchaseorder-number TABLES return = lv_return. ``` 如果返回表 `lv_return` 中有条目,则表示存在某些问题;应仔细检查这些消息并修正相应字段的内容。 #### 数据一致性校验 确认采购订单中的物料编号、供应商信息以及其他相关数据的一致性和准确性。例如,在创建采购合同时使用的材料编码应该存在于系统内,并且与指定工厂相兼容。 #### 权限配置审查 有时权限不足也会引发此接口调用失败。因此建议核查当前用户的授权对象设置是否允许执行该操作以及访问所需资源。 #### 日志记录分析 启用详细的调试模式可以更深入地了解具体哪个环节出现了状况。通过查看后台日志文件或者利用 SAP GUI 内置工具(如 ST22),能够获取更多关于程序运行期间发生的事件的信息,从而帮助定位根本原因所在。 #### 测试环境模拟 在一个受控环境中重现相同的业务场景有助于排除外部因素干扰的可能性。这可能涉及到搭建专门用于测试目的的小型实例或是借助其他开发人员的帮助来进行跨部门协作诊断工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值