ABAP-批导客户主数据

*&---------------------------------------------------------------------*
*& Report ZSDR_016
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsdr_016.

TABLES: sscrfields.
CONSTANTS: gc_objid TYPE w3objid VALUE 'ZSDR_016'.
CONSTANTSBEGIN OF gc_icon,
             green  TYPE icon-id VALUE '@08@',
             yellow TYPE icon-id VALUE '@09@',
             red    TYPE icon-id VALUE '@0A@',
           END OF gc_icon.
*&---------------------------------------------------------------------*
*&  数据类型
*&---------------------------------------------------------------------*
TYPESBEGIN OF s_data,
         sel        TYPE boolean,
         partner    TYPE but000-partner,   " 业务伙伴编号
         bu_type    TYPE but000-type,      " 业务伙伴类别
         bu_group   TYPE but000-bu_group,  " 业务伙伴分组
         title_key  TYPE ad_title,         " 称谓
         name_org1  TYPE but000-name_org1" 组织名称 1
         name_org2  TYPE but000-name_org2" 组织名称 2
         name_org3  TYPE but000-name_org3" 组织名称 3
         name_org4  TYPE but000-name_org4" 组织名称 4
         bu_sort1   TYPE but000-bu_sort1,  " 业务伙伴的搜索词 1
         bu_sort2   TYPE but000-bu_sort2,  " 业务伙伴的搜索词 1
         street     TYPE adrc-street,      " 街道
         country    TYPE adrc-country,     " 国家
         post_code1 TYPE adrc-post_code1,  " 城市邮政编码
         city1      TYPE adrc-city1,       " 城市
         region     TYPE adrc-region,      " 地区(省/自治区/直辖市、市、县)
         tel_number TYPE adr2-tel_number,  " 电话
         mob_number TYPE adr2-tel_number,  " 移动电话
         langu      TYPE t002-laiso,       " 语言代码
         fdate      TYPE sy-datum,         " 地址有效期自
         vkorg      TYPE knvv-vkorg,       " 销售组织
         vtweg      TYPE knvv-vtweg,       " 分销渠道
         spart      TYPE knvv-spart,       " 产品组
         pltyp      TYPE knvv-pltyp,       " 价格清单类型
         zterm      TYPE knvv-zterm,       " 付款条件代码
         ktgrd      TYPE knvv-ktgrd,       " 客户科目分配组
         konda      TYPE knvv-konda,       " 价格组
         kalks      TYPE knvv-kalks,       " 定价过程
         vsbed      TYPE knvv-vsbed,       " 装运条件
         tatyp      TYPE knvi-tatyp,       " 税收类别
         taxkd      TYPE knvi-taxkd,       " 客户税分类
         vwerk      TYPE knvv-vwerk,       " 交货工厂
         gpanr_z3   TYPE gpanr,            " 总公司
         bukrs      TYPE knb1-bukrs,       " 公司代码
         akont      TYPE knb1-akont,       " 统驭科目
         kna1f      TYPE char1,            " 基本视图
         knvvf      TYPE char1,            " 销售视图
         knb1f      TYPE char1,            " 公司代码视图
         type       TYPE bapi_mtype,
         icon       TYPE icon_d,
         msg        TYPE bapi_msg,
       END OF s_data.
TYPES: t_data TYPE TABLE OF s_data.

TYPESBEGIN OF s_excel,
         partner    TYPE alsmex_tabline-value,   " 业务伙伴编号
         bu_type    TYPE alsmex_tabline-value,   " 业务伙伴类别
         bu_group   TYPE alsmex_tabline-value,   " 业务伙伴分组
         title_key  TYPE alsmex_tabline-value,   " 称谓
         name_org1  TYPE alsmex_tabline-value,   " 组织名称 1
         name_org2  TYPE alsmex_tabline-value,   " 组织名称 2
         name_org3  TYPE alsmex_tabline-value,   " 组织名称 3
         name_org4  TYPE alsmex_tabline-value,   " 组织名称 4
         bu_sort1   TYPE alsmex_tabline-value,   " 业务伙伴的搜索词 1
         bu_sort2   TYPE alsmex_tabline-value,   " 业务伙伴的搜索词 2
         street     TYPE alsmex_tabline-value,   " 街道
         country    TYPE alsmex_tabline-value,   " 国家
         post_code1 TYPE alsmex_tabline-value,   " 城市邮政编码
         city1      TYPE alsmex_tabline-value,   " 城市
         region     TYPE alsmex_tabline-value,   " 地区(省/自治区/直辖市、市、县)
         tel_number TYPE alsmex_tabline-value,   " 电话
         mob_number TYPE alsmex_tabline-value,   " 移动电话
         langu      TYPE alsmex_tabline-value,   " 语言代码
         fdate      TYPE alsmex_tabline-value,   " 地址有效期自
         vkorg      TYPE alsmex_tabline-value,   " 销售组织
         vtweg      TYPE alsmex_tabline-value,   " 分销渠道
         spart      TYPE alsmex_tabline-value,   " 产品组
         pltyp      TYPE alsmex_tabline-value,   " 价格清单类型
         zterm      TYPE alsmex_tabline-value,   " 付款条件代码
         ktgrd      TYPE alsmex_tabline-value,   " 客户科目分配组
         konda      TYPE alsmex_tabline-value,   " 价格组
         kalks      TYPE alsmex_tabline-value,   " 定价过程
         vsbed      TYPE alsmex_tabline-value,   " 装运条件
         taxkd      TYPE alsmex_tabline-value,   " 客户税分类
         vwerk      TYPE alsmex_tabline-value,   " 交货工厂
         gpanr_z3   TYPE alsmex_tabline-value,   " 总公司
         bukrs      TYPE alsmex_tabline-value,   " 公司代码
         akont      TYPE alsmex_tabline-value,   " 统驭科目
       END OF s_excel.
TYPES: t_excel TYPE TABLE OF s_excel.
*&---------------------------------------------------------------------*
*&  结构
*&---------------------------------------------------------------------*
DATA: gs_data  TYPE s_data,
      gt_excel TYPE t_excel.

*&---------------------------------------------------------------------*
*&  内表
*&---------------------------------------------------------------------*
DATA: gt_data TYPE t_data.

*&---------------------------------------------------------------------*
*&  对象
*&---------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION DEFERRED.
DATA: go_dock_100 TYPE REF TO cl_gui_docking_container.
DATA: go_grid_100 TYPE REF TO cl_gui_alv_grid.
DATA: go_alv_event_100 TYPE REF TO lcl_alv_event_0100.

*&---------------------------------------------------------------------*
*&  变量
*&---------------------------------------------------------------------*
DATA: ok_code  TYPE sy-ucomm,
      gv_code  TYPE sy-ucomm,
      gv_title TYPE repti,
      gv_line  TYPE i.

*&---------------------------------------------------------------------*
*&  选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-t01.

PARAMETERS: p_box1 AS CHECKBOX,
            p_box2 AS CHECKBOX,
            p_box3 AS CHECKBOX.
PARAMETERS: p_file TYPE rlgrap-filename.

SELECTION-SCREEN END OF BLOCK bl01.

SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.
  PERFORM set_button_text.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM select_pc_filename USING p_file.

AT SELECTION-SCREEN.
  PERFORM ucomm_screen_1000.

START-OF-SELECTION.  
PERFORM program_main.

