*---------------------------------------------------------------------* * PROGRAM ID : ZSDR064 * * APPLICATION NAME : SD * * AUTHOR : liugx * * TRANSACTION : ZSDR064 * * PROGRAM TYPE : REPORT PROGRAM * * INPUT FILES : N/A * * OUTPUT FILES : N/A * * Development class : ZDEV * * Message class : * * DESCRIPTION : 客戶導入 * *---------------------------------------------------------------------* *=====================================================================* * 000 2017/11/03 NEW PROGRAM liugx * REPORT zsdr064. INCLUDE zsdr064top. INCLUDE zsdr064screen. INCLUDE zsdr064sub. INITIALIZATION. texta = '參數選擇'. text_a1 = '導入文件'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. CALL FUNCTION 'F4_FILENAME' EXPORTING field_name = 'P_FILE' IMPORTING file_name = p_file. START-OF-SELECTION. IF p_file IS INITIAL. MESSAGE '文件路徑不能爲空!' TYPE 'E'. ELSE. PERFORM frm_import_data. ENDIF. *&---------------------------------------------------------------------* *& 包含 ZSDR064TOP *&---------------------------------------------------------------------* DATA: wa_header TYPE cmds_ei_header, wa_central_data TYPE cmds_ei_vmd_central_data, wa_central_datax TYPE cmds_ei_vmd_central_data_xflag, wa_address TYPE bapiad1vl, wa_addressx TYPE bapiad1vlx, wa_tax_ind_st TYPE cmds_ei_tax_ind, wa_tax_ind TYPE cmds_ei_cmd_tax_ind, wa_bankdetail_st TYPE cvis_ei_cvi_bankdetail, wa_bankdetail TYPE cvis_ei_bankdetail, wa_company_code_st TYPE cmds_ei_company, wa_company_code TYPE cmds_ei_cmd_company, wa_functions_st TYPE cmds_ei_functions, wa_functions_t TYPE cmds_ei_functions_t, wa_functions TYPE cmds_ei_cmd_functions, wa_sales_data_st TYPE cmds_ei_sales, wa_sales_data TYPE cmds_ei_cmd_sales, wa_customer TYPE cmds_ei_extern, wa_customers TYPE cmds_ei_main, wa_correct TYPE cmds_ei_main, wa_defective TYPE cmds_ei_main, wa_mes_correct TYPE cvis_message, wa_mes_error TYPE cvis_message. CONSTANTS: c_update TYPE c VALUE 'M', c_insert TYPE c VALUE 'I'. *定義OLE變量 DATA:g_excel TYPE ole2_object, g_applica TYPE ole2_object, g_sheet TYPE ole2_object, g_cell TYPE ole2_object, g_workbook TYPE ole2_object. DATA:p_filepath TYPE string. DATA: it_raw TYPE truxs_t_text_data, BEGIN OF record OCCURS 0, vkorg TYPE vkorg,"銷售組織 name1 TYPE ad_name1,"名稱 region TYPE regio,"省份 street TYPE ad_street, "街道 收貨地址 house_num2 TYPE ad_hsnm2,"聯繫人 補充 str_suppl3 TYPE ad_strspp3,"電話 街道4 stkzu TYPE stkzu,"增票,普票 stceg TYPE stceg,"增值稅號 location TYPE ad_lctn,"開票地址 街道5 city2 TYPE ad_city2,"開票電話 區域 banka TYPE banka,"開戶銀行及賬號 END OF record. DATA:it005u LIKE TABLE OF t005u WITH HEADER LINE, itvkwz LIKE TABLE OF tvkwz WITH HEADER LINE. *&---------------------------------------------------------------------* *& 包含 ZSDR064SCREEN *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE texta . SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (10) text_a1. SELECTION-SCREEN POSITION 18. PARAMETERS: p_file TYPE rlgrap-filename. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b1. *&---------------------------------------------------------------------* *& 包含 ZSDR064SUB *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_IMPORT_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_import_data . DATA: it_raw TYPE truxs_t_text_data. DATA:messtab LIKE TABLE OF bdcmsgcoll WITH HEADER LINE, subrc TYPE syst-subrc. CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' EXPORTING * I_FIELD_SEPERATOR = i_line_header = 'X' i_tab_raw_data = it_raw i_filename = p_file TABLES i_tab_converted_data = record[] * EXCEPTIONS * CONVERSION_FAILED = 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. SELECT * INTO CORRESPONDING FIELDS OF TABLE it005u FROM t005u WHERE spras = 1 AND land1 = 'CN'. * A "customer" is made up of 4 Main Sections * 1. HEADER * 2. CENTRAL_DATA * 3. COMPANY_DATA * 4 SALES_DATA DATA:bapiret2 LIKE TABLE OF bapiret2 WITH HEADER LINE. CLEAR bapiret2[]. DATA:kunnr TYPE kunnr. DATA:bapiret2_t TYPE bapiret2_t. LOOP AT record. CONDENSE record-name1 NO-GAPS. CONDENSE record-region NO-GAPS. CONDENSE record-house_num2 NO-GAPS. CONDENSE record-str_suppl3 NO-GAPS. CONDENSE record-street NO-GAPS. CONDENSE record-vkorg NO-GAPS. CONDENSE record-stkzu NO-GAPS. CONDENSE record-stceg NO-GAPS. CONDENSE record-location NO-GAPS. CONDENSE record-city2 NO-GAPS. CONDENSE record-banka NO-GAPS. CLEAR: wa_customer,wa_customers, wa_company_code_st, wa_sales_data_st. "判斷客戶是否存在,若是存在,則不擴充 SELECT SINGLE kunnr INTO kunnr FROM kna1 WHERE name1 = record-name1. IF sy-subrc = 0. CLEAR bapiret2. bapiret2-type = 'A'. CONCATENATE '客戶已經存在!編號爲:' kunnr INTO bapiret2-message. APPEND bapiret2. CONTINUE. ENDIF. PERFORM import_center_data . PERFORM import_company_data. PERFORM import_sales_data. * wa_customer-header-object_instance-kunnr = ''. wa_customer-header-object_task = c_insert. CLEAR:wa_customer-company_data,wa_customer-sales_data. wa_customer-company_data = wa_company_code. wa_customer-sales_data = wa_sales_data. APPEND wa_customer TO wa_customers-customers. CALL METHOD cmd_ei_api=>maintain_bapi EXPORTING iv_collect_messages = 'X' is_master_data = wa_customers IMPORTING es_master_data_correct = wa_correct es_message_correct = wa_mes_correct es_master_data_defective = wa_defective es_message_defective = wa_mes_error. IF wa_mes_error-is_error IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. LOOP AT wa_correct-customers INTO wa_customer. wa_header = wa_customer-header. CLEAR bapiret2. bapiret2-type = 'S'. CONCATENATE '導入成功,客戶編碼:'wa_header-object_instance INTO bapiret2-message. APPEND bapiret2. ENDLOOP. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT wa_mes_error-messages INTO bapiret2 . APPEND bapiret2. ENDLOOP. ENDIF. ENDLOOP. CALL FUNCTION 'Z_DISP_BAPILOG' EXPORTING p_title = '導入結果查看' TABLES return = bapiret2. ENDFORM. " FRM_IMPORT_DATA *&---------------------------------------------------------------------* *& Form FRM_BANK_CREATE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_bank_create CHANGING bank_key TYPE bapi1011_key-bank_key. DATA:address TYPE bapi1011_address . address-bank_name = record-banka. "從bnka裏取最大的銀行代碼 BANKL 100000001 SELECT MAX( bankl ) INTO bank_key FROM bnka WHERE banks = 'CN' AND bankl BETWEEN 'I100000001' AND 'I199999999'. IF bank_key IS INITIAL . bank_key = 'I100000001'. ENDIF. DATA:i_key TYPE i. i_key = bank_key+1(10) + 1."加1 bank_key = i_key. CONCATENATE 'I' bank_key INTO bank_key. CONDENSE bank_key NO-GAPS. CALL FUNCTION 'BAPI_BANK_CREATE' EXPORTING bank_ctry = 'CN' bank_key = bank_key bank_address = address * BANK_METHOD = * BANK_FORMATTING = * BANK_ADDRESS1 = * I_XUPDATE = 'X' * I_CHECK_BEFORE_SAVE = * IMPORTING * RETURN = * BANKCOUNTRY = * BANKKEY = . IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. ENDIF. ENDFORM. " FRM_BANK_CREATE *&---------------------------------------------------------------------* *& Form IMPORT_CENTER_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM import_center_data . wa_address-title = '0003'. wa_address-name = record-name1. wa_address-city = record-region. "城市 wa_address-postl_cod1 = '999999'. wa_address-street = record-street."街道 wa_address-house_no2 = record-house_num2."收貨人 wa_address-str_suppl3 = record-str_suppl3."電話 wa_address-district = record-city2."開票電話 wa_address-location = record-location."開票地址 wa_address-country = 'CN'. wa_address-langu = 'ZH'. READ TABLE it005u WITH KEY bezei = record-region. IF sy-subrc = 0. wa_address-region = it005u-bland. ENDIF. "wa_address-region = '010'."地區 wa_address-sort1 = record-name1."搜素 * wa_address-sort2 = ''. * wa_address-taxjurcode = 'FL0000000'. wa_address-time_zone = 'UTC+8'. * Assign address data directly wa_customer-central_data-address-postal-data = wa_address. wa_customer-central_data-address-postal-datax = wa_addressx. * Account account group directly wa_customer-central_data-central-data-ktokd = '1000'."客戶組 IF record-stkzu = '增'. wa_customer-central_data-central-data-stkzu = 'X'."增值稅標識 ENDIF. wa_customer-central_data-central-data-stceg = record-stceg."增值稅號 * wa_customer-central_data-central-datax-ktokd = 'X'. DATA:bankl TYPE bankl. PERFORM frm_bank_create CHANGING bankl. ***銀行代碼必須存在,用BAPI_BANK_CREATE 建立 CLEAR:wa_customer-central_data-bankdetail,wa_bankdetail-bankdetails. wa_bankdetail_st-task = c_insert. wa_bankdetail_st-data_key-banks = 'CN'."國家 wa_bankdetail_st-data_key-bankl = bankl."銀行代碼 wa_bankdetail_st-data_key-bankn = record-banka."銀行 APPEND wa_bankdetail_st TO wa_bankdetail-bankdetails. wa_customer-central_data-bankdetail = wa_bankdetail. ***稅 CLEAR wa_tax_ind-tax_ind. wa_tax_ind_st-task = c_insert. wa_tax_ind_st-data_key-aland = 'CN'. wa_tax_ind_st-data_key-tatyp = 'MWST'. wa_tax_ind_st-data-taxkd = '1'."必須上稅 APPEND wa_tax_ind_st TO wa_tax_ind-tax_ind. wa_customer-central_data-tax_ind = wa_tax_ind. ENDFORM. " IMPORT_CENTER_DATA *&---------------------------------------------------------------------* *& Form IMPORT_COMPANY_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM import_company_data . CLEAR wa_company_code-company. wa_company_code_st-task = c_insert. "wa_company_code_st-data_key-bukrs = record-vkorg. SELECT SINGLE bukrs INTO wa_company_code_st-data_key-bukrs FROM tvko WHERE vkorg = record-vkorg. "wa_company_code_st-data-zuawa = '009'."排序碼 wa_company_code_st-data-akont = '1122020001'. * wa_company_code_st-data-zwels = 'ACDETY'. wa_company_code_st-data-zterm = '0004'. * wa_company_code_st-data-zgrup = '02'. * wa_company_code_st-data-xausz = '2'. * wa_company_code_st-data-xzver = 'X'. APPEND wa_company_code_st TO wa_company_code-company. ENDFORM. " IMPORT_COMPANY_DATA *&---------------------------------------------------------------------* *& Form IMPORT_SALES_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM import_sales_data . CLEAR wa_sales_data-sales. wa_sales_data_st-task = c_insert. wa_sales_data_st-data_key-vkorg = record-vkorg. wa_sales_data_st-data_key-vtweg = '99'. wa_sales_data_st-data_key-spart = '99'. wa_sales_data_st-data-kalks = '1'."客戶訂價過程 wa_sales_data_st-data-awahr = '100'."訂單可能性 wa_sales_data_st-data-inco1 = 'FOB'."國際貿易條 wa_sales_data_st-data-inco2 = '北京'. wa_sales_data_st-data-antlf = '9'."最大交貨 wa_sales_data_st-data-kzazu = 'X'. wa_sales_data_st-data-vsbed = '10'."裝運條件 wa_sales_data_st-data-waers = 'RMB'. wa_sales_data_st-data-ktgrd = '02'."賬戶分配組 wa_sales_data_st-data-zterm = '0004'."付款條件 wa_sales_data_st-data-versg = 1."客戶統計組 wa_sales_data_st-data-kdgrp = '23'."客戶組 SELECT SINGLE bzirk INTO wa_sales_data_st-data-bzirk FROM zxd01_regio WHERE regio = wa_address-region. "wa_sales_data_st-data-bzirk = '1400'."銷售地區 wa_sales_data_st-data-konda = '10'."價格組 SELECT SINGLE werks INTO wa_sales_data_st-data-vwerk FROM tvkwz WHERE vtweg = '99' AND vkorg = record-vkorg. * wa_sales_data_st-data-vwerk = 8800."交貨工廠 ***合做夥伴 CLEAR:wa_functions_t,wa_functions-functions. wa_functions_st-task = c_insert. wa_functions_st-data_key-parvw = 'AG'. wa_functions_st-data_key-parza = '000'. APPEND wa_functions_st TO wa_functions_t. wa_functions-functions = wa_functions_t. wa_functions_st-task = c_insert. wa_functions_st-data_key-parvw = 'RE'. wa_functions_st-data_key-parza = '000'. APPEND wa_functions_st TO wa_functions_t. wa_functions-functions = wa_functions_t. wa_functions_st-task = c_insert. wa_functions_st-data_key-parvw = 'RG'. wa_functions_st-data_key-parza = '000'. APPEND wa_functions_st TO wa_functions_t. wa_functions-functions = wa_functions_t. wa_functions_st-task = c_insert. wa_functions_st-data_key-parvw = 'WE'. wa_functions_st-data_key-parza = '000'. APPEND wa_functions_st TO wa_functions_t. wa_functions-functions = wa_functions_t. wa_sales_data_st-functions = wa_functions. APPEND wa_sales_data_st TO wa_sales_data-sales. ENDFORM. " IMPORT_SALES_DATA