ABAP 采购信息记录BAPI

复制代码
DATA:lv_mode      TYPE c,
       ls_eina      TYPE eina,
       lt_eina      TYPE TABLE OF eina,
       ls_eine      TYPE eine,
       lt_eine      TYPE TABLE OF eine,
       i_eina       TYPE mewieina,
       i_einax      TYPE mewieinax,
       i_eine       TYPE mewieine,
       i_einex      TYPE mewieinex,
       lt_return2   TYPE mewi_t_return,
       ls_return2   LIKE LINE OF lt_return2,
       lt_con_vali  TYPE TABLE OF mewivalidity,
       ls_con_vali  TYPE mewivalidity,
       lt_condition TYPE TABLE OF mewicondition,
       ls_condition TYPE mewicondition,
       e_eina       TYPE mewieina,
       e_eine       TYPE mewieine,
       ls_mara      TYPE mara,
       lt_mara      TYPE TABLE OF mara,
       lv_msg       TYPE bapi_msg.
  SELECT matnr,werks,ekgrp,plifz FROM marc INTO TABLE @DATA(lt_marc).
  SORT lt_marc BY matnr werks.
  SELECT * FROM mara INTO TABLE lt_mara.
  SORT lt_mara BY matnr.
  SELECT * FROM eina INTO TABLE lt_eina.
  SORT lt_eina BY matnr lifnr.
  SELECT * FROM eine INTO TABLE lt_eine.
  SORT lt_eine BY infnr ekorg esokz werks.
  SELECT a~lifnr,                                 "供应商
         a~matnr,                                 "物料
         a~ekorg,                                 "采购组织
         a~werks,                                 "工厂
         a~esokz,                                 "信息类型
         a~datab,                                 "有效期自
         a~datbi,                                 "有效期至
         a~knumh                                  "条件记录编号
    INTO TABLE @DATA(lt_a017)
    FROM a017 AS a.
  SORT lt_a017 BY lifnr matnr ekorg werks esokz.

  LOOP AT in_tab ASSIGNING FIELD-SYMBOL(<fs_zmms009>).
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = <fs_zmms009>-matnr
      IMPORTING
        output       = <fs_zmms009>-matnr
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
    "补齐供应商的前导零
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <fs_zmms009>-lifnr
      IMPORTING
        output = <fs_zmms009>-lifnr.

    READ TABLE lt_eina INTO ls_eina WITH KEY matnr = <fs_zmms009>-matnr lifnr = <fs_zmms009>-lifnr BINARY SEARCH.
    IF sy-subrc <> 0.
      lv_mode = 'I'."新增
    ELSE.
      READ TABLE lt_eine INTO ls_eine WITH KEY infnr = ls_eina-infnr
        ekorg = <fs_zmms009>-ekorg esokz = <fs_zmms009>-esokz werks = <fs_zmms009>-werks BINARY SEARCH.
      IF sy-subrc = 0.
        lv_mode          = 'M'."修改
        i_eina-info_rec  = ls_eina-infnr."采购信息记录号
        i_eine-info_rec  = ls_eina-infnr."
        i_einex-info_rec = 'X'.
        i_einax-vendor   = 'X'.
        i_einax-material = 'X'.
      ELSE.
        lv_mode = 'I'."新增
      ENDIF.
    ENDIF.

    i_eina-vendor    = <fs_zmms009>-lifnr."供应商
    i_eina-material  = <fs_zmms009>-matnr."物料编码