*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_0100 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION.  
PUBLIC SECTION.    
" Toolbar事件    
METHODS handle_toolbar                  
FOR EVENT toolbar OF cl_gui_alv_grid      
IMPORTING e_object e_interactive.    
" USER-COMMAND 事件    
METHODS handle_user_command                  
FOR EVENT user_command OF cl_gui_alv_grid      
IMPORTING e_ucomm.
ENDCLASS"LCL_ALV_EVENT_0100 DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_0100 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 IMPLEMENTATION.  
" Toolbar事件  
METHOD handle_toolbar.    
PERFORM alv_toolbar CHANGING e_object->mt_toolbar.  
ENDMETHOD.                    "handle_toolbar  
" USER_COMMAND 事件  
METHOD handle_user_command.    
PERFORM user_command_event USING e_ucomm.  
ENDMETHOD.                    "HANDLE_USER_COMMAND
ENDCLASS"LCL_ALV_EVENT_0100 IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.  gv_title 
TEXT-t02.  
SET PF-STATUS 'STATUS_BAR'.  
SET TITLEBAR 'TITLE_BAR' WITH gv_title gv_line.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_SCREEN_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_screen_0100 OUTPUT.  
PERFORM init_alv_100.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.  gv_code 
= ok_code.  
CLEAR ok_code.  
CASE gv_code.    
WHEN '&BACK'.      
LEAVE TO SCREEN 0.    
WHEN OTHERS.  
ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Form  PROGRAM_MAIN
*&---------------------------------------------------------------------*
*       text  程序入口
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM program_main.  
" 选择屏幕校验  
PERFORM check_screen_1000.  
" 读取Excel数据  
PERFORM upload_data USING    p_file                      
CHANGING gt_data gt_excel.  
IF gt_data[] IS INITIAL.    
" 无符合条件的数据!    
MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'.    
EXIT.  
ENDIF.  
" 处理数据  
PERFORM deal_data CHANGING gt_data.  
" 校验数据  
PERFORM check_data USING gt_excel CHANGING gt_data.  

DESCRIBE TABLE gt_data LINES gv_line" 统计内表行数  

CALL SCREEN 100.

ENDFORM" PROGRAM_MAIN
*&---------------------------------------------------------------------*
*&      Form  SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_button_text .  
DATA: ls_smp_dyntxt TYPE smp_dyntxt.  ls_smp_dyntxt

-icon_id '@49@'.  ls_smp_dyntxt
-icon_text TEXT-t03.  " 下载模板  ls_smp_dyntxt
-quickinfo TEXT-t03.  " 下载模板  sscrfields
-functxt_01   = ls_smp_dyntxt.
ENDFORM"SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
*&      Form  UCOMM_SCREEN_1000
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ucomm_screen_1000 .  
CASE sscrfields-ucomm.    
WHEN 'UC1'.    
WHEN 'FC01'.      
PERFORM set_download_exceltemplate.    
WHEN OTHERS.  
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SELECT_PC_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->cv_file    text
*----------------------------------------------------------------------*
FORM select_pc_filename CHANGING cv_file TYPE rlgrap-filename.  
DATA: ls_filetable TYPE file_table.  
DATA: lt_filetable TYPE filetable.  

DATA: lv_rc           TYPE i,        lv_window_title 
TYPE string,        lv_file_filter  
TYPE string.  lv_window_title 

TEXT-t04" Select File " ####  lv_file_filter 
'Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls'.  

CALL METHOD cl_gui_frontend_services=>file_open_dialog    
EXPORTING      window_title            
= lv_window_title
*     default_extension       =
*     default_filename        =      file_filter             
= lv_file_filter
*     with_encoding           =
*     initial_directory       =
*     multiselection          =    
CHANGING      file_table              
= lt_filetable      rc                      
= lv_rc
*     user_action             =
*     file_encoding           =    
EXCEPTIONS      file_open_dialog_failed 
1      cntl_error              
2      error_no_gui            
3      not_supported_by_gui    
4      
OTHERS                  5.  
IF sy-subrc <> 0.
*   Implement suitable error handling here  
ENDIF.  
READ TABLE lt_filetable INTO ls_filetable INDEX 1.  
IF sy-subrc EQ 0.    cv_file 
= ls_filetable-filename.  
ENDIF.

ENDFORM"SELECT_PC_FILENAME

*&---------------------------------------------------------------------*
*&      Form  set_DOWNLOAD_EXCELTEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_download_exceltemplate.  
DATA: lv_file  TYPE rlgrap-filename,        lv_objid 
TYPE w3objid.  

PERFORM save_file_path CHANGING lv_file.  

IF lv_file IS NOT INITIAL.    lv_objid 
= gc_objid.    
PERFORM download_excel_fromserver USING lv_objid lv_file.  
ENDIF.

ENDFORM"set_DOWNLOAD_EXCELTEMPLATE

*&---------------------------------------------------------------------*
*&      Form  save_file_path
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->cv_file    text
*----------------------------------------------------------------------*
FORM save_file_path CHANGING cv_file TYPE rlgrap-filename.  
DATA: lv_window_title TYPE string,        lv_file_filter  
TYPE string,        lv_file_name    
TYPE string.  

DATA: lv_filename TYPE string,        lv_path     
TYPE string,        lv_fullpath 
TYPE string.  

CLEAR cv_file.  lv_window_title 
TEXT-t05.                      " 保存文件  lv_file_filter  
'Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls'.  
CONCATENATE TEXT-t06 sy-datum INTO lv_file_name.  

CALL METHOD cl_gui_frontend_services=>file_save_dialog    
EXPORTING      window_title              
= lv_window_title      default_extension         
'xlsx'      default_file_name         
= lv_file_name
*     with_encoding             =      file_filter               
= lv_file_filter
*     initial_directory         =
*     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.    
" 打开文件目录失败!    
MESSAGE TEXT-m02 TYPE 'S' DISPLAY LIKE 'E'.    
EXIT.  
ENDIF.  
IF lv_fullpath IS NOT INITIAL.    cv_file 
= lv_fullpath.  
ENDIF.

ENDFORM"save_file_path

*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_EXCEL_FROMSERVER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->pv_objid    text
*      -->pv_file     text
*----------------------------------------------------------------------*
FORM download_excel_fromserver USING pv_objid TYPE wwwdatatab-objid                                     pv_file  
TYPE  rlgrap-filename.  
DATA: ls_objdata     TYPE wwwdatatab.  

DATA: lv_destination TYPE rlgrap-filename,        lv_rc          
TYPE sy-subrc,        lv_message     
TYPE bapi_msg.  

SELECT SINGLE relid objid    
FROM wwwdata    
INTO CORRESPONDING FIELDS OF ls_objdata     
WHERE srtf2 0     
AND relid   'MI'     
AND objid   = pv_objid.  
IF sy-subrc NE OR ls_objdata-objid EQ space.    
" The template file &1 does not exist, Please upload with SMW0(TCODE)    lv_message 
TEXT-m03.    
REPLACE '&1' WITH pv_objid INTO lv_message.    
MESSAGE lv_message TYPE 'S' DISPLAY LIKE 'E'.    
EXIT.  
ENDIF.  lv_destination   

= pv_file.  

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'    
EXPORTING      
key         = ls_objdata      destination 
= lv_destination    
IMPORTING      rc          
= lv_rc.  
IF lv_rc NE 0.    
" Template file &1 download failed !    lv_message 
TEXT-m04.    
REPLACE '&1' WITH pv_objid INTO lv_message.    
MESSAGE lv_message TYPE 'S' DISPLAY LIKE 'E'.    
EXIT.  
ENDIF.
ENDFORM"DOWNLOAD_EXCEL_FROMSERVER

