供應商批量導入


REPORT zmmr084.
************************************************************************
* 功能/技術文檔:DANZ-MM-84-批導-供應商批量導入-V01
* 描述:
*
* 變更記錄
*
* 修改日期  開發人員  請求號 描述
*----------------------------------------------------------------------*
************************************************************************
* Includes
************************************************************************
INCLUDE zmmr084_top.
INCLUDE zmmr084_sel.
INCLUDE zmmr084_frm.
************************************************************************
* Initialization
************************************************************************
INITIALIZATION.
  functxt-icon_id   = icon_export.
  functxt-quickinfo = '模版下載'.
  functxt-icon_text = '模版下載'.
  sscrfields-functxt_01 = functxt.
************************************************************************
* at selection screen
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_flname." SEACH HELP.
  PERFORM frm_get_file USING p_flname.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FC01'.
    PERFORM frm_get_model USING 'ZMMR084.XLS'.
  ENDIF.
************************************************************************
* Start of Selection
************************************************************************
START-OF-SELECTION.
  IF p_flname IS NOT INITIAL.
    IF p_vendor = 'X'.
      g_flag = 1.
      PERFORM frm_alv_show ."ALV結果展示
*      PERFORM frm_create_vendor."創建供應商
    ELSEIF p_bukrs = 'X'.
      g_flag = 2.
      PERFORM frm_alv_show ."ALV結果展示
*      PERFORM frm_add_bukrs."擴充公司代碼
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&  包含                ZMMR084_TOP
*&---------------------------------------------------------------------*
************************************************************************
* tables
************************************************************************
TABLES:sscrfields.
************************************************************************
* TYPES
************************************************************************
TYPE-POOLS: slis.
TYPES:BEGIN OF ty_basic_lf,"供應商創建
        "一般數據
        lifnr    LIKE lfa1-lifnr,
        partn    LIKE but000-partner,
        ktokk    LIKE lfa1-ktokk,
        name1    LIKE lfa1-name1,
        sortl    LIKE lfa1-sortl,
        stras    LIKE lfa1-stras,
        ort01    LIKE lfa1-ort01,
        land1    LIKE lfa1-land1,
        spras    LIKE lfa1-spras,
        telf1    LIKE lfa1-telf1,
        telfx    LIKE lfa1-telfx,
        telbx    LIKE lfa1-telbx,
        taxtype  LIKE dfkkbptaxnum-taxtype,
        taxnumxl LIKE dfkkbptaxnum-taxnumxl,
        augrp    LIKE but000-augrp, "權限組
        "公司代碼
        bukrs    LIKE lfb1-bukrs,
        kunnr    LIKE lfa1-kunnr,
        akont    LIKE lfb1-akont,
        ztermb   LIKE lfb1-zterm,
        bankl    LIKE lfbk-bankl,
        bankn    LIKE lfbk-bankn,
        reprf    LIKE lfb1-reprf,
        "采購組織
        ekorg    LIKE lfm1-ekorg,
        waers    LIKE lfm1-waers,
        ztermc   LIKE lfm1-zterm,
        webre    LIKE lfm1-webre,
      END OF ty_basic_lf.
TYPES:BEGIN OF ty_basic_bk,"公司代碼擴充
        "一般數據
        lifnr LIKE lfa1-lifnr,
        "公司代碼
        bukrs LIKE lfb1-bukrs,
        kunnr LIKE lfa1-kunnr,
        akont LIKE lfb1-akont,
        zterm LIKE lfb1-zterm,
        bankl LIKE lfbk-bankl,
        bankn LIKE lfbk-bankn,
        reprf LIKE lfb1-reprf,
      END OF ty_basic_bk.
TYPES:BEGIN OF ty_bankdetail,"銀行數據
        lifnr TYPE lifnr,
        banks TYPE banks,
        bankl TYPE bankk,
        bankn TYPE bankn,
      END OF ty_bankdetail.
TYPES:BEGIN OF ty_lfb1,"公司代碼
        lifnr TYPE lfb1-lifnr,
        bukrs TYPE lfb1-bukrs,
        akont TYPE lfb1-akont,
        zterm TYPE lfb1-zterm,
        zuawa TYPE lfb1-zuawa,
      END OF ty_lfb1.
* ALV輸出
TYPES:BEGIN OF ty_vendor,"創建供應商
        sel         TYPE c,
        lifnr       LIKE lfa1-lifnr,
        partn       LIKE but000-partner,
        ktokk       LIKE lfa1-ktokk,
        name1       LIKE lfa1-name1,
        sortl       LIKE lfa1-sortl,
        stras       LIKE lfa1-stras,
        ort01       LIKE lfa1-ort01,
        land1       LIKE lfa1-land1,
        spras       LIKE lfa1-spras,
        telf1       LIKE lfa1-telf1,
        telfx       LIKE lfa1-telfx,
        telbx       LIKE lfa1-telbx,
        taxtype     LIKE dfkkbptaxnum-taxtype,
        taxnumxl    LIKE dfkkbptaxnum-taxnumxl,
        augrp       LIKE but000-augrp, "權限組
        "公司代碼
        bukrs       LIKE lfb1-bukrs,
        kunnr       LIKE lfa1-kunnr,
        akont       LIKE lfb1-akont,
        ztermb      LIKE lfb1-zterm,
        bankl       LIKE lfbk-bankl,
        bankn       LIKE lfbk-bankn,
        reprf       LIKE lfb1-reprf,
        "采購組織
        ekorg       LIKE lfm1-ekorg,
        waers       LIKE lfm1-waers,
        ztermc      LIKE lfm1-zterm,
        webre       LIKE lfm1-webre,
*&----------------附加數據
        num(3)      TYPE c,   "當前行數
        type(1)     TYPE c, "執行結果
        message(60) TYPE c,    "消息
        light(4)    TYPE c,    "執行情況(燈)
      END OF ty_vendor.
TYPES:BEGIN OF ty_bukrs,"擴充公司代碼
        sel         TYPE c,
        "一般數據
        lifnr       LIKE lfa1-lifnr,
        "公司代碼
        bukrs       LIKE lfb1-bukrs,
        kunnr       LIKE lfa1-kunnr,
        akont       LIKE lfb1-akont,
        zterm       LIKE lfb1-zterm,
        bankl       LIKE lfbk-bankl,
        bankn       LIKE lfbk-bankn,
        reprf       LIKE lfb1-reprf,
*&----------------附加數據
        num(3)      TYPE c,   "當前行數
        type(1)     TYPE c, "執行結果
        message(60) TYPE c,    "消息
        light(4)    TYPE c,    "執行情況(燈)
      END OF ty_bukrs.
************************************************************************
* internal tables
************************************************************************
DATA:gt_data TYPE STANDARD TABLE OF alsmex_tabline WITH HEADER LINE."保存EXCEL數據的內表
FIELD-SYMBOLS: <gs_itab> TYPE alsmex_tabline."同上,結構
DATA:gt_basic_lf TYPE TABLE OF ty_basic_lf, "保存EXCEL導入的原始數據,供應商創建
     gs_basic_lf TYPE ty_basic_lf.
DATA:gt_basic_bk TYPE TABLE OF ty_basic_bk, "保存EXCEL導入的原始數據,公司代碼擴充
     gs_basic_bk TYPE ty_basic_bk.
