天天看點

ECC:建立供應商vmd_ei_api=>maintain_bapi

FUNCTION zmd_creat_lifnr.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(IT_MD017) TYPE  ZPIDT_MD017_BODY_TAB
*"  EXPORTING
*"     VALUE(EV_TYPE) TYPE  BAPI_MTYPE
*"     VALUE(EV_MSG) TYPE  BAPI_MSG
*"     VALUE(EV_LIFNR) TYPE  LIFNR
*"----------------------------------------------------------------------
  DATA:ls_md017 LIKE LINE OF it_md017.
  DATA:ls_item1 LIKE LINE OF ls_md017-item1.
  DATA:ls_item2 LIKE LINE OF ls_md017-item2.
  DATA:ls_item3 LIKE LINE OF ls_md017-item3.
  DATA:ls_mesg TYPE cvis_message,
          lt_msg TYPE bapiret2_t,
          lwa_msg TYPE bapiret2.
  DATA: ls_return TYPE bapiret2.
  DATA: ls_master_data TYPE vmds_ei_main.    "基礎資訊
  DATA: ls_master_data_correct TYPE  vmds_ei_main,
       ls_message_correct  TYPE cvis_message,
       ls_master_data_defective  TYPE vmds_ei_main,
       ls_message_defective  TYPE cvis_message.
*DATA: ls_vmds_pur TYPE  vmds_ei_purchasing.
  DATA:lt_vendors TYPE vmds_ei_extern_t.
  DATA:ls_vendors TYPE vmds_ei_extern.
  DATA:ls_lifnr TYPE vmds_ei_extern-header.
  DATA: ls_vmds_ei_extern TYPE vmds_ei_extern.
  DATA: ls_correct_extern TYPE vmds_ei_extern.
  DATA: ls_remarks TYPE cvis_ei_rem.
  DATA: lt_functions TYPE vmds_ei_functions_t,
      lwa_functions TYPE vmds_ei_functions.
  DATA: ls_bank TYPE cvis_ei_cvi_bankdetail.
  DATA: ls_communication_phone TYPE cvis_ei_phone_str,
       ls_communication_fax TYPE  cvis_ei_fax_str,
       ls_communication_smtp TYPE cvis_ei_smtp_str.
  DATA: lv_string TYPE string .
  DATA: lv_approved_date TYPE string,
       lv_approved_date1 TYPE string.
  DATA: lv_adrnr TYPE adrnr,
       ls_knvk TYPE knvk,