*&---------------------------------------------------------------------*
*&      Form  UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  pv_file        text
*  <--  ct_data        text
*  <--  ct_excel       text
*----------------------------------------------------------------------*
FORM upload_data USING    pv_file  TYPE rlgrap-filename                 
CHANGING ct_data  TYPE t_data                          ct_excel 
TYPE t_excel.  
DATA: ls_data      TYPE s_data,        ls_excel     
TYPE s_excel,        ls_excel_tab 
TYPE alsmex_tabline.  

DATA: lt_excel_tab LIKE TABLE OF ls_excel_tab.  

DATA: lv_row      TYPE alsmex_tabline-row,        lv_col      
TYPE alsmex_tabline-col,        lv_tabix    
TYPE sy-tabix,        lv_filename 
TYPE rlgrap-filename.  

FIELD-SYMBOLS: <fs_value>.  

CHECK pv_file IS NOT INITIAL.  

CLEAR: ct_data[], ct_excel[].  lv_filename 

= pv_file.  

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'    
EXPORTING      filename                
= lv_filename      i_begin_col             
2      i_begin_row             
1      i_end_col               
34      i_end_row               
9999    
TABLES      intern                  
= lt_excel_tab    
EXCEPTIONS      inconsistent_parameters 
1      upload_ole              
2      
OTHERS                  3.  
IF sy-subrc <> 0.    
" 读取EXCEL数据失败!    
MESSAGE TEXT-m05 TYPE 'S' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.  

SORT lt_excel_tab BY row col.  
LOOP AT lt_excel_tab INTO ls_excel_tab.    lv_col 
= ls_excel_tab-col.    
AT NEW row.      
CLEAR: ls_excel.      
IF lv_row NE ls_excel_tab-row AND ls_excel_tab-row NE 1.        
EXIT.      
ENDIF.    
ENDAT.    

ASSIGN COMPONENT lv_col OF STRUCTURE ls_excel TO <fs_value>.    
IF sy-subrc EQ 0.      
CONDENSE ls_excel_tab-value NO-GAPS.      
MOVE ls_excel_tab-value TO <fs_value>.    
ENDIF.    

AT END OF row.      
IF lv_row <= 3.        
APPEND ls_excel TO ct_excel.      
ELSE.        
CLEAR ls_data.        
MOVE-CORRESPONDING ls_excel TO ls_data.        
APPEND ls_data TO ct_data.      
ENDIF.      lv_row 
= ls_excel_tab-row + 1.    
ENDAT.    
CLEAR ls_excel_tab.  
ENDLOOP.

ENDFORM" UPLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  deal_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  <--  ct_data        text
*----------------------------------------------------------------------*
FORM deal_data CHANGING ct_data TYPE t_data.  
DATA: ls_data TYPE s_data.  

DATA: lv_tabix   TYPE sy-tabix,        lv_partner 
TYPE but000-partner,        lv_kunnr   
TYPE knvv-kunnr.  

CHECK ct_data[] IS NOT INITIAL.  

LOOP AT ct_data INTO ls_data.    lv_tabix 
= sy-tabix.    ls_data
-tatyp 'MWST'.    
IF ls_data-partner IS NOT INITIAL.      
" 添加前导零      
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        
EXPORTING          
input  = ls_data-partner        
IMPORTING          
output = ls_data-partner.    
ENDIF.    
IF ls_data-gpanr_z3 IS NOT INITIAL.      
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        
EXPORTING          
input  = ls_data-gpanr_z3        
IMPORTING          
output = ls_data-gpanr_z3.    

ENDIF.    
IF p_box1 'X'.      
SELECT SINGLE partner FROM but000 INTO lv_partner        
WHERE partner = ls_data-partner.      
IF sy-subrc EQ 0.        ls_data
-icon  = gc_icon-yellow.        ls_data
-msg   TEXT-m13.        " 客户基本视图已存在        ls_data
-kna1f 'X'.      
ENDIF.    
ENDIF.    
IF p_box2 'X'.      
SELECT SINGLE kunnr FROM knvv INTO lv_kunnr        
WHERE kunnr = ls_data-partner        
AND   vkorg = ls_data-vkorg        
AND   vtweg = ls_data-vtweg        
AND   spart = ls_data-spart.      
IF sy-subrc EQ 0.        ls_data
-icon  = gc_icon-yellow.        ls_data
-msg   = ls_data-msg && ';' && TEXT-m14" 客户销售视图已经存在        ls_data
-knvvf 'X'.      
ENDIF.    
ENDIF.    
IF p_box3 'X'.      
SELECT SINGLE kunnr FROM knb1 INTO lv_kunnr        
WHERE kunnr = ls_data-partner        
AND   bukrs = ls_data-bukrs.      
IF sy-subrc EQ 0.        ls_data
-icon  = gc_icon-yellow.        ls_data
-msg   = ls_data-msg && ';' && TEXT-m15.        " 客户公司代码视图已经存在        ls_data
-knb1f 'X'.      
ENDIF.    
ENDIF.    
MODIFY ct_data FROM ls_data INDEX lv_tabix      
TRANSPORTING partner gpanr_z3 tatyp icon msg kna1f knvvf knb1f.    
CLEAR ls_data.  
ENDLOOP.

ENDFORM"get_data

*&---------------------------------------------------------------------*
*&      Form  init_alv_100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init_alv_100.  
DATA: ls_layout  TYPE lvc_s_layo,        ls_variant 
TYPE disvariant.  

DATA: lt_fieldcatalog TYPE lvc_t_fcat,        lt_exclude      
TYPE ui_functions.  

IF go_dock_100 IS INITIAL.    
" 容器    
CREATE OBJECT go_dock_100      
EXPORTING        repid                       
= sy-repid  " 程序名        dynnr                       
= sy-dynnr  " 屏幕号
*       SIDE                        = DOCK_AT_LEFT        extension                   
1500      " ALV宽度      
EXCEPTIONS        cntl_error                  
1        cntl_system_error           
2        create_error                
3        lifetime_error              
4        lifetime_dynpro_dynpro_link 
5        
OTHERS                      6.    
IF sy-subrc <> 0.      
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno                 
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.    
ENDIF.    
" ALV    
CREATE OBJECT go_grid_100      
EXPORTING        i_parent          
= go_dock_100      
EXCEPTIONS        error_cntl_create 
1        error_cntl_init   
2        error_cntl_link   
3        error_dp_create   
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.    
ENDIF.    ls_variant

-report = sy-repid.    
" ALV字段    
PERFORM set_fieldcatalog TABLES lt_fieldcatalog.    
" ALV布局    
PERFORM set_layout CHANGING ls_layout.    
" 隐藏工具条按钮    
PERFORM set_toolbar_excluding CHANGING lt_exclude.    

" 显示ALV    
CALL METHOD go_grid_100->set_table_for_first_display      
EXPORTING        is_variant                    
= ls_variant        i_save                        
'A'        i_default                     
'X'        is_layout                     
= ls_layout        it_toolbar_excluding          
= lt_exclude      
CHANGING        it_outtab                     
= gt_data[]        it_fieldcatalog               
= lt_fieldcatalog[]      
EXCEPTIONS        invalid_parameter_combination 
1        program_error                 
2        too_many_lines                
3        
OTHERS                        4.    
IF sy-subrc <> 0.
*     Implement suitable error handling here    
ENDIF.    
" ALV事件    
CREATE OBJECT go_alv_event_100.    
SET HANDLER go_alv_event_100->handle_toolbar       FOR go_grid_100" TOOLBAR    
SET HANDLER go_alv_event_100->handle_user_command  FOR go_grid_100" USER COMMAND    
CALL METHOD go_grid_100->set_toolbar_interactive" 响应工具条  
ELSE.    
PERFORM refresh_alv USING go_grid_100.  
ENDIF.
ENDFORM"init_alv_100

