采购信息记录批导 调用BAPI ME_INFORECORD_MAINTAIN解决价格等级问题

LOOP AT  gt_alv ASSIGNING  FIELD-SYMBOL(<fs_alv>) WHERE box = 'X' .
    "补齐供应商的前导零
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <fs_alv>-lifnr
      IMPORTING
        output = <fs_alv>-lifnr.
    CLEAR:ls_eina,ls_eine,ls_mara.
    SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_eina
      FROM eina
       WHERE matnr = <fs_alv>-matnr
        AND lifnr = <fs_alv>-lifnr.

    IF sy-subrc = 0.

      SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_eine
        FROM eine
        WHERE infnr = ls_eina-infnr
          AND ekorg = <fs_alv>-ekorg "采购组织
          AND esokz = <fs_alv>-esokz "采购信息记录分类
          AND werks = <fs_alv>-werks."工厂

      IF sy-subrc = 0.
        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'.
      ENDIF.
    ENDIF.

    i_eina-vendor = <fs_alv>-lifnr."供应商
    i_eina-material = <fs_alv>-matnr."物料编码
    i_eina-manufacturer = <fs_alv>-mfrnr."制造商

    IF i_eina-manufacturer IS NOT INITIAL.
      i_einaX-manufacturer = 'X'.
    ENDIF.

    i_eine-purch_org = <fs_alv>-ekorg."采购组织
    IF i_eine-purch_org IS NOT INITIAL.
      i_einex-purch_org = 'X'.
    ENDIF.
    i_eine-info_type = <fs_alv>-esokz."信息类别
    IF i_eine-info_type IS NOT INITIAL.
      i_einex-info_type = 'X'.
    ENDIF.
    i_eine-plant = <fs_alv>-werks."工厂
    IF i_eine-plant IS NOT INITIAL.
      i_einex-plant = 'X'.
    ENDIF.
    i_eine-pur_group = <fs_alv>-ekgrp."采购组
    IF i_eine-pur_group IS NOT INITIAL.
      i_einex-pur_group = 'X'.
    ENDIF.
    i_eine-currency = <fs_alv>-waers."货币码
    IF i_eine-currency IS NOT INITIAL.
      i_einex-currency = 'X'.
    ENDIF.
    i_eine-tax_code = <fs_alv>-mwskz."税码
    IF i_eine-tax_code IS NOT INITIAL.
      i_einex-tax_code = 'X'.
    ENDIF.
    i_eine-plnd_delry = <fs_alv>-aplfz."计划交货时间(天)
    IF i_eine-plnd_delry IS NOT INITIAL.
      i_einex-plnd_delry = 'X'.
    ENDIF.

    i_eine-net_price = <fs_alv>-netpr."净价
    IF i_eine-net_price IS NOT INITIAL.
      i_einex-net_price = 'X'.
    ENDIF.

    "对采购单位进行一次转换
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input          = <fs_alv>-bprme
*       LANGUAGE       = SY-LANGU
      IMPORTING
        output         = <fs_alv>-bprme
      EXCEPTIONS
        unit_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    "对采购订单单位进行一次转换
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input          = <fs_alv>-meins
*       LANGUAGE       = SY-LANGU
      IMPORTING
        output         = <fs_alv>-meins
      EXCEPTIONS
        unit_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    i_eina-po_unit = <fs_alv>-meins.
    IF i_eina-po_unit IS NOT INITIAL."采购订单单位
      i_einax-po_unit = 'X'.
    ENDIF.

    i_eina-conv_num1 = <fs_alv>-umrez.
    IF i_eina-conv_num1 IS NOT INITIAL."采购订单单位转换分子
      i_einax-conv_num1 = 'X'.
    ENDIF.

    i_eina-conv_den1 = <fs_alv>-umren.
    IF i_eina-conv_den1 IS NOT INITIAL."采购订单单位转换分母
      i_einax-conv_den1 = 'X'.
    ENDIF.

    i_eine-orderpr_un = <fs_alv>-bprme."采购单位
    IF i_eine-orderpr_un IS NOT INITIAL.
      i_einex-orderpr_un = 'X'.
    ENDIF.
    i_eine-price_unit = <fs_alv>-peinh."价格单位
    IF i_eine-price_unit IS NOT INITIAL.
      i_einex-price_unit = 'X'.
    ENDIF.

    i_eine-conv_num1 = <fs_alv>-bpumz."价格单位转换订购单位分子
    IF i_eine-conv_num1 IS NOT INITIAL.
      i_einex-conv_num1 = 'X'.
    ENDIF.

    i_eine-conv_den1 = <fs_alv>-umren."价格单位转换订购单位分子
    IF i_eine-conv_den1 IS NOT INITIAL.
      i_einex-conv_den1 = 'X'.
    ENDIF.

    i_eine-nrm_po_qty = '1'."标准采购订单数量
    i_einex-nrm_po_qty = 'X'.

    CLEAR:ls_con_vali,ls_condition.
    CLEAR:ls_a017.
    SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_a017
 FROM a017
  WHERE  kschl = 'ZP01'   "条件类型
  AND lifnr = <fs_alv>-lifnr     "供应商帐户号
  AND matnr = <fs_alv>-matnr     "物料
  AND ekorg = <fs_alv>-ekorg     "采购组织
  AND werks = <fs_alv>-werks     "工厂
  AND datab = <fs_alv>-datab     "起始时间
  AND datbi = <fs_alv>-datbi     "截止时间
  AND esokz = <fs_alv>-esokz.   "采购信息记录分类-(0:标准   3:分包合同)

    ls_con_vali-serial_id = ls_a017-knumh.
    ls_con_vali-plant = <fs_alv>-werks."工厂
    ls_con_vali-valid_from = <fs_alv>-datab."有效起始日
    ls_con_vali-valid_to = <fs_alv>-datbi."有效截止日
    APPEND ls_con_vali TO lt_con_vali.

    ls_condition-serial_id = ls_a017-knumh.
    ls_condition-cond_count = '01'.
    ls_condition-cond_type = 'ZP01'."固定值
    ls_condition-currency = <fs_alv>-waers."货币码
    ls_condition-cond_value = <fs_alv>-netpr."净价
    ls_condition-cond_p_unt = <fs_alv>-peinh."条件定价单位
    ls_condition-cond_unit = <fs_alv>-bprme."条件单位
    APPEND ls_condition TO lt_condition.

    CLEAR:ls_konm,lt_konm[].


    IF <fs_alv>-kstbm1 IS NOT INITIAL.
      ls_konm-serial_no  = ls_a017-knumh.
      ls_konm-cond_count  = '01'.
      ls_konm-line_no  = '0001'.
      ls_konm-scale_base_qty = <fs_alv>-kstbm1.
      ls_konm-cond_value = <fs_alv>-kbetr1.
      APPEND ls_konm TO lt_konm.
    ENDIF.

    IF <fs_alv>-kstbm2 IS NOT INITIAL.
      ls_konm-serial_no  = ls_a017-knumh.
      ls_konm-cond_count  = '01'.
      ls_konm-line_no  = '0004'.
      ls_konm-scale_base_qty = <fs_alv>-kstbm2.
      ls_konm-cond_value = <fs_alv>-kbetr2.
      APPEND ls_konm TO lt_konm.
    ENDIF.
    IF <fs_alv>-kstbm3 IS NOT INITIAL.
      ls_konm-serial_no  = ls_a017-knumh.
      ls_konm-cond_count  = '01'.
      ls_konm-line_no  = '0007'.
      ls_konm-scale_base_qty = <fs_alv>-kstbm3.
      ls_konm-cond_value = <fs_alv>-kbetr3.
      APPEND ls_konm TO lt_konm.
    ENDIF.
    IF <fs_alv>-kstbm4 IS NOT INITIAL.
      ls_konm-serial_no  = ls_a017-knumh.
      ls_konm-cond_count  = '01'.
      ls_konm-line_no  = '0010'.
      ls_konm-scale_base_qty = <fs_alv>-kstbm4.
      ls_konm-cond_value = <fs_alv>-kbetr4.
      APPEND ls_konm TO lt_konm.
    ENDIF.

    lv_test = ''."是否测试,如果为'X',则为测试
    CLEAR:lt_return2.

    IF <fs_alv>-mode = 'I'.

      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina  = i_eina
          i_einax = i_einax
          i_eine  = i_eine
          i_einex = i_einex
          testrun = lv_test
        IMPORTING
          e_eina  = e_eina
          e_eine  = e_eine
        TABLES