*       LS_ZMMR1010 TYPE ZMMR1010,
       lv_retcode TYPE nrreturn,
       lv_person_number TYPE ad_persnum.
  DATA: ls_cvi_bankdetail TYPE cvis_ei_cvi_bankdetail,
       ls_bankdetail_key TYPE cvis_ei_bankdetail_key,
       ls_bankdetail_data TYPE cvis_ei_bankdetail_data,
       ls_bankdetail_datax TYPE cvis_ei_bankdetail_datax.
  DATA: lv_max_lifnr TYPE lifnr.
  DATA: ls_vmds_cmp TYPE vmds_ei_company,
       ls_vmds_pur TYPE vmds_ei_purchasing,
       ls_vmds_fun TYPE vmds_ei_functions.
  DATA: zlfbk TYPE lfbk.
  DATA:iv_flag  TYPE c .
  DATA:lv_lifnr TYPE lifnr.
  DATA: lv_message TYPE  bapiret2_t.
  DATA: ls_msg LIKE LINE OF lv_message.
  DATA: lt_xlfas TYPE TABLE OF flfas,
   lt_xlfb5 TYPE TABLE OF flfb5,
   lt_xlfbk TYPE TABLE OF flfbk,
   lt_xlfza TYPE TABLE OF flfza.
  DATA: l_lfb1 LIKE lfb1,
     l_ylfb1 TYPE  lfb1,
     l_lfa1 TYPE lfa1,
     l_ylfa1 TYPE lfa1,
     l_ylfm1 TYPE lfm1,
     l_lfm1 TYPE lfm1.
  DATA:lt_bukrs TYPE bukrs,
       lt_lifnr2 TYPE lifnr.
  DATA:lt_ztmm298 LIKE TABLE OF ztmm298.
  DATA:lv_ztmm298 LIKE LINE OF lt_ztmm298.
  DATA:lv_partner TYPE lifnr.
  DATA:lv_name TYPE name1_gp.

  DATA: lt_lifnr3 TYPE vmds_ei_extern-header.
  DATA: ls_lifnr3 TYPE vmds_ei_header-object_instance.
  CLEAR:ls_return ,
       ls_master_data ,
       ls_master_data_correct ,
       ls_message_correct  ,
       ls_master_data_defective  ,
       ls_message_defective  ,
       ls_vmds_ei_extern ,
       ls_correct_extern ,
       ls_remarks ,
       ls_bank ,
       ls_communication_phone ,
       ls_communication_fax ,
       ls_communication_smtp ,
       lv_string ,
       lv_approved_date ,
       lv_approved_date1 ,
       lv_adrnr ,
       ls_knvk ,
       lv_retcode  ,
       lv_person_number ,
       ls_cvi_bankdetail ,
       ls_bankdetail_key ,
       ls_bankdetail_data ,
       ls_bankdetail_datax ,
       lv_max_lifnr ,
       ls_vmds_cmp ,
       ls_vmds_pur ,
       ls_vmds_fun ,
       zlfbk ,
       iv_flag .
  IF it_md017[] IS NOT INITIAL.
    LOOP AT it_md017 INTO ls_md017.
      CLEAR:ls_vmds_ei_extern,lv_partner.
      SELECT SINGLE ecc_lifnr eccname1 INTO (lv_partner,lv_name) FROM ztmm298 WHERE s4_lifnr = ls_md017-partner.
*      SELECT SINGLE ecc_name1 INTO lv_name FROM ztmm298 WHERE s4name1 = ls_md017-name1.
      IF ls_md017-item2[] IS NOT INITIAL OR ls_md017-item3[] IS NOT INITIAL.
        SELECT SINGLE lifnr INTO lv_lifnr FROM lfa1 WHERE lifnr = lv_partner.
        IF sy-subrc <> 0.
          iv_flag = 'I'.
        ENDIF.
      ELSE.
        iv_flag = 'M'.
      ENDIF.
      IF lv_partner IS INITIAL.
        lv_partner = ls_md017-partner.
      ENDIF.
      IF lv_name IS INITIAL.
        lv_name = ls_md017-name1.
      ENDIF.
      ls_vmds_ei_extern-header-object_task = iv_flag.
      ls_vmds_ei_extern-header-object_instance-lifnr = lv_partner.

*通用資料
*      ls_vmds_ei_extern-central_data-central-data-ktokk = ls_md017-bu_group.    "分組
*⑧科目組的确定:如果BUT000-BU_GROUP = Z100,則LFA1-KTOKK = Z004,
*                    如果BUT000-BU_GROUP = Z201 or Z202  且BUT000-BPKIND = Z001 OR Z002 OR Z003,則LFA1-KTOKK = Z002,
*                    如果BUT000-BU_GROUP = Z201 or Z202  且BUT000-BPKIND = SPACE,則LFA1-KTOKK = Z001,
*                    如果BUT000-BU_GROUP = Z300,則LFA1-KTOKK =  Z003,
*                    如果BUT000-BU_GROUP = ZP00,則LFA1-KTOKK =  Z100
*      IF ls_md017-bu_group = 'Z100'.
*        ls_vmds_ei_extern-central_data-central-data-ktokk = 'Z004'.
      IF ls_md017-bu_group = 'Z201' OR ls_md017-bu_group = 'Z202'.
        IF ls_md017-bpkind = 'Z001' OR ls_md017-bpkind = 'Z002' OR ls_md017-bpkind = 'Z003'.
          ls_vmds_ei_extern-central_data-central-data-ktokk = 'Z002'.
        ELSEIF ls_md017-bpkind = ' '.
          ls_vmds_ei_extern-central_data-central-data-ktokk = 'Z001'.
        ENDIF.
      ELSEIF ls_md017-bu_group = 'Z300'.
        ls_vmds_ei_extern-central_data-central-data-ktokk = 'Z003'.
      ELSEIF ls_md017-bu_group = 'ZP00'.
        ls_vmds_ei_extern-central_data-central-data-ktokk = 'Z100'.
      ENDIF.
      ls_vmds_ei_extern-central_data-central-data-sperr = ls_md017-xblck.  "記賬當機
      ls_vmds_ei_extern-central_data-central-data-stceg = ls_md017-idnumber.  "證件号碼