*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ct_fcat    text
*----------------------------------------------------------------------*
FORM set_fieldcatalog TABLES ct_fcat TYPE lvc_t_fcat.  
DEFINE lm_add_fcat.    
CLEAR ls_fcat.    ls_fcat
-fieldname       = &1.  " 字段名    ls_fcat
-coltext         = &2.  " 显示字段文本    ls_fcat
-no_zero         = &3.  " 隐藏前导零    ls_fcat
-checkbox        = &4.  " 复选框    ls_fcat
-edit            = &5.  " 可修改    ls_fcat
-outputlen       = &6.  " 输出长度    ls_fcat
-just            = &7.  " 对齐    ls_fcat
-ref_table       = &8.  " 参考表    ls_fcat
-ref_field       = &9.  " 参考字段    
APPEND ls_fcat TO ct_fcat.  
END-OF-DEFINITION.  

DATA: ls_fcat TYPE lvc_s_fcat.  

CLEAR: ct_fcat[].  lm_add_fcat 

'SEL'        TEXT-f01   ''  'X' 'X' ''  ''  ''  ''.    " 选择  lm_add_fcat 
'ICON'       TEXT-f02   ''  ''  ''  ''  ''  ''  ''.    " 状态  lm_add_fcat 
'MSG'        TEXT-f03   ''  ''  ''  ''  ''  ''  ''.    " 提示信息  lm_add_fcat 
'PARTNER'    TEXT-f04   ''  ''  ''  ''  ''  ''  ''.    " 业务伙伴编号  lm_add_fcat 
'BU_TYPE'    TEXT-f05   ''  ''  ''  ''  ''  ''  ''.    " 业务伙伴类别  lm_add_fcat 
'BU_GROUP'   TEXT-f06   ''  ''  ''  ''  ''  ''  ''.    " 业务伙伴分组  lm_add_fcat 
'TITLE_KEY'  TEXT-f35   ''  ''  ''  ''  ''  ''  ''.    " 称谓  lm_add_fcat 
'NAME_ORG1'  TEXT-f07   ''  ''  ''  ''  ''  ''  ''.    " 组织名称1  lm_add_fcat 
'NAME_ORG2'  TEXT-f08   ''  ''  ''  ''  ''  ''  ''.    " 组织名称2  lm_add_fcat 
'NAME_ORG3'  TEXT-f09   '' ''   ''  ''  ''  ''  ''.    " 组织名称3  lm_add_fcat 
'NAME_ORG4'  TEXT-f10   '' ''   ''  ''  ''  ''  ''.    " 组织名称4  lm_add_fcat 
'BU_SORT1'   TEXT-f11   '' ''   ''  ''  ''  ''  ''.    " 业务伙伴的搜索词1  lm_add_fcat 
'BU_SORT2'   TEXT-f31   '' ''   ''  ''  ''  ''  ''.    " 业务伙伴的搜索词2  lm_add_fcat 
'STREET'     TEXT-f12   '' ''   ''  ''  ''  ''  ''.    " 街道  lm_add_fcat 
'COUNTRY'    TEXT-f13   '' ''   ''  ''  ''  ''  ''.    " 国家  lm_add_fcat 
'POST_CODE1' TEXT-f14   '' ''   ''  ''  ''  ''  ''.    " 城市邮政编码  lm_add_fcat 
'CITY1'      TEXT-f15   '' ''   ''  ''  ''  ''  ''.    " 城市  lm_add_fcat 
'REGION'     TEXT-f16   '' ''   ''  ''  ''  ''  ''.    " 地区  lm_add_fcat 
'TEL_NUMBER' TEXT-f17   '' ''   ''  ''  ''  ''  ''.    " 电话  lm_add_fcat 
'MOB_NUMBER' TEXT-f18   '' ''   ''  ''  ''  ''  ''.    " 移动电话  lm_add_fcat 
'LANGU'      TEXT-f19   '' ''   ''  ''  ''  ''  ''.    " 语言代码  lm_add_fcat 
'FDATE'      TEXT-f20   '' ''   ''  ''  ''  ''  ''.    " 地址有效期自  lm_add_fcat 
'VKORG'      TEXT-f21   '' ''   ''  ''  ''  ''  ''.    " 销售组织  lm_add_fcat 
'VTWEG'      TEXT-f22   '' ''   ''  ''  ''  ''  ''.    " 分销渠道  lm_add_fcat 
'SPART'      TEXT-f23   '' ''   ''  ''  ''  ''  ''.    " 产品组  lm_add_fcat 
'PLTYP'      TEXT-f24   '' ''   ''  ''  ''  ''  ''.    " 价格清单类型  lm_add_fcat 
'ZTERM'      TEXT-f25   '' ''   ''  ''  ''  ''  ''.    " 付款条件代码  lm_add_fcat 
'KTGRD'      TEXT-f26   '' ''   ''  ''  ''  ''  ''.    " 客户科目分配组  lm_add_fcat 
'KONDA'      TEXT-f36   '' ''   ''  ''  ''  ''  ''.    " 价格组  lm_add_fcat 
'VSBED'      TEXT-f33   '' ''   ''  ''  ''  ''  ''.    " 装运条件  lm_add_fcat 
'KALKS'      TEXT-f34   '' ''   ''  ''  ''  ''  ''.    " 定价过程  lm_add_fcat 
'TAXKD'      TEXT-f27   '' ''   ''  ''  ''  ''  ''.    " 客户税分类  lm_add_fcat 
'VWERK'      TEXT-f28   '' ''   ''  ''  ''  ''  ''.    " 交货工厂  lm_add_fcat 
'GPANR_Z3'   TEXT-f32   '' ''   ''  ''  ''  ''  ''.    " 总公司  lm_add_fcat 
'BUKRS'      TEXT-f29   '' ''   ''  ''  ''  ''  ''.    " 公司代码  lm_add_fcat 
'AKONT'      TEXT-f30   '' ''   ''  ''  ''  ''  ''.    " 统驭科目
ENDFORM"SET_FIELDCATALOG

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->cs_layout  text
*----------------------------------------------------------------------*
FORM set_layout CHANGING cs_layout TYPE lvc_s_layo.  
CLEAR: cs_layout.  cs_layout
-cwidth_opt 'X'.  " 自动调节字段长度  cs_layout
-zebra      'X'.  " 颜色交替显示  cs_layout
-sel_mode   'A'.  " A、B、C、D
*  CS_LAYOUT-STYLEFNAME = 'CELLTAB'.
*  CS_LAYOUT-EDIT_MODE = 'A'.  "
ENDFORM"SET_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  SET_TOOLBAR_EXCLUDING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->CT_FUNCTION  text
*----------------------------------------------------------------------*
FORM set_toolbar_excluding CHANGING ct_function TYPE ui_functions.  
DATA: ls_function TYPE ui_func.  

CLEAR: ct_function[].  ls_function 
= cl_gui_alv_grid=>mc_fc_print.            " 打印  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_graph.            " 显示图形  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_mb_view.             " 视图  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_detail.            " 明细  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_info.              " 最终用户文档  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_print_back.        " 打印  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_insert_row.    " 插入行  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_delete_row.    " 删除行  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_append_row.    " 附加行  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_copy_row.      " 复制行  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_copy.          " 复制  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_cut.           " 剪切  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_paste.         " 插入总览  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_paste_new_row" 插入新行  
APPEND ls_function TO ct_function.  ls_function 
= cl_gui_alv_grid=>mc_fc_loc_undo.          " 撤销  
APPEND ls_function TO ct_function.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_MB_EXPORT.           " 导出
*  APPEND LS_FUNCTION TO CT_FUNCTION.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_FC_MAXIMUM.          " 最大值
*  APPEND LS_FUNCTION TO CT_FUNCTION.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_FC_MINIMUM.          " 最小值
*  APPEND LS_FUNCTION TO CT_FUNCTION.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_FC_SUM.              " 总计
*  APPEND LS_FUNCTION TO CT_FUNCTION.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_FC_AVERAGE.          " 平均值
*  APPEND LS_FUNCTION TO CT_FUNCTION.
*  LS_FUNCTION = CL_GUI_ALV_GRID=>MC_FC_REFRESH.          " 刷新
*  APPEND LS_FUNCTION TO CT_FUNCTION.

