参考PR创建采购合同(ME31K) BDC模式

48 篇文章 4 订阅
7 篇文章 0 订阅
SAP目前没有BAPI 创建服务类采购合同,所以采用BDC创建。以下是参考PR,以BDC的模式创建有服务行的采购合同(可包含物资行)
 
FUNCTION zfun1039.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     REFERENCE(IV_BDCMODE) TYPE  CHAR1 OPTIONAL
*"     REFERENCE(IV_MODE) TYPE  CHAR1
*"     REFERENCE(IS_HEADER) TYPE  ZMM_S_CONTRACT_HEADER
*"     REFERENCE(IT_ITEM) TYPE  ZMM_T_CONTRACT_ITEM
*"     REFERENCE(IT_ACCOUNT) TYPE  ZMM_T_CONTRACT_ACCOUNT
*"     REFERENCE(IT_CONDITIONS) TYPE  ZMM_T_CONTRACT_CONDITIONS
*"     REFERENCE(IT_PARTNER) TYPE  ZMM_T_CONTRACT_PARTNER
*"     REFERENCE(IT_SERVICES) TYPE  ZMM_T_CONTRACT_SERVICES
*"     REFERENCE(IT_HEADER_TEXT) TYPE  ZMM_T_LONGTEXT
*"     REFERENCE(IT_ITEM_TEXT) TYPE  ZMM_T_LONGTEXT
*"  EXPORTING
*"     VALUE(EV_MSG) TYPE  CHAR255
*"     VALUE(EV_CODE) TYPE  STRING
*"     VALUE(EV_CONTRACT_NUM) TYPE  EBELN
*"  EXCEPTIONS
*"      UNKOWN_MODE
*"----------------------------------------------------------------------

  DATA:rec_ite TYPE zmm_s_contract_item,
       rec_acc TYPE zmm_s_contract_account,
       rec_ser TYPE zmm_s_contract_services,
       rec_con TYPE zmm_s_contract_conditions,
       rec_par TYPE zmm_s_contract_partner,
       rec_txt TYPE zmm_s_longtext.
  DATA:tab_bdc TYPE TABLE OF bdcdata.

*bdc值转化数据定义
  DATA:l_date_str1 TYPE char10,
       l_date_str2 TYPE char10,
       l_ktwrt_str TYPE char15,
       l_wkurs_str TYPE char10,
       l_bukrs     TYPE bukrs,
       l_ktmng_str TYPE char20,
       l_netpr_str TYPE char20,
       l_menge_str TYPE char20,
       l_tbtwr_str TYPE char20,
       l_poski_str TYPE char8,
       l_vbelp_str TYPE char5.
*bdc 数据定义
  DATA:tab_msg TYPE TABLE OF bdcmsgcoll,
       rec_msg TYPE bdcmsgcoll ,
       l_mode TYPE c VALUE 'N'.

  DATA:l_lines TYPE i,
       l_ebelp TYPE char5.
  DATA:tab_esll TYPE TABLE OF esll,
       rec_esll TYPE esll.

  WRITE is_header-bedat TO l_date_str1 DD/MM/YYYY.
***********************初始屏幕  start**********************************
  PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E' '0200'.
  PERFORM frm_bdc_add_field:
           TABLES tab_bdc USING 'BDC_OKCODE'  'KOPF',      "抬头明细按钮
           TABLES tab_bdc USING 'EKKO-EKGRP'  is_header-ekgrp,"采购组
           TABLES tab_bdc USING 'EKKO-EKORG'  is_header-ekorg,"采购组织
           TABLES tab_bdc USING 'RM06E-VEDAT' l_date_str1,    "协议日期
           TABLES tab_bdc USING 'RM06E-EVART' is_header-bsart,"协议类型
           TABLES tab_bdc USING 'EKKO-LIFNR'  is_header-lifnr. "供应商
  SELECT SINGLE bukrs INTO l_bukrs
     FROM t024e
  WHERE ekorg = is_header-ekorg.
  IF sy-subrc NE 0 OR l_bukrs IS INITIAL.
    "公司代码输入屏幕
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E' '0514'.
    PERFORM frm_bdc_add_field:
          TABLES tab_bdc USING 'BDC_OKCODE' '=ENTE',         "回车
          TABLES tab_bdc USING 'EKKO-BUKRS' is_header-bukrs. "公司代码
  ENDIF.
***********************初始屏幕    end**********************************