DATA functxt TYPE smp_dyntxt."下載模板按鈕要用到的結構
* ALV相關的內表和結構
DATA:gs_fieldcat TYPE slis_fieldcat_alv,
     gt_fieldcat TYPE slis_t_fieldcat_alv,
     g_layout    TYPE slis_layout_alv.
DATA:gt_alv_vendor TYPE TABLE OF ty_vendor,
     gs_alv_vendor TYPE ty_vendor.
DATA:gt_alv_bukrs TYPE TABLE OF ty_bukrs,
     gs_alv_bukrs TYPE ty_bukrs.
************************************************************************
* internal data fields
************************************************************************
DATA g_flag TYPE i.
DATA g_msg TYPE c VALUE IS INITIAL.
DATA g_mode TYPE c VALUE IS INITIAL."業務邏輯判斷
DATA g_num TYPE i VALUE 0.
DATA:gs_value TYPE string, "字段格式轉換時用到的變量
     gs_code  TYPE string.
CONSTANTS:yes TYPE flag VALUE 'X',
          no  TYPE flag VALUE space.
CONSTANTS:c_insr TYPE flag VALUE 'I',
          c_edit TYPE flag VALUE 'U',
          c_del  TYPE flag VALUE 'D'.
* ALV常量
CONSTANTS c_cns_pf_status    TYPE slis_formname VALUE 'ALV_PF_STATUS'.   "  ALV自定義按鈕
CONSTANTS c_cns_user_command TYPE slis_formname VALUE 'ALV_USER_COMMAND'."  ALV自定義按鈕響應事件

 

*&---------------------------------------------------------------------*
*&  包含                ZMMR084_SEL
*&---------------------------------------------------------------------*
************************************************************************
* Parameters and Selection Options
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_flname TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK blk1.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE TEXT-002.
PARAMETERS p_vendor RADIOBUTTON GROUP rad1.
PARAMETERS p_bukrs RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK blk2.
SELECTION-SCREEN:FUNCTION KEY 1.

 

*&---------------------------------------------------------------------*
*&  包含                ZMMR084_FRM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILE
*&---------------------------------------------------------------------*
*       選擇要上傳的模板文件
*----------------------------------------------------------------------*
*      -->P_P_FLNAME  text
*----------------------------------------------------------------------*
FORM frm_get_file  USING    p_flname.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',EXCEL FILE,*.XLS;*.XLSX;'
      mode             = 'O' "S為保存,O為打開
    IMPORTING
      filename         = p_flname
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0.
    EXIT.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_VENDOR
*&---------------------------------------------------------------------*
*       創建供應商
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_vendor .
*----------------------------供應商創建-函數參數----------------------------------------*
* 最外層參數
  DATA:lt_extern TYPE cvis_ei_extern_t, "輸入參數
       ls_extern TYPE cvis_ei_extern.
  DATA:lt_return TYPE bapiretm, "返回參數
       ls_return TYPE bapireti,
       lt_omsg   TYPE bapiretct,
       ls_omsg   TYPE bapiretc.
* 伙伴
  DATA ls_partner TYPE bus_ei_extern.
  DATA:lt_addr TYPE bus_ei_bupa_address_t, "地址
       ls_addr TYPE bus_ei_bupa_address.
  DATA:lt_smtp TYPE bus_ei_bupa_smtp_t, "電子郵件
       ls_smtp TYPE bus_ei_bupa_smtp.
  DATA:lt_phone TYPE bus_ei_bupa_telephone_t, "電話
       ls_phone TYPE bus_ei_bupa_telephone.
  DATA:lt_fax TYPE bus_ei_bupa_fax_t, "傳真
       ls_fax TYPE bus_ei_bupa_fax.
* 供應商
  DATA ls_vendor TYPE vmds_ei_extern.
  DATA:lt_company TYPE vmds_ei_company_t, "公司視圖
       ls_company TYPE vmds_ei_company.
  DATA:lt_bankdetail TYPE cvis_ei_bankdetail_t, "銀行信息
       ls_bankdetail TYPE cvis_ei_cvi_bankdetail.
  DATA:lt_purchasing TYPE vmds_ei_purchasing_t, "采購視圖
       ls_purchasing TYPE vmds_ei_purchasing.
  DATA:lt_purchasing_function TYPE vmds_ei_functions_t, "合作伙伴功能
       ls_purchasing_function TYPE vmds_ei_functions.
* 其它字段
  "取供應商編號的類的方法的參數 cvi_mapper
  DATA: lt_partnerguid_list TYPE bu_partner_guid_t,
        ls_partnerguid_list LIKE LINE OF lt_partnerguid_list,
        lt_vendor_list      TYPE cvis_vend_link_t,
        ls_vendor_list      LIKE LINE OF lt_vendor_list.
  DATA l_bpcat TYPE c VALUE '2'."伙伴類型
  DATA l_bprole1 TYPE c LENGTH 6 VALUE 'FLVN00'."伙伴角色
  DATA l_bprolecat1 TYPE c LENGTH 6 VALUE 'FLVN00'."伙伴角色類型
  DATA l_bprole2 TYPE c LENGTH 6 VALUE 'FLVN01'."伙伴角色
  DATA l_bprolecat2 TYPE c LENGTH 6 VALUE 'FLVN01'."伙伴角色類型
  DATA l_bprole3 TYPE c LENGTH 6 VALUE 'ZLVN00'."伙伴角色
  DATA l_bprolecat3 TYPE c LENGTH 6 VALUE 'FLVN00'."伙伴角色類型
  DATA l_bprole4 TYPE c LENGTH 6 VALUE 'ZLVN01'."伙伴角色
  DATA l_bprolecat4 TYPE c LENGTH 6 VALUE 'FLVN01'."伙伴角色類型
  DATA l_parvw TYPE parvw."用來保存通過函數轉換過后的合作伙伴功能字段
  CONSTANTS c_parvw1 TYPE c LENGTH 2 VALUE 'OA'."合作伙伴功能
  CONSTANTS c_parvw2 TYPE c LENGTH 2 VALUE 'VN'."合作伙伴功能
  CONSTANTS c_parvw3 TYPE c LENGTH 2 VALUE 'PI'."合作伙伴功能