*    i_eina-conv_num1 = <fs_zmms009>-umrez."转换分子
*    i_eina-conv_den1 = <fs_zmms009>-umren."转换分母

    i_eine-conv_num1 = <fs_zmms009>-umrez."转换分子
    IF i_eine-conv_num1 IS NOT INITIAL.
      i_einex-conv_num1 = 'X'.
    ENDIF.
    i_eine-conv_den1 = <fs_zmms009>-umren."转换分母
    IF i_eine-conv_den1 IS NOT INITIAL.
      i_einex-conv_den1 = 'X'.
    ENDIF.
    i_eine-purch_org = <fs_zmms009>-ekorg."采购组织
    IF i_eine-purch_org IS NOT INITIAL.
      i_einex-purch_org = 'X'.
    ENDIF.
    i_eine-info_type = <fs_zmms009>-esokz."信息类别
    IF i_eine-info_type IS NOT INITIAL.
      i_einex-info_type = 'X'.
    ENDIF.
    i_eine-plant = <fs_zmms009>-werks."工厂
    IF i_eine-plant IS NOT INITIAL.
      i_einex-plant = 'X'.
    ENDIF.
    IF <fs_zmms009>-ekgrp IS INITIAL.
      READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY matnr = <fs_zmms009>-matnr
                                                     werks = <fs_zmms009>-werks
                                                     BINARY SEARCH.
      IF sy-subrc = 0.
        i_eine-plnd_delry  = ls_marc-plifz. "计划交货时间
        <fs_zmms009>-ekgrp = ls_marc-ekgrp.
      ENDIF.
    ENDIF.
    IF i_eine-plnd_delry IS NOT INITIAL.
      i_einex-plnd_delry = 'X'.
    ENDIF.
    i_eine-pur_group = <fs_zmms009>-ekgrp."采购组
    IF i_eine-pur_group IS NOT INITIAL.
      i_einex-pur_group = 'X'.
    ENDIF.
    i_eine-currency = <fs_zmms009>-waers."货币码
    IF i_eine-currency IS NOT INITIAL.
      i_einex-currency = 'X'.
    ENDIF.
    i_eine-tax_code = <fs_zmms009>-mwskz."税码
    IF i_eine-tax_code IS NOT INITIAL.
      i_einex-tax_code = 'X'.
    ENDIF.
    IF <fs_zmms009>-netpr1 IS NOT INITIAL.
      ls_condition-cond_type = 'PB99'."条件类型
      i_eine-net_price = <fs_zmms009>-netpr1."净价
      IF i_eine-net_price IS NOT INITIAL.
        i_einex-net_price = 'X'.
      ENDIF.
    ELSEIF <fs_zmms009>-netpr2 IS NOT INITIAL.
      ls_condition-cond_type = 'PB01'."条件类型
      i_eine-net_price = <fs_zmms009>-netpr2."净价
      IF i_eine-net_price IS NOT INITIAL.
        i_einex-net_price = 'X'.
      ENDIF.
    ENDIF.

    "对采购单位进行一次转换
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input          = <fs_zmms009>-bprme
*       LANGUAGE       = SY-LANGU
      IMPORTING
        output         = <fs_zmms009>-bprme
      EXCEPTIONS
        unit_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
    "对单位进行校验
    READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <fs_zmms009>-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      IF ls_mara-bstme IS NOT INITIAL.
        i_eine-orderpr_un = ls_mara-bstme."采购单位
        IF i_eine-orderpr_un IS NOT INITIAL.
          i_einex-orderpr_un = 'X'.
        ENDIF.
        IF ls_mara-bstme <> <fs_zmms009>-bprme AND <fs_zmms009>-bprme IS NOT INITIAL.
          i_eine-orderpr_un = <fs_zmms009>-bprme."采购单位
        ENDIF.
      ELSE.
        i_eine-orderpr_un = ls_mara-meins."采购单位
        IF i_eine-orderpr_un IS NOT INITIAL.
          i_einex-orderpr_un = 'X'.
        ENDIF.
        IF ls_mara-meins <> <fs_zmms009>-bprme AND <fs_zmms009>-bprme IS NOT INITIAL.
          i_eine-orderpr_un = <fs_zmms009>-bprme."采购单位
        ENDIF.
      ENDIF.
    ENDIF.
    i_eine-price_unit = <fs_zmms009>-peinh."价格单位
    IF i_eine-price_unit IS NOT INITIAL.
      i_einex-price_unit = 'X'.
    ENDIF.

    i_eine-nrm_po_qty = <fs_zmms009>-norbm."标准采购订单数量
    IF i_eine-nrm_po_qty IS NOT INITIAL.
      i_einex-nrm_po_qty = 'X'.
    ENDIF.


    IF i_eina-info_rec <> ''.
      ls_condition-change_id = 'U'.
      READ TABLE lt_a017 INTO DATA(ls_a017) WITH KEY lifnr = <fs_zmms009>-lifnr
                                                     matnr = <fs_zmms009>-matnr
                                                     ekorg = <fs_zmms009>-ekorg
                                                     werks = <fs_zmms009>-werks
                                                     esokz = <fs_zmms009>-esokz
                                                     BINARY SEARCH.
      IF sy-subrc = 0.
        ls_con_vali-serial_id   = ls_a017-knumh.
        ls_condition-serial_id  = ls_a017-knumh.
        ls_condition-cond_count = '01'.
      ENDIF.
    ENDIF.

    ls_con_vali-plant      = <fs_zmms009>-werks."工厂
    ls_con_vali-valid_from = <fs_zmms009>-datab."有效起始日
    ls_con_vali-valid_to   = <fs_zmms009>-prdat."有效截止日
    APPEND ls_con_vali TO lt_con_vali.

    ls_condition-currency  = <fs_zmms009>-waers."货币码
    IF <fs_zmms009>-netpr1 IS NOT INITIAL.
      ls_condition-cond_value = <fs_zmms009>-netpr1."净价
    ELSEIF <fs_zmms009>-netpr2 IS NOT INITIAL.
      ls_condition-cond_value = <fs_zmms009>-netpr2."净价
    ENDIF.
    ls_condition-cond_p_unt = <fs_zmms009>-peinh."条件定价单位
    ls_condition-cond_unit  = <fs_zmms009>-bprme."条件单位
    APPEND ls_condition TO lt_condition.

    REFRESH:lt_return2.
    IF lv_mode = 'I'.
      CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina  = i_eina
          i_eine  = i_eine
          i_einex = i_einex
        IMPORTING
          e_eina  = e_eina
          e_eine  = e_eine
        TABLES
          return  = lt_return2.

      READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        "创建时需要将数据写入到数据库里,不然报错
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        "因为净价和条件不能同时维护,所以分开维护
        CLEAR:i_einex-net_price.
        REFRESH:lt_return2.
        i_eina-info_rec  = e_eina-info_rec."采购信息记录号
        i_eine-info_rec  = e_eina-info_rec.
        i_einex-info_rec = 'X'.
        CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
        CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
          EXPORTING
            i_eina        = i_eina
            i_eine        = i_eine
            i_einex       = i_einex
          IMPORTING
            e_eina        = e_eina
            e_eine        = e_eine
          TABLES
            cond_validity = lt_con_vali
            condition     = lt_condition
            return        = lt_return2.
      ENDIF.
    ELSE.
      "对数据进行修改
      CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina  = i_eina
          i_einax = i_einax
          i_eine  = i_eine
          i_einex = i_einex
        IMPORTING
          e_eina  = e_eina
          e_eine  = e_eine
        TABLES
