Code20080715 - ooxxvv/MySAPnotes GitHub Wiki
Code20080715
- ALV 的範例程式,包含 Call function 及 Class 的方式。
Code
***********************************************************************
**Program name: ZJOEYTEST
**Description : 實作 ALV (By function, By Class) 的簡單範例
**Date/Author : 2008.07.15 / Joey Lee
***********************************************************************
** M O D I F I C A T I O N L O G
***********************************************************************
** ChangeDate Programmer Request Description
** ========== ========== ========== ==================
** 2008.07.15 Joey Lee New Program
***********************************************************************
REPORT zjoeytest NO STANDARD PAGE HEADING
LINE-SIZE 135
LINE-COUNT 58(2).
*======================================================================
*================================================Global Date declear===
*-----------引用在SAP上預設的 Data Pool,已預先定義好所有ALV所需之變數型態
TYPE-POOLS: slis.
*-----For data
DATA: BEGIN OF it_vbap OCCURS 0,
vbeln LIKE vbap-vbeln,
matnr LIKE vbap-matnr,
matkl LIKE vbap-matkl,
END OF it_vbap.
*======================================================================
*=======================================================Initial Data===
*LOAD-OF-PROGRAM
*INITIALIZATION.
*======================================================================
*============================================Selection Screen Events===
*AT SELECTION-SCREEN OUTPUT.
*AT SELECTION-SCREEN ON VALUE-REQUEST for <para/sel-opt>.
*AT SELECTION-SCREEN.
*AT SELECTION-SCREEN ON <f>.
*AT SELECTION-SCREEN ON BLOCK <>.
*======================================================================
*======================================================Report Events===
START-OF-SELECTION.
*-Get data
SELECT vbeln posnr matnr matkl kwmeng vrkme
INTO CORRESPONDING FIELDS OF TABLE it_vbap
FROM vbap UP TO 100 ROWS
WHERE vbeln NE space.
**-Output by function
* PERFORM output_alv_function.
*-Output by class
PERFORM output_alv_class.
END-OF-SELECTION.
*======================================================================
*========================================================List Events===
*TOP-OF-PAGE.
*END-OF-PAGE.
*AT LINE-SELECTION.
*TOP-OF-PAGE DURING LINE-SELECTION.
*AT USER-COMMAND.
*======================================================================
*========================================================Subroutines===
*&--------------------------------------------------------------------*
*& Form user_command
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
*-User按鍵處理事件的程式碼
READ TABLE it_vbap INDEX selfield-tabindex.
CHECK sy-subrc = 0.
CASE ucomm.
WHEN '&IC1'.
CASE selfield-sel_tab_field.
WHEN 'IVBAP-VBELN'.
SET PARAMETER ID 'AUN' FIELD it_vbap-vbeln.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
WHEN 'IVBAP-MATNR'.
SET PARAMETER ID 'MAT' FIELD it_vbap-matnr.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDCASE.
ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*& Form output_alv_function
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM output_alv_function .
*-Internal tabel for ALV content
DATA: BEGIN OF lt_alv OCCURS 0.
INCLUDE STRUCTURE it_vbap.
DATA: rowcolors(4) TYPE c, "用來儲存單一列在 ALV 中的底色
cellcolors TYPE lvc_t_scol, "用來儲存單一欄位在 ALV 中的底色
END OF lt_alv.
*-For ALV setting
DATA: fieldcat TYPE slis_t_fieldcat_alv,
fieldcat_ln LIKE LINE OF fieldcat,
sortcat TYPE slis_t_sortinfo_alv,
sortcat_ln LIKE LINE OF sortcat,
lw_layout TYPE slis_layout_alv,
pgm LIKE sy-repid,
col_pos TYPE i.
DATA: lw_cellcolors TYPE lvc_s_scol.
IF it_vbap[] IS INITIAL.
EXIT.
ENDIF.
LOOP AT it_vbap.
MOVE-CORRESPONDING it_vbap TO lt_alv.
IF sy-tabix EQ 10.
*-----設定單一行的底色
lt_alv-rowcolors = 'C100'.
*-----設定單一欄位的底色
lw_cellcolors-fname = 'MATKL'.
lw_cellcolors-color-col = '6'.
lw_cellcolors-color-int = '0'.
lw_cellcolors-color-inv = '1'.
lw_cellcolors-nokeycol = ''.
APPEND lw_cellcolors TO lt_alv-cellcolors.
ENDIF.
APPEND lt_alv.
CLEAR lt_alv.
ENDLOOP.
*-將底色設定的 Fieldname 存入設定中
lw_layout-info_fieldname = 'ROWCOLORS'.
lw_layout-coltab_fieldname = 'CELLCOLORS'.
*------設定要顯示欄位的相關屬性 ( Field Catalogs )
ADD 1 TO col_pos.
*------------在 Dictionary 中所關連的 TABLE 名稱
fieldcat_ln-ref_tabname = 'VBAP'.
*------------在 ALV 中表格的名稱
fieldcat_ln-tabname = 'LT_ALV'.
*------------在 ALV 中欄位的名稱 field name
fieldcat_ln-fieldname = 'VBELN'.
*------------是否為 key
fieldcat_ln-key = 'X'.
*------------是否要計算總合
fieldcat_ln-do_sum = space.
*------------欄位排列的順序
fieldcat_ln-col_pos = col_pos.
*------------是否要隱藏此欄位
fieldcat_ln-no_out = space.
*------------指定此欄位的 quantity (在 Internal Table 中的名稱)
fieldcat_ln-qfieldname = space.
*------------此欄位是否要改變滑鼠游標
fieldcat_ln-hotspot = 'X'.
APPEND fieldcat_ln TO fieldcat.
ADD 1 TO col_pos.
fieldcat_ln-ref_tabname = 'VBAP'.
fieldcat_ln-tabname = 'LT_ALV'.
fieldcat_ln-fieldname = 'MATNR'.
fieldcat_ln-key = space.
fieldcat_ln-do_sum = space.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-no_out = space.
fieldcat_ln-qfieldname = space.
fieldcat_ln-hotspot = space.
APPEND fieldcat_ln TO fieldcat.
ADD 1 TO col_pos.
fieldcat_ln-ref_tabname = 'VBAP'.
fieldcat_ln-tabname = 'LT_ALV'.
fieldcat_ln-fieldname = 'MATKL'.
fieldcat_ln-key = space.
fieldcat_ln-do_sum = space.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-no_out = space.
fieldcat_ln-qfieldname = space.
fieldcat_ln-hotspot = space.
APPEND fieldcat_ln TO fieldcat.
*------設定預設的排序方式
*------------排列的優先順序
sortcat_ln-spos = '1'.
*------------要排列的欄位(Internal Table)
sortcat_ln-fieldname = 'MATNR'.
*------------是否昇冪
sortcat_ln-up = 'X'.
*------------是否降冪
sortcat_ln-down = space.
*------------此欄位是否要小計
sortcat_ln-subtot = 'X'.
APPEND sortcat_ln TO sortcat.
*------呼叫ALV Function Module
pgm = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = pgm
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = fieldcat
it_sort = sortcat
i_save = 'A'
is_layout = lw_layout
TABLES
t_outtab = lt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDFORM. " output_alv_function
*&---------------------------------------------------------------------*
*& Form output_alv_class
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM output_alv_class .
*--------For ALV content
TYPES: BEGIN OF ty_alv.
INCLUDE STRUCTURE it_vbap.
TYPES: cellcolors TYPE lvc_t_scol, "用來儲存單一欄位在 ALV 中的底色
END OF ty_alv.
DATA: lt_alv TYPE TABLE OF ty_alv,
lw_alv TYPE ty_alv.
*-------ALV 相關變數
DATA: gr_table TYPE REF TO cl_salv_table,
gr_functions TYPE REF TO cl_salv_functions,
gr_display TYPE REF TO cl_salv_display_settings,
l_field_name TYPE lvc_fname,
l_field_s TYPE scrtext_s,
l_field_m TYPE scrtext_m,
l_field_l TYPE scrtext_l,
l_title TYPE lvc_title,
gr_columns TYPE REF TO cl_salv_columns_table,
gr_column TYPE REF TO cl_salv_column_table,
lr_layout TYPE REF TO cl_salv_layout,
ls_layout_key TYPE salv_s_layout_key,
lw_cellcolors TYPE lvc_s_scol,
lw_color TYPE lvc_s_colo.
IF it_vbap[] IS INITIAL.
EXIT.
ENDIF.
LOOP AT it_vbap.
MOVE-CORRESPONDING it_vbap TO lw_alv.
CLEAR lw_cellcolors.
IF sy-tabix EQ 10.
*-----設定單一欄位的底色
lw_cellcolors-fname = 'MATKL'.
lw_cellcolors-color-col = '6'.
lw_cellcolors-color-int = '0'.
lw_cellcolors-color-inv = '1'.
lw_cellcolors-nokeycol = ''.
APPEND lw_cellcolors TO lw_alv-cellcolors.
ELSEIF sy-tabix EQ 12.
*-----設定整列變色
lw_cellcolors-color-col = '6'.
lw_cellcolors-color-int = '0'.
lw_cellcolors-color-inv = '1'.
lw_cellcolors-nokeycol = ''.
APPEND lw_cellcolors TO lw_alv-cellcolors.
ENDIF.
APPEND lw_alv TO lt_alv.
CLEAR lw_alv.
ENDLOOP.
*-設定主要資料的 Internal Table
cl_salv_table=>factory( IMPORTING r_salv_table = gr_table
CHANGING t_table = lt_alv ).
*-設定工具列
gr_functions = gr_table->get_functions( ).
gr_functions->set_all( abap_true ).
lr_layout = gr_table->get_layout( ).
ls_layout_key-report = sy-repid.
lr_layout->set_key( ls_layout_key ).
lr_layout->set_default( abap_true ).
lr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
*-設定最上方的標題
gr_display = gr_table->get_display_settings( ).
gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
l_title = 'Title by Program'.
gr_display->set_list_header( l_title ).
*-設定欄位屬性
l_field_s = 'VBELN-Title'.
l_field_m = 'VBELN-Title'.
l_field_l = 'VBELN-Title'.
gr_columns = gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( 'VBELN' ).
gr_column->set_short_text( l_field_s ).
gr_column->set_medium_text( l_field_m ).
gr_column->set_long_text( l_field_l ).
*-設定顏色
*------------設定顏色欄位的名稱(列或儲存格時)
gr_columns->set_color_column( 'CELLCOLORS' ).
*------------設定顏色(整行時)
gr_column ?= gr_columns->get_column( 'VBELN' ).
lw_color-col = '6'.
lw_color-int = '0'.
lw_color-inv = '1'.
gr_column->set_color( lw_color ).
*-秀出 ALV 報表
gr_table->display( ).
ENDFORM. " output_alv_class
*======================================================================