BAPI_PO_RESET_RELEASE BAPI_PO_RELEASE ME29N 生产订单 审批状态 修改

image-20230217142234441.png

业务目的:开发一个接口,传入生产订单号,审批状态和文本备注,调用BAPI修改采购订单的审批策略,审批状态为’1’审批通过,审批状态’2’审批不通过。

接口传入:

image-20230217142610283.png

image-20230217142638043.png

接口传出:

image-20230217142731836.png

直接上接口代码,复制即可使用:

FUNCTION Z_MM_MODIFY_APPROVAL_STATUS.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_HEAD) TYPE  ZMMSMAS
*"  EXPORTING
*"     VALUE(E_MSG_TYP) TYPE  ZMSG_TYPE
*"     VALUE(E_RET_MSG) TYPE  ZRET_MSG
*"     VALUE(E_PROCESS_NUMBER) TYPE  ZOA_PROCESS_NUMBER
*"----------------------------------------------------------------------
  TYPES:BEGIN OF TY_EKKO,
          EBELN TYPE EKKO-EBELN,              "采购订单编号
          FRGGR TYPE EKKO-FRGGR,              "审批组
          FRGSX TYPE EKKO-FRGSX,              "审批策略
          FRGZU TYPE EKKO-FRGZU,              "版本状态
          BSART TYPE EKKO-BSART,              "采购凭证类型
          EKORG TYPE EKKO-EKORG.              "采购组织
  TYPES END OF TY_EKKO.
  DATA:LT_TLINE TYPE TABLE OF TLINE,
       LS_TLINE TYPE TLINE.
  DATA:FNAME TYPE THEAD-TDNAME.
  DATA:LT_EKKO TYPE TABLE OF TY_EKKO.
  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组成对应审批组字段
  DATA:LV_RETURN TYPE STRING.
*  DATA:LT_T16FD TYPE TABLE OF T16FD.
  FIELD-SYMBOLS: <FS_FIELD> TYPE T16FS-FRGC1.              "当前审批组值
  CLEAR: L_LEVEL,
         L_LAST_CHAR,
         L_FIELDNAME.

  SELECT EBELN                               "采购订单
      FRGGR                                  "审批组
      FRGSX                                  "审批策略
      FRGZU                                  "版本状态
      BSART                                  "采购凭证类型
      EKORG                                  "采购组织
      INTO TABLE LT_EKKO
      FROM EKKO
    WHERE EBELN = I_HEAD-EBELN.

  "根据审批组取对应批准策略
  SELECT *
    INTO TABLE @DATA(LT_T16FS)
    FROM T16FS
    FOR ALL ENTRIES IN  @LT_EKKO
  WHERE FRGGR = @LT_EKKO-FRGGR           "审批组
        AND FRGSX = @LT_EKKO-FRGSX.      "审批策略
  WITH +DATA AS ( SELECT DISTINCT FRGGR FROM @LT_EKKO AS LT_DATA )
    SELECT +DATA~FRGGR,
      T16FD~FRGCT
      FROM +DATA
      INNER JOIN T16FD
      ON +DATA~FRGGR = T16FD~FRGGR
      INTO TABLE @DATA(LT_T16FD).

  READ TABLE LT_EKKO ASSIGNING FIELD-SYMBOL(<FS_EKKO>) WITH KEY EBELN = I_HEAD-EBELN.
  IF SY-SUBRC EQ 0 AND <FS_EKKO>-FRGZU IS NOT INITIAL.
    "根据采购订单的审批组、审批策略取对应的审批组
    READ TABLE LT_T16FS ASSIGNING FIELD-SYMBOL(<FS_T16FS>) WITH KEY FRGGR = <FS_EKKO>-FRGGR FRGSX = <FS_EKKO>-FRGSX.
    "计算审批通过级数
    L_LEVEL = STRLEN( <FS_EKKO>-FRGZU ).
    "取消采购订单,只取消第一级审批就可以,不需要逐级取消审批,如果逐级取消审批后造成采购订单被锁定错误
    IF I_HEAD-RESULT = '2'.
      "组成字段名
      CONCATENATE L_PRE_FIELD '1' INTO L_FIELDNAME.

      "通过指针获取批准代码
      ASSIGN COMPONENT L_FIELDNAME OF STRUCTURE <FS_T16FS> TO <FS_FIELD>.
      CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
        EXPORTING
          PURCHASEORDER            = <FS_EKKO>-EBELN
          PO_REL_CODE              = <FS_FIELD>
        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.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'   "对于没有返回文本信息的BAPI可以调用此函数查看返回信息
          EXPORTING
            MSGID               = SY-MSGID
            MSGNR               = SY-MSGNO
            MSGV1               = SY-MSGV1
            MSGV2               = SY-MSGV2
            MSGV3               = SY-MSGV3
            MSGV4               = SY-MSGV4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_RETURN.
        E_RET_MSG = LV_RETURN.
        E_MSG_TYP = 'E'.
      ENDIF.
      IF E_MSG_TYP NE 'E'.
        PERFORM FRM_UPDATA_EKKO USING I_HEAD-EBELN '08'.
      ENDIF.
    ENDIF.
    IF I_HEAD-RESULT = '1'.       "批准采购订单,由前往后逐级审批
      L_LEVEL = LINES( LT_T16FD ).
      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>.
        CALL FUNCTION 'BAPI_PO_RELEASE'
          EXPORTING
            PURCHASEORDER          = <FS_EKKO>-EBELN
            PO_REL_CODE            = <FS_FIELD>
          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 AND  L_LEVEL = SY-TABIX.
          CLEAR LV_RETURN.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = SY-MSGID
              MSGNR               = SY-MSGNO
              MSGV1               = SY-MSGV1
              MSGV2               = SY-MSGV2
              MSGV3               = SY-MSGV3
              MSGV4               = SY-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_RETURN.
          E_RET_MSG = LV_RETURN.
          E_MSG_TYP = 'E'.
        ENDIF.
      ENDDO.
      IF E_MSG_TYP NE 'E'.
        PERFORM FRM_UPDATA_EKKO USING I_HEAD-EBELN '05'.
      ENDIF.
    ENDIF.
    IF I_HEAD-RESULT NE '1' AND I_HEAD-RESULT NE '2'.
      E_MSG_TYP = 'E'.
      E_RET_MSG = '批准状态 ' && I_HEAD-RESULT &&  '错误,请检查输入'.
    ENDIF.
    "写入文本备注
    IF I_HEAD-HEADTXT1 IS NOT INITIAL.
      CALL FUNCTION 'C14W_STRING_TO_TLINE'
        EXPORTING
          I_STRING    = I_HEAD-HEADTXT1
        TABLES
          E_TLINE_TAB = LT_TLINE.
      FNAME = I_HEAD-EBELN .
      CALL FUNCTION 'CREATE_TEXT'    "创建长文本
        EXPORTING
          FID         = 'F01'
          FLANGUAGE   = '1'
          FNAME       = FNAME
          FOBJECT     = 'EKKO'
          SAVE_DIRECT = 'X'
        TABLES
          FLINES      = LT_TLINE.
    ENDIF.

  ENDIF.
  IF E_MSG_TYP IS INITIAL.
    E_MSG_TYP = 'S'.
    CLEAR LV_RETURN.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = SY-MSGID
        MSGNR               = SY-MSGNO
        MSGV1               = SY-MSGV1
        MSGV2               = SY-MSGV2
        MSGV3               = SY-MSGV3
        MSGV4               = SY-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = LV_RETURN.
    E_RET_MSG = LV_RETURN.
    IF SY-MSGNO = '000'.
      E_RET_MSG = '操作成功 未发现错误'.
    ENDIF.
  ENDIF.