ENDFORM"SET_TOOLBAR_EXCLUDING

*&---------------------------------------------------------------------*
*&      Form  REFRESH_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PO_GRID    text
*----------------------------------------------------------------------*
FORM refresh_alv USING po_grid TYPE REF TO cl_gui_alv_grid.  
DATA: ls_scroll TYPE lvc_s_stbl.  ls_scroll
-row 'X'.  ls_scroll
-col 'X'.  
CALL METHOD po_grid->refresh_table_display    
EXPORTING      is_stable      
= ls_scroll      i_soft_refresh 
'X'    
EXCEPTIONS      finished       
1      
OTHERS         2.

ENDFORM"REFRESH_ALV
*&---------------------------------------------------------------------*
*&      Form  ALV_TOOLBAR
*&---------------------------------------------------------------------*
*       text  ALV 工具条按钮
*----------------------------------------------------------------------*
*      -->CT_TOOLBAR text
*----------------------------------------------------------------------*
FORM alv_toolbar CHANGING ct_toolbar TYPE ttb_button.  
DATA: ls_toolbar TYPE stb_button.  ls_toolbar

-butn_type 3.  
APPEND ls_toolbar TO ct_toolbar.  

CLEAR: ls_toolbar.  ls_toolbar
-function  '&ZSALL'.  ls_toolbar
-icon      '@4B@'.  ls_toolbar
-quickinfo TEXT-b01.     " 全选  ls_toolbar
-butn_type 0.  ls_toolbar
-disabled  ''.  ls_toolbar
-text      TEXT-b01.     " 全选  
APPEND ls_toolbar TO ct_toolbar.  

CLEAR: ls_toolbar.  ls_toolbar
-function  '&ZDALL'.  ls_toolbar
-icon      '@4D@'.  ls_toolbar
-quickinfo TEXT-b02.       " 取消全选  ls_toolbar
-butn_type 0.  ls_toolbar
-disabled  ''.  ls_toolbar
-text      TEXT-b02.       " 取消全选  
APPEND ls_toolbar TO ct_toolbar.  

CLEAR: ls_toolbar.  ls_toolbar
-butn_type 3.  
APPEND ls_toolbar TO ct_toolbar.  

CLEAR: ls_toolbar.  ls_toolbar
-function  '&ZIMPORT'.  ls_toolbar
-icon      '@U3@'.  ls_toolbar
-quickinfo TEXT-b03.     " 导入  ls_toolbar
-butn_type 0.  ls_toolbar
-disabled  ''.  ls_toolbar
-text      TEXT-b03.     " 导入  
APPEND ls_toolbar TO ct_toolbar.
ENDFORM" ALV_TOOLBAR
*&---------------------------------------------------------------------*
*& Form USER_COMMAND_EVENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM user_command_event USING pv_ucomm TYPE sy-ucomm.  
CASE  pv_ucomm.    
WHEN '&ZSALL'.      
PERFORM select_all USING 'X'.    
WHEN '&ZDALL'.      
PERFORM select_all USING ''.    
WHEN '&ZIMPORT'.      
PERFORM call_bapi_to_import.    
WHEN OTHERS.  
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECT_ALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> pv_flag
*&---------------------------------------------------------------------*
FORM select_all USING VALUE(pv_flagTYPE char1.  
DATA: ls_data  TYPE s_data.  

DATA: lv_tabix TYPE sy-tabix.  

IF pv_flag 'X'.    
LOOP AT gt_data INTO ls_data WHERE sel ''.      lv_tabix 
= sy-tabix.      ls_data
-sel 'X'.      
MODIFY gt_data FROM ls_data INDEX lv_tabix TRANSPORTING sel.    
ENDLOOP.  
ELSE.    
LOOP AT gt_data INTO ls_data WHERE sel 'X'.      lv_tabix 
= sy-tabix.      
CLEAR ls_data-sel.      
MODIFY gt_data FROM ls_data INDEX lv_tabix TRANSPORTING sel.    
ENDLOOP.  
ENDIF.  
PERFORM refresh_alv USING go_grid_100.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_BAPI_TO_IMPORT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM call_bapi_to_import.  
DATA: ls_raifp1 TYPE raifp1,        ls_raifp2 
TYPE raifp2,        ls_raifp3 
TYPE raifp3,        ls_return 
TYPE bapiret2,        ls_data   
TYPE s_data.  

DATA: lt_raifp2 LIKE TABLE OF ls_raifp2,        lt_raifp3 
LIKE TABLE OF ls_raifp3,        lt_return 
LIKE TABLE OF ls_return.  

DATA: lv_txnok TYPE anlb-xnega,        lv_fcode 
TYPE sy-ucomm,        lv_subrc 
TYPE sy-subrc,        lv_tabix 
TYPE sy-tabix.  

DATA: lv_partner TYPE but000-partner,        lv_kunnr   
TYPE knvv-kunnr.  go_grid_100

->check_changed_data).  

READ TABLE gt_data INTO ls_data WITH KEY sel 'X'.  
IF sy-subrc <> 0.    
" 请选择要导入的数据!    
MESSAGE TEXT-m06 TYPE 'S' DISPLAY LIKE 'E'.    
EXIT.  
ENDIF.  

LOOP AT gt_data INTO ls_data WHERE sel  'X'                                
AND  type ''.    lv_tabix 
= sy-tabix.    
" 基本视图    
IF p_box1 'X'.      
IF ls_data-kna1f IS INITIAL.        
SELECT SINGLE partner FROM but000 INTO lv_partner          
WHERE partner = ls_data-partner.        
IF sy-subrc EQ 0.          ls_data
-type  'W'.          ls_data
-icon  = gc_icon-yellow.          ls_data
-msg   TEXT-m13.        " 客户基本视图已存在          ls_data
-kna1f 'X'.        
ELSE.          
PERFORM create_bp_but000 CHANGING ls_data.        
ENDIF.      
ENDIF.    
ENDIF.    
" 销售视图    
IF p_box2 'X' AND ls_data-kna1f 'X'.      
IF ls_data-knvvf IS INITIAL.        
SELECT SINGLE kunnr FROM knvv INTO lv_kunnr          
WHERE kunnr = ls_data-partner          
AND   vkorg = ls_data-vkorg          
AND   vtweg = ls_data-vtweg          
AND   spart = ls_data-spart.        
IF sy-subrc EQ 0.          ls_data
-type  'W'.          ls_data
-icon  = gc_icon-yellow.          ls_data
-msg   = ls_data-msg && ';' && TEXT-m14" 客户销售视图已经存在          ls_data
-knvvf 'X'.        
ELSE.          
PERFORM create_bp_knvv CHANGING ls_data.        
ENDIF.      
ENDIF.    
ENDIF.    
" 公司代码视图    
IF p_box3 'X' AND ls_data-kna1f 'X'.      
IF ls_data-knb1f IS INITIAL.        
SELECT SINGLE kunnr FROM knb1 INTO lv_kunnr          
WHERE kunnr = ls_data-partner          
AND   bukrs = ls_data-bukrs.        
IF sy-subrc EQ 0.          ls_data
-type  'W'.          ls_data
-icon  = gc_icon-yellow.          ls_data
-msg   = ls_data-msg && ';' && TEXT-m15.        " 客户公司代码视图已经存在          ls_data
-knb1f 'X'.        
ELSE.          
PERFORM create_bp_knb1 CHANGING ls_data.        
ENDIF.      
ENDIF.    
ENDIF.    