* 異常
  DATA l_uuid_error TYPE REF TO cx_uuid_error."調用UUID的相關創建類時可能出現的異常

  g_mode = 'I'.
  IF gs_basic_lf-lifnr IS INITIAL."EXCEL中沒有傳入供應商編號的情況

    "新增或更新業務伙伴的標識
    ls_partner-header-object_task              = g_mode.
    "通過系統類方法生成一個16位的GUID給業務伙伴
    TRY .
        ls_partner-header-object_instance-bpartnerguid
                  = cl_uuid_factory=>create_system_uuid( )->create_uuid_x16( ).
      CATCH cx_uuid_error .
    ENDTRY.
    "業務伙伴類別
    ls_partner-central_data-common-data-bp_control-category = l_bpcat.
    "簡稱(搜索項)
    ls_partner-central_data-common-data-bp_centraldata-searchterm1 = gs_basic_lf-sortl.
    ls_partner-central_data-common-data-bp_centraldata-authorizationgroup = gs_basic_lf-augrp.
    "供應商名稱(中文)
    ls_partner-central_data-common-data-bp_organization-name1 = gs_basic_lf-name1.
    "為業務伙伴添加角色
    ls_partner-central_data-role-roles[] = VALUE #(
                                                       ( task = g_mode
                                                         data_key = l_bprole1
                                                         data-rolecategory = l_bprolecat1
                                                         )
                                                       ( task = g_mode
                                                         data_key = l_bprole2
                                                         data-rolecategory = l_bprolecat2
                                                         ) ).
    "
    IF gs_basic_lf-taxtype IS NOT INITIAL AND
       gs_basic_lf-taxnumxl IS NOT INITIAL.
      ls_partner-central_data-taxnumber-taxnumbers[] = VALUE #(
                                                         ( task = g_mode
                                                           data_key-taxtype = gs_basic_lf-taxtype
                                                           data_key-taxnumber = gs_basic_lf-taxnumxl
                                                           data_key-taxnumxl = gs_basic_lf-taxnumxl
                                                           ) ).
    ENDIF .
    "銀行代碼
    IF gs_basic_lf-bankl IS NOT INITIAL OR
       gs_basic_lf-bankn IS NOT INITIAL.
      ls_partner-central_data-bankdetail-bankdetails[] = VALUE #(
                                                                  ( task = g_mode
                                                                   data-bank_ctry = gs_basic_lf-land1
                                                                   data-bank_key = gs_basic_lf-bankl
                                                                   data-bank_acct = gs_basic_lf-bankn
                                                                   )
                                                                    ).
    ENDIF.
* 電子郵件
    ls_smtp-contact-data-e_mail = gs_basic_lf-telbx.
    APPEND ls_smtp TO lt_smtp.
    MOVE-CORRESPONDING lt_smtp TO ls_addr-data-communication-smtp-smtp.
* 傳真
    ls_fax-contact-data-fax = gs_basic_lf-telfx.
    APPEND ls_fax TO lt_fax.
    MOVE-CORRESPONDING lt_fax TO ls_addr-data-communication-fax-fax.
* 電話
    ls_phone-contact-data-telephone = gs_basic_lf-telf1.
    APPEND ls_phone TO lt_phone.
    MOVE-CORRESPONDING lt_phone TO ls_addr-data-communication-phone-phone.
* 其它地址信息
    "國家
    ls_addr-data-postal-data-country = gs_basic_lf-land1.
    "語言
    ls_addr-data-postal-data-langu = gs_basic_lf-spras.
    "城市
    ls_addr-data-postal-data-city = gs_basic_lf-ort01.
    "地址
    ls_addr-data-postal-data-street = gs_basic_lf-stras.
    "郵政編碼
    ls_addr-data-postal-data-postl_cod1 = '000000'.
    APPEND ls_addr TO lt_addr.
    MOVE-CORRESPONDING lt_addr TO ls_partner-central_data-address-addresses.

    MOVE-CORRESPONDING ls_partner TO ls_extern-partner.

    "供應商編號,標識為創建
    ls_vendor-header-object_task = g_mode.
    "外部界面:中心數據
    ls_vendor-central_data-central-data-kunnr = gs_basic_lf-kunnr."客戶
    ls_vendor-central_data-central-data-stenr = gs_basic_lf-taxnumxl."稅號
* 公司信息
    ls_company-task = g_mode.
    ls_company-data_key-bukrs = gs_basic_lf-bukrs."公司代碼
    "格式化akont輸入,在前面加夠0.
    PERFORM frm_format_alpha_input USING gs_basic_lf-akont.
    ls_company-data-akont = gs_basic_lf-akont."統馭科目
    ls_company-data-zterm = gs_basic_lf-ztermb."付款條件代碼
    ls_company-data-reprf = gs_basic_lf-reprf."雙重發票檢查
    APPEND ls_company TO lt_company.
    ls_vendor-company_data-company = lt_company.
* 銀行信息
*      ls_bankdetail-task = g_mode.
*      ls_bankdetail-data_key-banks = gs_basic_lf-land1. "國家
*      ls_bankdetail-data_key-bankl = gs_basic_lf-bankl. "銀行代碼
*      ls_bankdetail-data_key-bankn = gs_basic_lf-bankn. "銀行帳戶
*      APPEND ls_bankdetail TO lt_bankdetail.
*      ls_vendor-central_data-bankdetail-bankdetails = lt_bankdetail.
* 采購組織
    ls_purchasing-task = g_mode.
    ls_purchasing-data_key-ekorg = gs_basic_lf-ekorg."采購組織
    ls_purchasing-data-waers = gs_basic_lf-waers."訂單貨幣
    ls_purchasing-data-zterm = gs_basic_lf-ztermc."付款條件
    ls_purchasing-data-webre = gs_basic_lf-webre."基於收貨的發票校驗

* 合作伙伴功能
    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw1
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.
    CLEAR l_parvw.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw2
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.
    CLEAR l_parvw.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw3
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.

    MOVE-CORRESPONDING lt_purchasing_function TO ls_purchasing-functions-functions.
    CLEAR lt_purchasing_function.
    APPEND ls_purchasing TO lt_purchasing.
    ls_vendor-purchasing_data-purchasing = lt_purchasing.
    MOVE-CORRESPONDING ls_vendor TO ls_extern-vendor.
    APPEND ls_extern TO lt_extern.

    CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
      EXPORTING
        i_data   = lt_extern
      IMPORTING
        e_return = lt_return.
    READ TABLE lt_return INTO ls_return INDEX 1.
    READ TABLE ls_return-object_msg WITH KEY type = 'E' TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      g_msg = 'E'.
    ELSE.
      READ TABLE ls_return-object_msg WITH KEY type = 'A' TRANSPORTING NO FIELDS.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        g_msg = 'E'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        g_msg = 'S'.
      ENDIF.
    ENDIF.