***********************抬头屏幕  start**********************************
*数据格式转化
  WRITE is_header-kdatb TO l_date_str1 MM/DD/YYYY.
  WRITE is_header-kdate TO l_date_str2 MM/DD/YYYY.
  WRITE is_header-ktwrt TO l_ktwrt_str NO-GROUPING DECIMALS 2.
  WRITE is_header-wkurs TO l_wkurs_str NO-GROUPING DECIMALS 2.

  PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E' '0201'.
  PERFORM frm_bdc_add_field:
        TABLES tab_bdc USING 'BDC_OKCODE'     '=PRTN',    "合作伙伴按钮
        TABLES tab_bdc USING 'EKKO-KDATB'     l_date_str1,"有效期开始
        TABLES tab_bdc USING 'EKKO-KDATE'     l_date_str2,"有效期结束
        TABLES tab_bdc USING 'EKKO-UNSEZ'     is_header-unsez,"我方参考
        TABLES tab_bdc USING 'EKKO_CI-ZZHTBH' is_header-zzhtbh,"合同编号
        TABLES tab_bdc USING 'EKKO_CI-ZZHTMC' is_header-zzhtmc,"合同名称
        TABLES tab_bdc USING 'EKKO-KTWRT'     l_ktwrt_str,"目标值
        TABLES tab_bdc USING 'EKKO-WAERS'     is_header-waers, "货币
        TABLES tab_bdc USING 'EKKO-WKURS'     l_wkurs_str,     "汇率
        TABLES tab_bdc USING 'EKKO-ANGNR'     is_header-angnr, "报价
        TABLES tab_bdc USING 'EKKO-INCO1'     is_header-incoterms1,
        TABLES tab_bdc USING 'EKKO-INCO2'     is_header-incoterms2,
        TABLES tab_bdc USING 'EKKO-ZTERM'     is_header-zterm. "付款条款
***********************抬头屏幕    end**********************************

***********************合作伙伴屏幕start********************************
  IF it_partner[] IS NOT INITIAL.
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLEKPA'  '0102'.
    PERFORM frm_bdc_add_field:
          TABLES tab_bdc USING 'BDC_OKCODE'      '=DISL',"显示按钮
          TABLES tab_bdc USING 'RM06E-SELKZ(01)' 'X'.    "选择第一行

    LOOP AT it_partner INTO rec_par.
      PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLEKPA' '0101'.
     PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE' '=NEW'.

      PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLEKPA' '0101'.
      PERFORM frm_bdc_add_field:
            TABLES tab_bdc USING 'BDC_OKCODE'       '/00',
            TABLES tab_bdc USING 'MMPA-PARVW(02)'   rec_par-parvw,"功能
            TABLES tab_bdc USING 'WRF02K-GPARN(02)' rec_par-lifn2."伙伴号
    ENDLOOP.

*回退级别合作伙伴屏幕
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLEKPA'   '0101'.
    PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE' '=BACK'.
  ENDIF.

*回退抬头屏幕
  PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLEKPA'   '0102'.
  PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE' '=BACK'.

*进入概览屏幕(抬头+行)
  PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0201'.
  PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE'  '=AB'.
***********************合作伙伴屏幕  end********************************

***********************概览屏幕    start********************************

  LOOP AT it_item INTO rec_ite.
    WRITE rec_ite-ktmng TO l_ktmng_str NO-GROUPING DECIMALS 2.
    WRITE rec_ite-netpr TO l_netpr_str NO-GROUPING DECIMALS 2.
*参考采购申请按钮
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0220'.
    PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE'  '=BS'.
*填写采购申请编号屏幕
    DATA:l_bnfpo_str TYPE char5.
    l_bnfpo_str = rec_ite-bnfpo.
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0501'.
    PERFORM frm_bdc_add_field:
         TABLES tab_bdc USING 'BDC_OKCODE'         '=ENTE',
         TABLES tab_bdc USING 'EKET-BANFN'         rec_ite-banfn,
         TABLES tab_bdc USING 'EKET-BNFPO'         l_bnfpo_str,
         TABLES tab_bdc USING 'EBAN-EKGRP'         is_header-ekgrp,
         TABLES tab_bdc USING 'RM06E-OFFBA'        ''.
*复制采购申请
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0125'.
    PERFORM frm_bdc_add_field:
         TABLES tab_bdc USING 'BDC_OKCODE'         '=REFH',
         TABLES tab_bdc USING 'BDC_CURSOR'         'EBAN-BANFN(01)',
         TABLES tab_bdc USING 'RM06E-TCSELFLAG(01)' 'X'.