MODIFY gt_data FROM ls_data INDEX lv_tabix      
TRANSPORTING type icon msg kna1f knvvf knb1f.    
CLEAR: ls_data.  
ENDLOOP.  

PERFORM refresh_alv USING go_grid_100.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_BP_BUT000
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- cs_data
*&---------------------------------------------------------------------*
FORM create_bp_but000 CHANGING cs_data TYPE s_data.  
DATA: ls_centraldata             TYPE bapibus1006_central,        ls_centraldataperson       
TYPE bapibus1006_central_person,        ls_centraldataorganization 
TYPE bapibus1006_central_organ,        ls_addressdata             
TYPE bapibus1006_address,        ls_telefondata             
TYPE bapiadtel,        ls_return                  
TYPE bapiret2.  

DATA: lt_telefondata LIKE TABLE OF ls_telefondata,        lt_return      
LIKE TABLE OF ls_return.  

DATA: lv_bpartner  TYPE bapibus1006_head-bpartner,        lv_bpartner2 
TYPE bapibus1006_head-bpartner,        lv_bu_type   
TYPE bapibus1006_head-partn_cat,        lv_bu_group  
TYPE bapibus1006_head-partn_grp,        lv_langu     
TYPE sy-langu,        lv_error     
TYPE char1.  

CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'    
EXPORTING      
input            = cs_data-langu    
IMPORTING      
output           = lv_langu " 语言代码    
EXCEPTIONS      unknown_language 
1      
OTHERS           2.  
IF sy-subrc <> 0.
*   Implement suitable error handling here  
ENDIF.  lv_bpartner 

= cs_data-partner.    " 业务伙伴编号  lv_bu_type  
= cs_data-bu_type.    " 业务伙伴类别  lv_bu_group 
= cs_data-bu_group.   " 业务伙伴分组  ls_centraldata

-title_key   = cs_data-title_key.  ls_centraldata
-searchterm1 = cs_data-bu_sort1" 业务伙伴的搜索词1  ls_centraldata
-searchterm2 = cs_data-bu_sort2" 业务伙伴的搜索词2  
IF cs_data-bu_type 1" 人员    ls_centraldataperson
-firstname          = cs_data-name_org1" 业务伙伴(人员)的名    ls_centraldataperson
-lastname           = cs_data-name_org2" 业务伙伴(个人)的姓    ls_centraldataperson
-correspondlanguage = lv_langu.          " 信函语言  
ELSE.                   " 组织    ls_centraldataorganization
-name1 = cs_data-name_org1" 组织名称 1    ls_centraldataorganization
-name2 = cs_data-name_org2" 组织名称 2    ls_centraldataorganization
-name3 = cs_data-name_org3" 组织名称 3    ls_centraldataorganization
-name4 = cs_data-name_org4" 组织名称 4    ls_addressdata
-langu             = lv_langu.          " 语言代码  

ENDIF.  ls_addressdata
-street        = cs_data-street.     " 街道  ls_addressdata
-country       = cs_data-country.    " 国家  ls_addressdata
-city          = cs_data-city1.      " 城市  ls_addressdata
-postl_cod1    = cs_data-post_code1" 城市邮政编码  ls_addressdata
-region        = cs_data-region.     " 地区(省/自治区/直辖市、市、县)  ls_addressdata
-validfromdate = cs_data-fdate.      " 有效起始日期  ls_addressdata
-validtodate   '99991231'.         " 有效截止日期  

IF cs_data-tel_number IS NOT INITIAL.    
CLEAR ls_telefondata.    ls_telefondata
-country = cs_data-country.    ls_telefondata
-std_no    'X'.    ls_telefondata
-home_flag 'X'.    ls_telefondata
-r_3_user  '1'.    ls_telefondata
-telephone = cs_data-tel_number.  " 电话    
APPEND ls_telefondata TO lt_telefondata.  
ENDIF.  

IF cs_data-mob_number IS NOT INITIAL.    
CLEAR ls_telefondata.    ls_telefondata
-country = cs_data-country.    ls_telefondata
-r_3_user  '3'.    ls_telefondata
-telephone = cs_data-mob_number.    
APPEND ls_telefondata TO lt_telefondata.        " 移动电话  
ENDIF.  

CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'    
EXPORTING      businesspartnerextern   
= lv_bpartner      partnercategory         
= lv_bu_type      partnergroup            
= lv_bu_group      centraldata             
= ls_centraldata      centraldataperson       
= ls_centraldataperson      centraldataorganization 
= ls_centraldataorganization      addressdata             
= ls_addressdata    
IMPORTING      businesspartner         
= lv_bpartner2    
TABLES      telefondata             
= lt_telefondata      
return                  = lt_return.  

LOOP AT lt_return INTO ls_return WHERE type 'A' OR type 'E'.    lv_error 
'X'.    cs_data
-msg  = cs_data-msg && ';' && ls_return-message.  
ENDLOOP.  
IF lv_error 'X'.    cs_data
-type  'W'.    cs_data
-icon = gc_icon-red.    
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.  
ELSE.    cs_data
-type   'S'.    cs_data
-icon   = gc_icon-green.    cs_data
-kna1f  'X'.    cs_data
-msg    = cs_data-msg && ';' && TEXT-m07" 基本视图创建成功    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_BP_KNVV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- cs_data
*&---------------------------------------------------------------------*
FORM create_bp_knvv  CHANGING cs_data TYPE s_data.  
DATA: ls_cvi_cust_link         TYPE cvi_cust_link,        ls_customers             
TYPE cmds_ei_extern,        ls_sales                 
TYPE cmds_ei_sales,        ls_tax_ind               
TYPE cmds_ei_tax_ind,        ls_functions             
TYPE cmds_ei_functions,        ls_master_data           
TYPE cmds_ei_main,        ls_master_data_correct   
TYPE cmds_ei_main,        ls_message_correct       
TYPE cvis_message,        ls_master_data_defective 
TYPE cmds_ei_main,        ls_message_defective     
TYPE cvis_message,        ls_return                
TYPE bapiret2.  

DATA: lt_return LIKE TABLE OF ls_return.  

DATA: lv_partner TYPE bapibus1006_head-bpartner,        lv_rltyp   
TYPE but100-rltyp,        lv_error   
TYPE char1,        lv_message 
TYPE bapiret2-message.  lv_partner 

= cs_data-partner.  

SELECT SINGLE rltyp    
INTO lv_rltyp    
FROM but100    
WHERE partner = lv_partner    
AND   rltyp   'FLCU01'.  
IF sy-subrc <> 0.    
CALL FUNCTION 'BAPI_BUPA_ROLE_ADD_2'      
EXPORTING        businesspartner             
= lv_partner        businesspartnerrolecategory 
'FLCU01'        businesspartnerrole         
'FLCU01'      
TABLES        
return                      = lt_return.    

LOOP AT lt_return INTO ls_return WHERE type 'E'                                     
OR    type 'A'.      lv_error 
'X'.      lv_message 
= lv_message && ',' && ls_return-message.      
CLEAR ls_return.    
ENDLOOP.    

IF lv_error 'X'.      cs_data
-type 'E'.      cs_data
-icon = gc_icon-red.      lv_message  
TEXT-m10 && ':' && lv_message.     " 销售视图创建失败      cs_data
-msg = cs_data-msg && ';' && lv_message.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      
EXIT.    
ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
wait 'X'.    
ENDIF.  
ENDIF.  

