采购订单审批/取消审批程序(BAPI_PO_RESET_RELEASE、BAPI_PO_RELEASE)

 

data:  gt_t16fs       TYPE STANDARD TABLE OF t16fs,            "批准策略

      "定义采购订单对应的审批信息
      BEGIN OF gt_ekko OCCURS 0,
        ebeln LIKE ekko-ebeln,                                "采购订单编号
        frggr LIKE ekko-frggr,                                   "审批组
        frgsx LIKE ekko-frgsx,                                  "审批策略
        frgzu LIKE ekko-frgzu,                                  "版本状态
        bsart LIKE ekko-bsart,                                 "采购凭证类型
        ekorg LIKE ekko-ekorg,                               "采购组织
      END   OF gt_ekko.

*&———————————————————————*
*&      Form  get_Approval_strategy
*&———————————————————————*
*       取采购订单对应的审批组和审批策略
*       再根据审批组和审批管理取每级对应的审批组
*———————————————————————-*
FORM get_approval_strategy.
  "取采购订单对应审批组
  SELECT ebeln                             "采购订单
    frggr                                             "审批组
    frgsx                                             "审批策略
    frgzu                                             "版本状态
    bsart                                            "采购凭证类型
    ekorg                                           "采购组织
    INTO TABLE gt_ekko
    FROM ekko

  WHERE ebeln = l_ebeln.


  "根据审批组取对应批准策略
  SELECT *
    INTO TABLE gt_t16fs
    FROM t16fs
    FOR ALL ENTRIES IN gt_ekko
  WHERE frggr = gt_ekko-frggr       "审批组

        AND frgsx = gt_ekko-frgsx.      "审批策略


ENDFORM.                    "get_Approval_strategy

 

*&———————————————————————*
*&      Form  PROCESS_po
*&———————————————————————*
*       处理采购订单,包括取消审批和审批
*———————————————————————-*
*      –>VALUE(FV_APPROVE)  处理标识,N:表示取消审批, Y:表示审批通过
*———————————————————————-*
FORM process_po USING value(fv_approve).
  DATA: l_level TYPE n,                                                  "当前订单已审批通过级别数
        l_last_char TYPE n,                                                 "当前订单最后审批通过级别
        l_pre_field TYPE string VALUE 'FRGC',              "所有审批组对应字段相同部分
        l_fieldname TYPE string.                                        "由l_pre_field + l_last_char组成对应审批组字段


  FIELD-SYMBOLS: <fs_field> TYPE t16fs-frgc1.      "当前审批组值
  CLEAR: l_level,
         l_last_char,
         l_fieldname.

  READ TABLE gt_ekko ASSIGNING <fs_ekko> WITH KEY ebeln = w_poheader-po_number.
  IF sy-subrc EQ 0 AND <fs_ekko>-frgzu IS NOT INITIAL.
    "根据采购订单的审批组、审批策略取对应的审批组
    READ TABLE gt_t16fs ASSIGNING <fs_t16fs> WITH KEY frggr = <fs_ekko>-frggr
                                                                                                         frgsx = <fs_ekko>-frgsx.

   "计算审批通过级数
    l_level = STRLEN( <fs_ekko>-frgzu ).
    "取消采购订单,只取消第一级审批就可以,不需要逐级取消审批,如果逐级取消审批后造成采购订单被锁定错误
    IF fv_approve = 'N'.

      "组成字段名
      CONCATENATE l_pre_field '1' INTO l_fieldname.

      "通过指针获取批准代码
      ASSIGN COMPONENT l_fieldname OF STRUCTURE <fs_t16fs> TO <fs_field>.

      PERFORM approve_po USING <fs_ekko>-ebeln 'N' <fs_field>.

    ENDIF.

    "批准采购订单,由前往后逐级审批

    IF fv_approve = 'Y'.
      DO l_level TIMES.
        l_last_char = sy-index.
        CONCATENATE l_pre_field l_last_char INTO l_fieldname.
        ASSIGN COMPONENT l_fieldname OF STRUCTURE <fs_t16fs> TO <fs_field>.
          PERFORM approve_po USING <fs_ekko>-ebeln 'Y' <fs_field>.
      ENDDO.

    ENDIF.
  ENDIF.

ENDFORM.                    "PROCESS_po

 

*&———————————————————————*
*&      Form  approve_po
*&———————————————————————*
*       审批或取消采购订单审批
*———————————————————————-*
*      –>VALUE(FV_EBELN)    采购订单编号
*      –>VALUE(FV_APPROVE)  审批状态
*      –>VALUE(FV_REL_COD)  审批代码
*———————————————————————-*
FORM approve_po USING value(fv_ebeln)
                      value(fv_approve)
                      value(fv_rel_cod).
  CALL FUNCTION 'Z_MM_APPROVE_PO'
    EXPORTING
      purchaseorder = fv_ebeln
      approve            = fv_approve
      rel_cod             = fv_rel_cod.

  IF sy-subrc EQ 0.
    WAIT UP TO 1 SECONDS.
  ENDIF.