*行明细屏幕
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0211'.
    PERFORM frm_bdc_add_field:
         TABLES tab_bdc USING 'BDC_OKCODE'         '/00',
         TABLES tab_bdc USING 'EKPO-MWSKZ'         rec_ite-mwskz.


    CLEAR:tab_esll[].
    SELECT * INTO TABLE tab_esll
      FROM esll
        WHERE packno IN (
            SELECT  sub_packno  "取出子包号
              FROM esll
                WHERE packno IN (
                  SELECT packno "采购行 概览包号
                   FROM eban
                     WHERE banfn EQ rec_ite-banfn
                      AND  bnfpo EQ rec_ite-bnfpo
              )
          ).
    CLEAR l_lines.
    DESCRIBE TABLE tab_esll LINES l_lines.
    IF l_lines IS INITIAL.
      DATA:l_bpumn_str TYPE char3,
           l_bpumz_str TYPE char3.
      WRITE rec_ite-ktmng TO l_ktmng_str NO-GROUPING DECIMALS 2.
      WRITE rec_ite-netpr TO l_netpr_str NO-GROUPING DECIMALS 2.
      WRITE rec_ite-bpumn TO l_bpumn_str.
      WRITE rec_ite-bpumz TO l_bpumz_str.
*非服务类采购申请行,填写行其他信息
      PERFORM frm_bdc_add_field:
             TABLES tab_bdc USING  'EKPO-KTMNG'  l_ktmng_str, "数量
             TABLES tab_bdc USING  'EKPO-NETPR'  l_netpr_str, "单价
             TABLES tab_bdc USING  'EKPO-BPRME'  rec_ite-bprme,"定价单位
             TABLES tab_bdc USING  'EKPO-BPUMN'  l_bpumn_str, "分子
             TABLES tab_bdc USING  'EKPO-BPUMZ'  l_bpumz_str. "分母
    ELSE."服务行
      PERFORM frm_bdc_add_field:
            TABLES tab_bdc USING 'EKPO-TXZ01'   rec_ite-txz01,
            TABLES tab_bdc USING 'EKPO-MATKL'   rec_ite-matkl.
    ENDIF.
    DO l_lines TIMES.
*退出账户分配屏幕
      PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLMLSK'  '0200'.
      PERFORM frm_bdc_add_field
                    TABLES tab_bdc USING  'BDC_OKCODE' '=BACK'.
    ENDDO.

*定位行
    l_ebelp = rec_ite-ebelp.
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0220'.
    PERFORM frm_bdc_add_field:
         TABLES tab_bdc USING 'BDC_OKCODE'         '/00' ,
         TABLES tab_bdc USING 'RM06E-EBELP'        l_ebelp. "定位行


    IF tab_esll[] IS NOT INITIAL.
*进入行服务屏幕
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPMM06E'    '0220'.
      PERFORM frm_bdc_add_field:
           TABLES tab_bdc USING 'BDC_OKCODE'          '=DIEN',
           TABLES tab_bdc USING 'RM06E-TCSELFLAG(01)' 'X'.
    ENDIF.


    LOOP AT tab_esll INTO rec_esll.
*定位行
      DATA:l_extrow TYPE char10.
      l_extrow = rec_esll-extrow.
*定位服务明细行
      PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLMLSP' '0201'.
      PERFORM frm_bdc_add_field:
            TABLES tab_bdc USING 'BDC_OKCODE'    '/00',
            TABLES tab_bdc USING 'RM11P-NEW_ROW' l_extrow .
      READ TABLE it_services INTO rec_ser
                              WITH KEY ebelp  = rec_ite-ebelp
                                       extrow = rec_esll-extrow.
      IF sy-subrc EQ 0.
*修改数据
        WRITE rec_ser-menge TO l_menge_str NO-GROUPING DECIMALS 2.
        WRITE rec_ser-tbtwr TO l_tbtwr_str NO-GROUPING DECIMALS 2.
        PERFORM frm_bdc_add_dynnr
          TABLES tab_bdc USING 'SAPLMLSP' '0201'.
        PERFORM frm_bdc_add_field:
            TABLES tab_bdc USING 'BDC_OKCODE'         '/00',
            TABLES tab_bdc USING 'ESLL-KTEXT1(01)'    rec_ser-ktext1,
            TABLES tab_bdc USING 'ESLL-MENGE(01)'     l_menge_str,
