728x90
반응형
ALV 로 뿌리는건 다양한 방법이 존재하는데...
사실 블로그에서 보는 ALV 설명만으로 내가 원하는 ALV 를 짜본적은 없다...
내 지식이 부족하기도 했었고.. 초보들에겐 그 설명조차 어려웠기 때문에....
그래서 나도 한번 풀어 써볼란다...-_-
요즘 맨날 보는 부동산 임대내역 관리.... 를 예제로... 보면서 붙여넣어야 겠다..
딱 필요한 내용만 넣어야지..
TOP 부분의 선언부이다.
*..... ALV Grid
* Predefine a local class for event handling to allow the
* declaration of a reference variable before the class is defined.
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: g_repid LIKE sy-repid,
gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo,
gs_variant TYPE disvariant,
go_grid TYPE REF TO cl_gui_alv_grid,
go_docking_container TYPE REF TO cl_gui_docking_container,
go_event_receiver TYPE REF TO lcl_event_receiver.
* Predefine a local class for event handling to allow the
* declaration of a reference variable before the class is defined.
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: g_repid LIKE sy-repid,
gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo,
gs_variant TYPE disvariant,
go_grid TYPE REF TO cl_gui_alv_grid,
go_docking_container TYPE REF TO cl_gui_docking_container,
go_event_receiver TYPE REF TO lcl_event_receiver.
그리고 더블클릭 이벤트 부분..
*----------------------------------------------------------------------*
* LOCAL CLASSES: Definition *
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
PRIVATE SECTION.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
* LOCAL CLASSES: Implementation *
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
* read selected row from internal table gt_zfit0006
IF ( e_row-rowtype IS INITIAL ) AND
( e_row-index GT 0 ).
PERFORM double_click USING e_row-index e_column-fieldname. <- 이 부분은 또 아래에..
ELSE.
MESSAGE s903 WITH 'Data line'.
* Cursor의 위치를 정확하게 놓으십시요. [&]
ENDIF.
ENDMETHOD. "handle_double_click
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
* LOCAL CLASSES: Definition *
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
PRIVATE SECTION.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
* LOCAL CLASSES: Implementation *
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
* read selected row from internal table gt_zfit0006
IF ( e_row-rowtype IS INITIAL ) AND
( e_row-index GT 0 ).
PERFORM double_click USING e_row-index e_column-fieldname. <- 이 부분은 또 아래에..
ELSE.
MESSAGE s903 WITH 'Data line'.
* Cursor의 위치를 정확하게 놓으십시요. [&]
ENDIF.
ENDMETHOD. "handle_double_click
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
* ALV 또는 화면에서 Double click시 수행 로직
*----------------------------------------------------------------------*
* --> P_LINE : ALV의 Current line
* --> P_FIELD : ALV의 Current field
*----------------------------------------------------------------------*
FORM double_click USING p_line p_field.
CLEAR:
gs_zfit0207,
g_flag_init.
g_flag_stat = '%VIEW'.
READ TABLE gt_zfit0207 INDEX p_line INTO gs_zfit0207.
PERFORM get_bupla_descr USING gs_zfit0207-bukrs <-1번째로 붙여넣을 것
gs_zfit0207-bupla
CHANGING j_1bbranch-name.
PERFORM get_cost_center_descr USING gs_zfit0207-kostl <- 2번째로
CHANGING g_ktext.
CALL SCREEN 0200.
ENDFORM. " DOUBLE_CLICK
* ALV 또는 화면에서 Double click시 수행 로직
*----------------------------------------------------------------------*
* --> P_LINE : ALV의 Current line
* --> P_FIELD : ALV의 Current field
*----------------------------------------------------------------------*
FORM double_click USING p_line p_field.
CLEAR:
gs_zfit0207,
g_flag_init.
g_flag_stat = '%VIEW'.
READ TABLE gt_zfit0207 INDEX p_line INTO gs_zfit0207.
PERFORM get_bupla_descr USING gs_zfit0207-bukrs <-1번째로 붙여넣을 것
gs_zfit0207-bupla
CHANGING j_1bbranch-name.
PERFORM get_cost_center_descr USING gs_zfit0207-kostl <- 2번째로
CHANGING g_ktext.
CALL SCREEN 0200.
ENDFORM. " DOUBLE_CLICK
************************************
*&---------------------------------------------------------------------*
*& Form GET_BUPLA_DESCR
*&---------------------------------------------------------------------*
FORM get_bupla_descr USING p_bukrs
p_bupla
CHANGING p_name.
CLEAR:
p_name.
SELECT SINGLE name
INTO p_name
FROM j_1bbranch
WHERE bukrs EQ p_bukrs "회사코드
AND branch EQ p_bupla. "사업장
ENDFORM. " GET_BUPLA_DESCR
*& Form GET_BUPLA_DESCR
*&---------------------------------------------------------------------*
FORM get_bupla_descr USING p_bukrs
p_bupla
CHANGING p_name.
CLEAR:
p_name.
SELECT SINGLE name
INTO p_name
FROM j_1bbranch
WHERE bukrs EQ p_bukrs "회사코드
AND branch EQ p_bupla. "사업장
ENDFORM. " GET_BUPLA_DESCR
*&---------------------------------------------------------------------*
*& Form GET_COST_CENTER_DESCR
*&---------------------------------------------------------------------*
FORM get_cost_center_descr USING p_kostl
CHANGING p_ktext.
CLEAR:
p_ktext.
SELECT SINGLE ktext
INTO p_ktext
FROM cskt
WHERE spras EQ zcont_spras_ko
AND kokrs EQ zcont_kokrs "관리회계영역
AND kostl EQ p_kostl "코스트센터
AND datbi GE sy-datum. "효력만료일
ENDFORM. " GET_COST_CENTER_DESCR
*& Form GET_COST_CENTER_DESCR
*&---------------------------------------------------------------------*
FORM get_cost_center_descr USING p_kostl
CHANGING p_ktext.
CLEAR:
p_ktext.
SELECT SINGLE ktext
INTO p_ktext
FROM cskt
WHERE spras EQ zcont_spras_ko
AND kokrs EQ zcont_kokrs "관리회계영역
AND kostl EQ p_kostl "코스트센터
AND datbi GE sy-datum. "효력만료일
ENDFORM. " GET_COST_CENTER_DESCR
***************************************************************
보다시피 더블클릭하면 데이터를 긁어와서 200번 스크린에
뿌려준다. 해당 필드에 맞게 말이지...
소스만 보고 이해를 한다면 당신은 이미 입문은 지난 초급단계!!!
(저도 초급이랍니다..)
갑자기 ALV 하다가 더블클릭 이벤트를 설명하게 되었는데...
ALV 로 다시 넘어가자. 어쨌든 TOP 부분에 선언한게 주 포인트였다.
두번째로...
스크린에 넘어간 후에 ALV 셋팅을 보자.
여기는 300번 스크린이다.
PROCESS BEFORE OUTPUT.
MODULE status.
MODULE init_grid. <- 이 부분에서 선언을 해주었다.
*
PROCESS AFTER INPUT.
MODULE exit_cancel AT EXIT-COMMAND.
MODULE user_command.
MODULE status.
MODULE init_grid. <- 이 부분에서 선언을 해주었다.
*
PROCESS AFTER INPUT.
MODULE exit_cancel AT EXIT-COMMAND.
MODULE user_command.
********************************************
소스를 보자.
*&---------------------------------------------------------------------*
*& Module INIT_GRID OUTPUT
*&---------------------------------------------------------------------*
* Create one ALV Control that shows the first table
*----------------------------------------------------------------------*
MODULE init_grid OUTPUT.
gs_variant-report = g_repid = sy-repid.
IF go_docking_container IS INITIAL. <-이게 없으면 생성한다.
IF cl_gui_alv_grid=>offline( ) IS INITIAL. <- 이거 안줘도 상관 없다.
*..... Create a custom container control for our ALV Control
CREATE OBJECT go_docking_container
EXPORTING
repid = sy-cprog
dynnr = sy-dynnr
side = cl_gui_docking_container=>dock_at_top
extension = 1000.
ENDIF.
*..... Create an instance of alv control
CREATE OBJECT go_grid
EXPORTING
i_parent = go_docking_container.
*..... Set a layout for the grid control
PERFORM set_layout. <- ALV 레이아웃 셋팅을 해주고 있다.
*..... Build field catalog for the alv control
PERFORM build_fieldcat. <-FIELD CATALOG 를 만들고 있다.
*..... Show table on ALV Control
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'ZFIT0207'
is_layout = gs_layout
is_variant = gs_variant
i_save = 'A'
CHANGING
it_fieldcatalog = gt_fieldcat
it_outtab = gt_zfit0207[].
*..... Create Object to receive events and link them to handler methods.
CREATE OBJECT go_event_receiver.
SET HANDLER go_event_receiver->handle_double_click FOR go_grid.
* raise event TOOLBAR:
CALL METHOD go_grid->set_toolbar_interactive.
ENDIF. "IF custom_container IS INITIAL
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
ENDMODULE. " INIT_GRID OUTPUT
*& Module INIT_GRID OUTPUT
*&---------------------------------------------------------------------*
* Create one ALV Control that shows the first table
*----------------------------------------------------------------------*
MODULE init_grid OUTPUT.
gs_variant-report = g_repid = sy-repid.
IF go_docking_container IS INITIAL. <-이게 없으면 생성한다.
IF cl_gui_alv_grid=>offline( ) IS INITIAL. <- 이거 안줘도 상관 없다.
*..... Create a custom container control for our ALV Control
CREATE OBJECT go_docking_container
EXPORTING
repid = sy-cprog
dynnr = sy-dynnr
side = cl_gui_docking_container=>dock_at_top
extension = 1000.
ENDIF.
*..... Create an instance of alv control
CREATE OBJECT go_grid
EXPORTING
i_parent = go_docking_container.
*..... Set a layout for the grid control
PERFORM set_layout. <- ALV 레이아웃 셋팅을 해주고 있다.
*..... Build field catalog for the alv control
PERFORM build_fieldcat. <-FIELD CATALOG 를 만들고 있다.
*..... Show table on ALV Control
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'ZFIT0207'
is_layout = gs_layout
is_variant = gs_variant
i_save = 'A'
CHANGING
it_fieldcatalog = gt_fieldcat
it_outtab = gt_zfit0207[].
*..... Create Object to receive events and link them to handler methods.
CREATE OBJECT go_event_receiver.
SET HANDLER go_event_receiver->handle_double_click FOR go_grid.
* raise event TOOLBAR:
CALL METHOD go_grid->set_toolbar_interactive.
ENDIF. "IF custom_container IS INITIAL
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
ENDMODULE. " INIT_GRID OUTPUT
*****************************************************
먼저 LAYOUT 부분을 보자.
FORM set_layout.
CLEAR gs_layout.
gs_layout-cwidth_opt = 'X'. "열너비 최적화
gs_layout-sel_mode = 'A'. "select multiple lines
ENDFORM. " SET_LAYOUT
CLEAR gs_layout.
gs_layout-cwidth_opt = 'X'. "열너비 최적화
gs_layout-sel_mode = 'A'. "select multiple lines
ENDFORM. " SET_LAYOUT
이렇게 설정해놓고...
**************************************************
FIELDCATALOG 부분을 보자.
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* Build field catalog for the alv control
*----------------------------------------------------------------------*
FORM build_fieldcat.
CLEAR: gt_fieldcat, gt_fieldcat[].
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' <- 이 부분에 여러 방법이 있다.
EXPORTING
i_buffer_active = 'X'
i_bypassing_buffer = 'X'
i_structure_name = 'ZFIT0207'
CHANGING
ct_fieldcat = gt_fieldcat.
LOOP AT gt_fieldcat INTO gs_fieldcat.
CASE gs_fieldcat-fieldname.
WHEN 'BUKRS' OR 'GJAHR' OR 'VTPRD' OR 'BUPLA' OR 'SEQNO'.
* 회사코드/회계연도/부가세신고분기/사업장/순번
gs_fieldcat-key = 'X'.
WHEN 'DEPST' OR 'MRENT' OR 'BZINS' OR 'TOTAR' OR 'TOTMR'.
* 임대보증금/월세/보증금이자/임대총액/월세(분기계)
gs_fieldcat-currency = t001-waers.
gs_fieldcat-do_sum = 'X'.
WHEN 'NAME'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-301.
WHEN 'MPBNO'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-302.
WHEN 'BLOCK'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-303.
WHEN 'UGRND'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-304.
WHEN 'ZUNIT'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-305.
ENDCASE.
MODIFY gt_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDFORM. " BUILD_FIELDCAT
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* Build field catalog for the alv control
*----------------------------------------------------------------------*
FORM build_fieldcat.
CLEAR: gt_fieldcat, gt_fieldcat[].
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' <- 이 부분에 여러 방법이 있다.
EXPORTING
i_buffer_active = 'X'
i_bypassing_buffer = 'X'
i_structure_name = 'ZFIT0207'
CHANGING
ct_fieldcat = gt_fieldcat.
LOOP AT gt_fieldcat INTO gs_fieldcat.
CASE gs_fieldcat-fieldname.
WHEN 'BUKRS' OR 'GJAHR' OR 'VTPRD' OR 'BUPLA' OR 'SEQNO'.
* 회사코드/회계연도/부가세신고분기/사업장/순번
gs_fieldcat-key = 'X'.
WHEN 'DEPST' OR 'MRENT' OR 'BZINS' OR 'TOTAR' OR 'TOTMR'.
* 임대보증금/월세/보증금이자/임대총액/월세(분기계)
gs_fieldcat-currency = t001-waers.
gs_fieldcat-do_sum = 'X'.
WHEN 'NAME'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-301.
WHEN 'MPBNO'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-302.
WHEN 'BLOCK'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-303.
WHEN 'UGRND'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-304.
WHEN 'ZUNIT'.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-305.
ENDCASE.
MODIFY gt_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDFORM. " BUILD_FIELDCAT
위와 같은 명령은 MERGE 펑션으로 필드카탈로그를 자동으로 생성해주고
생성된 FIELDCATALOG 는 gt_fieldcat.로 자동으로 입력되어져 있다..
(TABLE 형식으로 들어가있다는 말..)
그럼 저 GT_FIELDCAT 를 루프를 돌면서 해당 필드에 대해서 바꿀거는 바꾸고
삭제할것은 삭제할 수 있다는 말이다.
아래 3개만 보면서 설명해보겠다.
LOOP AT gt_fieldcat INTO gs_fieldcat. 루프를 돌면서
CASE gs_fieldcat-fieldname. 해당 필드네임이
WHEN 'BUKRS' OR 'GJAHR' OR 'VTPRD' OR 'BUPLA' OR 'SEQNO'. 이거면 키값으로 해주고
* 회사코드/회계연도/부가세신고분기/사업장/순번
gs_fieldcat-key = 'X'.
WHEN 'DEPST' OR 'MRENT' OR 'BZINS' OR 'TOTAR' OR 'TOTMR'. 이거면 통화금액을 해주고 합계내라
* 임대보증금/월세/보증금이자/임대총액/월세(분기계)
gs_fieldcat-currency = t001-waers.
gs_fieldcat-do_sum = 'X'.
WHEN 'NAME'. 이거면 TEXT 를 내가 저장한 TEXT로 바꿔라.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-301.
WHEN 'BUKRS' OR 'GJAHR' OR 'VTPRD' OR 'BUPLA' OR 'SEQNO'. 이거면 키값으로 해주고
* 회사코드/회계연도/부가세신고분기/사업장/순번
gs_fieldcat-key = 'X'.
WHEN 'DEPST' OR 'MRENT' OR 'BZINS' OR 'TOTAR' OR 'TOTMR'. 이거면 통화금액을 해주고 합계내라
* 임대보증금/월세/보증금이자/임대총액/월세(분기계)
gs_fieldcat-currency = t001-waers.
gs_fieldcat-do_sum = 'X'.
WHEN 'NAME'. 이거면 TEXT 를 내가 저장한 TEXT로 바꿔라.
gs_fieldcat-coltext = gs_fieldcat-tooltip = text-301.
이런식으로 만들어 준 것이다.
상당히 긴 필드카탈로그를 만들어야 할 때 아주 유용하게 사용할 수 있다.
이렇게 만들어 준 필드카탈로그를 다시 위쪽 소스를 보면 아래와 같은 부분이 있는데
*..... Show table on ALV Control
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'ZFIT0207' <-스트럭쳐는 CBO 테이블과 같게 하되..
is_layout = gs_layout <- 레이아웃 아까 만들어준것 넣고
is_variant = gs_variant <-이거 뭐지? 알면 댓글
i_save = 'A' <-APPEND
CHANGING
it_fieldcatalog = gt_fieldcat <-필드카탈로그를 바로 여기에 때려 박고
it_outtab = gt_zfit0207[]. <- 출력할 테이블을 여기다 넣으면 된다.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'ZFIT0207' <-스트럭쳐는 CBO 테이블과 같게 하되..
is_layout = gs_layout <- 레이아웃 아까 만들어준것 넣고
is_variant = gs_variant <-이거 뭐지? 알면 댓글
i_save = 'A' <-APPEND
CHANGING
it_fieldcatalog = gt_fieldcat <-필드카탈로그를 바로 여기에 때려 박고
it_outtab = gt_zfit0207[]. <- 출력할 테이블을 여기다 넣으면 된다.
이정도면 설명이 좀 되었을려나..?^^
또 여러가지 필드카탈로그를 만드는 방법이 있는데..
지금 프로그램 짜라는 임무가 떨어져서 바빠져서 못쓰겠다.. 어휴...
쉴틈이 없네......ㅎㅎㅎ
728x90
반응형
'ERP-SAP > ABAP' 카테고리의 다른 글
<ABAP> CLASS ALV 에서의 Top-of-page 만드는 소스 (0) | 2011.03.07 |
---|---|
<ABAP> DEFINE의 활용. (0) | 2010.12.23 |
<ABAP> Screen Dropdown Listbox 만들기!!! 스크린 드랍다운 리스트박스 (0) | 2010.12.03 |
<ABAP> EXCEL UPLOAD 만들기 (3) | 2010.12.02 |
<ABAP> Selection Screen 만들 시 조건에 따라 출력 필드 다르게 하기 (0) | 2010.12.02 |