SELECT SINGLE *    
INTO CORRESPONDING FIELDS OF ls_cvi_cust_link    
FROM cvi_cust_link    
WHERE customer = cs_data-partner.  
IF sy-subrc <> 0.    
CALL FUNCTION 'BAPI_BUPA_ROLE_REMOVE'      
EXPORTING        businesspartner             
= lv_partner        businesspartnerrolecategory 
'FLCU01'
*       ALL_BUSINESSPARTNERROLES    = ' '        businesspartnerrole         
'FLCU01'
*       DIFFERENTIATIONTYPEVALUE    =
*       ALL_DIFFERENTIATIONTYPEVALUES       = ' '      
TABLES        
return                      = lt_return.    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.    cs_data
-type  'E'.    cs_data
-icon = gc_icon-red.    lv_message  
TEXT-m10 && ':' && 'CVI_CUST_LINK Failed'.       " 销售视图创建失败    cs_data
-msg = cs_data-msg && ';' && lv_message.    
EXIT.  
ENDIF.  
" 抬头  ls_customers
-header-object_instance-kunnr = cs_data-partner.  ls_customers
-header-object_task 'M'.  

" 销售数据  ls_sales
-task 'M'.  ls_sales
-data_key-vkorg = cs_data-vkorg.  " 销售组织  ls_sales
-data_key-vtweg = cs_data-vtweg.  " 分销渠道  ls_sales
-data_key-spart = cs_data-spart.  " 产品组  ls_sales

-data-vsbed  = cs_data-vsbed.     " 装运条件  ls_sales
-datax-vsbed 'X'.  ls_sales
-data-kalks  = cs_data-kalks.     " 定价过程  ls_sales
-datax-kalks 'X'.  ls_sales
-data-konda  = cs_data-konda.     " 价格组  ls_sales
-datax-konda 'X'.  ls_sales
-data-pltyp  = cs_data-pltyp.     " 价格清单类型  ls_sales
-datax-pltyp 'X'.  ls_sales
-data-zterm  = cs_data-zterm.     " 付款条件  ls_sales
-datax-zterm 'X'.  ls_sales
-data-ktgrd  = cs_data-ktgrd.     " 客户科目分配组  ls_sales
-datax-ktgrd 'X'.  ls_sales
-data-vwerk  = cs_data-vwerk.     " 交货工厂  ls_sales
-datax-vwerk 'X'.  ls_sales
-data-waers  'CNY'.             " 货币  ls_sales
-datax-waers  'X'.  

" 伙伴功能  
CLEAR ls_functions.  ls_functions
-task 'M'.  ls_functions
-data_key-parvw 'AG'" SP  ls_functions
-data-partner   = cs_data-partner.  ls_functions
-datax-partner  'X'.  
APPEND ls_functions TO ls_sales-functions-functions[].  
CLEAR ls_functions.  ls_functions
-task 'M'.  ls_functions
-data_key-parvw 'RE'" BP  ls_functions
-data-partner   = cs_data-partner.  ls_functions
-datax-partner  'X'.  
APPEND ls_functions TO ls_sales-functions-functions[].  
CLEAR ls_functions.  ls_functions
-task 'M'.  ls_functions
-data_key-parvw 'RG'" PY  ls_functions
-data-partner   = cs_data-partner.  ls_functions
-datax-partner  'X'.  
APPEND ls_functions TO ls_sales-functions-functions[].  
CLEAR ls_functions.  ls_functions
-task 'M'.  ls_functions
-data_key-parvw 'WE'" SH  ls_functions
-data-partner   = cs_data-partner.  ls_functions
-datax-partner  'X'.  
APPEND ls_functions TO ls_sales-functions-functions[].  
IF cs_data-gpanr_z3 IS NOT INITIAL.    
CLEAR ls_functions.    ls_functions
-task 'M'.    ls_functions
-data_key-parvw 'Z3'" Z3    ls_functions
-data-partner   = cs_data-gpanr_z3.    ls_functions
-datax-partner  'X'.    
APPEND ls_functions TO ls_sales-functions-functions[].  
ENDIF.  
APPEND ls_sales TO ls_customers-sales_data-sales[].  

" 销项税  ls_tax_ind
-task 'M'.  ls_tax_ind
-data_key-aland = cs_data-country.  " 国家  ls_tax_ind
-data_key-tatyp = cs_data-tatyp.    " 税收类别  ls_tax_ind

-data-taxkd  = cs_data-taxkd.       " 税分类  ls_tax_ind
-datax-taxkd 'X'.  
APPEND ls_tax_ind TO ls_customers-central_data-tax_ind-tax_ind[].  

APPEND ls_customers TO ls_master_data-customers[].  

CALL METHOD cmd_ei_api=>initialize.  

CALL METHOD cmd_ei_api=>maintain_bapi    
EXPORTING      iv_collect_messages      
'X'      is_master_data           
= ls_master_data    
IMPORTING      es_master_data_correct   
= ls_master_data_correct      es_message_correct       
= ls_message_correct      es_master_data_defective 
= ls_master_data_defective      es_message_defective     
= ls_message_defective.  

IF ls_message_defective-is_error IS INITIAL.    cs_data
-knvvf 'X'.    cs_data
-type  'S'.    cs_data
-icon  = gc_icon-green.    cs_data
-msg   = cs_data-msg && ';' && TEXT-m09.     " 销售视图创建成功    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.  
ELSE.    
LOOP AT ls_message_defective-messages INTO ls_return.      lv_message 
= lv_message && ',' && ls_return-message.    
ENDLOOP.    cs_data
-type  'E'.    cs_data
-icon = gc_icon-red.    lv_message  
TEXT-m10 && ':' && lv_message.       " 销售视图创建失败    cs_data
-msg = cs_data-msg && ';' && lv_message.    
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.  
ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form CREATE_BP_KNB1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- cs_data
*&---------------------------------------------------------------------*
FORM create_bp_knb1  CHANGING cs_data TYPE s_data.  
DATA: ls_cvi_cust_link         TYPE cvi_cust_link,        ls_company               
TYPE cmds_ei_company,        ls_customers             
TYPE cmds_ei_extern,        ls_master_data           
TYPE cmds_ei_main,        ls_master_data_correct   
TYPE cmds_ei_main,        ls_message_correct       
TYPE cvis_message,        ls_master_data_defective 
TYPE cmds_ei_main,        ls_message_defective     
TYPE cvis_message,        ls_return                
TYPE bapiret2.  

DATA: lt_return LIKE TABLE OF ls_return.  

DATA: lv_partner TYPE bapibus1006_head-bpartner,        lv_rltyp   
TYPE but100-rltyp,        lv_error   
TYPE char1,        lv_message 
TYPE bapiret2-message.  lv_partner 

= cs_data-partner.  

SELECT SINGLE rltyp    
INTO lv_rltyp    
FROM but100    
WHERE partner = lv_partner    
AND   rltyp   'FLCU00'.  
IF sy-subrc <> 0.    
CALL FUNCTION 'BAPI_BUPA_ROLE_ADD_2'      
EXPORTING        businesspartner             
= lv_partner        businesspartnerrolecategory 
'FLCU00'        businesspartnerrole         
'FLCU00'      
TABLES        
return                      = lt_return.    

LOOP AT lt_return INTO ls_return WHERE type 'E'                                     
OR    type 'A'.      lv_error 
'X'.      cs_data
-msg = cs_data-msg && ';' && ls_return-message.    
ENDLOOP.    

