ABAP-自定义表维护程序

*&---------------------------------------------------------------------*
*& Report ZTABLE
*&---------------------------------------------------------------------*
* 事务代码:ZTAB
* 程序名称:ZTABLE
* 程序目的:通用透明标数据维护
* 使用变式:
* 设 计 人:
* 设计时间:2020-06-09
* 程序类型: ABAP/4 程序  ,功能
* 输入文件:
* 输出文件:
* 应用类型:
* 描    述: 通用透明标数据维护
*-----------------------------------------------------------------------
*
* 日志号   修改人     修改时间        修改说明              传输号码
*  ----    ----       ------          -----------           -----------
* 001      GW_DUANYS   2020-06-09
*-----------------------------------------------------------------------
REPORT ZTABLE.
*-----------------------------------------------------------------------
* DATA DEFINE 变量定义
*-----------------------------------------------------------------------
TYPE-POOLS: slis.
TABLES: sscrfields.

DATA: gt_fcat TYPE lvc_t_fcat,                              "#EC *
      gs_fcat LIKE LINE OF gt_fcat,                         "#EC *
      gs_layo TYPE lvc_s_layo,                              "#EC *
      gs_grid TYPE lvc_s_glay.                              "#EC *

DATA: gt_event TYPE slis_t_event,                           "#EC *
      gs_event LIKE LINE OF gt_event,                       "#EC *
      gt_event_exit TYPE slis_t_event_exit.                 "#EC *

DATA: gv_status_set TYPE slis_formname.                     "#EC *

DATA: go_ref_grid TYPE REF TO cl_gui_alv_grid.              "#EC *
DATA: go_grid TYPE REF TO cl_gui_alv_grid,                  "#EC *
      stbl    TYPE lvc_s_stbl.
DATA: gr_tab TYPE REF TO data,                              "#EC *
      gr_ref_line TYPE REF TO data,                         "#EC *
      gv_fieldname TYPE fieldname,                          "#EC *
      gv_wherestr TYPE char1024.                            "#EC *
DATA: gv_key_flag TYPE c.                                   "#EC *

"DATA: WA TYPE REF TO CL_ABAP_STRUCTDESCR.

FIELD-SYMBOLS: <gt_itab> TYPE STANDARD TABLE,               "#EC *
               <gv_wa>  TYPE any,                           "#EC *
               <gv_key> TYPE any,                           "#EC *
               <gv_field> TYPE any.                         "#EC *

DATA: gs_application TYPE ole2_object,                "#EC * "定义EXCEL对象
      gs_workbook TYPE ole2_object,                     "#EC * "定义工作区对象
      gs_worksheet TYPE ole2_object,               "#EC * "定义具体的SHEET对象
      gs_columns     TYPE ole2_object.         "#EC * "SHEET COL OBJCET
DATA: gs_cell TYPE ole2_object.                        "#EC * "定义CELL对象
FIELD-SYMBOLS: <gt_fs_gt_data> TYPE STANDARD TABLE,         "#EC *
               <gt_item> TYPE STANDARD TABLE,               "#EC *
               <gt_lt_item> TYPE STANDARD TABLE,            "#EC *
               <gv_gw_item> TYPE any,                       "#EC *
               <gv_gw_data> TYPE any.                       "#EC *

DATA: gv_file TYPE rlgrap-filename.                         "#EC *
"P_TAB LIKE DD03L-TABNAME VALUE 'ZFIRT001'.
*&---------------------------------------------------------------------*
* 内表定义
*&---------------------------------------------------------------------*
TYPE-POOLS: truxs.

DATA: gt_dd03l TYPE STANDARD TABLE OF dd03l,                "#EC *
      gt_dd03m     TYPE STANDARD TABLE OF dd03m,            "#EC *
      gt_structure TYPE lvc_t_fcat.                         "#EC *
*&---------------------------------------------------------------------*
* 工作区定义
*&---------------------------------------------------------------------*
DATA: gs_dd03l LIKE LINE OF gt_dd03l,                       "#EC *
      gs_dd03m     TYPE dd03m,                              "#EC *
      gr_table     TYPE REF TO data,                        "#EC *
      gs_structure TYPE lvc_s_fcat.                         "#EC *
*&---------------------------------------------------------------------*
* 指针定义
*&---------------------------------------------------------------------*
FIELD-SYMBOLS: <gt_fs_table> TYPE STANDARD TABLE,           "#EC *
               <gv_area>  TYPE any,                         "#EC *
               <gv_fs_field> TYPE any.                      "#EC *
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    METHODS handle_modify
    FOR EVENT data_changed_finished OF cl_gui_alv_grid
    IMPORTING e_modified et_good_cells.                     "#EC *