*         TXT_LINES       =
*         cond_validity   = lt_con_vali
*         condition       = lt_condition
*         COND_SCALE_VALUE       =
*         cond_scale_quan = lt_konm
          return  = lt_return2.

      READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
      IF sy-subrc <> 0 AND lv_test = ''.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.

        "因为净价和条件不能同时维护,所以分开维护
        CLEAR:i_einex-net_price.
        CLEAR: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_INFORECORD_MAINTAIN'
          EXPORTING
            i_eina          = i_eina
            i_einax         = i_einax
            i_eine          = i_eine
            i_einex         = i_einex
            testrun         = lv_test
          IMPORTING
            e_eina          = e_eina
            e_eine          = e_eine
          TABLES
*           TXT_LINES       =
            cond_validity   = lt_con_vali
            condition       = lt_condition
*           COND_SCALE_VALUE       =
            cond_scale_quan = lt_konm
            return          = lt_return2.
      ENDIF.
    ELSE.

      "对数据进行修改
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina  = i_eina
          i_einax = i_einax
          i_eine  = i_eine
          i_einex = i_einex
          testrun = lv_test
        IMPORTING
          e_eina  = e_eina
          e_eine  = e_eine
        TABLES
*         TXT_LINES       =
*         cond_validity   = lt_con_vali
*         condition       = lt_condition
*         COND_SCALE_VALUE       =
*         cond_scale_quan = lt_konm
          return  = lt_return2.

      CLEAR:i_einex-net_price."一定要清空这个变量,不然程序会报错
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          i_eina          = i_eina
**         I_EINAX       =
          i_eine          = i_eine
          i_einex         = i_einex
          testrun         = lv_test
        IMPORTING
          e_eina          = e_eina
          e_eine          = e_eine
        TABLES
**         TXT_LINES     =
          cond_validity   = lt_con_vali
          condition       = lt_condition
**         COND_SCALE_VALUE       =
          cond_scale_quan = lt_konm
          return          = lt_return2.

    ENDIF.

    LOOP AT lt_return2 INTO ls_return2 WHERE type = 'E' OR type = 'A'.
      <fs_alv>-msg = <fs_alv>-msg && ls_return2-message .
    ENDLOOP.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      <fs_alv>-msg = '创建失败'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      <fs_alv>-msg = '创建成功'.
    ENDIF.

    CLEAR:i_eina,i_einax,
          i_eine,i_einex,
          lt_con_vali[],lt_condition[],lt_konm[],
          ls_eina.
    CLEAR:lt_return2[],ls_return2.
  ENDLOOP.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值