alv grid
TRANSCRIPT
![Page 1: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/1.jpg)
ALV GRID CONTROL
![Page 2: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/2.jpg)
● 차 례
1. Screen 상에 Grid Object(Method)를 사용한 ALV Control.
가. 개요.
나. 기본적인 프로그램 코드 및 ALV 코드를 삽입할 Include 프로그램.
다. ALV 를 Display할 Screen 과 PBO / PAI . (1차완성단계)
라. ALV Control 의 각종 User Command 처리.
2. Screen 상에 Object(Method) 를 사용한 ALV Tree.
가. 개요.
나. 기본적인 프로그램 코드 및 ALV 코드를 삽입할 Include 프로그램.
다. ALV 를 Display할 Screen 과 PBO / PAI . (1차완성단계)
라. ALV Tree 에 사용자 정의의 툴바 추가하기.
마. ALV Tree 에 사용자 Event 추가하기.
3. Grid Function Module 을 사용한 ALV Control.
가. 개요.
나. 기본적인 프로그램 코드 생성.
다. 각종 Subloutine 처리.
라. Display.
4. List Function Module 을 사용한 ALV List.
가. 개요.
나. 기본적인 프로그램 코드 생성.
다. 각종 Subloutine 처리.
라. Display.
2
![Page 3: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/3.jpg)
1. Screen 상에 Grid Object(Method)를 사용한 ALV Control.
가. 개요.
1) ALV Grid Control 은 Class를 통해 Object Method 를 이용하여 다양한 효과를 줄수 있다.
2) List 에서 Sort, Sum, Find 등을 개발자가 직접 코딩 할 필요없이 자동으로 처리해 주므로
작업이 훨씬 수월해지며 시간을 아낄 수 있고,자료 가공이 아닌 자료를 보여주는 것이 주목적.
3)SAP 스탠다드 프로그램의 예를 보면 T-Code ME52와 ME52N을 비교하여 보면
TABLE Control을 이용하는것과 ALV를 이용하는것의 차이점을 알 수 있습니다.
( T-Code 끝에 N이 붙은 것은 대부분 ALV를 이용)
[ ME52 ] TABLE Control [ ME52N ] ALV Grid Control
4) 개발 방법으로는 SAP Fuction 을 이용하는 방법과 class를 이용하는 방법이 있는데,
여기서는 class를 이용하여 생성하도록 한다.
3
열 합계가자동으로 나옴열 합계가자동으로 나옴
![Page 4: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/4.jpg)
나. 기본적인 프로그램 코드 및 ALV 코드를 삽입할 Include 프로그램.
1) 먼저 기본적인 프로그램 소스를 생성한다.
Display할 데이터 , Screen 호출 명령어, INCLUDE 프로그램 선언 등.
*&---------------------------------------------------*
*& Report ZDEMO_ALVTREE *
*& Example of a simple ALV Grid Control *
*----------------------------------------------------*
REPORT zdemo_alvgridcontrol.
*Data Declaration
TABLES: ekko.
TYPES: BEGIN OF t_ekko,
ebeln TYPE ekpo-ebeln,
ebelp TYPE ekpo-ebelp,
statu TYPE ekpo-statu,
aedat TYPE ekpo-aedat,
matnr TYPE ekpo-matnr,
menge TYPE ekpo-menge,
meins TYPE ekpo-meins,
netpr TYPE ekpo-netpr,
peinh TYPE ekpo-peinh,
END OF t_ekko.
DATA: it_ekko TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0,
wa_ekko TYPE t_ekko,
wa_ekpo TYPE t_ekko.
DATA: ok_code like sy-ucomm, "OK-Code
save_ok like sy-ucomm.
************Includes***************************************************
INCLUDE ZDEMO_ALVGRIDT01. “ALV 선언부
INCLUDE ZDEMO_ALVGRIDT02. “class 선언부
INCLUDE ZDEMO_ALVGRIDO01. "Screen PBO Modules
INCLUDE ZDEMO_ALVGRIDI01. "Screen PAI Modules
INCLUDE ZDEMO_ALVGRIDF01. "ABAP Subroutines(FORMS)
************************************************************************
*Start-of-selection.
START-OF-SELECTION.
PERFORM get_data.
* Display ALV Grid Control
call screen 100.
4
![Page 5: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/5.jpg)
2) INCLUDE ZDEMO_ALVGRIDT01 를 생성하고 아래와 같이 선언한다.
TYPE-POOLS: slis. "ALV Declarations
data : alv_keyinfo type slis_keyinfo_alv,
alv_variant like disvariant,
alv_layout type slis_layout_alv,
alv_repid like sy-repid,
alv_print type slis_print_alv,
alv_detail_func(30).
data : gv_repid like sy-repid.
class : lcl_event_receiver_main definition deferred.
data : it_exclude_toolbar_main type ui_functions.
data : gs_print type lvc_s_prnt,
gs_layout type lvc_s_layo,
gs_fieldcat type lvc_s_fcat,
gs_fcatlayo type lvc_s_layo,
gs_f4 type lvc_s_f4, " F4 필드 관련
g_container type scrfname value 'G_CUSTOM_CONTAINER'.
* fieldcatalog for output table,
data : it_fieldcat_main type lvc_t_fcat
it_f4 type lvc_t_f4.
DATA : gs_sort TYPE lvc_s_sort.
DATA : gt_sort TYPE lvc_t_sort.
data : it_sort_main type lvc_t_sort.
data : gs_fcat type lvc_s_fcat.
* reference to custom container: neccessary to bind ALV Control
data : g_container_main type ref to cl_gui_custom_container,
g_grid_main type ref to cl_gui_alv_grid,
g_event_receiver_main type ref to lcl_event_receiver_main.
* Internal Table을 이용하여 fieldcatloag 변환 작업을 하기위함.
data : gt_field type slis_t_fieldcat_alv, " 필드명
g_fieldcat_s type slis_fieldcat_alv, " 이름 바뀌면 안됨
gs_fieldcat_slis type slis_fieldcat_alv.
5
![Page 6: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/6.jpg)
3) INCLUDE ZDEMO_ALVGRIDT02 를 생성하고 아래와 같이 선언한다.( 이벤트처리부분)
: ALV 화면에서 발생하게되는 이벤트에 대해 이곳에 정의하여 처리한다.
***************************************************************** LOCAL CLASSES: Definition****************************************************************CLASS lcl_event_receiver_main DEFINITION. PUBLIC SECTION. METHODS : handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive. METHODS : handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. METHODS : handle_before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm. METHODS : handle_after_user_command FOR EVENT after_user_command OF cl_gui_alv_grid IMPORTING e_ucomm e_not_processed.* e_saved. METHODS : handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed.
METHODS : handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id e_column_id. METHODS : handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column. METHODS : on_f4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING sender e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display.* METHODS : handle_RIGHT_CLICK FOR EVENT onf4 OF cl_gui_alv_grid* RIGHT_CLICK TYPES : ddshretval_table TYPE TABLE OF ddshretval. METHODS : my_f4 IMPORTING sender TYPE REF TO cl_gui_alv_grid et_bad_cells TYPE lvc_t_modi es_row_no TYPE lvc_s_roid er_event_data TYPE REF TO cl_alv_event_data e_display TYPE c e_fieldname TYPE lvc_fname EXPORTING lt_f4 TYPE ddshretval_table.ENDCLASS. "(LCL_EVENT_RECEIVER DEFINITION)
***************************************************************** LOCAL CLASSES: Implementation****************************************************************CLASS lcl_event_receiver_main IMPLEMENTATION. METHOD handle_toolbar.
6
![Page 7: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/7.jpg)
ENDMETHOD. "handle_toolbar
METHOD handle_user_command.
ENDMETHOD. "handle_user_command
METHOD handle_before_user_command.
ENDMETHOD. "handle_before_user_command
METHOD handle_after_user_command.
ENDMETHOD. "handle_AFTER_user_command
METHOD handle_data_changed.
ENDMETHOD. "handle_data_changed
METHOD handle_hotspot_click.
ENDMETHOD. "handle_hotspot_click
METHOD handle_double_click.
ENDMETHOD. "handle_double_click
METHOD on_f4.
ENDMETHOD. "on_f4
METHOD my_f4.
ENDMETHOD. "my_f4
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION.
# 위 두 INCLUDE 프로그램은 ALV를 사용하기 위한 각종 선언들이다.
그밖에 INCLUDE 프로그램들도 더블클릭을 이용하여 생성 하여 Activate 시켜놓고, Display를 할
데이터를 가져올 서브루틴 get_data 를 ~~F01에 아래와 같이 만든다.FORM get_data . SELECT ebeln UP TO 10 ROWS FROM ekko INTO corresponding fields of TABLE it_ekko. loop at it_ekko into wa_ekko. SELECT ebeln ebelp statu aedat matnr menge meins netpr peinh FROM ekpo appending TABLE it_ekpo where ebeln eq wa_ekko-ebeln. endloop.ENDFORM. " get_data
다. ALV 를 Display할 Screen 과 PBO / PAI .
1) ALV 를 Display 할 Screen 100번을 생성하고, STATUS와 TITLE 을 처리해준다.
7
![Page 8: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/8.jpg)
*-------------------------------------------------------------------****INCLUDE Z......O01 .*-------------------------------------------------------------------**&------------------------------------------------------------------**& Module STATUS_0100 OUTPUT*&------------------------------------------------------------------** PBO Module*-------------------------------------------------------------------*module status_0100 output. SET PF-STATUS 'STATUS1'. SET TITLEBAR 'T100'.
endmodule. " STATUS_0100 OUTPUT
*-------------------------------------------------------------------****INCLUDE Z......I01 .*-------------------------------------------------------------------**&------------------------------------------------------------------**& Module USER_COMMAND_0100 INPUT*&------------------------------------------------------------------** PAI Module*-------------------------------------------------------------------*module user_command_0100 input.save_ok = ok_code.case ok_code. when 'EXIT' or 'BACK' or 'CANC'.* Exit program leave to screen 0.endcase.endmodule. " USER_COMMAND_0100 INPUT
2) PBO 부분에 ALV 처리를 위한 MODULE PBO_100 을 추가하고 아래와 같이 처리한다.*&---------------------------------------------------------------------**& Module PBO_0100 OUTPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*
8
![Page 9: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/9.jpg)
MODULE PBO_0100 OUTPUT.if g_container_main is initial.
perform create_and_init_alv_main. else.
perform alv_refresh using g_grid_main 'X' 'X'. endif.ENDMODULE. " PBO_0100 OUTPUT
3) 서브루틴 create_and_init_alv_main 를 ZDEMO_ALVGRIDF01 에 아래와 같이 처리해준다.
FORM create_and_init_alv_main .* CONSTRUCTOR Call CREATE OBJECT g_container_main EXPORTING container_name = 'CONTAINER_MAIN'. CREATE OBJECT g_grid_main EXPORTING i_parent = g_container_main.* 툴바 버튼 제거 PERFORM exclude_toolbar_main TABLES it_exclude_toolbar_main.* Field 정의 PERFORM build_fieldcat_main. CLEAR gs_fcatlayo.* sort PERFORM set_sort_main.* Title between grid control and toolbar(70자 이내)* gs_fcatlayo-grid_title = HEADLINE.
* Define a drop down table.* perform set_drdn_table.* Field 속성을 정의한 field* gs_fcatlayo-stylefname = 'CELLTAB'. gs_fcatlayo-no_rowmark = ''.* gs_fcatlayo-sel_mode = 'X'.* gs_fcatlayo-box_fname = 'CHECK'.* 홀수 라인과 짝수라인의 Color를 다르게 설정함.* gs_fcatlayo-ZEBRA = 'X'.* gs_fcatlayo-TOTALS_BEF = 'X'.* gs_fcatlayo-NO_TOTARR = 'X'.* gs_fcatlayo-NO_TOTEXP ='X'.* gs_fcatlayo-NO_ROWMOVE = 'X'.* gs_fcatlayo-NO_ROWINS = 'X'.* gs_fcatlayo-NO_COLEXPD = 'X'.* gs_fcatlayo-NO_KEYFIX = 'X'.* gs_fcatlayo-NO_HGRIDLN = 'X'.* Column Head Click 시 자동으로 sort 하는 기능* gs_fcatlayo-sgl_clk_hd = 'X'.* subtotal만 출력되고 전체total은 표시가 안되게* gs_fcatlayo-NO_TOTLINE = 'X'.* gs_fcatlayo-INFO_FNAME = '' gs_fcatlayo-info_fname = 'COLOR'. gs_fcatlayo-stylefname = 'CELLTAB'.* event 등록 IF sy-batch IS INITIAL. CALL METHOD g_grid_main->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified. ENDIF.
CREATE OBJECT g_event_receiver_main.
SET HANDLER g_event_receiver_main->handle_toolbar FOR g_grid_main. SET HANDLER g_event_receiver_main->handle_user_command FOR g_grid_main. SET HANDLER g_event_receiver_main->handle_data_changed FOR g_grid_main. SET HANDLER g_event_receiver_main->handle_hotspot_click FOR g_grid_main. SET HANDLER g_event_receiver_main->handle_double_click FOR g_grid_main. SET HANDLER g_event_receiver_main->on_f4 FOR g_grid_main.
SET HANDLER g_event_receiver_main->handle_before_user_command FOR g_grid_main.
9
![Page 10: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/10.jpg)
** 좌측 선택을 위한 처리 CALL METHOD g_grid_main->set_ready_for_input EXPORTING i_ready_for_input = 1. alv_variant-report = sy-repid. alv_variant-log_group = '100'.* 합을 제일 윗라인에 DISPLAY gs_fcatlayo-totals_bef = 'X'. gs_fcatlayo-sel_mode = 'D'.
gs_fcatlayo-no_rowmark = 'X'.
* 실제 Display를 실행하는 부분 CALL METHOD g_grid_main->set_table_for_first_display EXPORTING is_layout = gs_fcatlayo** it_toolbar_excluding = gt_exclude_toolbar_main i_save = 'X'* 'U' " 특정사용자전용.* 'X' " 광역 전용.* ' ' " 저장안함.* i_default = 'X' " 레이아웃 사전셋팅 허용* LAYOUT Standard BCALV_GRID_09 참조.* is_variant 레이아웃선택/변경/저장/관리 enable is_variant = alv_variant " 선택 메뉴 display CHANGING it_outtab = IT_EKKO[]* it_sort = it_sort_main it_sort = GT_SORT it_fieldcatalog = it_fieldcat_main[].
ENDFORM. " create_and_init_alv_main
4) ALV 에 Display 될 속성들은 아래 서브루틴 에서 정의한다.
* 툴바 버튼 처리 PERFORM exclude_toolbar_main TABLES it_exclude_toolbar_main.* Field 정의 PERFORM build_fieldcat_main.
- 아래 서브루틴에서 ALV 화면 상단의 Display될 툴바를 선택한다.FORM exclude_toolbar_main TABLES p_exclude_toolbar_main.PERFORM append_exclude_toolbar TABLES p_exclude_toolbar_main* using : cl_gui_alv_grid=>mc_fc_excl_all. " 모두제거 USING : cl_gui_alv_grid=>mc_fc_loc_undo, " 실행취소* cl_gui_alv_grid=>mc_fc_auf, " 소계확장* cl_gui_alv_grid=>mc_fc_average, " &AVERAGE cl_gui_alv_grid=>mc_fc_back_classic, cl_gui_alv_grid=>mc_fc_call_abc, " &ABC cl_gui_alv_grid=>mc_fc_call_chain, cl_gui_alv_grid=>mc_fc_call_crbatch, cl_gui_alv_grid=>mc_fc_call_crweb, cl_gui_alv_grid=>mc_fc_call_lineitems, cl_gui_alv_grid=>mc_fc_call_master_data,* cl_gui_alv_grid=>mc_fc_call_more,* cl_gui_alv_grid=>mc_fc_call_report,* cl_gui_alv_grid=>mc_fc_call_xint,
10
![Page 11: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/11.jpg)
* cl_gui_alv_grid=>mc_fc_call_xxl,* cl_gui_alv_grid=>mc_fc_col_invisible,* cl_gui_alv_grid=>mc_fc_col_optimize,* cl_gui_alv_grid=>mc_fc_current_variant,* cl_gui_alv_grid=>mc_fc_data_save,* cl_gui_alv_grid=>mc_fc_delete_filter,* cl_gui_alv_grid=>mc_fc_deselect_all,* cl_gui_alv_grid=>mc_fc_detail,* cl_gui_alv_grid=>mc_fc_expcrdata,* cl_gui_alv_grid=>mc_fc_expcrdesig,* cl_gui_alv_grid=>mc_fc_expcrtempl,* cl_gui_alv_grid=>mc_fc_expmdb,* cl_gui_alv_grid=>mc_fc_extend,* cl_gui_alv_grid=>mc_fc_f4,* cl_gui_alv_grid=>mc_fc_filter,* cl_gui_alv_grid=>mc_fc_find,* cl_gui_alv_grid=>mc_fc_fix_columns,* cl_gui_alv_grid=>mc_fc_graph,* cl_gui_alv_grid=>mc_fc_help,* cl_gui_alv_grid=>mc_fc_info,* cl_gui_alv_grid=>mc_fc_load_variant, cl_gui_alv_grid=>mc_fc_loc_copy, " 행 카피. cl_gui_alv_grid=>mc_fc_html, cl_gui_alv_grid=>mc_fc_loc_copy_row, " 행 카피. cl_gui_alv_grid=>mc_fc_loc_cut, " 가위. cl_gui_alv_grid=>mc_fc_loc_delete_row, " 행삭제. cl_gui_alv_grid=>mc_fc_loc_insert_row, " 행삽입.* cl_gui_alv_grid=>mc_fc_loc_move_row, cl_gui_alv_grid=>mc_fc_loc_append_row, " 라인생성. cl_gui_alv_grid=>mc_fc_loc_paste, " 겹쳐쓰기. cl_gui_alv_grid=>mc_fc_loc_paste_new_row, " 겹쳐쓰기.* cl_gui_alv_grid=>mc_fc_maintain_variant,* cl_gui_alv_grid=>mc_fc_maximum,* cl_gui_alv_grid=>mc_fc_minimum,* cl_gui_alv_grid=>mc_fc_pc_file,* cl_gui_alv_grid=>mc_fc_print,* cl_gui_alv_grid=>mc_fc_print_back,* cl_gui_alv_grid=>mc_fc_print_prev,* cl_gui_alv_grid=>mc_fc_refresh,* cl_gui_alv_grid=>mc_fc_reprep,* cl_gui_alv_grid=>mc_fc_save_variant, cl_gui_alv_grid=>mc_fc_select_all.* cl_gui_alv_grid=>mc_fc_send,* cl_gui_alv_grid=>mc_fc_separator,* cl_gui_alv_grid=>mc_fc_sort,* cl_gui_alv_grid=>mc_fc_sort_asc,* cl_gui_alv_grid=>mc_fc_sort_dsc,* cl_gui_alv_grid=>mc_fc_subtot,* cl_gui_alv_grid=>mc_fc_sum,* cl_gui_alv_grid=>mc_fc_to_office,* cl_gui_alv_grid=>mc_fc_to_rep_tree,* cl_gui_alv_grid=>mc_fc_unfix_columns,* cl_gui_alv_grid=>mc_fc_views,* cl_gui_alv_grid=>mc_fc_view_crystal,* cl_gui_alv_grid=>mc_fc_view_excel,* cl_gui_alv_grid=>mc_fc_view_grid,* cl_gui_alv_grid=>mc_fc_word_processor.ENDFORM. " exclude_toolbar_main
- 아래 서브루틴에서는 Internal table의 필드중 Display에 대해 정의해준다.
: 이때 FIELDNAME 은 꼭 대문자로 지정해준다.
이외에도 필드 속성을 정의하는 여러가지 옵션이 있다.FORM build_fieldcat_main .
11
![Page 12: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/12.jpg)
CLEAR it_fieldcat_main[]. PERFORM field_category_setting TABLES it_fieldcat_main USING : 'S' 'FIELDNAME' 'EBELN', ' ' 'COLTEXT' '구매오더번호', ' ' 'OUTPUTLEN' '14',
' ' 'EMPHASIZE' 'C311', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'EBELP', ' ' 'COLTEXT' '품목순번', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'AEDAT', ' ' 'COLTEXT' '품목변경일', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'STATU', ' ' 'COLTEXT' 'RFQ상태', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조
'E' 'KEY' ' ', 'S' 'FIELDNAME' 'AEDAT', ' ' 'COLTEXT' '품목변경일', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조
'E' 'KEY' ' ', 'S' 'FIELDNAME' 'MATNR', ' ' 'COLTEXT' '품목번호', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조
'E' 'KEY' ' ', 'S' 'FIELDNAME' 'MENGE', ' ' 'COLTEXT' '품목수량', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'MEINS', ' ' 'COLTEXT' '품목단위', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'NETPR', ' ' 'COLTEXT' '품목단가', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' ', 'S' 'FIELDNAME' 'PEINH, ' ' 'COLTEXT' '가격단위', ' ' 'OUTPUTLEN' '14', ' ' 'EMPHASIZE' 'C310', " 색상으로 열강조 'E' 'KEY' ' '.ENDFORM. " build_fieldcat_main
- 추가로 필요한 서브루틴들을 생성해준다. FORM append_exclude_toolbar TABLES p_table USING p_value. DATA : ls_exclude TYPE ui_func. ls_exclude = p_value. APPEND ls_exclude TO p_table.ENDFORM. " append_exclude_toolbar
12
![Page 13: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/13.jpg)
FORM field_category_setting TABLES p_fieldcat type lvc_t_fcat using p_gub p_fname p_con. if p_gub = 'S'. clear gs_fcat. endif.* 속성 MOVE data l_col(40). field-symbols <fs>. concatenate 'GS_FCAT-' p_fname into l_col. assign (l_col) to <fs>. move p_con to <fs>. if p_gub = 'E'. append gs_fcat to p_fieldcat. endif.ENDFORM. " field_category_settingFORM alv_refresh USING $grid type ref to cl_gui_alv_grid $row $col. data ls_stable type lvc_s_stbl.* row가 바뀌지 않음 ls_stable-row = $row.* column이 바뀌지 않음. ls_stable-col = $col. call method $grid->refresh_table_display exporting is_stable = ls_stable* i_soft_refresh = 'X' .* Send Buffered Automation Queue to Frontend call method cl_gui_cfw=>flush.
ENDFORM. " alv_refresh
5) Screen 의 레이아웃에서 사용자제어 를 생성하고 CONTAINER_MAIN 을 이름란에 적어준다.
13
![Page 14: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/14.jpg)
6) 전체를 Activate 하고 실행한 결과이다.
14
![Page 15: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/15.jpg)
라. ALV Control 의 각종 User Command 처리.
: 앞에서 언급한 바와 같이 INCLUDE ZDEMO_ALVGRIDT02 에서 정의한 class method 중
해당되는 Event 의 Method ~EndMethod 사이에 추가하고 싶은 로직을 추가하면된다.
1) 마우스 더블클릭
METHOD handle_double_click.
(이 사이에 더블클릭에 대한 처리부를 넣어준다.)
ENDMETHOD. "handle_double_click
이때 더블클릭한 ALV CELL 의 row 번호 와 column 필드명은 각각 e_row , e_column 에
저장된다.
2) 체크박스 생성.
- display 할 Internal table 에 check 라는 이름의 char 타입 변수를 추가한다.
- field catalog 에 아래와 같이 추가해준다.
'S' 'FIELDNAME' 'CHECK', ' ' 'COLTEXT' '체크', ' ' 'CHECKBOX' 'X', ' ' 'EDIT' 'X',
* ' ' 'EMPHASIZE' 'C210', 'E' 'OUTPUTLEN' '05',
3) 풀다운 메뉴 생성. - 서브루틴 create_and_init_grid_main 안에 perform set_drdn_table. 의 주석을 없애고
서브루틴을 생성한다.
FORM set_drdn_table . data: lt_dropdown type lvc_t_drop, ls_dropdown type lvc_s_drop.* First listbox (handle '1'). ls_dropdown-handle = '1'. ls_dropdown-value = 'S'. append ls_dropdown to lt_dropdown.
ls_dropdown-handle = '1'. ls_dropdown-value = 'A'. append ls_dropdown to lt_dropdown.
call method g_grid_main->set_drop_down_table exporting it_drop_down = lt_dropdown.ENDFORM. " set_drdn_table
- 풀다운 메뉴로 처리할 field 에 대해 fieldcatalog 에서 아래와 같이 처리해준다.
'S' 'FIELDNAME' 'FULLDOWN', ' ' 'COLTEXT' '등급', ' ' 'JUST' 'C', ' ' 'drdn_hndl' '1', ' ' 'EDIT' 'X', ' ' 'OUTPUTLEN' '10',
'E' 'KEY' ' '.
4) Table Control 기능 (라인 선택하여 PAI 처리)구현.
15
![Page 16: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/16.jpg)
- 좌측 선택 바가 나오도록 서브루틴 create_and_init_alv_main 에서 CALL METHOD g_grid_main->set_ready_for_input EXPORTING i_ready_for_input = 1.
를 처리해준다.
- STATUS 에 라인 선택 후 Action을 취할 툴바버튼을 생성한다.
- PAI 의 USER_COMM_0100 에 아래 와 같이 처리해주고, 해당 라인의 값을 읽어서
원하는 코딩을 삽입해준다.. WHEN 'EXEC'. DATA: i_lvc_t_row TYPE LVC_T_ROW, i_lvc_s_row TYPE LVC_S_ROW, i_lvc_t_roid TYPE LVC_T_ROID, i_lvc_s_roid TYPE LVC_S_ROID, sel_line_100 type i. CLEAR: sel_line_100. CALL METHOD g_grid_main->get_selected_rows <- 선택한 라인을 읽어오는 부분 IMPORTING ET_INDEX_ROWS = i_lvc_t_row ET_ROW_NO = i_lvc_t_roid.*-- 선택한 라인 넘버 구하기 READ TABLE i_lvc_t_roid INDEX 1 into i_lvc_s_roid. IF sy-subrc = 0. sel_line_100 = i_lvc_s_roid-row_id. READ TABLE IT_EKKO INDEX sel_line_100 INTO WA_EKKO.. ELSE. MESSAGE I016(RP) WITH ‘라인을 선택해주세요.’. ENDIF.
※ 그밖에 F4기능,하나의 CELL 에 값 입력시 자동으로 값입력 처리, HOTSPOT(1번클릭시처리)
등 다양하게 처리해줄수 있습니다.
16
![Page 17: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/17.jpg)
2. Screen 상에 Object(Method) 를 사용한 ALV Tree.
가. 개요.
1) ALV Tree Report 는 구조화되어있는 ALV Tree를 만들기 위해서
OBJECT METHOD 를 이용하여 생성합니다.
2) ALV Tree Report 는 ALV 세부사항을 fieldcatalog과 같게 처리하고 ALVTree를 Display
하는 데 사용할 스크린을 부르는 순서로 처리해줍니다.
나. 기본적인 프로그램 코드 및 ALV 코드를 삽입할 Include 프로그램 생성.
1) 먼저 기본적인 프로그램 소스를 생성한다.
Display할 데이터 , Screen 호출 명령어, INCLUDE 프로그램 선언 등.*&-------------------------------------------------------**& Report ZDEMO_ALVTREE **& **&-------------------------------------------------------**& Example of a simple ALV Grid Tree Report **&-------------------------------------------------------*REPORT ZDEMO_ALVTREE .*Data DeclarationTABLES: ekko.TYPES: BEGIN OF t_ekko, ebeln TYPE ekpo-ebeln, ebelp TYPE ekpo-ebelp, statu TYPE ekpo-statu, aedat TYPE ekpo-aedat, matnr TYPE ekpo-matnr, menge TYPE ekpo-menge, meins TYPE ekpo-meins, netpr TYPE ekpo-netpr, peinh TYPE ekpo-peinh, END OF t_ekko.DATA: it_ekko TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0, it_ekpo TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0, it_emptytab TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0, wa_ekko TYPE t_ekko, wa_ekpo TYPE t_ekko.DATA: ok_code like sy-ucomm, "OK-Code save_ok like sy-ucomm.*************************************************************************IncludesINCLUDE ZALVTREET01.INCLUDE ZDEMO_ALVTREEO01. "Screen PBO ModulesINCLUDE ZDEMO_ALVTREEI01. "Screen PAI ModulesINCLUDE ZDEMO_ALVTREEF01. "ABAP Subroutines(FORMS)*************************************************************************Start-of-selection.START-OF-SELECTION.* ALVtree setup data PERFORM data_retrieval.* Display ALVtree report call screen 100.
2) INCLUDE ZALVTREET01 를 생성하고 아래와 같이 선언한다.**ALV DeclarationsTYPE-POOLS: slis.
17
![Page 18: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/18.jpg)
*ALV data declarationsDATA: fieldcatalog TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gd_fieldcat TYPE lvc_t_fcat, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv.
*ALVtree data declarationsCLASS cl_gui_column_tree DEFINITION LOAD.CLASS cl_gui_cfw DEFINITION LOAD.
DATA: gd_tree TYPE REF TO cl_gui_alv_tree, gd_hierarchy_header TYPE treev_hhdr, gd_report_title TYPE slis_t_listheader, gd_logo TYPE sdydo_value, gd_variant TYPE disvariant.
*Create container for alv-treeDATA: gd_tree_container_name(30) TYPE c, gd_custom_container TYPE REF TO cl_gui_custom_container.
3) 나머지 INCLUDE 프로그램도 생성하여 저장한다.
4) Screen 100 번을 생성하고 OK_CODE를 넣어준다.
PBO / PAI 도 각각 INCLUDE 프로그램에 생성해준다.
다. ALV 를 Display할 Screen 과 PBO / PAI .
1) STATUS 를 처리하고, PBO_0100과 USER_COMMAND_0100 에 아래와 같이 처리한다.MODULE PBO_0100 OUTPUT. IF gd_tree is initial. PERFORM create_and_init_alv_tree_main. ELSE. CALL METHOD cl_gui_cfw=>flush. ENDIF.ENDMODULE. " PBO_0100 OUTPUT
MODULE USER_COMMAND_0100 INPUT. DATA return TYPE REF TO cl_gui_event. save_ok = ok_code. case ok_code. when 'EXIT' or 'BACK' or 'CANC'.* Exit program leave to screen 0.* Process ALVtree user actions when others.
18
![Page 19: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/19.jpg)
call method cl_gui_cfw=>get_current_event_object receiving event_object = return. call method cl_gui_cfw=>dispatch. endcase.ENDMODULE. " USER_COMMAND_0100 INPUT
2) PBO_0100 에 서브루틴 create_and_init_alv_tree_main 을 ~~F01에 생성한다.
FORM create_and_init_alv_tree_main .* alv-tree의 container 생성 gd_tree_container_name = 'SCREEN_CONTAINER'. create object gd_custom_container exporting container_name = gd_tree_container_name exceptions cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5. if sy-subrc <> 0. message x208(00) with 'ERROR'. endif.* tree control 생성 create object gd_tree exporting parent = gd_custom_container node_selection_mode = cl_gui_column_tree=>node_sel_mode_single item_selection = 'X' no_html_header = '' <- 헤더를 생성할것인지 처리부 no_toolbar = '' <- 툴바를 생성할것인지 처리부 exceptions cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 illegal_node_selection_mode = 5 failed = 6 illegal_column_name = 7. if sy-subrc <> 0. message x208(00) with 'ERROR'. endif.* Report Title 생성
PERFORM build_report_title USING gd_report_title gd_logo.
* Field 속성정의 PERFORM build_fieldcatalog.* PERFORM build_layout.* 계층구조 헤더 정의 PERFORM build_hierarchy_header CHANGING gd_hierarchy_header. PERFORM build_variant.* Create empty ALVtree control ready for first display* Create emty tree-control CLEAR: it_emptytab. REFRESH: it_emptytab.* Create empty ALVtree control ready for first display CALL METHOD gd_tree->set_table_for_first_display EXPORTING is_hierarchy_header = gd_hierarchy_header <- 계층구조 이름 처리 it_list_commentary = gd_report_title <- 상단 헤더 처리 i_logo = gd_logo i_background_id = 'ALV_BACKGROUND' <- 상단 헤더 타입 i_save = 'A'
19
![Page 20: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/20.jpg)
is_variant = gd_variant CHANGING it_outtab = it_emptytab it_fieldcatalog = gd_fieldcat.
* ALVtree 계층구조 생성 PERFORM create_alvtree_hierarchy.ENDFORM. " create_and_init_alv_tree_main
4) create_alvtree_hierarchy 에 아래와 같이 Display 할 부분의 계층구조를 처리한다.FORM create_alvtree_hierarchy . data: ld_ebeln_key type lvc_nkey, ld_ebelp_key type lvc_nkey. loop at it_ekko into wa_ekko. perform add_ekko_node using wa_ekko '' changing ld_ebeln_key. loop at it_ekpo into wa_ekpo where ebeln eq wa_ekko-ebeln. perform add_ekpo_line using wa_ekpo ld_ebeln_key changing ld_ebelp_key. endloop. endloop.
* calculate totals call method gd_tree->update_calculations.* this method must be called to send the data to the frontend call method gd_tree->frontend_update.
ENDFORM. " create_alvtree_hierarchy
FORM add_ekko_node USING ps_ekko like wa_ekko value(p_relate_key) changing p_node_key.
data: ld_node_text type lvc_value.* Set item-layout data: lt_item_layout type lvc_t_layi, ls_item_layout type lvc_s_layi. ls_item_layout-t_image = '@3P@'. ls_item_layout-fieldname = gd_tree->c_hierarchy_column_name. ls_item_layout-style = cl_gui_column_tree=>style_default. ld_node_text = ps_ekko-ebeln. append ls_item_layout to lt_item_layout.* Add node call method gd_tree->add_node exporting i_relat_node_key = p_relate_key i_relationship = cl_gui_column_tree=>relat_last_child i_node_text = ld_node_text is_outtab_line = ps_ekko it_item_layout = lt_item_layout importing e_new_node_key = p_node_key.ENDFORM. " add_ekko_node
FORM add_ekpo_line USING ps_ekpo like wa_ekpo value(p_relate_key) changing p_node_key.
data: ld_node_text type lvc_value.
* Set item-layout
20
![Page 21: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/21.jpg)
data: lt_item_layout type lvc_t_layi, ls_item_layout type lvc_s_layi. ls_item_layout-t_image = '@3P@'. ls_item_layout-fieldname = gd_tree->c_hierarchy_column_name. ls_item_layout-style = cl_gui_column_tree=>style_default. ld_node_text = ps_ekpo-ebelp. append ls_item_layout to lt_item_layout.* Add node call method gd_tree->add_node exporting i_relat_node_key = p_relate_key i_relationship = cl_gui_column_tree=>relat_last_child i_node_text = ld_node_text is_outtab_line = ps_ekpo it_item_layout = lt_item_layout importing e_new_node_key = p_node_key.ENDFORM. " add_ekpo_line
5) 나머지 field 속성 정의(ALV Grid Control과 동일하게 처리) 나 헤더처리 등의 서브루틴을
~~F01 에 아래와 같이 생성해준다.FORM build_report_title CHANGING pt_report_title TYPE slis_t_listheader pa_logo TYPE sdydo_value. DATA: ls_line TYPE slis_listheader, ld_date(10) TYPE c.* List Heading Line(TYPE H) CLEAR ls_line. ls_line-typ = 'H'.* ls_line-key "Not Used For This Type(H) ls_line-info = 'PO ALVTree Display'. APPEND ls_line TO pt_report_title.* Status Line(TYPE S) ld_date(2) = sy-datum+6(2). ld_date+2(1) = '/'. ld_date+3(2) = sy-datum+4(2). ld_date+5(1) = '/'. ld_date+6(4) = sy-datum(4). ls_line-typ = 'S'. ls_line-key = 'Date'. ls_line-info = ld_date. APPEND ls_line TO pt_report_title.* Action Line(TYPE A) CLEAR ls_line. ls_line-typ = 'A'. CONCATENATE 'Report: ' sy-repid INTO ls_line-info SEPARATED BY space. APPEND ls_line TO pt_report_title.ENDFORM. FORM build_hierarchy_header CHANGING p_hierarchy_header TYPE treev_hhdr. p_hierarchy_header-heading = 'Hierarchy Header'(013). p_hierarchy_header-tooltip = 'This is the Hierarchy Header !'(014). p_hierarchy_header-width = 30. p_hierarchy_header-width_pix = ''.ENDFORM. " build_hierarchy_headerFORM build_variant.* Set repid for storing variants gd_variant-report = sy-repid.ENDFORM. " BUILD_VARIANT
6) Screen 100번에 사용자제어 를 설정하고 SCREEN_CONTAINER 를 이름란에 기재해준다.
21
![Page 22: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/22.jpg)
10) 실행하면 아래와 같은 tree 구조의 리포트가 생성된다.
라. ALV Tree 에 사용자 정의의 툴바 추가하기.
1) 메인 소스의 INCLUDE 파트에 ZTOOLBAR_EVENT_RECEIVER 라는 이름으로 INCLUDE
프로그램을 생성한다.*IncludesINCLUDE ZALVTREET01.INCLUDE ZTOOLBAR_EVENT_RECEIVER. " Toolbar EventINCLUDE ZDEMO_ALVTREEO01. "Screen PBO ModulesINCLUDE ZDEMO_ALVTREEI01. "Screen PAI ModulesINCLUDE ZDEMO_ALVTREEF01. "ABAP Subroutines(FORMS)
2) 생성된 INCLUDE 프로그램에 ALV Tree 의 툴바를 핸들링할 class에 대해 추가한다.
DATA: mr_toolbar type ref to cl_gui_toolbar. "Add to top include*---------------------------------------------------------------------** CLASS lcl_toolbar_event_receiver DEFINITION*---------------------------------------------------------------------*
22
![Page 23: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/23.jpg)
CLASS lcl_toolbar_event_receiver DEFINITION. PUBLIC SECTION. METHODS: on_function_selected FOR EVENT function_selected OF cl_gui_toolbar IMPORTING fcode,
on_toolbar_dropdown FOR EVENT dropdown_clicked OF cl_gui_toolbar IMPORTING fcode posx posy.ENDCLASS.*---------------------------------------------------------------------** CLASS lcl_toolbar_event_receiver IMPLEMENTATION*---------------------------------------------------------------------** ........ **---------------------------------------------------------------------*CLASS lcl_toolbar_event_receiver IMPLEMENTATION.
METHOD on_function_selected. DATA: lt_list_commentary TYPE slis_t_listheader, l_logo TYPE sdydo_value.
* Processing for user defined tollbar button goes here CASE fcode. <- 신규로 생성된 툴바버튼은 이 부분에서 처리해준다. WHEN 'NEXT'. WHEN 'DELETE'. DATA: lt_selected_node TYPE lvc_t_nkey. DATA: e_selected_node TYPE lvc_nkey, e_fieldname TYPE lvc_fname. DATA: lt_outtab_line(100) TYPE c, lt_node_text TYPE lvc_value. CALL METHOD gd_tree->get_selected_nodes CHANGING ct_selected_nodes = lt_selected_node. WHEN 'INSERT_LC'.* Code for function code INSERT_LC goes here WHEN 'INSERT_FC'.* Code for function code INSERT_FC goes here WHEN 'INSERT_FS'.* Code for function code INSERT_FS goes here WHEN 'INSERT_LS'.* Code for function code INSERT_LS goes here WHEN 'INSERT_NS'.* Code for function code INSERT_NS goes here ENDCASE.* update frontend CALL METHOD gd_tree->frontend_update. ENDMETHOD.
METHOD on_toolbar_dropdown.* create contextmenu DATA: l_menu TYPE REF TO cl_ctmenu, l_fc_handled TYPE as4flag.
CREATE OBJECT l_menu. CLEAR l_fc_handled.
* Setup Insert button so options are displayed as drop doan menu CASE fcode. WHEN 'INSERT_LC'. l_fc_handled = 'X'.* insert as last child CALL METHOD l_menu->add_function EXPORTING fcode = 'INSERT_LC'
23
![Page 24: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/24.jpg)
text = 'Insert New Line as Last Child'. "#EC NOTEXT* insert as first child CALL METHOD l_menu->add_function EXPORTING fcode = 'INSERT_FC' text = 'Insert New Line as First Child'. "#EC NOTEXT* insert as next sibling CALL METHOD l_menu->add_function EXPORTING fcode = 'INSERT_NS' text = 'Insert New Line as Next Sibling'."#EC NOTEXT* insert as last sibling CALL METHOD l_menu->add_function EXPORTING fcode = 'INSERT_LS' text = 'Insert New Line as Last Sibling'."#EC NOTEXT* insert as first sibling CALL METHOD l_menu->add_function EXPORTING fcode = 'INSERT_FS' text = 'Insert New Line as First Sibling'. "#EC NOTEXT ENDCASE.* show dropdownbox IF l_fc_handled = 'X'. CALL METHOD mr_toolbar->track_context_menu EXPORTING context_menu = l_menu posx = posx posy = posy. ENDIF. ENDMETHOD.ENDCLASS.
3) 데이터 선언부에 INCLUDE <ICON>. 을 삽입한다.
4) PBO 의 PBO_0100 에 서브루틴 create_toolbar 를 추가해서 생성해준다.IF gd_tree is initial. PERFORM create_and_init_alv_tree_main. PERFORM CREATE_TOOLBAR. <- 추가하는 부분 ELSE. CALL METHOD cl_gui_cfw=>flush.ENDIF.
5) 서브루틴 change_toolbar 를 아래와 같이 처리해준다.FORM CREATE_TOOLBAR .* get toolbar control call method gd_tree->get_toolbar_object importing er_toolbar = mr_toolbar. check not mr_toolbar is initial.* add seperator to toolbar call method mr_toolbar->add_button exporting fcode = '' icon = '' butn_type = cntb_btype_sep text = '' quickinfo = 'This is a Seperator'. "#EC NOTEXT* add Standard Button to toolbar (for Delete Subtree) call method mr_toolbar->add_button exporting fcode = 'DELETE' "Function code of button icon = '@18@' "Icon ID (see ) butn_type = cntb_btype_button "Button type text = '' "Button text quickinfo = 'Delete subtree'. "Quick info text
24
![Page 25: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/25.jpg)
* add Dropdown Button to toolbar (for Insert Line) call method mr_toolbar->add_button exporting fcode = 'INSERT_LC' "Function code of button icon = '@17@' "Icon ID (see ) butn_type = cntb_btype_dropdown "Button type text = '' "Button text quickinfo = 'Insert Line'. "Quick info text* set event-handler for toolbar-control data: toolbar_event_receiver type ref to lcl_toolbar_event_receiver. create object toolbar_event_receiver. set handler toolbar_event_receiver->on_function_selected for mr_toolbar. set handler toolbar_event_receiver->on_toolbar_dropdown for mr_toolbar.
ENDFORM. " CREATE_TOOLBAR
6) 처리결과 그림과 같이 툴바버튼이 추가 되었고 그 처리부분은 INCLUDE 에서 해준다.
마. ALV Tree 에 사용자 Event 추가하기.
1)메인 소스의 INCLUDE 파트에 ZALVTREET02 라는 이름으로 INCLUDE 프로그램을
생성한다.*IncludesINCLUDE ZALVTREET01.INCLUDE ZALVTREET02. "USER ACTION <- INCLUDE 추가INCLUDE ZTOOLBAR_EVENT_RECEIVER. " Toolbar Event
2) 생성된 INCLUDE 프로그램에 ALV Tree 의 User Action을 처리할 class를 추가한다.*---------------------------------------------------------------------** CLASS lcl_tree_event_receiver DEFINITION*---------------------------------------------------------------------*CLASS lcl_tree_event_receiver DEFINITION. PUBLIC SECTION. METHODS handle_node_ctmenu_request FOR EVENT node_context_menu_request OF cl_gui_alv_tree IMPORTING node_key menu. METHODS handle_node_ctmenu_selected FOR EVENT node_context_menu_selected OF cl_gui_alv_tree IMPORTING node_key fcode.
25
추가된 2개의 버튼: 디버깅을 통해 처리프로세스를 확인 해보세요.
![Page 26: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/26.jpg)
METHODS handle_item_ctmenu_request FOR EVENT item_context_menu_request OF cl_gui_alv_tree IMPORTING node_key fieldname menu. METHODS handle_item_ctmenu_selected FOR EVENT item_context_menu_selected OF cl_gui_alv_tree IMPORTING node_key fieldname fcode. METHODS handle_item_double_click FOR EVENT item_double_click OF cl_gui_alv_tree IMPORTING node_key fieldname. METHODS handle_button_click FOR EVENT button_click OF cl_gui_alv_tree IMPORTING node_key fieldname. METHODS handle_link_click FOR EVENT link_click OF cl_gui_alv_tree IMPORTING node_key fieldname. METHODS handle_header_click FOR EVENT header_click OF cl_gui_alv_tree IMPORTING fieldname.ENDCLASS.
*---------------------------------------------------------------------** CLASS lcl_tree_event_receiver IMPLEMENTATION*---------------------------------------------------------------------*CLASS lcl_tree_event_receiver IMPLEMENTATION. METHOD handle_node_ctmenu_request.* append own functions CALL METHOD menu->add_function EXPORTING fcode = 'USER1' text = 'Usercmd 1'. "#EC NOTEXT CALL METHOD menu->add_function EXPORTING fcode = 'USER2' text = 'Usercmd 2'. "#EC NOTEXT CALL METHOD menu->add_function EXPORTING fcode = 'USER3' text = 'Usercmd 3'. "#EC NOTEXT ENDMETHOD. METHOD handle_node_ctmenu_selected. CASE fcode. WHEN 'USER1' OR 'USER2' OR 'USER3'. MESSAGE i000(0h) WITH 'Node-Context-Menu on Node ' node_key 'fcode : ' fcode. "#EC NOTEXT ENDCASE. ENDMETHOD. METHOD handle_item_ctmenu_request .* append own functions CALL METHOD menu->add_function EXPORTING fcode = 'USER1' text = 'Usercmd 1'. CALL METHOD menu->add_function EXPORTING fcode = 'USER2' text = 'Usercmd 2'. CALL METHOD menu->add_function EXPORTING fcode = 'USER3' text = 'Usercmd 3'. ENDMETHOD. METHOD handle_item_ctmenu_selected. CASE fcode. WHEN 'USER1' OR 'USER2' OR 'USER3'. MESSAGE i000(0h) WITH 'Item-Context-Menu on Node ' node_key
26
![Page 27: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/27.jpg)
'Fieldname : ' fieldname. "#EC NOTEXT ENDCASE. ENDMETHOD. METHOD handle_item_double_click.* Processing for when user double clicks on ALVtree ENDMETHOD. METHOD handle_button_click.* Processing when user clicks button ENDMETHOD. METHOD handle_link_click. ENDMETHOD.
METHOD handle_header_click.* Processing for when user clicks on ALVtree column headers ENDMETHOD.ENDCLASS.
4) PBO 의 PBO_0100 에 서브루틴 change_toolbar 를 추가해서 생성해준다.IF gd_tree is initial.PERFORM create_and_init_alv_tree_main.PERFORM create_user_interaction. <- 서브루틴 추가
PERFORM CHANGE_TOOLBAR.ELSE. CALL METHOD cl_gui_cfw=>flush.ENDIF.
5) 서브루틴 create_user_interaction 를 아래와 같이 처리해준다.
FORM create_user_interaction .* define the events which will be passed to the backend data: lt_events type cntl_simple_events, l_event type cntl_simple_event.
* define the events which will be passed to the backend l_event-eventid = cl_gui_column_tree=>eventid_expand_no_children. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_checkbox_change. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_header_context_men_req. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_item_context_menu_req. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_item_double_click. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_header_click. append l_event to lt_events. l_event-eventid = cl_gui_column_tree=>eventid_item_keypress. append l_event to lt_events.
call method gd_tree->set_registered_events exporting events = lt_events exceptions cntl_error = 1 cntl_system_error = 2 illegal_event_combination = 3. if sy-subrc <> 0. message x208(00) with 'ERROR'. "#EC NOTEXT endif.* set HandlerDATA: l_event_receiver type ref to lcl_tree_event_receiver.
create object l_event_receiver.
27
![Page 28: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/28.jpg)
set handler l_event_receiver->handle_node_ctmenu_request for gd_tree.set handler l_event_receiver->handle_node_ctmenu_selected for gd_tree.set handler l_event_receiver->handle_item_ctmenu_request for gd_tree.set handler l_event_receiver->handle_item_ctmenu_selected for gd_tree.set handler l_event_receiver->handle_item_double_click for gd_tree.set handler l_event_receiver->handle_header_click for gd_tree.
ENDFORM. " create_user_interaction
6) 위와 같이 처리하고 그 처리부분을 INCLUDE 에서 해주게 된다.
28
![Page 29: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/29.jpg)
3. Grid Function Module 을 사용한 ALV Control.
가. 개요.
: 이번에는 1. 에서 class 로 개발한 ALV Grid Control 을
Function Module 'REUSE_ALV_GRID_DISPLAY' 로 개발하는 방법을 알아보겠습니다.
나. 기본적인 프로그램 코드 생성.*&---------------------------------------------------------------**& Report ZDEMO_ALVGRIDFUNCTION * *&---------------------------------------------------------------**& Example of a simple ALV Grid Report with Function Module **&-------------------------------------------- ------------------*REPORT ZDEMO_ALVGRIDFUNCTION.TABLES: ekko.*Data 선언*----------------TYPES: BEGIN OF t_ekko, ebeln TYPE ekpo-ebeln, ebelp TYPE ekpo-ebelp, statu TYPE ekpo-statu, aedat TYPE ekpo-aedat, matnr TYPE ekpo-matnr, menge TYPE ekpo-menge, meins TYPE ekpo-meins, netpr TYPE ekpo-netpr, peinh TYPE ekpo-peinh, END OF t_ekko.DATA: it_ekko TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0, wa_ekko TYPE t_ekko.*ALV data 선언 type-pools: slis.data: fieldcatalog type slis_t_fieldcat_alv with header line, gd_tab_group type slis_t_sp_group_alv, gd_layout type slis_layout_alv, gd_repid like sy-repid.*************************************************************************Start-of-selection.START-OF-SELECTION.perform get_data.perform build_fieldcatalog.perform build_layout.perform display_alv_report.
다. 각종 Subloutine 처리
1) 데이터 를 처리하는 서브루틴 을 생성한다.
FORM get_data .
select ebeln ebelp statu aedat matnr menge meins netpr peinh
up to 10 rows from ekpo into table it_ekko.
ENDFORM. " get_data
2) Field 속성과 레이아웃을 위한 서브루틴을 생성하고 처리해준다.
(1.2.번과 속성이 약간 차이가 있다.)FORM build_fieldcatalog . fieldcatalog-fieldname = 'EBELN'. fieldcatalog-seltext_m = '구매오더번호'. <- 이부분이 차이가 있는 부분입니다. fieldcatalog-col_pos = 0. fieldcatalog-outputlen = 10. fieldcatalog-emphasize = 'X'. fieldcatalog-key = 'X'.
29
![Page 30: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/30.jpg)
* fieldcatalog-do_sum = 'X'.* fieldcatalog-no_zero = 'X'. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'EBELP'. fieldcatalog-seltext_m = 'PO 품목'. fieldcatalog-col_pos = 1. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'STATU'. fieldcatalog-seltext_m = '상태'. fieldcatalog-col_pos = 2. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'AEDAT'. fieldcatalog-seltext_m = '품목변경일'. fieldcatalog-col_pos = 3. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MATNR'. fieldcatalog-seltext_m = '자재번호'. fieldcatalog-col_pos = 4. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MENGE'. fieldcatalog-seltext_m = 'PO 수량'. fieldcatalog-col_pos = 5. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MEINS'. fieldcatalog-seltext_m = '주문단위'. fieldcatalog-col_pos = 6. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'NETPR'. fieldcatalog-seltext_m = '단가'. fieldcatalog-col_pos = 7. fieldcatalog-outputlen = 15. fieldcatalog-datatype = 'CURR'. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'PEINH'. fieldcatalog-seltext_m = '가격단위'. fieldcatalog-col_pos = 8. append fieldcatalog to fieldcatalog. clear fieldcatalog.ENDFORM. " build_fieldcatalog
FORM build_layout . gd_layout-no_input = 'X'. gd_layout-colwidth_optimize = 'X'. gd_layout-totals_text = 'Totals'(201).* gd_layout-totals_only = 'X'.* gd_layout-f2code = 'DISP'. "Sets fcode for when double* "click(press f2)* gd_layout-zebra = 'X'.* gd_layout-group_change_edit = 'X'.* gd_layout-header_text = 'helllllo'.ENDFORM. " build_layout
3) 서브루틴 display_alv_report 를 생성하고 'REUSE_ALV_GRID_DISPLAY' 를 사용하여 Diplay한다.
FORM display_alv_report . gd_repid = sy-repid. call function 'REUSE_ALV_GRID_DISPLAY'
30
![Page 31: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/31.jpg)
exporting i_callback_program = gd_repid* i_callback_top_of_page = 'TOP-OF-PAGE' "see FORM* i_callback_user_command = 'USER_COMMAND'* i_grid_title = outtext is_layout = gd_layout it_fieldcat = fieldcatalog[]* it_special_groups = gd_tabgroup* IT_EVENTS = GT_XEVENTS i_save = 'X'* is_variant = z_template
tables t_outtab = it_ekko exceptions program_error = 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. " display_alv_report
라) Display.
- 실행버튼(F8) 을 통해 실행한 모습입니다.
4. List Function Module 을 사용한 ALV List.
가. 개요.
1) ALV List Function mudule은 근본적으로 GRID 의 오래된 버전입니다.
이 Function Module은 가능한 한 작은 노력으로, Internal Table 을 Display 하도록 합니다.
2) 개발하는 방법에서 3. 의 Function Module 을 이용한 Grid 와 같지만
Function Module은 "REUSE_ALV_LIST_DISPLAY"을 사용합니다.
31
![Page 32: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/32.jpg)
3) 'REUSE_ALV_GRID_DISPLAY에 대해 BALVBT01은 한 페이지에 여러가지로 disply 되어
있는 ALV LIST Report 의 예제를 보여줍니다.
나. 기본적인 프로그램 코드 생성.*&---------------------------------------------------------------**& Report ZDEMO_ALVGRIDFUNCTION * *&---------------------------------------------------------------**& Example of a simple ALV Grid Report with Function Module **&-------------------------------------------- ------------------*REPORT ZDEMO_ALVGRIDFUNCTION.TABLES: ekko.*Data 선언*----------------TYPES: BEGIN OF t_ekko, ebeln TYPE ekpo-ebeln, ebelp TYPE ekpo-ebelp, statu TYPE ekpo-statu, aedat TYPE ekpo-aedat, matnr TYPE ekpo-matnr, menge TYPE ekpo-menge, meins TYPE ekpo-meins, netpr TYPE ekpo-netpr, peinh TYPE ekpo-peinh, END OF t_ekko.DATA: it_ekko TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0, wa_ekko TYPE t_ekko.*ALV data 선언 type-pools: slis.data: fieldcatalog type slis_t_fieldcat_alv with header line, gd_tab_group type slis_t_sp_group_alv, gd_layout type slis_layout_alv, gd_repid like sy-repid.*************************************************************************Start-of-selection.START-OF-SELECTION.perform get_data.perform build_fieldcatalog.perform build_layout.perform display_alv_report.
다. 각종 Subloutine 처리
1) 데이터 를 처리하는 서브루틴 을 생성한다.
FORM get_data .
select ebeln ebelp statu aedat matnr menge meins netpr peinh
up to 10 rows from ekpo into table it_ekko.
ENDFORM. " get_data
2) Field 속성과 레이아웃을 위한 서브루틴을 생성하고 처리해준다.
(1.2.번과 속성이 약간 차이가 있다.)FORM build_fieldcatalog . fieldcatalog-fieldname = 'EBELN'. fieldcatalog-seltext_m = '구매오더번호'. <- 이부분이 차이가 있는 부분입니다. fieldcatalog-col_pos = 0. fieldcatalog-outputlen = 10. fieldcatalog-emphasize = 'X'. fieldcatalog-key = 'X'.* fieldcatalog-do_sum = 'X'.* fieldcatalog-no_zero = 'X'.
32
![Page 33: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/33.jpg)
append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'EBELP'. fieldcatalog-seltext_m = 'PO 품목'. fieldcatalog-col_pos = 1. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'STATU'. fieldcatalog-seltext_m = '상태'. fieldcatalog-col_pos = 2. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'AEDAT'. fieldcatalog-seltext_m = '품목변경일'. fieldcatalog-col_pos = 3. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MATNR'. fieldcatalog-seltext_m = '자재번호'. fieldcatalog-col_pos = 4. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MENGE'. fieldcatalog-seltext_m = 'PO 수량'. fieldcatalog-col_pos = 5. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'MEINS'. fieldcatalog-seltext_m = '주문단위'. fieldcatalog-col_pos = 6. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'NETPR'. fieldcatalog-seltext_m = '단가'. fieldcatalog-col_pos = 7. fieldcatalog-outputlen = 15. fieldcatalog-datatype = 'CURR'. append fieldcatalog to fieldcatalog. clear fieldcatalog. fieldcatalog-fieldname = 'PEINH'. fieldcatalog-seltext_m = '가격단위'. fieldcatalog-col_pos = 8. append fieldcatalog to fieldcatalog. clear fieldcatalog.ENDFORM. " build_fieldcatalog
FORM build_layout . gd_layout-no_input = 'X'. gd_layout-colwidth_optimize = 'X'. gd_layout-totals_text = 'Totals'(201).* gd_layout-totals_only = 'X'.* gd_layout-f2code = 'DISP'. "Sets fcode for when double* "click(press f2)* gd_layout-zebra = 'X'.* gd_layout-group_change_edit = 'X'.* gd_layout-header_text = 'helllllo'.ENDFORM. " build_layout
3) 서브루틴 display_alv_report 를 생성하고 'REUSE_ALV_LIST_DISPLAY' 를 사용하여 Diplay한다.
FORM display_alv_report . gd_repid = sy-repid. call function 'REUSE_ALV_LIST_DISPLAY' exporting i_callback_program = gd_repid
33
![Page 34: Alv Grid](https://reader033.vdocuments.net/reader033/viewer/2022061501/55cf9ae3550346d033a3e10a/html5/thumbnails/34.jpg)
* i_callback_user_command = 'USER_COMMAND'* i_grid_title = outtext is_layout = gd_layout it_fieldcat = fieldcatalog[]* it_special_groups = gd_tabgroup* IT_EVENTS = GT_XEVENTS i_save = 'X'* is_variant = z_template
tables t_outtab = it_ekko exceptions program_error = 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. " display_alv_report
라) Display.
- 실행버튼(F8) 을 통해 실행한 모습입니다.
34