ENDCLASS"LCL_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
*    PERFORM REFRESH.
    DATA ls_stbl TYPE lvc_s_stbl.

    PERFORM alv_field_modify.

*   稳定刷新
    ls_stbl-row 'X'." 基于行的稳定刷新
    ls_stbl-col 'X'." 基于列稳定刷新
    CALL METHOD go_ref_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl.
  ENDMETHOD.                    "HANDLE_MODIFY

ENDCLASS"LCL_EVENT_RECEIVER IMPLEMENTATION

DATA go_event_receiver TYPE REF TO lcl_event_receiver.      "#EC *

*&---------------------------------------------------------------------*
*& SELECTION SCREEN/选择屏幕
*&---------------------------------------------------------------------*
PARAMETERS: p_tab TYPE dd03l-tabname ,
            p_edit TYPE NO-DISPLAY DEFAULT 'X',
            p_alv TYPE NO-DISPLAY.

SELECTION-SCREENFUNCTION KEY 1.
*---------------------------------------------------------------------*
* INITIALIZATION                                                      *
*                                                                     *
*---------------------------------------------------------------------*
INITIALIZATION.
  sscrfields-functxt_01  '  '.

****************************************
* AT SELECTION SCREEN                  *
****************************************
AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.    "配置汇总字段
      PERFORM frm_edit.

  ENDCASE.