"            TABLES tab_bdc USING 'ESLL-MEINS(01)'     rec_ser-meins,
            TABLES tab_bdc USING 'ESLL-TBTWR(01)'     l_tbtwr_str.
*科目确认屏幕(退出)
        PERFORM frm_bdc_add_dynnr
            TABLES tab_bdc USING 'SAPLMLSK' '0200'.
        PERFORM frm_bdc_add_field:
            TABLES tab_bdc USING 'BDC_OKCODE'         '=BACK'.
      ELSE."接口中无此服务行,则需要删除
        PERFORM frm_bdc_add_dynnr
         TABLES tab_bdc USING 'SAPLMLSP' '0201'.
        PERFORM frm_bdc_add_field:
          TABLES tab_bdc USING 'BDC_OKCODE'         '/EBDZ',
          TABLES tab_bdc USING 'RM11P-SELKZ(01)'    'X'.

*删除确认屏幕
        PERFORM frm_bdc_add_dynnr
                         TABLES tab_bdc USING 'SAPLSPO1'  '0100'.
        PERFORM frm_bdc_add_field
                         TABLES tab_bdc USING 'BDC_OKCODE' '=YES'.
      ENDIF.

    ENDLOOP.
*退出服务屏幕
    PERFORM frm_bdc_add_dynnr TABLES tab_bdc USING 'SAPLMLSP'   '0201'.
    PERFORM frm_bdc_add_field TABLES tab_bdc USING 'BDC_OKCODE' '=ESB'.
  ENDLOOP."END OF it_item
***********************概览屏幕      end********************************
  IF iv_mode EQ 'C'."创建
*保存
    PERFORM frm_bdc_add_dynnr
        TABLES tab_bdc USING 'SAPMM06E' '0220'.
    PERFORM frm_bdc_add_field:
        TABLES tab_bdc USING 'BDC_OKCODE' '=BU'.
*无消息确认
    PERFORM frm_bdc_add_dynnr
        TABLES tab_bdc USING 'SAPLSPO1' '0300'.
    PERFORM frm_bdc_add_field:
        TABLES tab_bdc USING 'BDC_OKCODE' '=YES'.
  ELSEIF iv_mode EQ 'X'."数据校验
*退出事务
    PERFORM frm_bdc_add_dynnr
        TABLES tab_bdc USING 'SAPMM06E' '0220'.
    PERFORM frm_bdc_add_field:
        TABLES tab_bdc USING 'BDC_OKCODE' '=BACK'.
*不保存数据
    PERFORM frm_bdc_add_dynnr
        TABLES tab_bdc USING 'SAPLSPO1' '0100'.
    PERFORM frm_bdc_add_field:
        TABLES tab_bdc USING 'BDC_OKCODE' '=NO'.
  ELSE.
    RAISE unkown_mode.
  ENDIF.

  IF iv_bdcmode CO 'AEN'.
    l_mode = iv_bdcmode.
  ENDIF.
*调用BDC
  CALL TRANSACTION 'ME31K' USING tab_bdc
                           MODE l_mode MESSAGES INTO tab_msg.
  LOOP AT tab_msg INTO rec_msg.
    IF rec_msg-msgtyp = 'S' AND
       rec_msg-msgid = '06' AND
       rec_msg-msgnr = '017'. "创建成功
      MESSAGE s017(06) WITH rec_msg-msgv1 rec_msg-msgv2 INTO ev_msg.
      ev_code = 0.
      ev_contract_num = rec_msg-msgv2.
*创建成功,更新文本
      CALL FUNCTION 'ZFUN1034'
        EXPORTING
          iv_contract_num = ev_contract_num
          it_header_text  = it_header_text
          it_item_text    = it_item_text.
      EXIT.
    ELSEIF rec_msg-msgtyp = 'E'.
      ev_code = 4.
      MESSAGE ID rec_msg-msgid TYPE rec_msg-msgtyp NUMBER rec_msg-msgnr
              WITH rec_msg-msgv1 rec_msg-msgv2
                   rec_msg-msgv3 rec_msg-msgv4
              INTO ev_msg.
    ENDIF.
  ENDLOOP.

  IF iv_mode EQ 'X'."数据校验模式
    IF ev_code IS INITIAL AND ev_msg IS INITIAL.
      ev_code = 0.
      ev_msg = '数据校验成功'.
    ENDIF.
  ENDIF.
ENDFUNCTION.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值