ABAP-自定义表维护程序

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

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.
*---------------------------------------------------------------------*
* INITIALIZATION                                                      *
*                                                                     *
*---------------------------------------------------------------------*
INITIALIZATION.

*-----------------------------------------------------------------------
* 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.   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 
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.
*  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

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