alv grid

38
ALV GRID CONTROL

Upload: poussinforever

Post on 01-Jan-2016

62 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Alv Grid

ALV GRID CONTROL

Page 2: Alv Grid

● 차 례

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

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

나. 기본적인 프로그램 코드 및 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

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

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

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

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

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

** 좌측 선택을 위한 처리 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

* 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

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

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

6) 전체를 Activate 하고 실행한 결과이다.

14

Page 15: Alv Grid

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

- 좌측 선택 바가 나오도록 서브루틴 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

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

*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

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

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

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

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

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

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

* 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

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

'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

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

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

* 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

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

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

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

* 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