ENDFORM.                    "approve_po

FUNCTION z_mm_approve_po.
*"———————————————————————-
*"*"Update function module:
*"
*"*"Local interface:
*"  IMPORTING
*"     VALUE(PURCHASEORDER) TYPE  BAPIMMPARA-PO_NUMBER
*"     VALUE(APPROVE) TYPE  CHAR1
*"     VALUE(REL_COD) TYPE  BAPIMMPARA-PO_REL_COD
*"———————————————————————-

  IF approve = 'Y'.
    CALL FUNCTION 'BAPI_PO_RELEASE'
      EXPORTING
        purchaseorder                = purchaseorder
        po_rel_code                  = rel_cod
*     USE_EXCEPTIONS               = 'X'
*     NO_COMMIT                    = ' '
*   IMPORTING
*     REL_STATUS_NEW               =
*     REL_INDICATOR_NEW            =
*     RET_CODE                     =
*   TABLES
*     RETURN                       = return
     EXCEPTIONS
       authority_check_fail         = 1
       document_not_found           = 2
       enqueue_fail                 = 3
       prerequisite_fail            = 4
       release_already_posted       = 5
       responsibility_fail          = 6
       OTHERS                       = 7
              .
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSEIF approve = 'N'.
    CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
      EXPORTING
        purchaseorder                  = purchaseorder
        po_rel_code                     = rel_cod
*     USE_EXCEPTIONS                 = 'X'
*   IMPORTING
*     REL_STATUS_NEW                 =
*     REL_INDICATOR_NEW              =
*   TABLES
*     RETURN                         = return
     EXCEPTIONS
       authority_check_fail           = 1
       document_not_found             = 2
       enqueue_fail                   = 3
       prerequisite_fail              = 4
       release_already_posted         = 5
       responsibility_fail            = 6
       no_release_already             = 7
       no_new_release_indicator       = 8
       OTHERS                         = 9
              .
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDIF.
ENDFUNCTION.

### 使用 `BAPI_PO_CHANGE` 修改 SAP 采购订单数量 为了修改 SAP 中的采购订单数量,可以使用 `BAPI_PO_CHANGE` 函数模块。此函数允许更新现有采购订单中的各种属性,包括项目级别的数量字段。 以下是具体实现方法: #### 调用参数设置 在调用 `BAPI_PO_CHANGE` 前需准备输入结构体来指定要更改的具体项及其新值。对于调整数量的操作主要涉及两个表:一个是用于传递采购订单头信息;另一个则是明细条目(`PO_ITEMS`)的信息,在这里定义需要变更的商品编号以及新的订购量[^1]。 ```abap DATA: lt_itemscheds TYPE TABLE OF bapiparex, ls_itemscheds LIKE LINE OF lt_itemscheds. " 设置采购订单号和其他必要条件... CALL FUNCTION 'BAPI_PO_GETDETAIL' EXPORTING purchaseorder = lv_purchase_order_number IMPORTING purchasdocument = wa_purdoc. ``` #### 更新物品详情 针对特定商品行增加或减少其预定数目时,则应构建相应的调度行记录并加入到上述提到的数据集中去。注意每一条这样的记录都代表了一次独立的变化操作,并且必须指明对应的物料序号(Item Number)以便系统能够准确定位待处理的对象[^2]。 ```abap ls_itemscheds-number = '1'. " 物料序列号, 需依据实际情况设定 ls_itemscheds-purchasingvaluefield-name = 'ORDERQUANTITY'. ls_itemscheds-purchasingvaluefield-value = new_quantity. " 新的数量值 APPEND ls_itemscheds TO lt_itemscheds. ``` #### 执行 BAPI 变更请求 最后一步就是实际执行这个事务性的命令了。这通常意味着提交整个交易以保存所做的任何改动至数据库中永久存储起来。如果一切顺利的话,那么所选项目的订货数就会按照预期被刷新成最新的数值。 ```abap CALL FUNCTION 'BAPI_PO_CHANGE' EXPORTING purCHASEORDER = lv_purchase_order_number * OTHER_PARAMETERS... AS NEEDED TABLES poitems = lt_poitems poschedulelines = lt_itemscheds EXCEPTIONS document_not_found = 1 no_change_necessary = 2 error_occurred = 3 others = 99. IF sy-subrc <> 0. " Handle errors here as appropriate ENDIF. ``` 通过以上步骤即可完成利用 `BAPI_PO_CHANGE` 对于已存在采购单内某件货物所需总量做出相应增减的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值