* 根據伙伴GUID取出供應商編號
    ls_partnerguid_list = ls_partner-header-object_instance-bpartnerguid.
    APPEND ls_partnerguid_list TO lt_partnerguid_list.
    lt_vendor_list = cvi_mapper=>get_instance( )->get_assigned_vendors_for_bps(
                                              i_partner_guids = lt_partnerguid_list ).
    IF lt_vendor_list IS NOT INITIAL.
      READ TABLE lt_vendor_list INTO ls_vendor_list INDEX 1 .
    ENDIF.

    "附加數據
    gs_alv_vendor-lifnr = ls_vendor_list-vendor.
    gs_alv_vendor-num = g_num.
    gs_alv_vendor-type = g_msg.
    IF g_msg = 'S'.
      gs_alv_vendor-light = '@5B@'.
      CONCATENATE '供應商'gs_basic_lf-name1'創建成功' INTO gs_alv_vendor-message.
    ELSEIF g_msg = 'E'.
      gs_alv_vendor-light = '@5C@'.
      READ TABLE ls_return-object_msg INTO ls_omsg WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        READ TABLE ls_return-object_msg INTO ls_omsg WITH KEY type = 'A'.
      ENDIF.
      CONCATENATE '供應商'gs_basic_lf-name1'創建失敗,原因是:'ls_omsg-message INTO gs_alv_vendor-message.
    ENDIF.
    MODIFY gt_alv_vendor FROM gs_alv_vendor.

    CLEAR:ls_partner,ls_smtp,ls_fax,ls_phone,ls_addr,ls_vendor,ls_company,ls_bankdetail,
        ls_purchasing,ls_purchasing_function,ls_extern,ls_return,ls_partnerguid_list,
        ls_vendor_list.
    REFRESH:lt_smtp,lt_fax,lt_phone,lt_addr,lt_company,lt_bankdetail,lt_purchasing,lt_purchasing_function,
            lt_extern,lt_return,lt_partnerguid_list,lt_vendor_list.
    CLEAR:l_parvw.

  ELSE."EXCEL中傳入了供應商編號的情況

    "新增或更新業務伙伴的標識
    ls_partner-header-object_task              = g_mode.
    PERFORM frm_format_alpha_input USING gs_basic_lf-lifnr.
    ls_partner-header-object_instance-bpartner = gs_basic_lf-partn.
    "通過系統類方法生成一個16位的GUID給業務伙伴
    TRY .
        ls_partner-header-object_instance-bpartnerguid
                  = cl_uuid_factory=>create_system_uuid( )->create_uuid_x16( ).
      CATCH cx_uuid_error .
    ENDTRY.
    "業務伙伴類別
    ls_partner-central_data-common-data-bp_control-category = l_bpcat.
    ls_partner-central_data-common-data-bp_control-grouping = gs_basic_lf-ktokk.
    "簡稱(搜索項)
    ls_partner-central_data-common-data-bp_centraldata-searchterm1 = gs_basic_lf-sortl.
    "供應商名稱(中文)
    ls_partner-central_data-common-data-bp_organization-name1 = gs_basic_lf-name1.
    "為業務伙伴添加角色
    ls_partner-central_data-role-roles[] = VALUE #(
                                                       ( task = g_mode
                                                         data_key = l_bprole1
                                                         data-rolecategory = l_bprolecat1
                                                         )
                                                       ( task = g_mode
                                                         data_key = l_bprole2
                                                         data-rolecategory = l_bprolecat2
                                                         ) ).
*        IF gs_basic_lf-bankl IS NOT INITIAL OR
*           gs_basic_lf-bankn IS NOT INITIAL.
*          "銀行代碼
*          ls_partner-central_data-bankdetail-bankdetails[] = VALUE #(
*                                                                      ( task = g_mode
*                                                                       data-bank_ctry = gs_basic_lf-land1
*                                                                       data-bank_key = gs_basic_lf-bankl
*                                                                       data-bank_acct = gs_basic_lf-bankn
*                                                                       )
*                                                                        ).
*        ENDIF.
* 電子郵件
    ls_smtp-contact-data-e_mail = gs_basic_lf-telbx.
    APPEND ls_smtp TO lt_smtp.
    MOVE-CORRESPONDING lt_smtp TO ls_addr-data-communication-smtp-smtp.
* 傳真
    ls_fax-contact-data-fax = gs_basic_lf-telfx.
    APPEND ls_fax TO lt_fax.
    MOVE-CORRESPONDING lt_fax TO ls_addr-data-communication-fax-fax.
* 電話
    ls_phone-contact-data-telephone = gs_basic_lf-telf1.
    APPEND ls_phone TO lt_phone.
    MOVE-CORRESPONDING lt_phone TO ls_addr-data-communication-phone-phone.
* 其它地址信息
    "國家
    ls_addr-data-postal-data-country = gs_basic_lf-land1.
    "語言
    ls_addr-data-postal-data-langu = gs_basic_lf-spras.
    "城市
    ls_addr-data-postal-data-city = gs_basic_lf-ort01.
    "地址
    ls_addr-data-postal-data-street = gs_basic_lf-stras.
    "郵政編碼
    ls_addr-data-postal-data-postl_cod1 = '000000'.
    APPEND ls_addr TO lt_addr.
    MOVE-CORRESPONDING lt_addr TO ls_partner-central_data-address-addresses.

    MOVE-CORRESPONDING ls_partner TO ls_extern-partner.
*        ls_extern-ensure_create-create_vendor = 'X'.

    "供應商編號,標識為創建
    ls_vendor-header-object_task = g_mode.
    PERFORM frm_format_alpha_input USING gs_basic_lf-lifnr.
    ls_vendor-header-object_instance-lifnr = gs_basic_lf-lifnr.
    "外部界面:中心數據
    ls_vendor-central_data-central-data-kunnr = gs_basic_lf-kunnr."客戶
    ls_vendor-central_data-central-data-stenr = gs_basic_lf-taxnumxl."稅號
*        ls_vendor-central_data-central-data-ktokk = gs_basic_lf-ktokk."稅號
* 公司信息
    ls_company-task = g_mode.
    ls_company-data_key-bukrs = gs_basic_lf-bukrs."公司代碼
    "格式化akont輸入,在前面加夠0.
    PERFORM frm_format_alpha_input USING gs_basic_lf-akont.
    ls_company-data-akont = gs_basic_lf-akont."統馭科目
    ls_company-data-zterm = gs_basic_lf-ztermb."付款條件代碼
    ls_company-data-reprf = gs_basic_lf-reprf."雙重發票檢查
    APPEND ls_company TO lt_company.
    ls_vendor-company_data-company = lt_company.
* 銀行信息
*      ls_bankdetail-task = g_mode.
*      ls_bankdetail-data_key-banks = gs_basic_lf-land1. "國家
*      ls_bankdetail-data_key-bankl = gs_basic_lf-bankl. "銀行代碼
*      ls_bankdetail-data_key-bankn = gs_basic_lf-bankn. "銀行帳戶
*      APPEND ls_bankdetail TO lt_bankdetail.
*      ls_vendor-central_data-bankdetail-bankdetails = lt_bankdetail.
* 采購組織
    ls_purchasing-task = g_mode.
    ls_purchasing-data_key-ekorg = gs_basic_lf-ekorg."采購組織
    ls_purchasing-data-waers = gs_basic_lf-waers."訂單貨幣
    ls_purchasing-data-zterm = gs_basic_lf-ztermc."付款條件
    ls_purchasing-data-webre = gs_basic_lf-webre."基於收貨的發票校驗