*      ls_vmds_ei_extern-central_data-central-data-fityp = ls_md017-taxnumxl.  "稅号
      IF ls_md017-bu_group = 'Z201'.
        IF ls_md017-bpkind = 'Z001' OR ls_md017-bpkind = 'Z002' OR ls_md017-bpkind = 'Z003'.
*          ls_vmds_ei_extern-central_data-central-data-sx = 'N'.
*          ls_vmds_ei_extern-central_data-central-data-gs = 'N'.
        ENDIF.
      ENDIF.
      IF ls_md017-bpkind = 'Z001'.                       "合作夥伴類型
        ls_vmds_ei_extern-central_data-central-data-brsch = '01'.
      ELSEIF ls_md017-bpkind = 'Z002'.
        ls_vmds_ei_extern-central_data-central-data-brsch = '10'.
      ELSEIF ls_md017-bpkind = 'Z003'.
        ls_vmds_ei_extern-central_data-central-data-brsch = '11'.
      ELSE.
        ls_vmds_ei_extern-central_data-central-data-brsch = '06'.
      ENDIF.
      ls_vmds_ei_extern-central_data-central-data-vbund = ls_md017-vbund.  "貿易夥伴

      ls_vmds_ei_extern-central_data-central-datax-ktokk = 'X'.    "分組
      ls_vmds_ei_extern-central_data-central-datax-sperr = 'X'.    "記賬當機
      ls_vmds_ei_extern-central_data-central-datax-brsch = 'X'.    "合作夥伴類型
      ls_vmds_ei_extern-central_data-central-datax-vbund = 'X'.    "貿易夥伴

*      ls_vmds_ei_extern-central_data-address-postal-data-name = ls_md017-name1.    "名稱
      ls_vmds_ei_extern-central_data-address-postal-data-name = lv_name.    "名稱
      ls_vmds_ei_extern-central_data-address-postal-data-name_2 = ls_md017-name2.   "名稱2
      ls_vmds_ei_extern-central_data-address-postal-data-name_3 = ls_md017-name3.   "名稱3
      ls_vmds_ei_extern-central_data-address-postal-data-name_4 = ls_md017-name4.   "名稱4
      ls_vmds_ei_extern-central_data-address-postal-data-sort1 = ls_md017-sort1.   "搜尋項1
      ls_vmds_ei_extern-central_data-address-postal-data-sort2 = ls_md017-sort2.   "搜尋項2
      ls_vmds_ei_extern-central_data-address-postal-data-street = ls_md017-street."街道
      ls_vmds_ei_extern-central_data-address-postal-data-house_no = ls_md017-house_num1."門牌号
      ls_vmds_ei_extern-central_data-address-postal-data-postl_cod1 = ls_md017-post_code1."郵編
      ls_vmds_ei_extern-central_data-address-postal-data-city = ls_md017-city1."城市
      ls_vmds_ei_extern-central_data-address-postal-data-country = ls_md017-country."國家
      ls_vmds_ei_extern-central_data-address-postal-data-region = ls_md017-region."地區
      ls_vmds_ei_extern-central_data-address-postal-data-langu = ls_md017-langu."語言

      ls_vmds_ei_extern-central_data-address-postal-datax-street   =  'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-house_no   =  'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-postl_cod1   =  'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-city   =  'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-country	 = 	'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-region   =  'X'.
      ls_vmds_ei_extern-central_data-address-postal-datax-langu	 = 	'X'.
