BP 创建/修改 供应商和客户

这个BAPI 可以用来创建/修改 供应商和客户。
本篇文章只写了导入供应商的部分,客户也可以通过这个bapi导入的,但是请自行更改使用。
这个bapi比 cmd_ei_api =>maintain_bapi和VMD_EI_API好用一些。
你也可以SE37看到这个bapi里面涉及到很多表。你想导入数据的字段,就可以在这些表里面寻找。一定要根据要导入的数据来设计这个导入程序。

RFC_CVI_EI_INBOUND_MAIN

TABLES:sscrfields.

TYPE-POOLS:truxs,icon,slis.

*INCLUDE BDCRECX1_S.
************************************************************************
* GLOBAL STRUCTURES
************************************************************************

TYPES: BEGIN OF ty_out,
         bu_group(4),                          "BP01
         partner(10),                          "供应商代码-自动创建
         name_org1(40),                        "名称1
         name_org2(40),                        "名称2(联系人)
         bu_sort1(20),                         "检索项:测试客户-wtx
         street(60),                           "地址:街道名称-客户测试
         post_code1(10),                       "邮政编码:311107
         city1(40),                            "城市:杭州
         land1(3),                             "国家:CN  中国
         regio(3),                             "地区
         langu(2),                             "语言:ZH 中文
*         name_co(40),                          "联系人
         tel_number(30),                       "电话:0571-86397805
         tel_extens(10),                       "电话-分机
         mob_number(30),                       "移动电话:159581640000
         fax_number(30),                       "传真
         fax_extens(10),                       "传真-分机
         smtp_addr(241),                       "E-mail:494066891@qq.com
         taxnum(20),                           "业务伙伴税号

         bukrs(4),                             "公司代码
         akont(10),                            "统驭科目:
         zuawa(3),                             "排序码(3):
         zterm(4),                             "付款条件:

         reprf(1), "双重发票校验
         bank_land(3),                         "银行国家
         bank_id(15),                        "银行代码
         bank_no(40),                          "银行账号:
         BUTOBK_BKREF(40),                        "参考明细
*         bkont           TYPE bu_bkont, "银行控制码
         bank_name(60),                            "银行名称
         koinh(60),                            "账户持有人:
         ekorg(4),                             "采购组织:1020 单泵
         waers(5),                             "币种:CNY  中国人民币;
         zterm2(4),                            "默认付款条件

         webre(1),"基于收货的发票校验
         dzwels(10),                           "付款方式
         kalsk(2), "方案组
         titleletter(50),       "问候
         statu1          TYPE iconname, "基本数据的状态
         statu2          TYPE iconname, "公司代码的状态
         statu3          TYPE iconname, "银行数据的状态
         statu4          TYPE iconname, "采购数据的状态
         message1(100),"基本数据的消息
         ZCUOWU    TYPE C, "错误
         message2(100),"公司代码的消息
         message3(100),"银行数据的消息
         message4(100),"采购数据的消息
         SEL TYPE C,
       END OF ty_out.

************************************************************************
* INTERNAL TABLES
************************************************************************
*----------数据存储表----------
DATA: gt_out TYPE TABLE OF ty_out,
      gs_out TYPE ty_out.

*"------------ALV-----------------
DATA: gt_fieldcat TYPE lvc_t_fcat, "字段目录
      gs_fieldcat LIKE LINE OF gt_fieldcat,
      gs_layout   TYPE lvc_s_layo.

*---------------信用段数据-----------------------------------*
DATA: return TYPE ukm_t_monitor_return.


SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-001.
PARAMETERS: cb_up RADIOBUTTON GROUP grp3 DEFAULT 'X' USER-COMMAND com1 .
PARAMETERS: cb_down RADIOBUTTON GROUP grp3 .
SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_file TYPE rlgrap-filename MODIF ID mg1 MEMORY ID me2 . " 导入文件下载模板
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN: FUNCTION KEY 1 .
*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化                                     *
*&---------------------------------------------------------------------*
INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.
*&---控制选择条件显示设置M1
  LOOP AT SCREEN.
    IF screen-group1 = 'MG1' .
*&---下载模板隐藏
      IF cb_down = abap_true.
        screen-active = 0.
      ENDIF.
*&---上传文件显示
      IF cb_up = abap_true .
        screen-active = 1.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
*&---文件路径搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_get_filename.

*&---------------------------------------------------------------------*
*& FORM FRM_GET_FILENAME
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  CB_CENTR        TEXT
*& <--  CB_BANK        TEXT
*&---------------------------------------------------------------------*
FORM frm_get_filename .

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_file
      mask             = '*.*,*.*,*.XLS,*.XLS,*.XLSX,*.XLSX.' "DEF_PATH = 'C:\'
*     MASK             = '*.TXT,*.TXT.' "DEF_PATH = 'C:\'
      mode             = 'O'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form EXCEL_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM excel_create .
*&---------------------------------------------------------------------*
*& FORM FRM_DOWN_LOAD
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  CB_CENTR        TEXT
*& <--  CB_BANK        TEXT
*&---------------------------------------------------------------------*
*FORM frm_down_load .

*&---变量定义
  DATA: lv_text       TYPE string,                    "MESSAGE
        lv_filename   TYPE string,                    "DOWNLOAD FILE NAME
        lv_path       TYPE string,                    "DOWNLOAD FILE PATH
        ls_functxt    TYPE smp_dyntxt,                "MENU NAME
        lv_filepath   TYPE rlgrap-filename VALUE 'C', "FILE PATCH
        lv_mod(20)    TYPE c VALUE 'ZMB_MMB023',         "MODEL
        lv_fullpath   TYPE string,                    "FULL PATH
        ls_object     TYPE wwwdatatab,                "OBJECT NAME
        lv_rc         TYPE sy-subrc,                  "RETURN CODE
        lv_title      TYPE string VALUE '保存',    "TITLE
        lv_title_name TYPE string VALUE '供应商主数据导入模板'.       "TITLE NAME


*&---调用OS 操作系统对话框
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title              = lv_title
      default_extension         = 'XLSX'
      default_file_name         = lv_title_name
    " WITH_ENCODING             =
      file_filter               = 'EXCEL文件(*.XLS)|*.XLS|全部文件 (*.*)|*.*|'
      initial_directory         = 'D:\'
      prompt_on_overwrite       = 'X'
    CHANGING
      filename                  = lv_filename  "默认文件名称
      path                      = lv_path   "文件路径
      fullpath                  = lv_fullpath  "文件路径
    " USER_ACTION               =
    " FILE_ENCODING             =
    EXCEPTIONS
      cntl_error                = 1
      error_no_gui              = 2
      not_supported_by_gui      = 3
      invalid_default_file_name = 4
      OTHERS                    = 5.
  IF sy-subrc <> 0.
*   IMPLEMENT SUITABLE ERROR HANDLING HERE
  ENDIF.
*&---操作系统文件路径
  CONCATENATE lv_path
  lv_filename
  '.XLSX'
  INTO lv_filepath.
