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.