***電話
      ls_communication_phone-contact-task = iv_flag.
      ls_communication_phone-contact-data-telephone = ls_md017-tel_number.

      ls_communication_phone-contact-datax-telephone = 'X'.
      ls_communication_phone-contact-datax-country = 'X'.
      APPEND ls_communication_phone TO ls_vmds_ei_extern-central_data-address-communication-phone-phone.
***傳真
      ls_communication_fax-contact-task = iv_flag.
      ls_communication_fax-contact-data-fax = ls_md017-fax_number.

      ls_communication_fax-contact-datax-fax = 'X'.
      APPEND ls_communication_fax TO ls_vmds_ei_extern-central_data-address-communication-fax-fax.
***銀行資訊
      IF ls_md017-item1[] IS NOT INITIAL.
        LOOP AT ls_md017-item1 INTO ls_item1.
          CLEAR lv_lifnr.
          SELECT SINGLE lifnr INTO lv_lifnr FROM lfbk WHERE lifnr = lv_partner AND banks = ls_item1-banks AND bankl = ls_item1-bankl AND bankn = ls_item1-sbpbkid.
          IF lv_lifnr IS NOT INITIAL.
            ls_bank-task = 'M'.
          ELSE.
            ls_bank-task = 'I'.
          ENDIF.
          ls_bank-data_key-banks = ls_item1-banks. "銀行國家代碼 = IV_FLAG.
          ls_bank-data_key-bankl = ls_item1-bankl. "銀行帳戶号碼
          ls_bank-data_key-bankn = ls_item1-sbpbkid."銀行賬号
          ls_bank-data-bkref = ls_item1-bkref."參考明細
          ls_bank-data-bkont = ls_item1-bkont."控制碼
          ls_bank-data-koinh = ls_item1-accname."賬戶名稱

          ls_bank-datax-bkref = 'X'."參考明細
          ls_bank-datax-bkont = 'X'."控制碼
          ls_bank-datax-koinh = 'X'."賬戶名稱
          APPEND ls_bank TO ls_vmds_ei_extern-central_data-bankdetail-bankdetails.
          CLEAR ls_bank.
        ENDLOOP.
      ENDIF.
***采購視圖
      IF ls_md017-item2[] IS NOT INITIAL.
        LOOP AT ls_md017-item2 INTO ls_item2.
          CLEAR lv_lifnr.
          SELECT SINGLE lifnr INTO lv_lifnr FROM lfm1 WHERE lifnr = lv_partner AND ekorg = ls_item2-ekorg.
          IF lv_lifnr IS NOT INITIAL.
            ls_vmds_pur-task = 'M'.
          ELSE.
            ls_vmds_pur-task = 'I'.
          ENDIF.
*          ls_vmds_pur-data_key-ekorg = ls_item2-ekorg.   "采購組織
          ls_vmds_pur-data_key-ekorg = '8000'.   "采購組織
          ls_vmds_pur-data-waers = ls_item2-waers.   "訂單貨币
          ls_vmds_pur-data-zterm = ls_item2-zterm.   "付款條款
          ls_vmds_pur-data-kalsk = ls_item2-kalsk.   "方案組
          ls_vmds_pur-data-webre = ls_item2-webre.   "基于收貨的發票校驗