*-----------------------------------------------------------------------
* START-OF-SELECTION  F8事件
*-----------------------------------------------------------------------
START-OF-SELECTION.
  IF p_tab+0(1'Z'.
    PERFORM frm_set_title .
    PERFORM frm_create_dynamic_table .
    PERFORM frm_get_data.
    PERFORM display_data .
  ELSE.
    MESSAGE w018(zcrm_001WITH text-009."'只能维护自定义表: ZXXXXXX...'.
*    EXIT.
    RETURN.
  ENDIF.
*&---------------------------------------------------------------------*
*&      FORM  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*

FORM display_data .

  PERFORM set_fcat.
  DELETE gt_fcat WHERE fieldname 'MANDT'.


  PERFORM set_layout.
  "MODIFY BY HAND LM 20200224 START 增加限制条件,后台的 时候不进行ALV展示,否则会DUMP
  IF sy-batch ''."如果不是后台作业才调用ALV展示
    PERFORM show_alv  TABLES gt_fcat <gt_itab>[]
                      USING  gs_layo.                       "#EC *
  ENDIF.
  "MODIFY BY HAND LM 20200224 END

ENDFORM" DISPLAY_DATA


*&---------------------------------------------------------------------*
*&      FORM  SET_FCAT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM set_fcat .

  DATA: ls_dd03vt TYPE dd03vt.

  "根据表明取ALV字段描述
  FREE: gt_fcat.
  SELECT * INTO CORRESPONDING FIELDS OF ls_dd03vt
         FROM dd03vv
         WHERE tabname = p_tab ORDER BY position.
    CLEAR: ls_dd03vt-ddtext.
    SELECT SINGLE scrtext_s
      INTO ls_dd03vt-ddtext
      FROM dd03vt
     WHERE tabname = ls_dd03vt-tabname
       AND fieldname = ls_dd03vt-fieldname
       AND ddlanguage = sy-langu.                           "#EC *
    IF ls_dd03vt-ddtext ''.
      SELECT SINGLE ddtext
        INTO ls_dd03vt-ddtext
        FROM dd03t
       WHERE tabname = ls_dd03vt-tabname
         AND fieldname = ls_dd03vt-fieldname
         AND ddlanguage = sy-langu.                         "#EC *
    ENDIF.
    " 'FIELD' 'TEXT' 'EDIT' 'ZERO' 'TYPE' 'QFIELDNAME' 'KEY' 'HOSTSPOT' 'EMPHASIZE' 'CHECKBOX' 'REF_TABLE' 'REF_FIELD'
    IF ls_dd03vt-inttype 'P'.
      PERFORM csalv_set_fcat USING: ls_dd03vt-fieldname
                                    ls_dd03vt-ddtext
                                    ls_dd03vt-leng                                    p_edit                                    

''                                    
''                                    
''                                    
''                                    
''                                    
''                                    
''                                    p_tab                                    ls_dd03vt

-fieldname.    
ELSE.      
IF  ls_dd03vt-fieldname 'TELF1'.        
PERFORM csalv_set_fcat USING: ls_dd03vt-fieldname                                      ls_dd03vt
-ddtext                                      ls_dd03vt
-leng                                      p_edit                                      

''                                      
''                                      
''                                      
''                                      
''                                      
''                                      
''                                      
''                                      
''.      
ELSE.        
PERFORM csalv_set_fcat USING: ls_dd03vt-fieldname                                      ls_dd03vt
-ddtext                                      ls_dd03vt
-leng                                      p_edit                                      

''                                      
''                                      
''                                      
''                                      
''                                      
''                                      
''                                      p_tab ls_dd03vt
-fieldname..      
ENDIF.    
ENDIF.  
ENDSELECT.  

"DELETE GT_FCAT WHERE FIELDNAME = 'MANDT'.

ENDFORM" SET_FCAT

*&---------------------------------------------------------------------*
*&      FORM  SSET_LAYOUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM set_layout .  gs_layo

-zebra             'X'.

ENDFORM" SET_LAYOUT

*&---------------------------------------------------------------------*
*&      FORM  CSALV_SET_FCAT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM csalv_set_fcat USING      pv_name      pv_text      pv_len      pv_edit      pv_zero      pv_type      pv_qfieldname      pv_key      pv_hotspot      pv_emphasize      pv_checkbox      pv_reftab      pv_reffield












.

*  IF pv_LEN > 50.
*    pv_LEN = 50.
*  ENDIF.  
CASE p_tab.    
WHEN 'ZTPP_TEXI' OR 'ZTPP_ZHUD'.      gs_fcat
-no_init_ch 'A'.  
ENDCASE.  gs_fcat
-fieldname   =  pv_name.
*  GS_FCAT-REPTEXT_L   =
*  GS_FCAT-SELDDICTXT   =  gs_fcat
-reptext     =  pv_text.  gs_fcat
-outputlen   = pv_len.  gs_fcat
-edit        =  pv_edit.  gs_fcat
-no_zero     =  pv_zero.  gs_fcat
-datatype    =  pv_type.  gs_fcat
-qfieldname  =  pv_qfieldname.  gs_fcat
-key         =  pv_key.  gs_fcat
-hotspot     =  pv_hotspot.  gs_fcat
-emphasize   =  pv_emphasize.  gs_fcat
-checkbox    =  pv_checkbox.  gs_fcat

-ref_table   =  pv_reftab.  gs_fcat
-ref_field   =  pv_reffield.  

"GS_FCAT-F4AVAILABL  = 'X'.  
APPEND gs_fcat TO  gt_fcat.

ENDFORM"CSALV_SET_FCAT

*&---------------------------------------------------------------------*
*&      FORM  SHOW_ALV
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM show_alv TABLES tt_fcat                     tt_tab               

USING pv_layout.                             "#EC *  gv_status_set 

'STANDARD'.  gs_event

-name 'CALLER_EXIT'.   "SLIS_EV_CALLER_EXIT_AT_START事件  gs_event
-form 'FM_BUTTON'.  
APPEND gs_event TO gt_event .  gs_layo

-cwidth_opt 'X'.  

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'  
EXPORTING    i_callback_program                  
= sy-repid    i_callback_pf_status_set            
'PF_STATUS_SET'    i_callback_user_command             
'USER_COMMAND'
*    I_GRID_SETTINGS                    = GS_GRID    is_layout_lvc                       
= gs_layo    it_fieldcat_lvc                     
= tt_fcat[]     it_events                          
= gt_event[]
*     IT_EVENT_EXIT                     = GT_EVENT_EXIT[]  
TABLES    t_outtab                            
= tt_tab[]
*   EXCEPTIONS
*     PROGRAM_ERROR                     = 1
*     OTHERS                            = 2    
.

ENDFORM"CSALV_SET_FCAT
*&---------------------------------------------------------------------*
*&      FORM  PF_STATUS_SET
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->RT_EXTAB   TEXT
*----------------------------------------------------------------------*
FORM pf_status_set USING pt_extab TYPE slis_t_extab.        "#EC *  
DATA: ls_wa TYPE slis_extab.  
FREE: pt_extab.  
IF p_edit ''.    ls_wa
-fcode 'NEW'.    
APPEND ls_wa TO pt_extab.    ls_wa
-fcode 'INST'.    
APPEND ls_wa TO pt_extab.    ls_wa
-fcode 'DELETE'.    
APPEND ls_wa TO pt_extab.    ls_wa
-fcode 'REFRESH'.    
APPEND ls_wa TO pt_extab.    ls_wa
-fcode 'DOWNLOAD'.    
APPEND ls_wa TO pt_extab.    ls_wa
-fcode 'UP'.    
APPEND ls_wa TO pt_extab.  
ENDIF.  
SET PF-STATUS gv_status_set EXCLUDING pt_extab.
ENDFORM.                    "pf_status_set
*&---------------------------------------------------------------------*
*&      FORM  USER_COMMAND
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->P_UCOMM      TEXT
*      -->PS_SELFIELD  TEXT
*----------------------------------------------------------------------*

FORM user_command USING pv_ucomm LIKE sy-ucomm                        ps_selfield 
TYPE slis_selfield.     "#EC *  


CASE pv_ucomm.    
WHEN 'BACK' OR 'EXIT' OR 'CANC'.      
SET SCREEN 0.

*    WHEN 'CRE'.      
"PERFORM FRM_CREATE_DOC.    
WHEN 'SAVE'.      
PERFORM frm_save_doc.    
WHEN 'NEW'.      
CLEAR <gv_wa>.      
APPEND <gv_wa> TO <gt_itab>.    
WHEN 'INST'.
*      CHECK ps_selfield-tabindex > 0.      
IF ps_selfield-tabindex > 0.        
CLEAR: <gv_wa>.        
INSERT <gv_wa> INTO <gt_itab>  INDEX ps_selfield-tabindex.      
ENDIF.      
"CLEAR: <ITAB>.    
WHEN 'DELETE'.      
PERFORM frm_delete_data.      
PERFORM frm_get_data.    
WHEN 'REFRESH' OR '&NTE' OR '&ETA' OR 'REFR'.      
FREE: <gt_itab>.      
PERFORM frm_get_data.    
WHEN 'UP'.  "导入      
PERFORM frm_get_fn.          "取主数据文件路径
*      CHECK gv_file IS NOT INITIAL.      
IF gv_file IS NOT INITIAL.        
"PERFORM FRM_CREATE_DYNAMIC_TABLE.                      "根据自建表创建动态内表        
PERFORM frm_upload_data.                               "上传文件到内表        
PERFORM frm_input_data.                                "批导        
PERFORM frm_get_data.      
ENDIF.    
WHEN 'DOWNLOAD'.    "下载模板      
"PERFORM FRM_SUB_DOWN .      
PERFORM frm_create_temp USING p_tab.  
ENDCASE.  

PERFORM refresh_alv_output .  
"ps_selfield-refresh = 'X'.
ENDFORM"USER_COMMAND
*&---------------------------------------------------------------------*
*&      FORM  FRM_SUB_DOWN
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_sub_down.                                          "#EC *
*&---变量定义  
DATA: lv_text       TYPE string,                   "MESSAGE        lv_mod
(20),                                  "MODEL        lv_fullpath   
TYPE string,                    "#EC * "FULL PATH        ls_object     
TYPE wwwdatatab,               "OBJECT NAME        lv_rc         
TYPE sy-subrc.                 "RETURN CODE  

PERFORM frm_get_fn .
*&---SMWO 模板名称  lv_mod 
'ZSD009'"下载文件名

*&---OS长度控制/*&---下载模板  
IF strlen( gv_file ) <> 4.
*&---查询模板.    
SELECT SINGLE relid    objid    

FROM wwwdata    
INTO CORRESPONDING FIELDS OF ls_object    
WHERE srtf2 '0'    
AND objid = lv_mod"#EC * "#EC CI_NOFIRST.                 "SMW0里对象名称    
IF sy-subrc <> OR ls_object-objid = space .      
CONCATENATE text-901"'模板文件:'      lv_mod      

text-902"'不存在,请用SMW0进行加载.'      
INTO lv_text.      
MESSAGE lv_text TYPE 'E'.      
STOP.                                                 "#EC *    
ENDIF.
*&---下载模板    
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'      
EXPORTING        
key         = ls_object        destination 
= gv_file      
IMPORTING        rc          
= lv_rc.    
IF lv_rc <> 0.      
CONCATENATE text-901"''模板文件:'      lv_mod      

text-903"''下载失败,请与开发人员联系.'      
INTO lv_text.      
MESSAGE lv_text TYPE 'E'.      
STOP.                                                 "#EC *    
ENDIF.
*&---'已下载'    
MESSAGE s018(zcrm_001WITH text-904.  
ELSE.
*&---'已取消下载'    
MESSAGE s018(zcrm_001WITH text-905.  
ENDIF.
ENDFORM.                    "frm_sub_down
*&------------------------------------------------------------------------*
*&      FORM  FRM_CREATE_DYNAMIC_TABLE
*&------------------------------------------------------------------------*
*       TEXT
*&---------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_create_dynamic_table .

*&------创建动态内表、结构  
IF <gt_itab> IS ASSIGNED.    UNASSIGN <gt_itab>
.  
ENDIF.  
CREATE DATA gr_tab TYPE TABLE OF (p_tab).  
ASSIGN gr_tab->* TO <gt_itab>.  
"动态创建结构类型  
CREATE DATA gr_ref_line LIKE LINE OF <gt_itab>.  
ASSIGN gr_ref_line->* TO <gv_wa>.



*&------获取表字段  
CLEAR gt_dd03l.  
SELECT    *    

FROM dd03l    
INTO CORRESPONDING FIELDS OF TABLE gt_dd03l    
WHERE tabname = p_tab    
AND as4local  =  'A'.  
SORT gt_dd03l BY position ASCENDING.  
DELETE gt_dd03l WHERE fieldname '.INCLUDE'.  
DELETE gt_dd03l WHERE fieldname '.APPEND'.  
IF gt_dd03l IS INITIAL.    
MESSAGE e208(00WITH text-003."'该自建表不存在有效字段'.    
RETURN.  
ENDIF.

*&------生成动态结构  
CLEAR gt_structure.  
LOOP AT gt_dd03l INTO gs_dd03l.    gs_structure
-fieldname = gs_dd03l-fieldname.    gs_structure
-col_pos = gs_dd03l-position.    gs_structure
-ref_table = p_tab.    gs_structure
-ref_field = gs_dd03l-fieldname.    
APPEND gs_structure TO gt_structure.    
CLEAR  gs_dd03l.  
ENDLOOP.

*&------调用函数生成动态内表  
CALL METHOD cl_alv_table_create=>create_dynamic_table    
EXPORTING      it_fieldcatalog 
= gt_structure    
IMPORTING      ep_table        
= gr_table.
*&---------将指针指向动态内表  
ASSIGN gr_table->* TO <gt_fs_table>.
ENDFORM.                    "frm_create_dynamic_table
*&------------------------------------------------------------------------*
*&      FORM  FRM_UPLOAD_DATA
*&------------------------------------------------------------------------*
*       数据上传
*&---------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_upload_data .
*&------进度条  
DATA: lt_ldfraw_data TYPE truxs_t_text_data.
*  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    EXPORTING
*      percentage = 30
*      text       = text-002."'读取数据…'(002).
*&------数据导入  
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'    
EXPORTING
*     I_FIELD_SEPERATOR    =      i_line_header        
'X'      i_tab_raw_data       
= lt_ldfraw_data      i_filename           
= gv_file    
TABLES      i_tab_converted_data 
= <gt_fs_table>    
EXCEPTIONS      conversion_failed    
1      
OTHERS               2.  
IF sy-subrc <> 0.    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno    
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
ENDIF.
ENDFORM" FRM_UPLOAD_DATA
*&------------------------------------------------------------------------*
*&      FORM  FRM_INPUT_DATA
*&------------------------------------------------------------------------*
*       数据更新
*&---------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_input_data .  
DATA lv_msg TYPE string.  
IF <gt_fs_table> IS NOT INITIAL.    
MODIFY (p_tabFROM TABLE <gt_fs_table>.    
IF sy-subrc 0.      
COMMIT WORK.      
CONCATENATE text-004 p_tab text-005 INTO lv_msg.      
MESSAGE lv_msg TYPE 'S'.    

ELSE.      
ROLLBACK WORK.      
CONCATENATE text-004 p_tab text-006 INTO lv_msg.      
MESSAGE lv_msg TYPE 'S'.    
ENDIF.  
ENDIF.

ENDFORM.                    "frm_input_data
*&------------------------------------------------------------------------*
*&      FORM  FRM_GET_FN
*&------------------------------------------------------------------------*
*       TEXT
*&---------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_get_fn .  
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'    
CHANGING      file_name 
= gv_file.
ENDFORM" FRM_GET_FN
*&---------------------------------------------------------------------*
*&      FORM  REFRESH_ALV_OUTPUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM refresh_alv_output .    

.
**   稳定刷新  
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      e_grid 
= go_grid.  stbl

-row 'X'." 基于行的稳定刷新  stbl
-col 'X'." 基于列稳定刷新  

CALL METHOD go_grid->refresh_table_display    
EXPORTING      is_stable 
= stbl.


ENDFORM"REFRESH_ALV_OUTPUT
*&---------------------------------------------------------------------*
*&      FORM  REFRESH_ALV_SELECTED
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM refresh_alv_selected.                                  "#EC *  
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,        lt_index_rows   
TYPE  lvc_t_row.                    "#EC *  

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'       "获得当前ALV对象->LR_GRID  
IMPORTING      e_grid = lo_grid.  

CALL METHOD lo_grid->get_selected_rows         "刷新数据(HEAD)       
IMPORTING et_index_rows = lt_index_rows.
ENDFORM"REFRESH_ALV_OUTPUT
*&---------------------------------------------------------------------*
*&      FORM  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->RT_EXTAB   TEXT
*----------------------------------------------------------------------*
FORM set_pf_status USING pt_extab TYPE slis_t_extab.        "#EC *
*  SET PF-STATUS '100'.
ENDFORM"SET_PF_STATUS

*&---------------------------------------------------------------------*
*&      FORM  FM_BUTTON
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->E_GRID     TEXT
*----------------------------------------------------------------------*
FORM fm_button USING ps_grid TYPE slis_data_caller_exit.    "#EC *  

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       =  
IMPORTING
*     ET_EXCLUDING                     =
*     E_REPID                          =
*     E_CALLBACK_PROGRAM               =
*     E_CALLBACK_ROUTINE               =    e_grid                           
= go_ref_grid
*     ET_FIELDCAT_LVC                  =
*     ER_TRACE                         =
*     E_FLG_NO_HTML                    =
*     ES_LAYOUT_KKBLO                  =
*     ES_SEL_HIDE                      =
*     ET_EVENT_EXIT                    =
*     ER_FORM_TOL                      =
*     ER_FORM_EOL                      =   
.
*   CALL METHOD REF_GRID->CHECK_CHANGED_DATA.
* 设置ENTER事件  

CALL METHOD go_ref_grid->register_edit_event    
EXPORTING      i_event_id 
= cl_gui_alv_grid=>mc_evt_enter    
EXCEPTIONS      error      
1      
OTHERS     2.  

CREATE OBJECT go_event_receiver.  
SET HANDLER   go_event_receiver->handle_modify FOR go_ref_grid.

ENDFORM"FM_BUTTON
*&---------------------------------------------------------------------*
*&      FORM  ALV_FIELD_MODIFY
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->E_GRID     TEXT
*----------------------------------------------------------------------*
FORM alv_field_modify.                                      "#EC *



ENDFORM.                    "alv_field_modify
*&---------------------------------------------------------------------*
*&      FORM  ALV_FIELD_MODIFY
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->E_GRID     TEXT
*----------------------------------------------------------------------*
FORM frm_save_doc.  
"删除主键为空的记录  

LOOP AT <gt_itab> INTO <gv_wa>.    gv_key_flag 
'X'.    
LOOP AT gt_dd03l INTO gs_dd03l WHERE fieldname <> 'MANDT' AND keyflag 'X' .      gv_fieldname 
= gs_dd03l-fieldname.      
ASSIGN COMPONENT gv_fieldname OF STRUCTURE <gv_wa> TO <gv_key>"#EC CI_SUBRC.      
IF <gv_key> <> ''.        gv_key_flag 
''.      
ENDIF.      UNASSIGN <gv_key>
.    
ENDLOOP.
*    IF gv_key_flag = 'X'.
*      DELETE <gt_itab>.
*    ENDIF.  
ENDLOOP.  

MODIFY (p_tabFROM TABLE <gt_itab>.  
COMMIT WORK AND WAIT.  
IF sy-subrc 0.    
MESSAGE s001(00WITH '数据保存成功!'.  
ELSE.    
MESSAGE e001(00WITH '数据保存失败!'.  
ENDIF.

ENDFORM.                    "frm_save_doc
*&---------------------------------------------------------------------*
*&      FORM  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_get_data .  

CLEAR: <gt_itab>[].  
IF p_alv 'X'.    
IMPORT itab = <gt_itab> FROM DATABASE demo_indx_table(sqID 'TABLE'"#EC CI_SUBRC.  
ELSE.    
SELECT * INTO CORRESPONDING FIELDS OF TABLE <gt_itab> FROM (p_tab.  
ENDIF.

ENDFORM" FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      FORM  FRM_DELETE_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_delete_data .  
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,        lt_index_rows 
TYPE  lvc_t_row,        ls_index_rows 
LIKE LINE OF lt_index_rows,        lv_sval 
TYPE char1024,        lv_answer
.  

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'       "获得当前ALV对象->LR_GRID  
IMPORTING      e_grid = lo_grid.  

CALL METHOD lo_grid->get_selected_rows         "刷新数据(HEAD)       
IMPORTING et_index_rows = lt_index_rows[].

*  CHECK lt_index_rows[] IS NOT INITIAL.  
IF lt_index_rows[] IS INITIAL.    
RETURN.  
ENDIF.  

CALL FUNCTION 'POPUP_TO_CONFIRM'    
EXPORTING
*     TITLEBAR                    = ' '
*     DIAGNOSE_OBJECT             = ' '      text_question               
text-011"'是否删除选中的条目?'
*     TEXT_BUTTON_1               = '是'(001)
*     ICON_BUTTON_1               = ' '
*     TEXT_BUTTON_2               = '否'(002)
*     ICON_BUTTON_2               = ' '
*     DEFAULT_BUTTON              = '1'      display_cancel_button       
''
*     USERDEFINED_F1_HELP         = ' '
*     START_COLUMN                = 25
*     START_ROW                   = 6
*     POPUP_TYPE                  =
*     IV_QUICKINFO_BUTTON_1       = ' '
*     IV_QUICKINFO_BUTTON_2       = ' '    
IMPORTING      answer                      
= lv_answer
*   TABLES
*     PARAMETER                   =   
EXCEPTIONS     text_not_found 

OTHERS 2.  
IF sy-subrc <> 0.    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno         
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
ENDIF.
*  CHECK lv_answer = '1'.  
IF lv_answer <> '1'.    
RETURN.  
ENDIF.  

LOOP AT lt_index_rows INTO ls_index_rows.    gv_key_flag 
'X'.    
READ TABLE <gt_itab> INTO <gv_wa> INDEX ls_index_rows-index.    
IF sy-subrc 0.      
"按主键值删除      
CLEAR: gv_wherestr.      
LOOP AT gt_dd03l INTO gs_dd03l WHERE fieldname <> 'MANDT' AND keyflag 'X' .        gv_fieldname 
= gs_dd03l-fieldname.        
ASSIGN COMPONENT gv_fieldname OF STRUCTURE <gv_wa> TO <gv_key>"#EC CI_SUBRC.        lv_sval 
''' && <KEY> && '''.        
CONCATENATE '''' <gv_key> '''' INTO lv_sval.        

IF gv_wherestr ''.          
CONCATENATE gv_wherestr gv_fieldname '='  lv_sval INTO gv_wherestr SEPARATED BY space.        
ELSE.          
CONCATENATE gv_wherestr ' AND ' gv_fieldname '='  lv_sval INTO gv_wherestr SEPARATED BY space.        
ENDIF.      
ENDLOOP.      
DELETE FROM (p_tabWHERE (gv_wherestr).    
ENDIF.  
ENDLOOP.

ENDFORM" FRM_DELETE_DATA
*&---------------------------------------------------------------------*
*&      FORM  FRM_SET_TITLE
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_set_title .  

SELECT SINGLE ddtext    
INTO sy-title    
FROM dd02t   
WHERE tabname = p_tab     
AND ddlanguage = sy-langu.                             "#EC *

ENDFORM" FRM_SET_TITLE
*&---------------------------------------------------------------------*
*&      FORM  FRM_CREATE_TEMP
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_create_temp USING pv_tabname TYPE tabname.  

DATA: lv_r1 TYPE i,        lv_r2 
TYPE i.
*  ***存储每个CELL值得变量****  
DATA: lv_val1 TYPE char30.  
PERFORM frm_create_dyn_table USING  pv_tabname.


*  ***创建EXCEL对象*****  
CREATE OBJECT gs_application 'EXCEL.APPLICATION'.

*  ***创建工作区对象*****  
CALL METHOD OF      gs_application      

'WORKBOOKS'    = gs_workbook.

*  ******************以下是新增一个SHEET操作********************  
SET PROPERTY OF gs_application 'SHEETSINNEWWORKBOOK' 1.  
CALL METHOD OF      gs_workbook      

'ADD'       = gs_worksheet.  
CALL METHOD OF      gs_worksheet      

'ACTIVATE'.

*  ***向EXCEL中写入数据****  
PERFORM set_fcat.  
DELETE gt_fcat WHERE fieldname '.INCLUDE'.  
LOOP AT gt_fcat INTO gs_fcat.    lv_r1 
1.    lv_r2 
= sy-tabix .    lv_val1 
= gs_fcat-reptext.    
CALL METHOD OF        gs_application        

'CELLS'        = gs_cell      
EXPORTING        #1             
= lv_r1        #2             
= lv_r2.    
SET PROPERTY OF gs_cell 'VALUE' = lv_val1.  
ENDLOOP.

*  DO 12 TIMES.  
LOOP AT gt_fcat INTO gs_fcat WHERE fieldname 'MANDT'.    
PERFORM columnwidth USING sy-tabix '0.1'.  
ENDLOOP.
*  ENDDO.
*  ***保存文件****  
PERFORM frm_get_fn.  

CALL METHOD OF      gs_worksheet      

'SAVEAS'    

EXPORTING      #1           
= gv_file      #2           
1.  
IF sy-subrc 0.    
MESSAGE s026(zcrm_001WITH text-010 gv_file.  
ENDIF.
*  ***关闭WORKSHEET****  
CALL METHOD OF      gs_worksheet      

'CLOSE'.
*  ***关闭WORKBOOK****  
CALL METHOD OF      gs_workbook      

'CLOSE'.
*  ***关闭EXCEL对象****  
CALL METHOD OF      gs_application      

'QUIT'.

*  ***释放对象****  
FREE OBJECT gs_cell.  
FREE OBJECT gs_worksheet.  
FREE OBJECT gs_workbook.  
FREE OBJECT gs_application.

ENDFORM" FRM_CREATE_TEMP
*&---------------------------------------------------------------------*
*&      FORM  FRM_CREATE_DYN_TABLE
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_create_dyn_table USING pv_tabnam.  
DATA: lr_itab TYPE REF TO data.  
"创建内表  
CREATE DATA lr_itab TYPE TABLE OF (pv_tabnam).  
ASSIGN lr_itab->* TO <gt_fs_gt_data>.  
ASSIGN lr_itab->* TO <gv_gw_data>.
ENDFORM" FRM_CREATE_DYN_TABLE
*&---------------------------------------------------------------------*
*&   (4)   FORM  COLUMNWIDTH
*&---------------------------------------------------------------------*
*       设置列宽为自动或是固定值
*----------------------------------------------------------------------*
*      -->COLNUM     列号,可以为单个列或是多个列
*      -->WIDTH      列宽值
*----------------------------------------------------------------------*
FORM columnwidth USING pv_colnum                       pv_width
.  
CALL METHOD OF      gs_application      

'COLUMNS'      = gs_columns    
EXPORTING      #1             
= pv_colnum.  

IF pv_width ''.    
CALL METHOD OF        gs_columns        

'AUTOFIT'.  
ELSE.    
SET PROPERTY OF gs_columns 'COLUMNWIDTH' = pv_width.  
ENDIF.

*SET ROW HEIGHT
*  CALL METHOD OF CV_EXCEL 'ROWS' = LV_ROW
*    EXPORTING
*    #1 = IV_ROW_NO.
*
*  IF LV_HEIGHT IS INITIAL.
*    CALL METHOD OF LV_ROW 'AUTOFIT'.
*  ELSE.
*    SET PROPERTY OF LV_ROW 'ROWHEIGHT' = LV_HEIGHT.
*  ENDIF.

ENDFORM"COLUMNWIDTH
*&---------------------------------------------------------------------*
*&   (4)   FORM  FRM_EDIT
*&---------------------------------------------------------------------*
*       设置列宽为自动或是固定值
*----------------------------------------------------------------------*
*      -->COLNUM     列号,可以为单个列或是多个列
*      -->WIDTH      列宽值
*----------------------------------------------------------------------*
FORM FRM_EDIT.
DATABEGIN OF src OCCURS 1,             txt
(255TYPE c,          
END OF src.  

CHECK p_tab+0(1'Z'.  
READ REPORT p_tab INTO src.  
EDITOR-CALL FOR src.  

IF sy-subrc 0.    
INSERT REPORT p_tab FROM src.  
ENDIF.

ENDFORM.

原文地址:https://www.cnblogs.com/eagle-dtq/p/15245600.html