IF lv_error 'X'.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      cs_data
-type 'E'.      cs_data
-icon = gc_icon-red.      cs_data
-msg  TEXT-m12 && ':' && cs_data-msg.     " 公司代码视图创建失败      
EXIT.    
ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
wait 'X'.    
ENDIF.  
ENDIF.  
SELECT SINGLE *    
INTO CORRESPONDING FIELDS OF ls_cvi_cust_link    
FROM cvi_cust_link    
WHERE customer = cs_data-partner.  
IF sy-subrc <> 0.    
CALL FUNCTION 'BAPI_BUPA_ROLE_REMOVE'      
EXPORTING        businesspartner             
= lv_partner        businesspartnerrolecategory 
'FLCU00'
*       ALL_BUSINESSPARTNERROLES    = ' '        businesspartnerrole         
'FLCU00'
*       DIFFERENTIATIONTYPEVALUE    =
*       ALL_DIFFERENTIATIONTYPEVALUES       = ' '      
TABLES        
return                      = lt_return.    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.    cs_data
-type  'E'.    cs_data
-icon = gc_icon-red.    lv_message  
TEXT-m12 && ':' && 'CVI_CUST_LINK Failed'.       " 公司视图创建失败    cs_data
-msg = cs_data-msg && ';' && lv_message.    
EXIT.  
ENDIF.  
" 抬头  ls_customers
-header-object_instance-kunnr = cs_data-partner.  ls_customers
-header-object_task 'M'.

*  ls_customers-central_data-address-task = 'I'.

*  ls_customers-central_data-central-data-ktokd  = cs_data-bu_group.
*  ls_customers-central_data-central-datax-ktokd = 'X'.
*
*  ls_customers-central_data-address-postal-data-name     = cs_data-name_org1.
*  ls_customers-central_data-address-postal-datax-name    = 'X'.
*  ls_customers-central_data-address-postal-data-name_2   = cs_data-name_org2.
*  ls_customers-central_data-address-postal-datax-name_2  = 'X'.
*  ls_customers-central_data-address-postal-data-name_3   = cs_data-name_org3.
*  ls_customers-central_data-address-postal-datax-name_3  = 'X'.
*  ls_customers-central_data-address-postal-data-name_4   = cs_data-name_org4.
*  ls_customers-central_data-address-postal-datax-name_4  = 'X'.
*  ls_customers-central_data-address-postal-data-country  = 'CN'.
*  ls_customers-central_data-address-postal-datax-country = 'X'.
*  ls_customers-central_data-address-postal-data-langu    = 1.
*  ls_customers-central_data-address-postal-datax-langu   = 'X'.  
" 公司数据  ls_company
-task 'M'.  ls_company
-data_key-bukrs = cs_data-bukrs.   " 公司代码  ls_company

-data-akont  = cs_data-akont.      " 统驭科目  ls_company
-datax-akont 'X'.  
APPEND ls_company TO ls_customers-company_data-company[].  

APPEND ls_customers TO ls_master_data-customers[].  

CALL METHOD cmd_ei_api=>initialize.  

CALL METHOD cmd_ei_api=>maintain_bapi    
EXPORTING      iv_collect_messages      
'X'      is_master_data           
= ls_master_data    
IMPORTING      es_master_data_correct   
= ls_master_data_correct      es_message_correct       
= ls_message_correct      es_master_data_defective 
= ls_master_data_defective      es_message_defective     
= ls_message_defective.  

IF ls_message_defective-is_error IS INITIAL.    cs_data
-knvvf 'X'.    cs_data
-type  'S'.    cs_data
-icon  = gc_icon-green.    cs_data
-msg   = cs_data-msg && ';' && TEXT-m11.     " 公司代码视图创建成功    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.  
ELSE.    
LOOP AT ls_message_defective-messages INTO ls_return.      lv_message 
= lv_message && ',' && ls_return-message.    
ENDLOOP.    cs_data
-type  'E'.    cs_data
-icon = gc_icon-red.    lv_message  
TEXT-m12 && ':' && lv_message.       " 公司代码视图创建失败    cs_data
-msg = cs_data-msg && ';' && lv_message.    
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_SCREEN_1000
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_screen_1000 .  
IF p_box1 IS INITIAL AND     p_box2 
IS INITIAL AND     p_box3 
IS INITIAL.    
" 请选择要扩展的视图!    
MESSAGE TEXT-m16 TYPE 'S' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.  
IF p_file IS INITIAL.    
" 请选择要导入的文件!    
MESSAGE TEXT-m17 TYPE 'S' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- pt_excel
*&      <-- ct_data
*&---------------------------------------------------------------------*
FORM check_data USING    pt_excel TYPE t_excel                
CHANGING ct_data  TYPE t_data.  
DATA:lo_descr TYPE REF TO cl_abap_structdescr.  

DATA: ls_data      TYPE s_data,        ls_excel_1   
TYPE s_excel,        ls_excel_2   
TYPE s_excel,        ls_compdescr 
TYPE abap_compdescr.  

DATA: lv_tabix TYPE sy-tabix,        lv_langu 
TYPE sy-langu.  

FIELD-SYMBOLS: <fs_value1> TYPE any,                 <fs_value2> 
TYPE any,                 <fs_value3> 
TYPE any.  lo_descr ?= cl_abap_typedescr

=>describe_by_data( ls_excel_1 ).  

READ TABLE pt_excel INTO ls_excel_1 INDEX 2.  
IF sy-subrc <> 0.  

ENDIF.  
READ TABLE pt_excel INTO ls_excel_2 INDEX 3.  
IF sy-subrc <> 0.  

ENDIF.  

LOOP AT ct_data INTO ls_data.    lv_tabix 
= sy-tabix.    
LOOP AT lo_descr->components INTO ls_compdescr.      
ASSIGN COMPONENT ls_compdescr-name OF STRUCTURE ls_excel_2 TO <fs_value2>.      
IF sy-subrc EQ 0.        
IF <fs_value2> TEXT-a01.  " 必输          
ASSIGN COMPONENT ls_compdescr-name OF STRUCTURE ls_data TO <fs_value3>.          
IF sy-subrc EQ 0.            
IF <fs_value3> IS INITIAL.              
ASSIGN COMPONENT ls_compdescr-name OF STRUCTURE ls_excel_1 TO <fs_value1>.              
IF sy-subrc EQ 0.                ls_data
-type 'E'.                ls_data
-icon = gc_icon-red.                
IF ls_data-msg IS NOT INITIAL.                  ls_data
-msg = ls_data-msg && ';' && <fs_value1> && ':' && TEXT-a01.                
ELSE.                  ls_data
-msg = <fs_value1> && ':' && TEXT-a01.                
ENDIF.              
ENDIF.            
ENDIF.          
ENDIF.        
ENDIF.      
ENDIF.    
ENDLOOP.    
IF ls_data-type IS INITIAL.      
CLEAR lv_langu.      
CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'        
EXPORTING          
input            = ls_data-langu        
IMPORTING          
output           = lv_langu " 语言代码        
EXCEPTIONS          unknown_language 
1          
OTHERS           2.      
IF sy-subrc <> 0.
*       Implement suitable error handling here      
ENDIF.      
IF lv_langu IS INITIAL.        ls_data
-type 'E'.        ls_data
-icon = gc_icon-red.        ls_data
-msg TEXT-m18.  " 语言代码必输入      
ENDIF.    
ENDIF.    
MODIFY ct_data FROM ls_data INDEX lv_tabix TRANSPORTING type icon msg.  
ENDLOOP.

ENDFORM.

 

posted @ 2021-12-17 11:20  東東東東  阅读(178)  评论(0编辑  收藏  举报