*          ls_vmds_pur-data-inco1 = ls_item2-inco1.   "國際貿易術語
          ls_vmds_pur-data-inco1 = ''.   "國際貿易術語
          ls_vmds_pur-data-sperm = ls_item2-sperm.   "供應商采購組織當機


          ls_vmds_pur-datax-waers = 'X'.   "訂單貨币
          ls_vmds_pur-datax-zterm = 'X'.   "付款條款
          ls_vmds_pur-datax-kalsk = 'X'.   "方案組
          ls_vmds_pur-datax-webre = 'X'.   "基于收貨的發票校驗
          ls_vmds_pur-datax-inco1 = 'X'.   "國際貿易術語
          ls_vmds_pur-datax-sperm = 'X'..   "供應商采購組織當機
          lwa_functions-task = 'I'.
          lwa_functions-data_key-parvw = 'LF'.
          APPEND lwa_functions TO lt_functions.


          lwa_functions-task = 'I'.
          lwa_functions-data_key-parvw = 'RS'.
          APPEND lwa_functions TO lt_functions.
          ls_vmds_pur-functions-functions = lt_functions.
          APPEND ls_vmds_pur TO ls_vmds_ei_extern-purchasing_data-purchasing.
          CLEAR ls_vmds_pur.


        ENDLOOP.
      ENDIF.
***财務視圖
      IF ls_md017-item3[] IS NOT INITIAL.
        LOOP AT ls_md017-item3 INTO ls_item3.
          CLEAR lv_lifnr.
          SELECT SINGLE lifnr INTO lv_lifnr FROM lfb1 WHERE lifnr = lv_partner AND bukrs = ls_item3-sbpscid.
          IF lv_lifnr IS NOT INITIAL.
            ls_vmds_cmp-task = 'M'.
          ELSE.
            ls_vmds_cmp-task = 'I'.
          ENDIF.
          SELECT SINGLE eccgsdm INTO ls_vmds_cmp-data_key-bukrs FROM ztmm299 WHERE s4gsdm = ls_item3-sbpscid."公司代碼
          IF ls_vmds_cmp-data_key-bukrs IS NOT INITIAL.
            lt_bukrs = ls_vmds_cmp-data_key-bukrs.
          ELSE.
            ev_type = 'E'.
            ev_msg = '請維護ZTMM299公司代碼資料'.
            CONTINUE.
          ENDIF.

*          ls_vmds_cmp-data_key-bukrs = ls_item3-sbpscid. "公司代碼

          ls_vmds_cmp-data-akont = ls_item3-zsakonte.   "統馭科目
          ls_vmds_cmp-data-fdgrv = ls_item3-fdgrv.   "現金管理組
          ls_vmds_cmp-data-zterm = ls_item3-zterm.   "付款條款
          ls_vmds_cmp-data-zwels = ls_item3-zwels.   "支付方式
          ls_vmds_cmp-data-sperr = ls_item3-sperr.   "供應商公司代碼當機
          ls_vmds_cmp-data-zuawa = '0001'.   "排序碼
          ls_vmds_cmp-data-reprf = 'X'.   "檢查重複發票


          ls_vmds_cmp-datax-akont = 'X'.   "統馭科目
          ls_vmds_cmp-datax-fdgrv = 'X'.    "現金管理組
          ls_vmds_cmp-datax-zterm = 'X'.    "付款條款
          ls_vmds_cmp-datax-zwels = 'X'.   "支付方式
          ls_vmds_cmp-datax-sperr = 'X'.    "供應商公司代碼當機
          ls_vmds_cmp-datax-zuawa = 'X'.    "排序碼
          ls_vmds_cmp-datax-reprf = 'X'.    "檢查重複發票
          APPEND ls_vmds_cmp TO ls_vmds_ei_extern-company_data-company.
          CLEAR ls_vmds_cmp.
        ENDLOOP.
      ENDIF.
      APPEND ls_vmds_ei_extern TO ls_master_data-vendors.
* 調用api維護供應商
      CALL METHOD vmd_ei_api=>maintain_bapi
        EXPORTING
          iv_collect_messages      = 'X'
          is_master_data           = ls_master_data
        IMPORTING
          es_master_data_correct   = ls_master_data_correct
          es_message_correct       = ls_message_correct
          es_master_data_defective = ls_master_data_defective
          es_message_defective     = ls_message_defective.