* 合作伙伴功能
    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw1
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.
    CLEAR l_parvw.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw2
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.
    CLEAR l_parvw.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw3
      IMPORTING
        output = l_parvw.
    ls_purchasing_function-task = g_mode.
    ls_purchasing_function-data_key-parvw = l_parvw.
    APPEND ls_purchasing_function TO lt_purchasing_function.

    MOVE-CORRESPONDING lt_purchasing_function TO ls_purchasing-functions-functions.
    CLEAR lt_purchasing_function.
    APPEND ls_purchasing TO lt_purchasing.
    ls_vendor-purchasing_data-purchasing = lt_purchasing.
    MOVE-CORRESPONDING ls_vendor TO ls_extern-vendor.
    APPEND ls_extern TO lt_extern.

    CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
      EXPORTING
        i_data   = lt_extern
      IMPORTING
        e_return = lt_return.
    READ TABLE lt_return INTO ls_return INDEX 1.
    READ TABLE ls_return-object_msg WITH KEY type = 'E' TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      g_msg = 'E'.
    ELSE.
      READ TABLE ls_return-object_msg WITH KEY type = 'A' TRANSPORTING NO FIELDS.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        g_msg = 'E'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        g_msg = 'S'.
      ENDIF.
    ENDIF.

    "附加數據
    gs_alv_vendor-lifnr = gs_basic_lf-lifnr.
    gs_alv_vendor-num = g_num.
    gs_alv_vendor-type = g_msg.
    IF g_msg = 'S'.
      gs_alv_vendor-light = '@5B@'.
      CONCATENATE '供應商'gs_basic_lf-name1'創建成功' INTO gs_alv_vendor-message.
    ELSEIF g_msg = 'E'.
      gs_alv_vendor-light = '@5C@'.
      READ TABLE ls_return-object_msg INTO ls_omsg WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        READ TABLE ls_return-object_msg INTO ls_omsg WITH KEY type = 'A'.
      ENDIF.
      CONCATENATE '供應商'gs_basic_lf-name1'創建失敗,原因是:'ls_omsg-message INTO gs_alv_vendor-message.
    ENDIF.
    MODIFY gt_alv_vendor FROM gs_alv_vendor.

    CLEAR:ls_partner,ls_smtp,ls_fax,ls_phone,ls_addr,ls_vendor,ls_company,ls_bankdetail,
        ls_purchasing,ls_purchasing_function,ls_extern,ls_return.
    REFRESH:lt_smtp,lt_fax,lt_phone,lt_addr,lt_company,lt_bankdetail,lt_purchasing,lt_purchasing_function,
            lt_extern,lt_return.
    CLEAR:l_parvw.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_BUKRS
*&---------------------------------------------------------------------*
*       擴充公司代碼
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_add_bukrs .
*-------------------------------公司代碼擴充-函數參數-------------------------------------*
* 中間處理時用到的參數
  DATA:lt_bankdetail2   TYPE TABLE OF ty_bankdetail, "從數據表里取出的銀行數據
       ls_bankdetail2   TYPE ty_bankdetail,
       ls_bankdetail2_1 TYPE ty_bankdetail.
  DATA:lt_bankdetail4 TYPE TABLE OF ty_bankdetail, "從數據表里取出的銀行數據
       ls_bankdetail4 TYPE ty_bankdetail.
  DATA:lt_lfb1 TYPE TABLE OF ty_lfb1, "從數據表中取出的公司代碼數據
       ls_lfb1 TYPE ty_lfb1.
* 調用類需要的參數
  DATA ls_master_data TYPE vmds_ei_main.  "最外層參數
  DATA:lt_vendor2 TYPE vmds_ei_extern_t,
       ls_vendor2 TYPE vmds_ei_extern.
  DATA:lt_bankdetail3 TYPE  cvis_ei_bankdetail_t, "銀行數據
       ls_bankdetail3 TYPE cvis_ei_cvi_bankdetail.
  DATA:lt_company2 TYPE vmds_ei_company_t,
       ls_company2 TYPE vmds_ei_company.
  DATA:ls_return_message TYPE cvis_message,
       lt_message        TYPE bapiret2_t,
       ls_message        TYPE bapiret2.
  DATA:ls_return_data    TYPE vmds_ei_main, "返回的供應商數據
       lt_return_vendors TYPE vmds_ei_extern_t, "返回的供應商編號
       ls_return_verdors LIKE LINE OF lt_return_vendors.
* 其它字段
  DATA l_ifbukrs TYPE c. "判斷是否供應商創建過視圖
  DATA l_land1 TYPE c LENGTH 2 VALUE 'CN'."默認國家
  DATA l_lifnr TYPE lifnr VALUE 0. "返回的供應商編號

  g_mode = 'U'.
* 查出所有的銀行信息
  SELECT
        lifnr  "供應商或債權人的帳號
        banks  "銀行國家代碼
        bankl  "銀行代碼
        bankn  "銀行帳戶號碼
    FROM lfbk
    INTO CORRESPONDING FIELDS OF TABLE lt_bankdetail2.
  SORT lt_bankdetail2 BY lifnr.
* 查出所有公司代碼數據
  SELECT
        lifnr
        bukrs
        akont
        zterm
        zuawa
    INTO CORRESPONDING FIELDS OF TABLE lt_lfb1
    FROM lfb1.
  SORT lt_lfb1 BY lifnr bukrs.

  PERFORM frm_format_alpha_input USING gs_basic_bk-lifnr."添加前導零
* 找出對應供應商編號的銀行代碼數據
  READ TABLE lt_bankdetail2 INTO ls_bankdetail2 WITH KEY lifnr = gs_basic_bk-lifnr BINARY SEARCH.
  IF sy-subrc = 0.
    LOOP AT lt_bankdetail2 INTO ls_bankdetail2_1 FROM sy-tabix .
      IF ls_bankdetail2_1-lifnr = ls_bankdetail2-lifnr.
        MOVE-CORRESPONDING ls_bankdetail2_1 TO ls_bankdetail4.
        APPEND ls_bankdetail4 TO lt_bankdetail4.
      ELSE.
        EXIT.
      ENDIF.
      CLEAR:ls_bankdetail4,ls_bankdetail2_1.
    ENDLOOP.
  ENDIF.

  "查找了LFB1中是否存在公司,即該供應商是否之前創建公司視圖
  READ TABLE lt_lfb1 WITH KEY lifnr = gs_basic_bk-lifnr
                              bukrs = gs_basic_bk-bukrs TRANSPORTING NO FIELDS .
  IF sy-subrc = 0.
    CLEAR l_ifbukrs.
    l_ifbukrs = yes."之前有創建過當前傳入的公司代碼數據
  ENDIF.

* 銀行數據
  "將傳入的銀行數據和根據供應商查找到的數據進行比對,如果相同,則將查找到的內表數據打上刪除標記
  LOOP AT lt_bankdetail4 INTO ls_bankdetail4 WHERE bankl = gs_basic_bk-bankl
                                               AND bankn = gs_basic_bk-bankn.
    ls_bankdetail3-task = c_del.                                " 打上刪除標記
    ls_bankdetail3-data_key-banks = ls_bankdetail4-banks.      "國家
    ls_bankdetail3-data_key-bankl = ls_bankdetail4-bankl.      "銀行代碼
    ls_bankdetail3-data_key-bankn = ls_bankdetail4-bankn.      "銀行帳戶
    APPEND ls_bankdetail3 TO lt_bankdetail3.
    CLEAR:ls_bankdetail3,ls_bankdetail4.
  ENDLOOP.

* 客戶通用數據
  ls_vendor2-header-object_task = g_mode."更新標識
  ls_vendor2-header-object_instance-lifnr = gs_basic_bk-lifnr."供應商編號
  ls_vendor2-central_data-central-data-kunnr = gs_basic_bk-kunnr."客戶
  ls_vendor2-central_data-central-datax-kunnr = yes.

