GRID ALV 程序实例
*&-----------------------------------------------------------*
*& Report ZDEMO_ALV_GRID
*&-----------------------------------------------------------*
*& Example of a simple ALV Grid Report
*&-----------------------------------------------------------*
REPORT zdemo_alv_grid.
TYPE-POOLS: slis.
TABLES: mara,marc,rlgrap.
*Data Declaration
TYPES: BEGIN OF str_alv,
sel TYPE flag,
id TYPE char25, " Red Green color "
message TYPE string, " Message "
index TYPE i,
matnr TYPE mara-matnr,
werks TYPE marc-werks,
dismm TYPE marc-dismm,
dispo TYPE marc-dispo,
END OF str_alv.
DATA: gt_alv TYPE STANDARD TABLE OF str_alv,
gs_alv TYPE str_alv.
*ALV data declarations
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
gs_fieldcat TYPE slis_fieldcat_alv,
layout TYPE slis_layout_alv,
gt_events TYPE slis_t_event,
gs_events TYPE slis_alv_event,
gs_grid_settings TYPE lvc_s_glay.
*Select screen data declarations
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS: p_chk1 RADIOBUTTON GROUP zr01 DEFAULT 'X' USER-COMMAND zchg.
SELECTION-SCREEN COMMENT 3(8) text-002 FOR FIELD p_chk1.
SELECTION-SCREEN POSITION 12.
PARAMETERS: p_chk2 RADIOBUTTON GROUP zr01.
SELECTION-SCREEN COMMENT 14(12) text-003 FOR FIELD p_chk2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS: p_mtart TYPE mara-mtart.
PARAMETERS: p_file LIKE rlgrap-filename MODIF ID z01.
SELECTION-SCREEN END OF BLOCK blk1.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-004.
PARAMETERS: p_werks TYPE marc-werks MODIF ID z02.
SELECT-OPTIONS: s_matnr FOR mara-matnr MODIF ID z02.
SELECTION-SCREEN END OF BLOCK blk2.
*Marco declarations
DEFINE mro_fcat.
clear: gs_fieldcat.
gs_fieldcat-fieldname = &1.
translate gs_fieldcat-fieldname to upper case.
gs_fieldcat-reptext_ddic = &2.
gs_fieldcat-seltext_l = &2.
gs_fieldcat-seltext_m = &2.
gs_fieldcat-seltext_s = &2.
gs_fieldcat-no_zero = 'X'.
if gs_fieldcat-fieldname eq 'SEL'.
gs_fieldcat-checkbox = 'X'.
gs_fieldcat-edit = 'X'.
gs_fieldcat-just = 'C'.
endif.
append gs_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
*Screen Group control
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF p_chk1 EQ 'X'.
IF screen-group1 EQ 'Z02'.
screen-input = 0.
screen-invisible = 1.
MODIFY SCREEN.
ELSEIF screen-group1 EQ 'Z01'.
screen-input = 1.
screen-invisible = 0.
MODIFY SCREEN.
ENDIF.
ELSE.
IF screen-group1 EQ 'Z01'.
screen-input = 0.
screen-invisible = 1.
MODIFY SCREEN.
ELSEIF screen-group1 EQ 'Z02'.
screen-input = 1.
screen-invisible = 0.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
"Screen Event"
START-OF-SELECTION .
"Extract data"
PERFORM frm_extract_data.
"Display alv"
PERFORM frm_display.
*&---------------------------------------------------------------------*
*& Form FRM_EXTRACT_DATA
*&---------------------------------------------------------------------*
FORM frm_extract_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_alv
FROM mara INNER JOIN marc ON mara~matnr = marc~matnr
WHERE mara~matnr IN s_matnr
AND werks EQ p_werks.
IF gt_alv IS INITIAL.
MESSAGE 'No data.' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " FRM_EXTRACT_DATA"
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
FORM frm_display .
CLEAR layout.
layout-zebra = 'X'.
layout-colwidth_optimize = 'X'.
layout-box_fieldname = 'SEL'. "设置选择列字段"
CLEAR gt_fieldcat.
PERFORM frm_init_fcat.
PERFORM frm_event.
"修改后刷新数据到内表"
gs_grid_settings-edt_cll_cb = 'X'.
"显示 ALV"
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_events = gt_events
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
is_layout = layout
it_fieldcat = gt_fieldcat
i_grid_settings = gs_grid_settings
i_save = 'A'
TABLES
t_outtab = gt_alv.
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_DISPLAY"
*&---------------------------------------------------------------------*
*& Form frm_set_status
*&---------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
DATA: lt_fcode TYPE STANDARD TABLE OF sy-ucomm.
CLEAR lt_fcode.
* APPEND '&CHNG' TO lt_fcode.
SET PF-STATUS 'STATUS' EXCLUDING lt_fcode.
ENDFORM. "frm_set_status"
*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
WHEN 'BACK' OR 'EXIT'.
LEAVE PROGRAM .
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
"ALV被修改时会自动刷新,没有修改不进行刷新"
rs_selfield-refresh = 'X'.
ENDFORM. "frm_user_command"
*&---------------------------------------------------------------------*
*& Form FRM_INIT_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_fcat .
* mro_fcat 'sel' 'Choose'. " 设置check box
mro_fcat 'index' 'Index'.
mro_fcat 'id' 'Icon' .
mro_fcat 'message' 'Message'.
mro_fcat 'werks' 'Plant'.
mro_fcat 'matnr' 'P/N'.
mro_fcat 'dismm' 'MRP TYpe'.
mro_fcat 'dispo' 'MRP Controller'.
"半自动创建"
* CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
* EXPORTING
* i_structure_name = 'ZDEMO_STRUCTURE'
* CHANGING
* ct_fieldcat = gt_fieldcat
* EXCEPTIONS
* inconsistent_interface = 1
* program_error = 2
* OTHERS = 3.
* 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_INIT_FCAT "
*&---------------------------------------------------------------------*
*& Form frm_event
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_event.
CLEAR gt_events.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = gt_events.
ENDFORM. "frm_event"