본문 바로가기
ERP-SAP/ABAP

<ABAP> ALV - CLASS 로 만들기. ALV GRID CONTROL

by 행복한워니의 기록 2010. 12. 3.
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.

DATAg_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 ).
      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

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

***************************************************************


보다시피 더블클릭하면 데이터를 긁어와서 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  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=>offlineIS 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

이렇게 설정해놓고...

**************************************************
FIELDCATALOG 부분을 보자. 
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       Build field catalog for the alv control
*----------------------------------------------------------------------*
FORM build_fieldcat.
  CLEARgt_fieldcatgt_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.


이런식으로 만들어 준 것이다. 
상당히 긴 필드카탈로그를 만들어야 할 때 아주 유용하게 사용할 수 있다. 
이렇게 만들어 준 필드카탈로그를 다시 위쪽 소스를 보면 아래와 같은 부분이 있는데 

*..... 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[]. <- 출력할 테이블을 여기다 넣으면 된다.

이정도면 설명이 좀 되었을려나..?^^

또 여러가지 필드카탈로그를 만드는 방법이 있는데..
지금 프로그램 짜라는 임무가 떨어져서 바빠져서 못쓰겠다.. 어휴...
쉴틈이 없네......ㅎㅎㅎ




728x90
반응형