FUNCTION zoa_os001_contractcreate. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(IS001) TYPE ZMMS035_I *" EXPORTING *" VALUE(ES001) TYPE ZMMS035_ITEM *"---------------------------------------------------------------------- *--------------------------------------------------------------------* *定义BAPI部分 *--------------------------------------------------------------------* DATA:ls_data TYPE zmms035, lv_error TYPE c, "错误标识 lv_msg TYPE bapi_msg, ls_data1 TYPE zmms035_e, lv_num TYPE string, lv_tabix TYPE sy-tabix, l_flag TYPE c, lv_vbeln TYPE vbeln. DATA: lt_log TYPE TABLE OF zmmt021, ls_log LIKE LINE OF lt_log. CLEAR: l_flag,lv_error. IF is001-item[] IS INITIAL. es001-type = 'E'. es001-message = '请输入数据!'. zcl_iface_h_record=>save( input = is001 output = es001 ). RETURN. ENDIF. *检查必输项 LOOP AT is001-item INTO ls_data. CLEAR:lv_error. PERFORM frm_check_data USING ls_data CHANGING ls_data1 lv_error. IF lv_error IS NOT INITIAL. *写入接口日志 ls_data1-zoano = ls_data-zoano. ls_data1-zoanoitem = ls_data-zoanoitem. APPEND ls_data1 TO es001-item. CLEAR:ls_data1,ls_data. " zcl_iface_h_record=>save( input = is001 output = es001 ). CONTINUE. ENDIF. *供应商内外部转换 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = ls_data-lifnr IMPORTING output = ls_data-lifnr . IF ls_data-bstyp IS INITIAL. ls_data-bstyp = 'K'. ENDIF. IF ls_data-bsart IS INITIAL. ls_data-bsart = 'MK'. "协议类型 ELSE. ENDIF. *根据工厂取公司代码 SELECT SINGLE bukrs INTO ls_data-bukrs FROM t001k AS a INNER JOIN t001w AS b ON a~bwkey = b~bwkey WHERE b~werks = ls_data-werks. *根据物料取采购组 SELECT SINGLE ekgrp INTO ls_data-ekgrp FROM marc WHERE matnr = ls_data-matnr AND werks = ls_data-werks. IF sy-subrc <> 0. *如果根据物料取采购组取不到采购组,根据供应商取 SELECT SINGLE ekgrp INTO ls_data-ekgrp FROM lfm1 WHERE lifnr = ls_data-lifnr AND ekorg = ls_data-ekorg. ENDIF. *价格单位 IF ls_data-peinh IS INITIAL. ls_data-peinh = 1. ENDIF. *取订单价格单位 SELECT SINGLE meins INTO ls_data-bprme FROM mara WHERE matnr = ls_data-matnr. *取付款条件 SELECT SINGLE zterm INTO ls_data-zterm FROM lfm1 WHERE lifnr = ls_data-lifnr AND ekorg = ls_data-ekorg. IF ls_data-mwskz IS INITIAL. ls_data-mwskz = 'J1'. ENDIF. *物料内外部转换 CALL FUNCTION 'CONVERSION_EXIT_MATN5_INPUT' EXPORTING input = ls_data-matnr IMPORTING output = ls_data-matnr EXCEPTIONS length_error = 1 OTHERS = 2. *---BDC开始 PERFORM bdc_dynpro USING 'SAPMM06E' '0200'. PERFORM bdc_field USING 'BDC_CURSOR' 'RM06E-EVRTN'. PERFORM bdc_field USING 'BDC_OKCODE' '=AB'. PERFORM bdc_field USING 'EKKO-LIFNR' ls_data-lifnr. "供应商 PERFORM bdc_field USING 'RM06E-EVART' ls_data-bsart. "采购凭证类型 PERFORM bdc_field USING 'RM06E-VEDAT' sy-datum. "协议日期 PERFORM bdc_field USING 'EKKO-EKORG' ls_data-ekorg. "采购组织 PERFORM bdc_field USING 'EKKO-EKGRP' ls_data-ekgrp. "采购组 PERFORM bdc_field USING 'RM06E-WERKS' ls_data-werks. "工厂 PERFORM bdc_dynpro USING 'SAPMM06E' '0201'. PERFORM bdc_field USING 'BDC_CURSOR' 'EKKO-KDATE'. PERFORM bdc_field USING 'BDC_OKCODE' '=AB'. *perform bdc_field using 'EKKO-EKGRP' 'W99'. *perform bdc_field using 'EKKO-PINCR' '10'. *perform bdc_field using 'EKKO-UPINC' '1'. PERFORM bdc_field USING 'EKKO-KDATB' ls_data-kdatb. "有效起始日期 PERFORM bdc_field USING 'EKKO-KDATE' ls_data-kdate . "有效截止日期 PERFORM bdc_field USING 'EKKO-SPRAS' sy-langu. "语言 PERFORM bdc_field USING 'EKKO-ZTERM' ls_data-zterm. "付款条件 PERFORM bdc_field USING 'EKKO-WAERS' ls_data-waers. "货币 *perform bdc_field using 'EKKO-ZBD1T' '14'. *perform bdc_field using 'EKKO-ZBD1P' '3.000'. *perform bdc_field using 'EKKO-WKURS' '1.00000'. *perform bdc_field using 'EKKO-ZBD2T' '20'. *perform bdc_field using 'EKKO-ZBD2P' '2.000'. *perform bdc_field using 'EKKO-ZBD3T' '30'. PERFORM bdc_dynpro USING 'SAPMM06E' '0220'. PERFORM bdc_field USING 'BDC_CURSOR' 'RM06E-EVRTP(01)'. PERFORM bdc_field USING 'BDC_OKCODE' '=DETA'. PERFORM bdc_field USING 'EKPO-EMATN(01)' ls_data-matnr. "物料号 PERFORM bdc_field USING 'EKPO-KTMNG(01)' ls_data-ktmng. "目标数量 PERFORM bdc_field USING 'EKPO-NETPR(01)' ls_data-netpr. "净价 PERFORM bdc_dynpro USING 'SAPMM06E' '0211'. PERFORM bdc_field USING 'BDC_CURSOR' 'EKPO-PEINH'. "价格单位 PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'EKPO-NETPR' ls_data-netpr. "净价 PERFORM bdc_field USING 'EKPO-PEINH' ls_data-peinh. "价格单位 PERFORM bdc_dynpro USING 'SAPMM06E' '0220'. PERFORM bdc_field USING 'BDC_CURSOR' 'EKPO-KNTTP(01)'. PERFORM bdc_field USING 'BDC_OKCODE' '=BU'. *perform bdc_field using 'RM06E-EBELP' record-EBELP_026. PERFORM bdc_dynpro USING 'SAPLSPO1' '0300'. PERFORM bdc_field USING 'BDC_OKCODE' '=YES'. *perform bdc_transaction using 'ME31K'. REFRESH messtab. CLEAR ls_options. ls_options-dismode = 'N'. ls_options-updmode = 'L'. ls_options-cattmode = ' '. ls_options-defsize = ' '. ls_options-racommit = ' '. ls_options-nobinpt = ''. ls_options-nobiend = ' '. CALL TRANSACTION 'ME31K' USING bdcdata OPTIONS FROM ls_options MESSAGES INTO messtab. FREE:bdcdata. *---BDC结束 l_flag = 'S'. LOOP AT messtab INTO DATA(ls_messtab) WHERE msgtyp = 'E' OR msgtyp = 'A'. l_flag = 'E'. EXIT. ENDLOOP. IF l_flag = 'S' . LOOP AT messtab INTO ls_messtab WHERE msgtyp = 'S' AND msgid = '06' AND msgnr = '017'. CLEAR: lv_msg. MESSAGE ID ls_messtab-msgid TYPE ls_messtab-msgtyp NUMBER ls_messtab-msgnr INTO lv_msg WITH ls_messtab-msgv1 ls_messtab-msgv2 ls_messtab-msgv3 ls_messtab-msgv4. ls_data1-message = |{ ls_data1-message };{ lv_msg }|. lv_vbeln = ls_messtab-msgv2. ENDLOOP. * *写入自建日志内表 MOVE-CORRESPONDING ls_data TO ls_log. ls_log-ebeln = lv_vbeln. ls_log-ernam = sy-uname. ls_log-erdat = sy-datum. ls_log-erzet = sy-uzeit. APPEND ls_log TO lt_log. ls_data1-zoano = ls_data-zoano. ls_data1-zoanoitem = ls_data-zoanoitem. ls_data1-ebeln = lv_vbeln. ls_data1-type = 'S'. ls_data1-message = lv_msg. APPEND ls_data1 TO es001-item. INSERT zmmt021 FROM ls_log. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. ELSE. LOOP AT messtab INTO ls_messtab WHERE msgtyp CA 'AEX'. CLEAR: lv_msg. MESSAGE ID ls_messtab-msgid TYPE ls_messtab-msgtyp NUMBER ls_messtab-msgnr INTO lv_msg WITH ls_messtab-msgv1 ls_messtab-msgv2 ls_messtab-msgv3 ls_messtab-msgv4. ls_data1-message = |{ ls_data1-message };{ lv_msg }|. ls_data1-zoano = ls_data-zoano. ls_data1-zoanoitem = ls_data-zoanoitem. ls_data1-type = 'E'. ls_data1-message = lv_msg. APPEND ls_data1 TO es001-item. ENDLOOP. ENDIF. CLEAR:ls_data1,lv_msg,ls_log,ls_data. ENDLOOP. LOOP AT es001-item INTO ls_data1. lv_tabix = sy-tabix. IF ls_data1-ebeln IS NOT INITIAL. lv_num = lv_num + 1. ENDIF. ENDLOOP. IF lv_num = lv_tabix. es001-type = 'S'. es001-message = '合同创建成功'. ELSEIF lv_num = 0. es001-type = 'E'. es001-message = '合同创建失败'. ELSE. es001-type = 'W'. es001-message = lv_num && '条合同创建成功'. ENDIF. zcl_iface_h_record=>save( input = is001 output = es001 ). ENDFUNCTION. *----------------------------------------------------------------------* ***INCLUDE LZZOAF01. *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form frm_check_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> ls_data *& <-- ls_data1 *&---------------------------------------------------------------------* FORM frm_check_data USING ls_data TYPE zmms035 CHANGING ls_data1 TYPE zmms035_e lv_error. DATA:lv_number TYPE i. IF ls_data-zoano IS INITIAL. "检查OA流程编号 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-zoanoitem IS INITIAL. "检查OA流程编号行项目 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号行项目必输'. lv_error = 'X'. EXIT. ENDIF. SELECT COUNT(*) INTO lv_number FROM zmmt021 WHERE zoano = ls_data-zoano AND zoanoitem = ls_data-zoanoitem. IF lv_number <> 0. ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '已存在'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-zoadata IS INITIAL. "检查OA传输日期 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && 'OA传输日期必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-kdatb IS INITIAL. "检查有效期开始必输 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '有效期开始必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-kdate IS INITIAL. "检查有效期结束必输 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '有效期结束必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-lifnr IS INITIAL. "检查供应商 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '供应商必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-ekorg IS INITIAL. "检查采购组织 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && 'OA流程编号必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-pstyp IS INITIAL. "检查项目类别 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '项目类别必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-matnr IS INITIAL. "检查物料号 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '物料号必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-txz01 IS INITIAL. "检查短文本 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '短文本必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-werks IS INITIAL. "检查工厂 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '工厂必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-ktmng IS INITIAL. "检查目标数量 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '目标数量必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-netpr IS INITIAL. "检查订单净价 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '订单净价必输'. lv_error = 'X'. EXIT. ENDIF. IF ls_data-waers IS INITIAL. "检查货币 ls_data1-type = 'E'. ls_data1-message = 'OA流程编号' && ls_data-zoano && '行项目' && ls_data-zoanoitem && '货币必输'. lv_error = 'X'. EXIT. ENDIF. ENDFORM. *----------------------------------------------------------------------* * Start new screen * *----------------------------------------------------------------------* FORM bdc_dynpro USING program dynpro. CLEAR bdcdata. bdcdata-program = program. bdcdata-dynpro = dynpro. bdcdata-dynbegin = 'X'. APPEND bdcdata. ENDFORM. *----------------------------------------------------------------------* * Insert field * *----------------------------------------------------------------------* FORM bdc_field USING fnam fval. * IF FVAL <> NODATA. CLEAR bdcdata. bdcdata-fnam = fnam. bdcdata-fval = fval. APPEND bdcdata. * ENDIF. ENDFORM. *perform bdc_transaction using 'ME31K'.

暂无讨论,说说你的看法吧