【ABAP】OA->SAP创建合同(ME31K)接口:BDC模式

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.

  DATAlt_log TYPE TABLE OF zmmt021,
        ls_log LIKE LINE OF lt_log.

CLEARl_flag,lv_error.

IF is001-item[] IS INITIAL.
  es001-type 'E'.
  es001-message '请输入数据!'.
      zcl_iface_h_record=>saveinput 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_messtabWHERE 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'.
      CLEARlv_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'.
      CLEARlv_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=>saveinput 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'.

给TA打赏
共{{data.count}}人
人已打赏
ABAPSAP

【ABAP】创建采购订单(ME21N)增强-长文本校验

2021-6-1 16:13:06

ABAPSAP

【ABAP】BAPI_OUTB_DELIVERY_CONFIRM_DEC过账数量出错

2021-6-23 15:01:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索