* 公司代碼數據
  "如果之前已經創建了公司視圖的話,就對其進行修改,否則對其進行新建
  IF l_ifbukrs = yes.
    ls_company2-task = c_edit.   "如果傳入的公司存在,則進行修改
  ELSE.
    ls_company2-task = c_insr.  "如果一個供應商沒有公司視圖,則進行新建公司視圖
  ENDIF.
  ls_company2-data_key-bukrs = gs_basic_bk-bukrs."公司代碼
  ls_company2-data-akont = gs_basic_bk-akont.    "統馭科目
  ls_company2-data-zterm = gs_basic_bk-zterm.    "付款條件代碼
  ls_company2-data-reprf = gs_basic_bk-reprf.    "付款條件代碼
  ls_company2-datax-akont = yes.
  ls_company2-datax-zterm = yes.
  ls_company2-datax-reprf = yes.
  APPEND ls_company2 TO lt_company2.
  ls_vendor2-company_data-company = lt_company2.

  "此時再將傳入的數據導入系統中進行賦值
  ls_bankdetail3-task = c_insr.
  ls_bankdetail3-data_key-banks = l_land1."國家
  ls_bankdetail3-data_key-bankl = gs_basic_bk-bankl."銀行代碼
  ls_bankdetail3-data_key-bankn = gs_basic_bk-bankn."銀行帳戶 = 合作銀行類型
  APPEND ls_bankdetail3 TO lt_bankdetail3.
  CLEAR ls_bankdetail3.
  IF gs_basic_bk-bankl IS NOT INITIAL OR
     gs_basic_bk-bankn IS NOT INITIAL.  "這2個值有其中一個不為空時才加入銀行數據
    ls_vendor2-central_data-bankdetail-bankdetails = lt_bankdetail3."銀行明細
  ENDIF.
*將整理好的數據添加到供應商主數據中
  APPEND ls_vendor2 TO lt_vendor2.
  ls_master_data-vendors = lt_vendor2.

  CALL METHOD vmd_ei_api=>maintain_bapi
    EXPORTING
      is_master_data         = ls_master_data
    IMPORTING
      es_message_defective   = ls_return_message "錯誤消息
      es_master_data_correct = ls_return_data. "創建成功返回的供應商數據
  lt_message = ls_return_message-messages.
  lt_return_vendors = ls_return_data-vendors.
  READ TABLE lt_return_vendors INTO ls_return_verdors INDEX 1.
  IF sy-subrc = 0 .
    WRITE ls_return_verdors-header-object_instance TO l_lifnr."讀取供應商編號
  ENDIF.
  IF lt_message IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    g_msg = 'S'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    g_msg = 'E'.
  ENDIF.

  "附加數據
  gs_alv_bukrs-num = g_num.
  gs_alv_bukrs-type = g_msg.
  IF g_msg = 'S'.
    gs_alv_bukrs-light = '@5B@'.
    CONCATENATE '供應商'gs_basic_bk-lifnr'擴充公司代碼成功' INTO gs_alv_bukrs-message.
  ELSEIF g_msg = 'E'.
    gs_alv_bukrs-light = '@5C@'.
    CONCATENATE '供應商'gs_basic_bk-lifnr'擴充公司代碼失敗' INTO gs_alv_bukrs-message.
  ENDIF.
  MODIFY gt_alv_bukrs FROM gs_alv_bukrs.

  CLEAR:ls_bankdetail2,ls_bankdetail3,ls_vendor2,ls_company2,ls_master_data,ls_return_message,
        ls_return_data,ls_return_verdors.
  REFRESH:lt_bankdetail3,lt_company2,lt_vendor2,lt_message,lt_return_vendors,lt_bankdetail2,
          lt_lfb1.
  CLEAR:l_ifbukrs,l_lifnr.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_MODEL
*&---------------------------------------------------------------------*
*       下載模板
*----------------------------------------------------------------------*
*      -->P_0146   text
*----------------------------------------------------------------------*
FORM frm_get_model  USING    p_objid TYPE wwwdata-objid.
  DATA: l_objdata     LIKE wwwdatatab,
        l_destination LIKE rlgrap-filename,
        l_rc          LIKE sy-subrc,
        l_errtxt      TYPE string.
  DATA: l_fullpath  TYPE string,
        l_extension TYPE string,
        l_fname     LIKE rlgrap-filename,
        l_formkey   LIKE  wwwdatatab.

  l_extension = p_objid.
  PERFORM get_file_name USING '.xls'
                              'Excel|*.xls;'
                     CHANGING l_fullpath.
  IF l_fullpath = space.
    MESSAGE '請選擇下載文件名' TYPE 'E'.
  ELSE.
    CONCATENATE l_fullpath '' INTO l_fname.
    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF l_objdata
      WHERE relid = 'MI'
        AND objid = p_objid .

    IF sy-subrc NE 0 OR l_objdata-objid = space.
      MESSAGE e001(00) WITH '文件不存在!'.
    ELSE.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key         = l_objdata
          destination = l_fname
        IMPORTING
          rc          = l_rc
        CHANGING
          temp        = l_fname.
      IF l_rc NE 0.
        MESSAGE e001(00) WITH '文件下載失敗!'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_FILE_NAME
*&---------------------------------------------------------------------*
*       獲取要下載的文件名字
*----------------------------------------------------------------------*
*      -->P_0274   text
*      -->P_0275   text
*      <--P_L_FULLPATH  text
*----------------------------------------------------------------------*
FORM get_file_name  USING p_extension
                         p_file_filter
                CHANGING p_fullpath.
  DATA: l_filename TYPE string,
        l_path     TYPE string,
        l_fullpath TYPE string,
        l_titile   TYPE string,
        l_init_dir TYPE string.

  CLEAR p_fullpath.
  l_titile    = TEXT-t04.
  l_init_dir  = TEXT-t03.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = l_titile
      default_extension    = '.xls'
      initial_directory    = l_init_dir
      prompt_on_overwrite  = 'X'
      file_filter          = p_file_filter
    CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = l_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  p_fullpath = l_fullpath.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FORMAT_ALPHA_INPUT
*&---------------------------------------------------------------------*
*       添加前導零
*----------------------------------------------------------------------*
*      -->P_IM_S_GENERAL_LIFNR  text
*----------------------------------------------------------------------*
FORM frm_format_alpha_input  USING    p1.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p1
    IMPORTING
      output = p1.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_flag  text
*----------------------------------------------------------------------*
FORM frm_alv_show  .
  PERFORM frm_get_data."數據獲取
  PERFORM frm_layout_build."  設置表格樣式
  PERFORM frm_field_build. "  建立表頭數據
  PERFORM frm_data_out."輸出
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       往ALV輸出內表里填值
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  IF g_flag = 1.

    CALL FUNCTION 'ZXXX001'
      EXPORTING
        filename                = p_flname
        i_begin_col             = '1' "起始列號
        i_begin_row             = '3' "起始行號
        i_end_col               = '26' "終止列號
        i_end_row               = '65535' "終止行號
        im_sheet_name           = 1
      TABLES
        intern                  = gt_data[]
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF gt_data[] IS INITIAL.
      MESSAGE '清單中無數據' TYPE 'E'.
    ENDIF.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