*         condition = lt_condition
          return  = lt_return2.
      READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.

      REFRESH : lt_return2.
      CLEAR:i_einex-net_price.
      CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina        = i_eina
          i_einax       = i_einax
          i_eine        = i_eine
          i_einex       = i_einex
        IMPORTING
          e_eina        = e_eina
          e_eine        = e_eine
        TABLES
          cond_validity = lt_con_vali
          condition     = lt_condition
          return        = lt_return2.
    ENDIF.

    READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
    IF sy-subrc = 0.
      <fs_zmms009>-msgty  = 'E'.
      <fs_zmms009>-msgtxt = ls_return2-message.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      <fs_zmms009>-e_infnr = e_eina-info_rec."采购信息记录号
      <fs_zmms009>-msgty   = 'S'.
      IF lv_mode = 'I'.
        <fs_zmms009>-msgtxt  = '创建成功' && <fs_zmms009>-e_infnr.
      ELSE.
        <fs_zmms009>-msgtxt  = '修改成功' && <fs_zmms009>-e_infnr.
      ENDIF.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.

    CLEAR:i_eina,i_einax,
          i_eine,i_einex,
          lt_con_vali,lt_condition,
          ls_eina.
    CLEAR:lt_return2.
  ENDLOOP.
复制代码

 

posted @   Delaine  阅读(1359)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示