*      lt_msg = ls_mesg-messages.
*      LOOP AT lt_msg INTO lwa_msg.
*
*      ENDLOOP.



      IF ls_message_defective-is_error = ''.
        lt_vendors = ls_master_data_correct-vendors.

        LOOP AT lt_vendors INTO ls_vendors.
          CLEAR:lt_lifnr3,ls_lifnr3.
          lt_lifnr3 = ls_vendors-header.
          ls_lifnr3 = lt_lifnr3-object_instance.  "建立的供應商
        ENDLOOP.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        IF ls_lifnr3 IS NOT INITIAL.
          ev_type = 'S'.
          ev_msg = '建立成功'.
          ev_lifnr = ls_lifnr3.
        ENDIF.
        CLEAR:ls_vmds_ei_extern.
        IF ls_md017-xblck = 'X'.
          CLEAR :lt_xlfas,lt_xlfb5,lt_xlfbk, lt_xlfza,l_lfb1,l_ylfb1,l_lfa1,l_ylfa1,l_lfm1,l_ylfm1.
          CALL FUNCTION 'VENDOR_READ'
            EXPORTING
              i_bukrs   = lt_bukrs
              i_lifnr   = ls_lifnr3
            IMPORTING
              e_lfa1    = l_lfa1
*             E_LFB1    =
            EXCEPTIONS
              not_found = 1
              OTHERS    = 2.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.

*        l_lfm1-sperm = 'X'. "選擇采購組織當機

          l_lfa1-sperm = 'X'. "所有采購組織當機
          l_lfa1-sperr = 'X'."所有公司當機
          IF l_lfa1 IS NOT INITIAL.
            CALL FUNCTION 'VENDOR_UPDATE' IN UPDATE TASK
              EXPORTING
                i_lfa1  = l_lfa1
                i_lfb1  = l_lfb1
                i_lfm1  = l_lfm1
                i_ylfa1 = l_ylfa1
                i_ylfb1 = l_ylfb1
                i_ylfm1 = l_ylfm1
              TABLES
                t_xlfas = lt_xlfas
                t_xlfb5 = lt_xlfb5
                t_xlfbk = lt_xlfbk
                t_xlfza = lt_xlfza
                t_ylfas = lt_xlfas
                t_ylfb5 = lt_xlfb5
                t_ylfbk = lt_xlfbk
                t_ylfza = lt_xlfza.
            IF sy-subrc = 0.
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  wait = 'X'.
              ev_type = 'S'.
              ev_msg = '當機成功'.
            ELSE.
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
              ev_type = 'E'.
              ev_msg = '當機失敗'.
            ENDIF.
          ENDIF.
        ENDIF.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ev_type = 'E'.
        lv_message = ls_message_defective-messages.
        LOOP AT lv_message INTO ls_msg WHERE type = 'E' OR type = 'A'.
          ev_msg = ls_msg-message.
        ENDLOOP.
      ENDIF.

    ENDLOOP.
  ELSE.
    ev_type = 'E'.
    ev_msg = '無資料'.
  ENDIF.
  IF ls_lifnr3 IS NOT INITIAL AND ev_type <> 'E'.
    ev_type = 'S'.
    ev_msg = '建立成功'.
    ev_lifnr = ls_lifnr3.
    IF iv_flag = 'I'.
      lv_ztmm298-ecc_lifnr = ev_lifnr.
      lv_ztmm298-s4_lifnr = ls_md017-partner.
      lv_ztmm298-eccname1 = lv_name.
      lv_ztmm298-s4name1 = ls_md017-name1.
      lv_ztmm298-cpudt = sy-datum.
      lv_ztmm298-cputm = sy-uzeit.
      lv_ztmm298-usnam = sy-uname.
      APPEND lv_ztmm298 TO lt_ztmm298.
      CLEAR lv_ztmm298.
    ENDIF.
  ENDIF.
  MODIFY ztmm298 FROM TABLE lt_ztmm298.
  COMMIT WORK AND WAIT.
ENDFUNCTION.
           

繼續閱讀