zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    u盘的超级用法
    文件夹访问被拒绝
    web移动前端的click点透问题
    call()apply()ind()备忘录
    Safari中的new Date()格式化坑
    dataURI V.S. CSS Sprites 移动端
    css3属性之 box-sizing
    多人协作代码--公共库的引用与业务约定
    web前端本地测试方法
    依赖包拼合方法
  • 原文地址:https://www.cnblogs.com/eagle-dtq/p/15245600.html
Copyright © 2011-2022 走看看