*格式轉化
    LOOP AT gt_data ASSIGNING <gs_itab>.
      CASE <gs_itab>-col.
        WHEN '0001'.
          gs_alv_vendor-lifnr = <gs_itab>-value."供應商編號
        WHEN '0002'.
          gs_alv_vendor-partn = <gs_itab>-value."供應商賬戶組
        WHEN '0003'.
          gs_alv_vendor-ktokk = <gs_itab>-value."供應商賬戶組
        WHEN '0004'.
          gs_alv_vendor-name1 = <gs_itab>-value."供應商名稱
        WHEN '0005'.
          gs_alv_vendor-sortl = <gs_itab>-value."簡稱(搜索項)
        WHEN '0006'.
          gs_alv_vendor-stras = <gs_itab>-value."地址(中)
        WHEN '0007'.
          gs_alv_vendor-ort01 = <gs_itab>-value."城市
        WHEN '0008'.
          gs_alv_vendor-land1 = <gs_itab>-value."國家
        WHEN '0009'.
          gs_alv_vendor-spras = <gs_itab>-value."語言
        WHEN '0010'.
          gs_alv_vendor-telf1 = <gs_itab>-value."電話
        WHEN '0011'.
          gs_alv_vendor-telfx = <gs_itab>-value."傳真
        WHEN '0012'.
          gs_alv_vendor-telbx = <gs_itab>-value."郵箱地址
        WHEN '0013'.
          gs_alv_vendor-taxtype = <gs_itab>-value."稅類別
        WHEN '0014'.
          gs_alv_vendor-taxnumxl = <gs_itab>-value."稅號
        WHEN '0015'.
          gs_alv_vendor-augrp = <gs_itab>-value."權限組
        WHEN '0016'.
          gs_alv_vendor-bukrs = <gs_itab>-value."公司代碼
        WHEN '0017'.
          gs_alv_vendor-kunnr = <gs_itab>-value."客戶
        WHEN '0018'.
          gs_alv_vendor-akont = <gs_itab>-value."統馭科目
        WHEN '0019'.
          gs_alv_vendor-ztermb = <gs_itab>-value."付款條件
        WHEN '0020'.
          gs_alv_vendor-bankl = <gs_itab>-value."銀行代碼
        WHEN '0021'.
          gs_alv_vendor-bankn = <gs_itab>-value."銀行帳號
        WHEN '0022'.
          gs_alv_vendor-reprf = <gs_itab>-value."雙重發票檢查
        WHEN '0023'.
          gs_alv_vendor-ekorg = <gs_itab>-value."采購組織
        WHEN '0024'.
          gs_alv_vendor-waers = <gs_itab>-value."訂單貨幣
        WHEN '0025'.
          gs_alv_vendor-ztermc = <gs_itab>-value."付款條件
        WHEN '0026'.
          gs_alv_vendor-webre = <gs_itab>-value."基於收貨的發票校驗
      ENDCASE.

      AT END OF row.
        "權限檢查
        AUTHORITY-CHECK OBJECT 'ZBUKRS'
                 ID 'BUKRS' FIELD gs_alv_vendor-bukrs.
        IF sy-subrc <> 0.
          MESSAGE ID 'ZMM001' TYPE 'E' NUMBER '19' WITH gs_alv_vendor-bukrs.

        ENDIF.

        AUTHORITY-CHECK OBJECT 'ZAUGRP'
                 ID 'AUGRP' FIELD gs_alv_vendor-augrp.
        IF sy-subrc <> 0.
          MESSAGE ID 'ZMM001' TYPE 'E' NUMBER '20' WITH gs_alv_vendor-augrp.
        ENDIF.



        APPEND gs_alv_vendor TO gt_alv_vendor.
        CLEAR gs_alv_vendor.
      ENDAT.
    ENDLOOP.

  ELSEIF g_flag = 2.

    CALL FUNCTION 'ZXXX001'
      EXPORTING
        filename                = p_flname
        i_begin_col             = '1' "起始列號
        i_begin_row             = '3' "起始行號
        i_end_col               = '8' "終止列號
        i_end_row               = '65535' "終止行號
        im_sheet_name           = 2
      TABLES
        intern                  = gt_data[]
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF gt_data[] IS INITIAL.
      MESSAGE '清單中無數據' TYPE 'E'.
    ENDIF.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

*格式轉化
    LOOP AT gt_data ASSIGNING <gs_itab>.
      CASE <gs_itab>-col.
        WHEN '0001'.
          gs_alv_bukrs-lifnr = <gs_itab>-value."供應商編號
        WHEN '0002'.
          gs_alv_bukrs-bukrs = <gs_itab>-value."公司代碼
        WHEN '0003'.
          gs_alv_bukrs-kunnr = <gs_itab>-value."客戶
        WHEN '0004'.
          gs_alv_bukrs-akont = <gs_itab>-value."統馭科目
        WHEN '0005'.
          gs_alv_bukrs-zterm = <gs_itab>-value."付款條件
        WHEN '0006'.
          gs_alv_bukrs-bankl = <gs_itab>-value."銀行代碼
        WHEN '0007'.
          gs_alv_bukrs-bankn = <gs_itab>-value."銀行帳號
        WHEN '0008'.
          gs_alv_bukrs-reprf = <gs_itab>-value."雙重發票檢查
      ENDCASE.

      AT END OF row.
        APPEND gs_alv_bukrs TO gt_alv_bukrs.
        CLEAR gs_alv_bukrs.
      ENDAT.
    ENDLOOP.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       "  設置表格樣式
*----------------------------------------------------------------------*
FORM frm_layout_build .
  g_layout-box_fieldname        = 'SEL'.  " 選擇模式,在最左端有選擇按鈕
  g_layout-colwidth_optimize    = 'X'.    " 自動調整列寬
  g_layout-zebra                = 'X'.    " 表格斑馬線
ENDFORM.                    "frm_layout_build
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELD_BUILD
*&---------------------------------------------------------------------*
*       "  建立表頭數據
*----------------------------------------------------------------------*
FORM frm_field_build .
  IF g_flag = 1.
    "一般數據