*&---OS长度控制/*&---下载模板
  IF strlen( lv_filepath ) <> 5.
*&---查询模板.
    SELECT SINGLE
      relid objid
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_object
    WHERE srtf2 = '0'
      AND objid = lv_mod.                         "SMW0里对象名称
    IF sy-subrc <> 0 OR ls_object-objid = space .
      CONCATENATE '模板文件'"'模板文件:'
      lv_mod
      '不存在,请用smw0进行加载'"'不存在,请用SMW0进行加载.'
      INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.
*&---下载模板
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = ls_object
        destination = lv_filepath
      IMPORTING
        rc          = lv_rc.
    IF lv_rc <> 0.
      CONCATENATE TEXT-911"''模板文件:'
      lv_mod
      '下载失败,请与开发人员联系'"''下载失败,请与开发人员联系.'
      INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.
*&---'已下载'
    MESSAGE '已下载' TYPE 'S'.
  ELSE.
*&---'已取消下载'
    MESSAGE '已取消下载' TYPE 'S'.
  ENDIF.

ENDFORM.

*************************************************************************
**EVENT  START-OF-SELECTION.
*************************************************************************
START-OF-SELECTION.

  IF cb_down EQ 'X'.
    PERFORM excel_create.      "下载模板
    LEAVE LIST-PROCESSING.
  ENDIF.

  " PERFORM check_file .        "检查上传文件的格式
  PERFORM upload_document .   "进行文档上传

*************************************************************************
**EVENT  END-OF-SELECTION
*************************************************************************
END-OF-SELECTION.
  PERFORM frm_output. "导入消息输出
*************************************************************************
**EVENT  END-OF PAGE
*************************************************************************
END-OF-PAGE.

*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_output ."输出
  PERFORM form_fieldcat."列格式
  PERFORM form_layout.  "布局设置
  PERFORM form_showdata.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FORM_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_fieldcat ."列格式 传的参数参

  PERFORM frm_get_fieldcat USING:


   'STATU1' '处理数据状态'  '' '' ,
    'MESSAGE1' '导入数据消息'    '' '' ,
  'BU_GROUP' '分组'   '' '' ,
  'PARTNER' '供应商编号'    '' '' ,
  'NAME_ORG1' '名称1'    '' '' ,
  'NAME_ORG2' '联系人'   '' '' ,
  'BU_SORT1' '检索项'   '' '' ,
  'STREET' '地址街道'   '' '' ,
  'POST_CODE1' '邮政编码'   '' '' ,
  'CITY1' '城市'   '' '' ,
  'LAND1' '国家'   '' '' ,
  'REGIO' '地区'    '' '' ,
  'LANGU' '语言'    '' '' ,
  'TEL_NUMBER' '电话'    '' '' ,
  'TEL_EXTENS' '电话-分机'    '' '' ,
  'MOB_NUMBER' '移动电话'   '' '' ,
  'FAX_NUMBER' '传真'    '' '' ,
  'FAX_EXTENS' '传真-分机'    '' '' ,
  'SMTP_ADDR' 'E-mail'    '' '' ,
  'TAXNUM' '税号'    '' '' ,
  "'TITLELETTER' '问候'   '' '' ,

  "'STATU2' '公司状态'    '' '' ,
  'BUKRS' '公司代码'    '' '' ,
  'AKONT' '统驭科目'    '' '' ,
  'ZUAWA' '排序码'   '' '' ,
  'ZTERM' '付款条件'   '' '' ,
*  'DZWELS' '付款方式'
  'REPRF' '双重发票校验'    '' '' ,
*  'MESSAGE2' '公司消息'    '' '' ,
 " 'STATU3' '银行状态'    '' '' ,
  'BANK_LAND' '银行国家'    '' '' ,
  'BANK_ID' '银行代码'    '' '' ,
  'BANK_NO' '银行账号'    '' '' ,
  'BUTOBK_BKREF'    '参考明细'   '' '' ,

  'BANK_NAME' '银行名称'   '' '' ,
  'KOINH' '账户持有人'    '' '' ,
*  'MESSAGE3' '银行消息'    '' '' ,
 " 'STATU4' '采购状态'   '' '' ,
  'EKORG' '采购组织'   '' '' ,
  'WAERS' '货币码'   '' '' ,
  'ZTERM2' '采购付款条件'   '' '' ,
  'WEBRE' '发票校验'   '' '' .
*  'MESSAGE4' '采购消息'   '' '' .

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->pv_fieldname   text
*      -->pv_coltext   text
*      -->pv_ref_table   text
*      -->pv_ref_table   text
*----------------------------------------------------------------------*
FORM frm_get_fieldcat USING "列格式 传参形式
      pv_fieldname  TYPE any
      pv_coltext    TYPE any
      pv_ref_table  TYPE any
      pv_ref_field  TYPE any.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = pv_fieldname.
  gs_fieldcat-coltext = pv_coltext.
  gs_fieldcat-scrtext_l = pv_coltext.
  gs_fieldcat-ref_table = pv_ref_table.
  gs_fieldcat-ref_field = pv_ref_field.

  APPEND gs_fieldcat TO gt_fieldcat.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FORM_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_layout ."布局设置
  gs_layout-cwidth_opt = 'X'.
  gs_layout-zebra      = 'X'.
  gs_layout-box_fname  = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form OPEN_DIALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM open_dialog .
  DATA:lt_file_table TYPE filetable.
  DATA:ls_file_table TYPE file_table.
  DATA:l_rc TYPE i.

  DATA: lv_filter   TYPE string.

  lv_filter = 'ALL FILES (*.*)|*.*|EXCEL FILES (*.XLS)|*.XLS|WORD FILES(*.DOC)|*.DOC'.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '选择文件'
      default_filename        = '*.XLSX'  "默认excel文件"
      initial_directory       = 'D:\ '  "默认打开D盘,也可以默认空"
      multiselection          = ''   "文件单选"
    CHANGING
      file_table              = lt_file_table
      rc                      = l_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ELSE.
    "选择文件框的赋值 将选择的文件地址写入到地址栏"
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    IF sy-subrc = 0.
      p_file =  ls_file_table-filename.
      REFRESH : lt_file_table.
      CLEAR:ls_file_table.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_file .
  DATA: lv_s1 TYPE string,
        lv_s2 TYPE string.

  IF p_file IS NOT INITIAL.
    SPLIT p_file AT '.' INTO lv_s1 lv_s2.
    TRANSLATE lv_s2 TO UPPER CASE.
    IF lv_s2 <> 'XLS' AND lv_s2 <> 'XLSX' AND lv_s2 <> 'TXT'.
      MESSAGE '文件格式不对!' TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE  LIST-PROCESSING.
    ENDIF.
  ELSE.
    MESSAGE '文件名不能为空!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE  LIST-PROCESSING.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DOCUMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM upload_document .

  "定义表格结构内表。"
  DATA: lt_excel TYPE TABLE OF zalsmex_tabline, "表格结构。"
        ls_excel TYPE zalsmex_tabline.

  "ALSMEX_TABLINE是具有Excel数据的表行,有三个组件,row col value 。"

  DATA:get_file TYPE rlgrap-filename."这里参照系统中的结构字段。"
  MOVE p_file TO get_file."将地址栏的值赋值给GET_FILE"


  "调用此函数,将Excel中的内容以类似坐标的形式存储到LT_EXCEL内表中。"
  "使用ALSM_EXCEL_TO_INTERNAL_TABLE函数导入数据,一个excel文件最大行数只可为9999,如果超出是无法全部读入内表中的,会丢失其余行。
   “这个函数可以用:ALSM_EXCEL_TO_INTERNAL_TABLE 替代
  call function 'ZALSM_EXCEL_TO_INTERNAL_TABLE'     
    EXPORTING
      filename                = get_file
      i_begin_col             = 1
      i_begin_row             = 3
      i_end_col               = 75
      i_end_row               = 65535
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  DELETE lt_excel WHERE row = 1."删除第一行抬头。如果excel文件中不存在抬头的话,可不写此句。"

  IF lt_excel IS INITIAL.
    CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
      EXPORTING
*       DEFAULTOPTION = 'Y'
        diagnosetext1 = '数据错误'
*       DIAGNOSETEXT2 = ' '
*       DIAGNOSETEXT3 = ' '
        textline1     = 'Excel表格中没有内容!'
        titel         = '提示'.
    RETURN.
  ENDIF.

  CLEAR:gt_out.
  FIELD-SYMBOLS:<fs>.
  SORT lt_excel BY row col.
  DATA:num_col TYPE i.

  "将转换后的EXCEL内表中数据按照导入模板顺序依次放入内表,
  "故应将EXCEL模板顺序和内表顺序保持一致
  LOOP AT lt_excel INTO ls_excel.
    num_col = ls_excel-col.
    ASSIGN COMPONENT  num_col  OF STRUCTURE gs_out TO <fs>.
    <fs> = ls_excel-value.
    AT END OF row.

      APPEND gs_out TO gt_out.
      CLEAR:gs_out.
    ENDAT.
    CLEAR:ls_excel.
  ENDLOOP.


*付款条件
  SELECT
        SPRAS,
        zterm
        INTO TABLE  @DATA(gt_fktj)  " 付款条件
        FROM  t052u
        WHERE  spras  = '1'.  

  SELECT
        PARTNER,
        taxnum,
        taxnumXL
         INTO TABLE @DATA(GT_SHUIH)
        FROM DFKKBPTAXNUM
        WHERE TAXTYPE = 'CN5' OR TAXTYPE = 'CN0' .




    LOOP AT gt_out  INTO  gs_out .

*是否要给号
      IF gs_out-bu_group  =  'C009' OR  gs_out-bu_group  =  'C010' .   "这个分组各个公司都不一样
        IF  gs_out-partner  =  ''.
          gs_out-zcuowu  = 'X'.
          gs_out-message1 =  '此分组需要给定供应商编号'.
        ENDIF.
      ENDIF.

*税号是否存在
      IF  gs_out-taxnum NE ''.
       READ TABLE  GT_SHUIH INTO DATA(GS_SHUIH) WITH KEY taxnumXL  = gs_out-taxnum.
        IF sy-subrc EQ 0.
          gs_out-message1  =   gs_out-message1 &&  '相同税号已经存在,只能修改。'.
         " gs_out-zcuowu  = 'X'.
          gs_out-partner = GS_SHUIH-partner.
        ENDIF.
        CLEAR GS_SHUIH.

        READ TABLE  GT_SHUIH INTO DATA(GS_SHUIH2) WITH KEY taxnum  = gs_out-taxnum.
        IF sy-subrc EQ 0.
          gs_out-message1  =   gs_out-message1 &&  '相同税号已经存在,只能修改。'.
         " gs_out-zcuowu  = 'X'.
          gs_out-partner = GS_SHUIH2-partner.
        ENDIF.
        CLEAR GS_SHUIH2.



      ELSE.
        gs_out-message1  =   gs_out-message1 &&  '税号不能为空!'.
        gs_out-zcuowu  = 'X'.
      ENDIF.


"付款条款的检查
      IF  gs_out-zterm NE ''  .
        READ TABLE  gt_fktj  INTO DATA(gs_fktj)  WITH KEY zterm  = gs_out-zterm.
        IF sy-subrc <> 0.
          gs_out-message1  =   gs_out-message1 &&  '付款条款不存在!'.
             gs_out-zcuowu  = 'X'.
        ENDIF.
        CLEAR :gs_fktj.
      ENDIF.

      IF  gs_out-zterm2 NE ''  .
        READ TABLE  gt_fktj  INTO DATA(gs_fktj2)  WITH KEY zterm  = gs_out-zterm2.
        IF sy-subrc <> 0.
          gs_out-message1  =   gs_out-message1 &&  '付款条款不存在!'.
          gs_out-zcuowu  = 'X'.
        ENDIF.
        CLEAR :gs_fktj2.
      ENDIF.


* 分组检查-----
      IF gs_out-bu_group =  'C001'  ."分组有需要调整哟
      ELSE.
         gs_out-message1  =   gs_out-message1 &&  '分组不存在!'.
          gs_out-zcuowu  = 'X'.
      ENDIF.


      MODIFY gt_out FROM gs_out.
      CLEAR gs_out .
    ENDLOOP.


ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FORM_SHOWDATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_showdata .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout_lvc            = gs_layout
      i_save                   = 'A'
      it_fieldcat_lvc          = gt_fieldcat[]
      i_callback_pf_status_set = 'FRM_SET_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
    TABLES
      t_outtab                 = gt_out
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  FRM_SET_STATUS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->RT_EXTAB   TEXT
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' .
ENDFORM. "FRM_SET_STATUS
*---------------------------------------------------------------------*
*       FORM USER_COMMAND                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*--------------------------------------------------------------------*
*  -->  R_UCOMM                                                       *
*  -->  RS_SELFIELD                                                   *
*---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
      rs_selfield TYPE slis_selfield.

  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.
  rs_selfield-refresh = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.

  CASE r_ucomm.
     WHEN '&IC1' . "双击事件
      IF rs_selfield-value IS INITIAL."值不为空
        r_ucomm = '&ETA'.
      ENDIF.
      CHECK rs_selfield-value IS NOT INITIAL.
      READ TABLE gt_out INTO gs_out  INDEX rs_selfield-tabindex.

      CASE rs_selfield-fieldname.
        WHEN 'PARTNER'. "
           CHECK gS_out-partner IS NOT INITIAL.
      SET PARAMETER ID 'BPA' FIELD gS_out-partner.
      CALL TRANSACTION 'BP' AND SKIP FIRST SCREEN.

        WHEN OTHERS.
          r_ucomm = '&ETA'.
      ENDCASE.
    CLEAR gs_out.

    WHEN 'ZIMPORT'.
      PERFORM badi_daoru.
      CALL METHOD lr_grid->refresh_table_display.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form BADI_DAORU
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM badi_daoru .


  DATA:ls_cvis_bp_general           TYPE cvis_bp_general,
       lt_cvis_bp_general           LIKE TABLE OF ls_cvis_bp_general, "一般数据

       ls_cvis_bp_role              TYPE cvis_bp_role,
       lt_cvis_bp_role              LIKE TABLE OF cvis_bp_role, "角色

       ls_cvis_bp_bank_details      TYPE    cvis_bp_bank_details, "
       lt_cvis_bp_bank_details      LIKE TABLE OF cvis_bp_bank_details, "银行

       ls_cvis_bp_tax_number        TYPE cvis_bp_tax_number,
       lt_cvis_bp_tax_number        LIKE TABLE OF ls_cvis_bp_tax_number,

       ls_cvis_bp_address           TYPE cvis_bp_address,
       lt_cvis_bp_address           LIKE TABLE OF ls_cvis_bp_address,

       ls_cvis_bp_address_teleno    TYPE cvis_bp_address_teleno, "电话号码
       lt_cvis_bp_address_teleno    LIKE TABLE OF ls_cvis_bp_address_teleno,

       ls_cvis_bp_address_faxno     TYPE cvis_bp_address_faxno,
       lt_cvis_bp_address_faxno     LIKE TABLE OF ls_cvis_bp_address_faxno, "传真号码

       ls_cvis_bp_address_email     TYPE cvis_bp_address_email,
       lt_cvis_bp_address_email     LIKE TABLE OF ls_cvis_bp_address_email, "邮箱号码


       ls_cvis_bp_return            TYPE cvis_bp_return,
       lt_cvis_bp_return            LIKE  TABLE OF cvis_bp_return,


       ls_cvis_supplier_general     TYPE cvis_supplier_general,
       lt_cvis_supplier_general     TYPE  TABLE OF    cvis_supplier_general,

       ls_cvis_supplier_company     TYPE cvis_supplier_company,
       lt_cvis_supplier_company     LIKE TABLE OF cvis_supplier_company,

       ls_cvis_supplier_purchasing  TYPE cvis_supplier_purchasing,
       lt_cvis_supplier_purchasing  LIKE TABLE OF cvis_supplier_purchasing, "采购视图

       ls_cvis_supplier_purchasing2 TYPE cvis_supplier_purchasing2,
       lt_cvis_supplier_purchasing2 LIKE TABLE OF cvis_supplier_purchasing2, "采购视图

       ls_sup_purch_functions       TYPE cvis_supplier_purch_func,
       lt_sup_purch_functions       LIKE TABLE OF cvis_supplier_purch_func,

       is_supplier_contacts         TYPE cvis_supplier_contacts,
       it_supplier_contacts         LIKE TABLE OF cvis_supplier_contacts,

       is_sup_cont_address1         TYPE cvis_supp_cont_address1,
       it_sup_cont_address1         LIKE  TABLE OF cvis_supp_cont_address1,

       is_sup_cont_teleno1          TYPE cvis_supp_cont_teleno1,
       it_sup_cont_teleno1          LIKE  TABLE OF cvis_supp_cont_teleno1,

       is_sup_cont_fax1             TYPE  cvis_supp_cont_fax1,
       it_sup_cont_fax1             LIKE TABLE OF cvis_supp_cont_fax1,

       is_sup_cont_email1           TYPE cvis_supp_cont_email1,
       it_sup_cont_email1           LIKE TABLE OF cvis_supp_cont_email1,




       lv_bpartner                  TYPE bu_partner,
       ls_tb003i                    TYPE tb003i,
       lt_tb003i                    LIKE TABLE OF ls_tb003i,
       lv_guid                      TYPE but000-partner_guid,
       lv_object_task               TYPE bus_ei_object_task, "I为创建,U修改
       lv_bkvid                     TYPE bu_bkvid,
       lv_index                     TYPE sy-tabix,
       lv_category                  TYPE bu_id_category,
       lv_bezei                     TYPE bezei20,
       lv_run_id                    TYPE cvi_run_id,
       lv_lines                     TYPE i.

*长文本参数
  DATA:ls_line  TYPE tline,
       lt_line  TYPE TABLE OF tline,
       ls_thead TYPE thead-tdname.

  DATA:ls_strlen TYPE i,
       lv_strlen TYPE i,
       i_subruc  TYPE i.

*  CLEAR ls_header.
  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_partner>) WHERE sel = 'X'   AND zcuowu = ''.

    "  PERFORM frm_partner_alpha_input CHANGING <fs_partner>-partner.  "业务伙伴加零

    IF <fs_partner>-partner IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <fs_partner>-partner
        IMPORTING
          output = <fs_partner>-partner.
    ENDIF.


*统驭科目:加零
    IF <fs_partner>-akont IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <fs_partner>-akont
        IMPORTING
          output = <fs_partner>-akont.
    ENDIF.

*语言
    IF <fs_partner>-langu IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
        EXPORTING
          input            = <fs_partner>-langu
        IMPORTING
          output           = <fs_partner>-langu     "语言
        EXCEPTIONS
          unknown_language = 1
          OTHERS           = 2.
      IF sy-subrc <> 0.
        "Implement suitable error handling here
      ENDIF.
    ENDIF.

*查业务伙伴是否存在
    CLEAR lv_guid.
    SELECT SINGLE partner_guid INTO lv_guid
            FROM but000 WHERE partner = <fs_partner>-partner.

*判断是修改还是新建
      IF sy-subrc = 0.
        lv_object_task = 'U'.  "修改BP
        ls_cvis_bp_general-bpartnerguid = lv_guid.
      ELSE.
        lv_object_task = 'I'.  "创建BP

*lv_guid 是 BAPI 的 CHAR 32 格式业务伙伴地址的全局唯一标识
        CALL FUNCTION 'RS_DME_MG_GENERATE_GUID'
          IMPORTING
            e_guid_16 = lv_guid.
*          E_GUID_32       = ls_cvis_bp_general-bpartnerguid .

      ENDIF.
      ls_cvis_bp_general-object_task = lv_object_task.

*runid  区分用的
      IF lv_run_id IS INITIAL.
        lv_run_id = '2000000' .
      ELSE.
        lv_run_id = lv_run_id + 1.
      ENDIF.

* bp_general————————一般数据赋值——————————————————————————————————————
      ls_cvis_bp_general-run_id = lv_run_id.".'1000000'.
      ls_cvis_bp_general-category = '2'.



*业务分组
      IF <fs_partner>-bu_group NE ''  .
        ls_cvis_bp_general-grouping = <fs_partner>-bu_group. "业务合作伙伴组
      ELSE.
        ls_cvis_bp_general-grouping = '0001'. "业务合作伙伴组
      ENDIF.


*伙伴编码,名称

      ls_cvis_bp_general-bpartner = <fs_partner>-partner.

      ls_cvis_bp_general-name1 = <fs_partner>-name_org1."名称·1
      ls_cvis_bp_general-name2 = <fs_partner>-name_org2."名称2,联系人

*搜索项
      ls_cvis_bp_general-searchterm1 = <fs_partner>-bu_sort1.


      APPEND ls_cvis_bp_general TO lt_cvis_bp_general.
      CLEAR ls_cvis_bp_general.
*
**———————————————————————以上是一般数据的赋值———————————————————————————————————————————————





*——ls_cvis_bp_address——————————————BP Address Data——— 地址数据赋值—————————————————————————————————
      ls_cvis_bp_address-run_id    = lv_run_id. "
      ls_cvis_bp_address-guid    = lv_guid. "
      ls_cvis_bp_address-comm_type = 'INT'.
      ls_cvis_bp_address-langu = sy-langu.
      ls_cvis_bp_address-street =  <fs_partner>-street."街道

      IF <fs_partner>-post_code1 = ''.   "为空就填写888
        ls_cvis_bp_address-postl_cod1  =  '888888'.   
      ELSE.
      ls_cvis_bp_address-postl_cod1  =  <fs_partner>-post_code1."邮政编码
      ENDIF.

      ls_cvis_bp_address-city  =  <fs_partner>-city1.
      ls_cvis_bp_address-region = <fs_partner>-regio.
      ls_cvis_bp_address-country = <fs_partner>-land1.


      APPEND ls_cvis_bp_address TO lt_cvis_bp_address.
      CLEAR: ls_cvis_bp_address..

*电话号码
      ls_cvis_bp_address_teleno-run_id    = lv_run_id. "电话号码
      ls_cvis_bp_address_teleno-country   = <fs_partner>-land1.
      ls_cvis_bp_address_teleno-telephone = <fs_partner>-tel_number.       "电话
      ls_cvis_bp_address_teleno-extension = <fs_partner>-tel_extens.       "电话分机号
      APPEND ls_cvis_bp_address_teleno TO lt_cvis_bp_address_teleno .
      CLEAR ls_cvis_bp_address_teleno.

*移动电话
      IF <fs_partner>-mob_number IS NOT INITIAL.
        ls_cvis_bp_address_teleno-run_id    = lv_run_id. "电话号码
        ls_cvis_bp_address_teleno-country   = <fs_partner>-land1.
        ls_cvis_bp_address_teleno-telephone = <fs_partner>-mob_number.       "电话
        ls_cvis_bp_address_teleno-r_3_user  = '2'."是否移动电话
        APPEND ls_cvis_bp_address_teleno TO lt_cvis_bp_address_teleno .
        CLEAR ls_cvis_bp_address_teleno.
      ENDIF.

*传真
      ls_cvis_bp_address_faxno-run_id    = lv_run_id.
      ls_cvis_bp_address_faxno-country   = <fs_partner>-land1.
      ls_cvis_bp_address_faxno-fax       = <fs_partner>-fax_number.  "传真
      ls_cvis_bp_address_faxno-extension = <fs_partner>-fax_extens.  "传真分机号
      APPEND ls_cvis_bp_address_faxno TO lt_cvis_bp_address_faxno. "传真号码
      CLEAR ls_cvis_bp_address_faxno.


*电子邮件
      ls_cvis_bp_address_email-run_id = lv_run_id.
      IF <fs_partner>-smtp_addr IS INITIAL.
        ls_cvis_bp_address_email-e_mail = '888888@126.COM'."<fs_PARTNER>-ad_smtpadr.  "电子邮件地址
      ELSE.
        ls_cvis_bp_address_email-e_mail = <fs_partner>-smtp_addr.  "电子邮件地址
      ENDIF.
      APPEND ls_cvis_bp_address_email TO lt_cvis_bp_address_email. "邮箱号码
      CLEAR  ls_cvis_bp_address_email.

***——————————————地址数据赋值————————————————————————————————————————————————————————————————



*——————————————————BP角色——————————————————————————————————————————————


      ls_cvis_bp_role-run_id =  lv_run_id.                  "'1000000'.
      ls_cvis_bp_role-data_key = 'FLVN00'." 'FLVN00'.
      APPEND ls_cvis_bp_role TO lt_cvis_bp_role.
      CLEAR ls_cvis_bp_role.

      ls_cvis_bp_role-run_id =  lv_run_id.                  "'1000000'.
      ls_cvis_bp_role-data_key = 'FLVN01'." 'FLVN00'.
      APPEND ls_cvis_bp_role TO lt_cvis_bp_role.
      CLEAR ls_cvis_bp_role.

      ls_cvis_supplier_general-run_id =  lv_run_id.           "供应商一般数据
      ls_cvis_supplier_general-object_task = lv_object_task.
      IF  <fs_partner>-partner NE '' .
        ls_cvis_supplier_general-lifnr =  <fs_partner>-partner.
      ENDIF.

      APPEND ls_cvis_supplier_general TO lt_cvis_supplier_general.
      CLEAR ls_cvis_supplier_general.
*———————————————————BP角色—————————————————————————————————————————————





*——税号—————查重和赋值———————————————————————————————————————————————————————————————
      ls_cvis_bp_tax_number-run_id = lv_run_id.
      ls_cvis_bp_tax_number-taxtype = 'CN5'.
      ls_cvis_bp_tax_number-taxnumber = <fs_partner>-taxnum.
      "   ls_cvis_bp_tax_number-taxnumxl = <fs_partner>-taxnum.
      APPEND ls_cvis_bp_tax_number TO lt_cvis_bp_tax_number.
      CLEAR ls_cvis_bp_tax_number.

*—————税号—————————————————————————————————————————————————————————





*————银行信息赋值————————————————————————————————————————————______________________________________
      IF  <fs_partner>-bank_no NE '' .

        lv_bkvid = lv_bkvid + 1.
        CONDENSE lv_bkvid NO-GAPS.
        lv_index = strlen( lv_bkvid ).
        lv_index = 4 - lv_index.
        DO lv_index TIMES.
          lv_bkvid = '0' && lv_bkvid.
        ENDDO.

        ls_cvis_bp_bank_details-run_id  = lv_run_id.
        ls_cvis_bp_bank_details-bank_ctry  = <fs_partner>-bank_land.     "银行国家
        ls_cvis_bp_bank_details-data_key  = lv_bkvid.     "银行国家
        ls_cvis_bp_bank_details-bank_key  = <fs_partner>-bank_id.    "银行代码
        ls_cvis_bp_bank_details-bank_acct = <fs_partner>-bank_no.    "银行账号
        ls_cvis_bp_bank_details-bank_ref  = <fs_partner>-butobk_bkref ."参考明细,账号写不下才放尾数在这
        ls_cvis_bp_bank_details-accountholder = <fs_partner>-koinh."账号持有人。
        APPEND ls_cvis_bp_bank_details TO lt_cvis_bp_bank_details.
        CLEAR ls_cvis_bp_bank_details.
      ENDIF.
*————————银行信息赋值——————————————————————————————————————————————————————————————————————————————




*——————————公司代码数据——————————————————————————————————————————————————————————————
      ls_cvis_supplier_company-run_id = lv_run_id.


      ls_cvis_supplier_company-bukrs =  <fs_partner>-bukrs. "公司代码
      ls_cvis_supplier_company-akont =  <fs_partner>-akont. "统驭科目
      ls_cvis_supplier_company-zuawa =   <fs_partner>-zuawa."排序码
      ls_cvis_supplier_company-zterm =   <fs_partner>-zterm. "付款条件
      ls_cvis_supplier_company-reprf  =   <fs_partner>-reprf ."双重发票校验
      APPEND  ls_cvis_supplier_company TO  lt_cvis_supplier_company.
      CLEAR  ls_cvis_supplier_company.
*————————————————————————————————————————————————————————————————————



*———————采购视图赋值—————————————————————————————————————————————————————————————
      ls_cvis_supplier_purchasing-run_id = lv_run_id.
      ls_cvis_supplier_purchasing-ekorg =  <fs_partner>-ekorg. "采购组织
      ls_cvis_supplier_purchasing-waers =   <fs_partner>-waers.   "币种
      ls_cvis_supplier_purchasing-zterm =   <fs_partner>-zterm2 ."付款条件
      ls_cvis_supplier_purchasing-webre =   <fs_partner>-webre ."基于收货的发票校验
      APPEND ls_cvis_supplier_purchasing TO lt_cvis_supplier_purchasing.
      CLEAR ls_cvis_supplier_purchasing.

*————————————————————————————————————————————————————————————————————————————————————

**_____________________________业务伙伴功能————————————————————————————————

SELECT SINGLE
       LFA1~LIFNR,
       LFA1~LAND1,
       LFM1~EKORG,"采购组织
       LFB1~BUKRS "公司代码
       INTO  @DATA(GS_LIFNR)
       FROM  LFA1
       LEFT  JOIN  LFB1  ON  LFA1~lifnr = LFB1~lifnr
       LEFT  JOIN  LFM1  ON  LFA1~lifnr =  LFM1~lifnr
      WHERE LFA1~lifnr = @<fs_partner>-partner
        AND  LFM1~ekorg = @<fs_partner>-ekorg
        AND  LFB1~bukrs = @<fs_partner>-bukrs.
IF GS_LIFNR-bukrs = '' AND GS_LIFNR-ekorg = '' .
      ls_sup_purch_functions-run_id  = lv_run_id.
   "   ls_sup_purch_functions-parza  =  1.
      ls_sup_purch_functions-ekorg  = <fs_partner>-ekorg.
      ls_sup_purch_functions-parvw  = 'BA'."'OA'.
      ls_sup_purch_functions-partner =  <fs_partner>-partner.
      APPEND   ls_sup_purch_functions  TO  lt_sup_purch_functions.
      CLEAR ls_sup_purch_functions.

      ls_sup_purch_functions-run_id  = lv_run_id.

      ls_sup_purch_functions-ekorg  = <fs_partner>-ekorg.
      ls_sup_purch_functions-parvw  = 'LF'. "'VN'.
      ls_sup_purch_functions-partner =  <fs_partner>-partner.
      APPEND   ls_sup_purch_functions  TO  lt_sup_purch_functions.
      CLEAR ls_sup_purch_functions.


      ls_sup_purch_functions-run_id  = lv_run_id.
      ls_sup_purch_functions-ekorg  = <fs_partner>-ekorg.
      ls_sup_purch_functions-parvw  = 'RS'."'PI'.
      ls_sup_purch_functions-partner =  <fs_partner>-partner.
      APPEND   ls_sup_purch_functions  TO  lt_sup_purch_functions.
      CLEAR ls_sup_purch_functions.
ENDIF.
CLEAR GS_LIFNR.
*————————————————————业务伙伴功能——————————————————————————————————————————
"调取BAPI"
      CALL FUNCTION 'RFC_CVI_EI_INBOUND_MAIN'
        EXPORTING
          iv_docommit            = 'X'
*         IV_CREATE_APPLOG       =
*         IV_SUPPRESS_TAXJUR_CHECK           =
        TABLES
          it_bp_general          = lt_cvis_bp_general
          it_bp_role             = lt_cvis_bp_role
*         IT_BP_INDUSTRY         =
*         IT_BP_IDENT_NUMBERS    =
          it_bp_bank_details     = lt_cvis_bp_bank_details
          it_bp_tax_number       = lt_cvis_bp_tax_number
       "  IT_BP_TAX_NUMBER_COMMON            =
          it_bp_address          = lt_cvis_bp_address
       "  IT_BP_ADDRESS_USAGE    =
          it_bp_address_teleno   = lt_cvis_bp_address_teleno
          "IT_BP_ADDRESS_TELENO_REMARKS       =
          it_bp_address_faxno    = lt_cvis_bp_address_faxno
          it_bp_address_email    = lt_cvis_bp_address_email
          it_sup_general         = lt_cvis_supplier_general
          it_sup_company         = lt_cvis_supplier_company
          it_sup_purchasing      = lt_cvis_supplier_purchasing
          it_sup_purch_functions = lt_sup_purch_functions
          ct_return              = lt_cvis_bp_return.
      .


      CLEAR ls_cvis_bp_return.
      LOOP AT lt_cvis_bp_return INTO ls_cvis_bp_return  WHERE type = 'E' OR type = 'A' .
        IF sy-subrc = 0.
          CONCATENATE <fs_partner>-message1 ls_cvis_bp_return-message  sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                     INTO <fs_partner>-message1 SEPARATED BY '/'.
          i_subruc = 1.
          <fs_partner>-statu1 = '@0A@'.
        ENDIF.

      ENDLOOP.
      LOOP AT lt_cvis_bp_return INTO ls_cvis_bp_return  WHERE type = 'S'.
        <fs_partner>-partner = ls_cvis_bp_return-object_key.
         <fs_partner>-message1 =  <fs_partner>-message1 &&  '修改或者导入成功'.
         <fs_partner>-statu1 = '@08@'.
      ENDLOOP.
*
      REFRESH:
   lt_cvis_bp_general,
   lt_cvis_bp_role,

   lt_cvis_bp_bank_details,
   lt_cvis_bp_tax_number,

   lt_cvis_bp_address,

   lt_cvis_bp_address_teleno,

   lt_cvis_bp_address_faxno,
   lt_cvis_bp_address_email,
   lt_cvis_supplier_general,
   lt_cvis_supplier_company,
   lt_cvis_supplier_purchasing,
   lt_cvis_bp_return.

      CLEAR:lv_category, lv_bkvid,lv_index.
    ENDLOOP.
ENDFORM.



FORM frm_partner_alpha_input CHANGING cv_bpartner.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = cv_bpartner
    IMPORTING
      output = cv_bpartner.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CONVERSION_EXIT_PARVW_INPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LS_HEADER_PARVW
*&---------------------------------------------------------------------*
FORM conversion_exit_parvw_input CHANGING cv_parvw.

  CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
    EXPORTING
      input  = cv_parvw
    IMPORTING
      output = cv_parvw.

ENDFORM.

使用代码的注意点
1.这个程序是在excel中填写好数据,再导入系统的,导入的格式顺序请你参考源代码中的定义顺序。
2.从excel 的第一列第三行开始写具体的供应商主数据
3.里面有邮政编码和邮箱,没填写就自动填写888了。使用时候要注意。
4.这个代码既可以更新也可创建供应商主数据。
5.一定要根据实际情况去调整程序,不能一味照搬。

CVI_EI_INBOUND_MAIN

*&---------------------------------------------------------------------*
*& Report ZSDR041
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsdr041.
TABLES:sscrfields.

*-->ALV Define
DATA: gt_fieldcat TYPE lvc_t_fcat ."字段属性得定义
DATA: gs_fieldcat TYPE lvc_s_fcat ."字段属性定义
DATA: gs_layout   TYPE lvc_s_layo ."layout 格式定义


CONSTANTS:c_green  LIKE dv70a-statusicon VALUE '@08@',
          c_yellow LIKE dv70a-statusicon VALUE '@09@',
          c_red    LIKE dv70a-statusicon VALUE '@0A@'.

*工具栏上排除的按钮
DATA:gt_exclude TYPE ui_functions.

*-->Other Define.
DATA:ok_code  LIKE sy-ucomm.
DATA:functxt  TYPE smp_dyntxt.
DATA:g_file   TYPE sapb-sappfad.
DATA:gv_error TYPE c.

*-->内表定义
DATA : BEGIN OF gs_upload,
         kunnr      TYPE kunnr,        "客户编号
         name1      TYPE name1,        "名称1(必输)
         name2      TYPE name2,        "名称2
         sort1      TYPE ad_sort1,     "搜索条件1(必输)
         sort2      TYPE ad_sort2,     "搜索条件2(必输)
         street     TYPE ad_street,    "街道(送货地址)(必输)"
         land1      TYPE land1,        "国家(必输)
         region     TYPE regio,        "地区
         pstlz      TYPE pstlz,        "邮政编码
         langu      TYPE spras,        "语言(必输)
         telf1      TYPE telf1,        "电话号码(必输)
         telf2      TYPE telf2,        "移动电话
         fax_number TYPE ad_fxnmbr1,   "传真
         taxnumxl   TYPE bptaxnumxl,   "增值税登记号
         banks      TYPE banks,        "银行国家
         bankl      TYPE bankl,        "银行描述
         bankn      TYPE bankk,        "银行账户
         bkref      TYPE bkref,        "参考明细
         vkorg      TYPE vkorg,        "销售组织(必输)
         vtweg      TYPE vtweg,        "分销渠道(必输)
         spart      TYPE spart,        "产品组(必输)
         rltyp      TYPE char12,       "BP Role(必输)
         bu_group   TYPE bu_group,     "分组(必输)
         bzirk      TYPE bzirk,        "销售区域(必输)
         vkbur      TYPE vkbur,        "销售办公室(必输)
         vkgrp      TYPE vkgrp,        "销售小组(必输)
         user1      TYPE char12,       "员工编号1(必输)
         user2      TYPE char12,       "员工编号2
         waers      TYPE waers,        "币别(必输)
         kurst      TYPE knvv-kurst,   "汇率类型(必输)
         inco1      TYPE inco1,        "国际贸易条款(必输)
         inco2_l    TYPE inco2_l,      "国际贸易条款位置 1(必输)
         zterm      TYPE dzterm,       "付款条件(必输)
         ktgrd      TYPE knvv-ktgrd,   "科目指派群(必输)
         taxkd1     TYPE takld,        "客户税分类-CN(必输)
         pltyp      TYPE pltyp,        "价格清单(必输)
         bukrs      TYPE bukrs,        "公司代码(必输)
         akont      TYPE akont,        "统驭科目(必输)
         zterm2     TYPE dzterm,       "付款条件(必输)
         str_suppl1 TYPE ad_strspp1,   "街道2
         str_suppl2 TYPE ad_strspp2,   "街道3
         str_suppl3 TYPE ad_strspp3,   "街道4
         location   TYPE ad_lctn,      "街道5

         "辅助字段
         sel,
         deng       TYPE char4,
         message    TYPE char40,

       END OF gs_upload.

DATA : gt_upload LIKE TABLE OF gs_upload.

*-->SELECTION-SCREEN
SELECTION-SCREEN BEGIN OF BLOCK blc_001 WITH FRAME TITLE TEXT-001.
  PARAMETERS : p_file  LIKE rlgrap-filename MODIF ID r1.
SELECTION-SCREEN END OF BLOCK blc_001.
SELECTION-SCREEN: FUNCTION KEY 1.

INITIALIZATION.

  PERFORM frm_sub_button.  "模板按钮

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.         "data declaration must be front of this statement

  PERFORM select_file.

AT SELECTION-SCREEN.

  PERFORM frm_download_mod."选择屏幕按钮

START-OF-SELECTION.

  PERFORM frm_upload_data. "导入数据

  PERFORM frm_check_data.  "检查必输数据

  PERFORM frm_alv_output.  "ALV输出
*&---------------------------------------------------------------------*
*& Form frm_sub_button
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_sub_button .

  CLEAR functxt.
  functxt-icon_id   = icon_export."icon_view_form
  functxt-icon_text = '下载批导模板'.
  sscrfields-functxt_01 = functxt.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form select_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM select_file .

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path         = ''
      mask             = ',*.*,*.*.'(101)
      title            = 'Select File'(100)
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload_data .

  DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
  FIELD-SYMBOLS: <fs_val>.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = '1'     "从第一列开始
      i_begin_row             = '4'     "从第四行开始
      i_end_col               = '50'
      i_end_row               = '50000'
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  LOOP AT lt_excel.
    CONDENSE lt_excel-value.
    ASSIGN COMPONENT lt_excel-col OF STRUCTURE gs_upload TO <fs_val>.
    <fs_val> = lt_excel-value.
    AT END OF row.
      APPEND gs_upload TO gt_upload.
      CLEAR gs_upload.
    ENDAT.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_data .

  LOOP AT gt_upload ASSIGNING FIELD-SYMBOL(<fs_upload>).

    "必输检查
    IF <fs_upload>-name1 IS INITIAL
     OR <fs_upload>-sort1 IS INITIAL
     OR <fs_upload>-street IS INITIAL
     OR <fs_upload>-land1 IS INITIAL
     OR <fs_upload>-langu IS INITIAL
     OR <fs_upload>-pstlz IS INITIAL
     OR <fs_upload>-telf1 IS INITIAL
     OR <fs_upload>-vkorg IS INITIAL
     OR <fs_upload>-vtweg IS INITIAL
     OR <fs_upload>-spart IS INITIAL
*     OR <fs_upload>-bu_group IS INITIAL
*     OR <fs_upload>-bzirk IS INITIAL
     OR <fs_upload>-vkbur IS INITIAL
     OR <fs_upload>-vkgrp IS INITIAL
     OR <fs_upload>-waers IS INITIAL
     OR <fs_upload>-kurst IS INITIAL      "汇率类型
*     OR <fs_upload>-inco1 IS INITIAL
*     OR <fs_upload>-inco2_l IS INITIAL
     OR <fs_upload>-zterm IS INITIAL
     OR <fs_upload>-ktgrd IS INITIAL     "科目指派群
     OR <fs_upload>-taxkd1 IS INITIAL
     OR <fs_upload>-pltyp IS INITIAL
     OR <fs_upload>-bukrs IS INITIAL
     OR <fs_upload>-akont IS INITIAL
     OR <fs_upload>-user1 IS INITIAL
     OR <fs_upload>-user2 IS INITIAL
     OR <fs_upload>-zterm IS INITIAL.

      <fs_upload>-deng = c_red.
      <fs_upload>-message = '存在必输字段未给值,请检查导入模板!'.
      gv_error = 'X'.
    ELSE.
      <fs_upload>-sel  = 'X'.
      <fs_upload>-deng = c_yellow.
      IF <fs_upload>-bankl IS NOT INITIAL OR <fs_upload>-banks IS NOT INITIAL.
        SELECT COUNT(*) FROM bnka  WHERE bankl = <fs_upload>-bankl
                                     AND banks = <fs_upload>-banks.
        IF sy-subrc <> 0.
          <fs_upload>-deng = c_red.
          <fs_upload>-message = '银行信息在SAP不存在,请检查模板!'.
        ENDIF.
      ENDIF.
    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_alv_output
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_output .

  PERFORM fill_fieldcat. "字段属性定义

  PERFORM fill_layout.    "格式定义

  PERFORM alv_display.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form fill_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM fill_fieldcat .

  DEFINE add_fieldcat.

    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname    =  &1.
    gs_fieldcat-reptext      =  &2.
    gs_fieldcat-edit         =  &3.
    gs_fieldcat-col_pos      =  &4.
    gs_fieldcat-just         =  &5.
    gs_fieldcat-outputlen    =  &6.
    gs_fieldcat-fix_column   =  &7.

    CASE &1 .
        WHEN 'SEL'.
          gs_fieldcat-checkbox = 'X'.
    ENDCASE.

    APPEND gs_fieldcat TO gt_fieldcat.

  END-OF-DEFINITION.

  CLEAR gt_fieldcat.
  REFRESH gt_fieldcat.

  add_fieldcat     'SEL'        '选择'           'X'   ''  ''  ''  ''.
  add_fieldcat     'DENG'       '状态'           ''   ''  ''  ''  ''.
  add_fieldcat     'MESSAGE'    '消息'           ''   ''  ''  ''  ''.
  add_fieldcat     'KUNNR'      '客户编号'       ''   ''  ''  ''  ''.
  add_fieldcat     'NAME1'      '名称1'          ''   ''  ''  ''  ''.
  add_fieldcat     'NAME2'      '名称2'          ''   ''  ''  ''  ''.
  add_fieldcat     'SORT1'      '搜索条件1'      ''   ''  ''  ''  ''.
  add_fieldcat     'SORT2'      '搜索条件2'      ''   ''  ''  ''  ''.
  add_fieldcat     'STREET'     '街道(送货地址)' ''   ''  ''  ''  ''.
  add_fieldcat     'LAND1'      '国家'           ''   ''  ''  ''  ''.
  add_fieldcat     'REGION'     '地区'           ''   ''  ''  ''  ''.
  add_fieldcat     'PSTLZ'      '邮政编码'       ''   ''  ''  ''  ''.
  add_fieldcat     'LANGU'      '语言'           ''   ''  ''  ''  ''.
  add_fieldcat     'TELF1'      '电话号码'       ''   ''  ''  ''  ''.
  add_fieldcat     'TELF2'      '移动电话'       ''   ''  ''  ''  ''.
  add_fieldcat     'FAX_NUMBER' '传真'           ''   ''  ''  ''  ''.
  add_fieldcat     'TAXNUMXL'   '增值税登记号'   ''   ''  ''  ''  ''.
  add_fieldcat     'BANKS'      '银行国家'       ''   ''  ''  ''  ''.
  add_fieldcat     'BANKL'      '银行描述'       ''   ''  ''  ''  ''.
  add_fieldcat     'BANKN'      '银行账户'       ''   ''  ''  ''  ''.
  add_fieldcat     'BKREF'      '参考明细'       ''   ''  ''  ''  ''.
  add_fieldcat     'VKORG'      '销售组织'       ''   ''  ''  ''  ''.
  add_fieldcat     'VTWEG'      '分销渠道'       ''   ''  ''  ''  ''.
  add_fieldcat     'SPART'      '产品组'         ''   ''  ''  ''  ''.
  add_fieldcat     'RLTYP'      'BP角色'         ''   ''  ''  ''  ''.
  add_fieldcat     'BU_GROUP'   '分组'           ''   ''  ''  ''  ''.
  add_fieldcat     'BZIRK'      '销售区域'       ''   ''  ''  ''  ''.
  add_fieldcat     'VKBUR'      '销售办公室'     ''   ''  ''  ''  ''.
  add_fieldcat     'VKGRP'      '销售小组'       ''   ''  ''  ''  ''.
  add_fieldcat     'USER1'      '员工编号1'      ''   ''  ''  ''  ''.
  add_fieldcat     'USER2'      '员工编号2'      ''   ''  ''  ''  ''.
  add_fieldcat     'WAERS'      '币别'           ''   ''  ''  ''  ''.
  add_fieldcat     'KURST'      '汇率类型'       ''   ''  ''  ''  ''.
  add_fieldcat     'INCO1'      '国际贸易条款'   ''   ''  ''  ''  ''.
  add_fieldcat     'INCO2_L'    '国际贸易条款位置 '   ''   ''  ''  ''  ''.
  add_fieldcat     'ZTERM'      '付款条件'       ''   ''  ''  ''  ''.
  add_fieldcat     'KTGRD'      '科目指派群'     ''   ''  ''  ''  ''.
  add_fieldcat     'TAXKD1'     '客户税分类-CN'  ''   ''  ''  ''  ''.
  add_fieldcat     'PLTYP'      '价格清单'       ''   ''  ''  ''  ''.
  add_fieldcat     'BUKRS'      '公司代码'       ''   ''  ''  ''  ''.
  add_fieldcat     'AKONT'      '统驭科目'       ''   ''  ''  ''  ''.
  add_fieldcat     'ZTERM2'     '付款条件'       ''   ''  ''  ''  ''.
  add_fieldcat     'STR_SUPPL1' '街道2'          ''   ''  ''  ''  ''.
  add_fieldcat     'STR_SUPPL2' '街道3'          ''   ''  ''  ''  ''.
  add_fieldcat     'STR_SUPPL3' '街道4'          ''   ''  ''  ''  ''.
  add_fieldcat     'LOCATION'   '街道5'          ''   ''  ''  ''  ''.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form fill_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM fill_layout .

* 定义列自动宽度优化
  gs_layout-cwidth_opt  = 'X'.
  gs_layout-sel_mode    = 'A'.
*  gs_layout-no_rowmark = 'X'.
* 定义条纹显示
  gs_layout-zebra       = 'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form alv_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM alv_display .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'STATUS'   "GUI状态
      i_callback_user_command  = 'USER_COMMAND'  "按钮事件
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
    TABLES
      t_outtab                 = gt_upload
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
* Implement suitable error handling here
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
  ENDIF.


ENDFORM.
FORM status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS'.
ENDFORM.
FORM user_command USING u_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.

  DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
        lv_code LIKE sy-ucomm.
  DATA: ls_stable TYPE lvc_s_stbl.

  " 刷新alv屏幕数据
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->check_changed_data.
  CASE u_ucomm.
    WHEN '&F03' OR '&F12' OR '&F15'.
      LEAVE TO SCREEN 0.
    WHEN 'UPLOAD'.
      PERFORM frm_process.
  ENDCASE.
  rs_selfield-refresh = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_process
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_process .

  CONSTANTS : c_parvw1 TYPE parvw VALUE 'SP', "售达方
              c_parvw2 TYPE parvw VALUE 'BP', "收票方
              c_parvw3 TYPE parvw VALUE 'PY', "付款方
              c_parvw4 TYPE parvw VALUE 'SH', "送达方
              c_parvw5 TYPE parvw VALUE 'VM', "业务员
              c_parvw6 TYPE parvw VALUE 'VN'. "业务助理

  DATA : lt_roles TYPE bus_ei_bupa_roles_t,         "Role Data
         ls_roles TYPE bus_ei_bupa_roles.

  DATA : lt_addresses TYPE bus_ei_bupa_address_t,
         ls_addresses TYPE bus_ei_bupa_address.

  DATA : lt_phone TYPE bus_ei_bupa_telephone_t,
         ls_phone TYPE bus_ei_bupa_telephone.

  DATA : lt_tel  TYPE TABLE OF bapiadtel,
         ls_tel  TYPE bapiadtel,
         lt_telx TYPE TABLE OF bapiadtelx,
         ls_telx TYPE bapiadtelx.

  DATA : lt_fax TYPE bus_ei_bupa_fax_t,           "传真
         ls_fax TYPE bus_ei_bupa_fax.

  DATA : lt_remark TYPE bus_ei_bupa_addressremark_t,
         ls_remark TYPE bus_ei_bupa_addressremark.

  DATA : lt_tax TYPE bus_ei_bupa_taxnumber_t,
         ls_tax TYPE bus_ei_bupa_taxnumber.

  DATA : lt_id TYPE bus_ei_bupa_identification_t,
         ls_id TYPE bus_ei_bupa_identification.

  DATA : lt_company TYPE cmds_ei_company_t,
         ls_company TYPE cmds_ei_company.

  DATA : lt_text TYPE cvis_ei_text_t,
         ls_text TYPE cvis_ei_text.

  DATA : lt_lines TYPE tline_tab,
         ls_lines TYPE tline.

  DATA : lt_tax_ind TYPE cmds_ei_tax_ind_t,
         ls_tax_ind TYPE cmds_ei_tax_ind.

  DATA : lt_sales TYPE cmds_ei_sales_t,
         ls_sales TYPE cmds_ei_sales.

  DATA : lt_functions TYPE cmds_ei_functions_t,
         ls_functions TYPE cmds_ei_functions.

  DATA : lt_data TYPE cvis_ei_extern_t,
         ls_data TYPE cvis_ei_extern.

  DATA : lt_partnerguid_list TYPE bu_partner_guid_t,
         ls_partnerguid_list LIKE LINE OF lt_partnerguid_list.

  DATA : lt_customer_list TYPE cvis_cust_link_t,
         ls_customer_list TYPE cvi_cust_link.

  DATA : lt_return TYPE bapiretm,
         ls_return TYPE bapireti.

*  DATA : lt_zsd_sales TYPE STANDARD TABLE OF zsd_bp_sales_data.

  DATA : ls_bank_data TYPE bus_ei_bupa_bankdetail.

  DATA : ls_partner  TYPE bus_ei_extern,
         ls_customer TYPE cmds_ei_extern.

*  DATA : ls_company_view_data TYPE zsd_bp_company_data,
*         ls_sales_view_data   TYPE zsd_bp_sales_data,
  DATA : ls_msg        TYPE bapiretc.

  DATA : lt_master_data TYPE cmds_ei_main,
         ls_master_data TYPE cmds_ei_extern.

  DATA : lt_error_mess TYPE cvis_message,
         ls_error_mess TYPE bapiret2.

  DATA : ls_basic TYPE cmds_ei_cmd_central.

  DATA : lv_bpartnerguid TYPE bu_partner_guid_bapi,
         lv_banky        TYPE but0bk-bankl.

  DATA : lt_return_tel TYPE STANDARD TABLE OF bapiret2,
         ls_return_tel TYPE bapiret2.

  DATA : c_message TYPE char255.
  DATA : lv_error.


  IF gv_error = 'X'.
    MESSAGE '存在错误数据,不能导入!' TYPE 'E'.
    EXIT.
  ENDIF.

  LOOP AT gt_upload INTO gs_upload WHERE kunnr IS NOT INITIAL AND sel = 'X'.
    lv_error = 'X'.
  ENDLOOP.

  IF lv_error = 'X'.
    MESSAGE '存在已经创建成功的客户,不能再次导入!' TYPE 'E'.
    EXIT.
  ENDIF.


  LOOP AT gt_upload INTO gs_upload WHERE sel = 'X'.
    CLEAR : ls_partner.
    CLEAR : lv_bpartnerguid.
    CLEAR : lt_data.

    TRY.
        lv_bpartnerguid = cl_uuid_factory=>create_system_uuid( )->create_uuid_x16( ).
      CATCH cx_uuid_error.

        "返回消息
    ENDTRY.

**********************************************************************
* Role
**********************************************************************
    CLEAR : lt_roles, ls_roles.

    ls_roles-task = 'I'.
    ls_roles-data_key = 'ZSD001'.     "客户财务视图
    APPEND ls_roles TO lt_roles.
    ls_roles-task = 'I'.
    ls_roles-data_key = 'ZSD002'.     "客户销售视图
    APPEND ls_roles TO lt_roles.
    ls_partner-central_data-role-roles = lt_roles.

**********************************************************************
* 基础数据
**********************************************************************
    CHECK lv_bpartnerguid IS NOT INITIAL.


    ls_partner-header-object_task = 'I'.
    ls_partner-header-object_instance-bpartnerguid = lv_bpartnerguid.
    ls_partner-central_data-common-data-bp_control-category = 2.                           "业务伙伴类别(组织)
    ls_partner-central_data-common-data-bp_control-grouping = gs_upload-bu_group.           "科目组

    ls_partner-central_data-common-data-bp_centraldata-title_key = '0003'.                 " 称谓
    ls_partner-central_data-common-data-bp_organization-name1      = gs_upload-name1.       "名称1
    ls_partner-central_data-common-data-bp_organization-name2      = gs_upload-name2.       "名称2
    ls_partner-central_data-common-data-bp_centraldata-searchterm1 = gs_upload-sort1.       "搜索项1
    ls_partner-central_data-common-data-bp_centraldata-searchterm2 = gs_upload-sort2.       "搜索项2

    ls_partner-central_data-common-datax-bp_centraldata-title_key   = 'X'.
    ls_partner-central_data-common-datax-bp_organization-name1      = 'X'.
    ls_partner-central_data-common-datax-bp_organization-name2      = 'X'.
    ls_partner-central_data-common-datax-bp_centraldata-searchterm1 = 'X'.
    ls_partner-central_data-common-datax-bp_centraldata-searchterm2 = 'X'.

*---> Fullfill address 填充地址数据
    CLEAR : lt_addresses, ls_addresses.

    ls_addresses-task = 'I'.
*  ls_addresses-data-postal-data-c_o_name   = is_data1-zreceiver.        "收票人
    ls_addresses-data-postal-data-postl_cod1 = gs_upload-pstlz.           "邮政编码
    ls_addresses-data-postal-data-street     = gs_upload-street.           "开票街道
    ls_addresses-data-postal-data-str_suppl1 = gs_upload-str_suppl1.       "收票地址2
    ls_addresses-data-postal-data-str_suppl2 = gs_upload-str_suppl2.       "收票地址3
    ls_addresses-data-postal-data-str_suppl3 = gs_upload-str_suppl3.       "开票街道4
    ls_addresses-data-postal-data-location   = gs_upload-location.         "开票街道5
    ls_addresses-data-postal-data-country    = gs_upload-land1.            "国家代码
    ls_addresses-data-postal-data-region     = gs_upload-region.           "地区代码
*  ls_addresses-data-postal-data-city       = is_data1-city1.            "城市
    ls_addresses-data-postal-data-langu   = gs_upload-langu.            "语言
*  ls_addresses-data-postal-data-languiso   = is_data1-langu.            "语言


*  ls_addresses-data-postal-datax-c_o_name   = 'X'.    "收票人
    ls_addresses-data-postal-datax-postl_cod1 = 'X'.    "邮政编码
    ls_addresses-data-postal-datax-street     = 'X'.    "开票街道
    ls_addresses-data-postal-datax-str_suppl1 = 'X'.    "地址:2
    ls_addresses-data-postal-datax-str_suppl2 = 'X'.    "地址:3
    ls_addresses-data-postal-datax-str_suppl3 = 'X'.    "开票街道4
    ls_addresses-data-postal-datax-location   = 'X'.    "开票街道5
    ls_addresses-data-postal-datax-country    = 'X'.    "国家代码
    ls_addresses-data-postal-datax-region     = 'X'.    "地区代码
*  ls_addresses-data-postal-datax-city       = 'X'.    "城市
    ls_addresses-data-postal-datax-langu      = 'X'.    "语言
*  ls_addresses-data-postal-datax-langu_iso  = 'X'.    "语言

*--> 电话
    CLEAR : ls_phone, lt_phone.
    ls_phone-contact-task = 'I'.
    ls_phone-contact-data-telephone = gs_upload-telf1.  "电话
    ls_phone-contact-datax-telephone = 'X'.
    APPEND ls_phone TO lt_phone.

    ls_phone-contact-task = 'I'.
    ls_phone-contact-data-telephone = gs_upload-telf2.  "电话
    ls_phone-contact-datax-telephone = 'X'.
    APPEND ls_phone TO lt_phone.
    ls_addresses-data-communication-phone-phone = lt_phone.

    APPEND ls_addresses TO lt_addresses.
    ls_partner-central_data-address-addresses = lt_addresses.

*-->增值税信息
    ls_tax-task = 'I'.
    ls_tax-data_key-taxtype   = 'CN0'.
    ls_tax-data_key-taxnumber = gs_upload-taxnumxl.
    ls_tax-data_key-taxnumxl  = gs_upload-taxnumxl.
    APPEND ls_tax TO lt_tax.
    ls_partner-central_data-taxnumber-taxnumbers = lt_tax.


*-->银行信息

    IF gs_upload-banks <> '' OR gs_upload-bankl <> '' OR gs_upload-bankn <> '' OR gs_upload-bkref IS NOT INITIAL.
      ls_bank_data-task = 'I'.
      ls_bank_data-data-bank_ctry = gs_upload-banks.         "银行国家代码
      ls_bank_data-data-bank_key  = gs_upload-bankl.         "银行代码
      ls_bank_data-data-bank_acct = gs_upload-bankn.         "银行帐户号码
      ls_bank_data-data-bank_ref  = gs_upload-bkref.
*  ls_bank_data-data-accountholder = p_basic_data-koinh.  "账户持有人

      ls_bank_data-datax-bank_ctry = 'X'.  "银行国家代码
      ls_bank_data-datax-bank_key  = 'X'.  "银行代码
      ls_bank_data-datax-bank_acct = 'X'.  "银行帐户号码
      ls_bank_data-datax-bank_ref  = 'X'.
*  ls_bank_data-datax-accountholder = 'X'.                "账户持有人
      APPEND ls_bank_data TO ls_partner-central_data-bankdetail-bankdetails.
    ENDIF.


    CLEAR ls_customer.
**********************************************************************
* 客户中心数据
**********************************************************************
* 客户数据表头
    ls_customer-header-object_task = 'I'.

    ls_tax_ind-task = 'I'.
    ls_tax_ind-data_key-aland = 'CN'.
    ls_tax_ind-data_key-tatyp = 'MWST'.

    ls_tax_ind-data-taxkd = gs_upload-taxkd1.  "客户税分类
    ls_tax_ind-datax-taxkd = 'X'.
    APPEND ls_tax_ind TO lt_tax_ind.

    ls_customer-central_data-tax_ind-tax_ind = lt_tax_ind.

**********************************************************************
* 客户销售视图
**********************************************************************
    CLEAR : lt_sales.

    CLEAR : lt_functions.

    ls_sales-task = 'I'.
    ls_sales-data_key-vkorg = gs_upload-vkorg. "销售组织
    ls_sales-data_key-vtweg = gs_upload-vtweg. "分销渠道
    ls_sales-data_key-spart = gs_upload-spart. "产品组
    ls_sales-data-vkbur     = gs_upload-vkbur. "销售办公室
    ls_sales-data-vkgrp     = gs_upload-vkgrp. "销售组
*    ls_sales-data-kdgrp     = is_data1-kdgrp. "客户组
    ls_sales-data-waers     = gs_upload-waers. "货币
    ls_sales-data-kalks     = '1'. "客户定价过程
    ls_sales-data-vsbed     = '01'. "装运条件
    ls_sales-data-pltyp     = gs_upload-pltyp. "价格清单类型
*    ls_sales-data-incov     = is_data1-incov. "国际贸易条款版本
    ls_sales-data-inco1     = gs_upload-inco1. "国际贸易条款
    ls_sales-data-inco2_l   = gs_upload-inco2_l. "国际贸易条款位置 1
*    ls_sales-data-inco3_l   = is_data1-inco3_l. "国际贸易条款位置 2
    ls_sales-data-ktgrd     = gs_upload-ktgrd.   "科目分配组
    ls_sales-data-zterm     = gs_upload-zterm.   "付款条件
    ls_sales-data-kzazu     = 'X'.

    ls_sales-datax-vkbur     = 'X'. "销售办公室
    ls_sales-datax-vkgrp     = 'X'. "销售组
*    ls_sales-datax-kdgrp     = 'X'. "客户组
    ls_sales-datax-waers     = 'X'. "货币
    ls_sales-datax-kalks     = 'X'. "客户定价过程
    ls_sales-datax-vsbed     = 'X'. "装运条件
    ls_sales-datax-pltyp     = 'X'. "价格清单类型
*    ls_sales-datax-incov     = 'X'. "国际贸易条款版本
    ls_sales-datax-inco1     = 'X'. "国际贸易条款
    ls_sales-datax-inco2_l   = 'X'. "国际贸易条款位置 1
*    ls_sales-datax-inco3_l   = 'X'. "国际贸易条款位置 2
    ls_sales-datax-ktgrd     = 'X'. "科目分配组
    ls_sales-datax-zterm     = 'X'. "付款条件
    ls_sales-datax-kzazu     = 'X'.

    CLEAR : ls_functions.

    ls_functions-task = 'I'.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw1  "售达方
      IMPORTING
        output = ls_functions-data_key-parvw.

    APPEND ls_functions TO lt_functions.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw2 "收票方
      IMPORTING
        output = ls_functions-data_key-parvw.

    APPEND ls_functions TO lt_functions.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw3 "付款方
      IMPORTING
        output = ls_functions-data_key-parvw.

    APPEND ls_functions TO lt_functions.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw4 "送达方
      IMPORTING
        output = ls_functions-data_key-parvw.

    APPEND ls_functions TO lt_functions.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw5 "业务员
      IMPORTING
        output = ls_functions-data_key-parvw.

    ls_functions-data-partner = gs_upload-user1.
    ls_functions-datax-partner = 'X'.
    APPEND ls_functions TO lt_functions.

    CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
      EXPORTING
        input  = c_parvw6 "业务助理
      IMPORTING
        output = ls_functions-data_key-parvw.

    ls_functions-data-partner = gs_upload-user2.
    ls_functions-datax-partner = 'X'.
    APPEND ls_functions TO lt_functions.

    ls_sales-functions-functions = lt_functions.


    APPEND ls_sales TO lt_sales.
    ls_customer-sales_data-sales = lt_sales.

**********************************************************************
* 客户公司代码视图
**********************************************************************
    CLEAR : lt_company.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'   " 统驭科目补零
      EXPORTING
        input  = gs_upload-akont
      IMPORTING
        output = gs_upload-akont.

    ls_company-task = 'I'.
    ls_company-data_key-bukrs = gs_upload-bukrs. " 公司代码
    ls_company-data-akont     = gs_upload-akont. " 统驭科目
    ls_company-data-zterm     = gs_upload-zterm2. " 付款条件

    ls_company-datax-akont = 'X'.
    ls_company-datax-zterm = 'X'.
    APPEND ls_company TO lt_company.

    ls_customer-company_data-company = lt_company.

*--> 创建BP以及员工
    CLEAR : lt_data.

    ls_data-partner  = ls_partner.
    ls_data-customer = ls_customer.
    APPEND ls_data TO lt_data.

    CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
      EXPORTING
        i_data   = lt_data
*       I_EXT_DATA       =
      IMPORTING
        e_return = lt_return.

    CLEAR c_message.
    LOOP AT lt_return INTO ls_return.
      LOOP AT ls_return-object_msg INTO ls_msg WHERE type = 'E' OR type = 'A'.
        CONCATENATE c_message ls_msg-message INTO c_message.
      ENDLOOP.
    ENDLOOP.


    IF c_message EQ ''.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.

      SELECT SINGLE partner FROM but000 INTO gs_upload-kunnr WHERE partner_guid = ls_return-object_key.

      gs_upload-deng = c_green.
      gs_upload-message = '创建成功!'.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      gs_upload-deng = c_red.
      gs_upload-message = c_message.
    ENDIF.

    MODIFY gt_upload FROM gs_upload.
    CLEAR :lt_return,c_message.
  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_mod
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download_mod .

  DATA:l_temp TYPE c,
       l_str  TYPE string.


  CASE sscrfields-ucomm.

    WHEN 'FC01'.
      CLEAR:g_file,l_temp,l_str.
      "获取文件路径
      CONCATENATE '客户主数据导入模板-' sy-datum INTO l_str.
      l_temp = '1'.
      PERFORM frm_get_filepath USING l_str CHANGING g_file.
      "下载模板
      CHECK sy-subrc = 0 AND NOT g_file IS INITIAL.
      PERFORM frm_download_excel_fromserver USING g_file l_temp.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILEPATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_G_FILE  text
*----------------------------------------------------------------------*
FORM frm_get_filepath USING p_l_str CHANGING p_file.

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_l_str "
      def_path         = p_file
      mask             = ',*.xls,*.xls,*.xlsx,*.xlsx.'
      mode             = 'S'
      title            = '保存路径'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

ENDFORM. "FRM_GET_FILEPATH
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_EXCEL_FROMSERVER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_TEMP  text
*      -->P_P_FILE  text
*      <--P_L_ERROR  text
*----------------------------------------------------------------------*
FORM frm_download_excel_fromserver USING p_file LIKE sapb-sappfad
                                           p_temp.

  DATA:l_temp         TYPE wwwdatatab-objid,
       lo_objdata     LIKE wwwdatatab,
       lo_mime        LIKE w3mime,
       ls_destination LIKE rlgrap-filename,
       ls_objnam      TYPE string,
       li_rc          LIKE sy-subrc,
       ls_errtxt      TYPE string,
       l_error        TYPE char255.

  CLEAR:l_temp,l_error,lo_objdata,ls_objnam.

  IF p_temp = '1'.
    l_temp =  'ZSDR041'.
  ENDIF.

  CONCATENATE l_temp '.XLS' INTO ls_objnam.

  SELECT SINGLE relid objid FROM wwwdata
    INTO CORRESPONDING FIELDS OF lo_objdata
    WHERE srtf2    = 0
      AND relid    = 'MI'
      AND objid    = l_temp.

  IF sy-subrc NE 0 OR lo_objdata-objid EQ space.
    CONCATENATE '模板文件:' ls_objnam '不存在,请用TCODE:SMW0进行加载' INTO l_error.
    MESSAGE e000(zre) WITH l_error.
  ENDIF.

  ls_destination   = p_file.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = lo_objdata
      destination = ls_destination
    IMPORTING
      rc          = li_rc.

  IF li_rc NE 0.
    CONCATENATE '模板文件:' ls_objnam '下载失败' INTO l_error.
    MESSAGE e000(zre) WITH l_error.
  ENDIF.

ENDFORM. " FRM_DOWNLOAD_EXCEL_FROMSERVER

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值