ENDFUNCTION.


FORM FRM_UPDATA_EKKO USING EBELN PROCSTAT.
  WAIT UP TO 2 SECONDS.
  UPDATE EKKO SET PROCSTAT =  PROCSTAT  WHERE EBELN = EBELN.
  COMMIT WORK AND WAIT .
ENDFORM.

对于创建长文本,调用CREATE_TEXT函数即可

CALL FUNCTION 'C14W_STRING_TO_TLINE'
        EXPORTING
          I_STRING    = I_HEAD-HEADTXT1
        TABLES
          E_TLINE_TAB = LT_TLINE.
      FNAME = I_HEAD-EBELN .
CALL FUNCTION 'CREATE_TEXT'    "创建长文本
    EXPORTING
      FID         = 'F01'
      FLANGUAGE   = '1'
      FNAME       = FNAME
      FOBJECT     = 'EKKO'
      SAVE_DIRECT = 'X'
    TABLES
      FLINES      = LT_TLINE.

双击长文本框,然后点击 转到->表头 查看文本信息

image-20230217144124430.png

image-20230217144553557.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BAPI_PO_CREATE1是一个针对事务码ME21N的函数模块,用于创建采购订单。它接受抬头和行项目作为输入参数,并根据这些参数创建采购订单[^2]。 在使用BAPI_PO_CREATE1时,需要注意以下几点: 1. 抬头数据:需要提供采购订单的抬头信息,例如供应商、采购组织、采购组等。 2. 行项目数据:需要提供采购订单的行项目信息,例如物料号、数量、价格等。 3. lt_poitem-ematerial字段:在同一个BAPI COMMIT中多次调用BAPI_PO_CREATE1时,需要赋值该字段。如果不赋值,系统会自动将其值设置为lt_poitem-material的值,并在后续调用中记忆该值。如果不正确地赋值该字段,可能会导致后续的BAPI调用报错[^1]。 下面是一个使用BAPI_PO_CREATE1创建采购订单的示例代码: ```python import pyrfc # 创建RFC连接 conn = pyrfc.Connection(user='username', passwd='password', ashost='host', sysnr='00', client='client') # 准备抬头数据 header_data = { 'COMP_CODE': '0001', 'DOC_TYPE': 'NB', 'VENDOR': '10000001', # 其他抬头字段... } # 准备行项目数据 item_data = [ { 'PO_ITEM': '00010', 'MATERIAL': 'MATERIAL1', 'QUANTITY': 10, # 其他行项目字段... }, { 'PO_ITEM': '00020', 'MATERIAL': 'MATERIAL2', 'QUANTITY': 20, # 其他行项目字段... }, # 其他行项目... ] # 调用BAPI_PO_CREATE1创建采购订单 result = conn.call('BAPI_PO_CREATE1', POHEADER=header_data, POITEM=item_data) # 检查返回结果 if result['RETURN'][0]['TYPE'] == 'E': print('创建采购订单失败:', result['RETURN'][0]['MESSAGE']) else: print('创建采购订单成功:', result['RETURN'][0]['MESSAGE']) # 关闭RFC连接 conn.close() ``` 请注意,上述示例代码中的参数值需要根据实际情况进行替换。另外,还需要安装pyrfc库来进行RFC连接的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值