*    PERFORM field_set USING 'SEL'  '' '' '15' '' '' .
    PERFORM field_set USING 'LIFNR'  '供應商號' '供應商號' '15' '' '' .
    PERFORM field_set USING 'KTOKK'  '供應商賬戶組' '供應商賬戶組' '15' '' '' .
    PERFORM field_set USING 'NAME1'  '供應商名稱(中文)' '供應商名稱(中文)' '15' '' '' .
    PERFORM field_set USING 'SORTL'  '簡稱(搜索項)' '簡稱(搜索項)' '15' '' '' .
    PERFORM field_set USING 'STRAS'  '地址(中)' '地址(中)' '15' '' '' .
    PERFORM field_set USING 'ORT01'  '城市' '城市' '15' '' '' .
    PERFORM field_set USING 'LAND1'  '國家' '國家' '15' '' '' .
    PERFORM field_set USING 'SPRAS'  '語言' '語言' '15' '' '' .
    PERFORM field_set USING 'TELF1'  '電話' '電話' '15' '' '' .
    PERFORM field_set USING 'TELFX'  '傳真' '傳真' '15' '' '' .
    PERFORM field_set USING 'TELBX'  '郵箱地址' '郵箱地址' '15' '' '' .
    PERFORM field_set USING 'TAXTYPE'  '稅類別' '稅類別' '15' '' '' .
    PERFORM field_set USING 'TAXNUMXL'  '稅號' '稅號' '15' '' '' .
    PERFORM field_set USING 'AUGRP'  '權限組' '權限組' '15' '' '' .
    "公司代碼
    PERFORM field_set USING 'BUKRS'  '公司代碼' '公司代碼' '15' '' '' .
    PERFORM field_set USING 'KUNNR'  '客戶' '客戶' '15' '' '' .
    PERFORM field_set USING 'AKONT'  '統馭科目' '統馭科目' '15' '' '' .
    PERFORM field_set USING 'ZTERMB'  '付款條件' '付款條件' '15' '' '' .
    PERFORM field_set USING 'BANKL'  '銀行代碼' '銀行代碼' '15' '' '' .
    PERFORM field_set USING 'BANKN'  '銀行帳號' '銀行帳號' '15' '' '' .
    PERFORM field_set USING 'REPRF'  '雙重發票檢查' '雙重發票檢查' '15' '' '' .
    "采購組織
    PERFORM field_set USING 'EKORG'  '采購組織' '采購組織' '15' '' '' .
    PERFORM field_set USING 'WAERS'  '訂單貨幣' '訂單貨幣' '15' '' '' .
    PERFORM field_set USING 'ZTERMC'  '付款條件' '付款條件' '15' '' '' .
    PERFORM field_set USING 'WEBRE'  '基於收貨的發票校驗' '基於收貨的發票校驗' '15' '' '' .
    "附加數據
    PERFORM field_set USING 'NUM'  '當前行數' '當前行數' '15' '' '' .
    PERFORM field_set USING 'TYPE'  '執行結果' '執行結果' '15' '' '' .
    PERFORM field_set USING 'MESSAGE'  '返回消息' '返回消息' '15' '' '' .
    PERFORM field_set USING 'LIGHT'  '執行情況' '執行情況' '15' '' '' .
  ELSEIF g_flag = 2.
    "一般數據
*    PERFORM field_set USING 'SEL'  '' '' '15' '' '' .
    PERFORM field_set USING 'LIFNR'  '供應商號' '供應商號' '15' '' '' .
    "公司代碼
    PERFORM field_set USING 'BUKRS'  '公司代碼' '公司代碼' '15' '' '' .
    PERFORM field_set USING 'KUNNR'  '客戶' '客戶' '15' '' '' .
    PERFORM field_set USING 'AKONT'  '統馭科目' '統馭科目' '15' '' '' .
    PERFORM field_set USING 'ZTERM'  '付款條件' '付款條件' '15' '' '' .
    PERFORM field_set USING 'BANKL'  '銀行代碼' '銀行代碼' '15' '' '' .
    PERFORM field_set USING 'BANKN'  '銀行帳號' '銀行帳號' '15' '' '' .
    PERFORM field_set USING 'REPRF'  '雙重發票檢查' '雙重發票檢查' '15' '' '' .
    "附加數據
    PERFORM field_set USING 'NUM'  '當前行數' '當前行數' '15' '' '' .
    PERFORM field_set USING 'TYPE'  '執行結果' '執行結果' '15' '' '' .
    PERFORM field_set USING 'MESSAGE'  '返回消息' '返回消息' '15' '' '' .
    PERFORM field_set USING 'LIGHT'  '執行情況' '執行情況' '15' '' '' .
  ENDIF.
ENDFORM.                    "frm_field_build
*&---------------------------------------------------------------------*
*&      Form  FRM_DATA_OUT
*&---------------------------------------------------------------------*
*       輸出數據
*----------------------------------------------------------------------*
FORM frm_data_out .
  IF g_flag = 1.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = c_cns_pf_status
        i_callback_user_command  = c_cns_user_command
        is_layout                = g_layout
        it_fieldcat              = gt_fieldcat
        i_save                   = 'X'
      TABLES
        t_outtab                 = gt_alv_vendor
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSEIF g_flag = 2.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = c_cns_pf_status
        i_callback_user_command  = c_cns_user_command
        is_layout                = g_layout
        it_fieldcat              = gt_fieldcat
        i_save                   = 'X'
      TABLES
        t_outtab                 = gt_alv_bukrs
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF.
ENDFORM.                    "frm_data_out
*&---------------------------------------------------------------------*
*&      Form  FIELD_SET
*&---------------------------------------------------------------------*
FORM field_set USING p_fieldname
                     p_seltext_l
                     p_seltext_s
                     p_outputlen
                     p_ref_fieldname
                     p_ref_tabname
                         .
  IF p_fieldname = 'MESSAGE'.
    gs_fieldcat-key = 'X'.
  ELSEIF p_fieldname = 'TYPE'.
    gs_fieldcat-key = 'X'.
  ELSEIF p_fieldname = 'NUM'.
    gs_fieldcat-key = 'X'.
  ELSEIF p_fieldname = 'LIGHT'.
    gs_fieldcat-key = 'X'.
  ENDIF.
  gs_fieldcat-fieldname     = p_fieldname .
  gs_fieldcat-seltext_l     = p_seltext_l .
  gs_fieldcat-seltext_s     = p_seltext_s .
  gs_fieldcat-outputlen     = p_outputlen .
  gs_fieldcat-ref_fieldname = p_ref_fieldname.
  gs_fieldcat-ref_tabname   = p_ref_tabname.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.
ENDFORM.                    "field_set
*&-------------------------------------------------------------------
*      添加按鈕,雙擊下面的 STANDARD_FULLSCREEN
*--------------------------------------------------------------------
FORM alv_pf_status USING ut_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING ut_extab.
ENDFORM. "ALV_PF_STATUS
*--------------------------------------------------------------------
*      自定義事件、雙擊事件
*--------------------------------------------------------------------
FORM alv_user_command USING u_ucomm LIKE sy-ucomm
                        us_selfield TYPE slis_selfield.
  DATA:l_index TYPE sy-tabix.
  CASE u_ucomm.
    WHEN 'SAVE'."保存數據到數據表
*      PERFORM F_REFRESH_ALV.  "刷新ALV,下面有說明

      PERFORM frm_create.
*   WHEN '&IC1'."雙擊
** 獲取當前ALV所在行數據
*      READ TABLE IT_GW INDEX RS_SELFIELD-TABINDEX.
*      SET PARAMETER ID: 'ANR' FIELD IT_GW-AUFNR.
*      CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
  ENDCASE.
  us_selfield-refresh = 'X'.
ENDFORM.                    "ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  FRM_PRINT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create .
  IF g_flag = 1." 供應商創建
    LOOP AT gt_alv_vendor INTO gs_alv_vendor.
      g_num = g_num + 1.
      MOVE-CORRESPONDING gs_alv_vendor TO gs_basic_lf.
      PERFORM frm_create_vendor.
      CLEAR:gs_alv_vendor,gs_basic_lf.
    ENDLOOP.
  ELSEIF g_flag = 2."公司代碼擴充
    LOOP AT gt_alv_bukrs INTO gs_alv_bukrs.
      g_num = g_num + 1.
      MOVE-CORRESPONDING gs_alv_bukrs TO gs_basic_bk.
      PERFORM frm_add_bukrs.
      CLEAR:gs_alv_bukrs,gs_basic_bk.
    ENDLOOP.
  ENDIF.
  CLEAR g_num.
ENDFORM.                    " FRM_CREATE

FORM sub_auth_chk.

ENDFORM.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM