반응형

    ALV에 사용자 정의 Search Help를 추가하는 것은 어렵다기보다 곳곳에 코딩을 추가해야 하는 번거로움이 있습니다. 

    OOP 기반의 ALV를 기준으로 F4 Help를 추가하는 예제를 살펴보고자 합니다.

     

    간단히 코딩을 추가 해야할 절차를 정리해보죠. 꼭 순서를 지켜야 하는 것은 아닙니다.

     

    1) Event Receiver에 사용할 Search Help Method를  선언합니다. CLASS DEFINITION 사용. 

    2) 1)에서 선언된 Method를 구현하고 Form 문과 연계하여 Search Help 코딩을 합니다. CLASS IMPLEMENTATION 사용.

    3) Possible Entry로 선택된 값을 ALV에 넣기 위해 ALV를 Edit 가능하게 해 줍니다.

    4) Possible Entry를 구현할 필드를 등록해줍니다. register_f4_for_fields Method 사용.

    5) ALV의 Event Hander에 1)에서 선언된 Method를 사용 가능하게 매핑을 해줍니다. SET HANDLER 이용.

     

     

    1)  CLASS DEFINITION에 사용할 Event Receiver에 Search Help Method를 선언.

        SE24에서 Class CL_GUI_ALV_GRID를 보면 ONF4라는 이벤트를 Overriding 해서 사용할 것입니다.

     

        참고로 SAP Class에서는 Overloading은 지원하지 않습니다.

        Overloading(오버로딩) : 같은 이름의 메소드를 매개변수 개수나 Type을 다르게 정의해 사용한다.

        Overriding(오버라이딩) : 상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의해 사용한다.

         

    매개변수를 확인하고 이를 CLASS Event Receiver DEFINITION 문으로 선언해주면 아래와 같습니다.

    sender는 ALV Grid가 여러 개 일 때 구분을 위해 파라미터 하나를 추가합니다. 사용하지 않아도 됩니다.

    2) 선언된 Event Receiver에 Method 구현( IMPLEMENTATION ) 코딩.

        1) 번이 변수의 선언이라면 2)는 실제 사용하는 코딩이 되겠습니다.

    handle_on_f4 메소드를 on_f4라는 Form 문과 연결하여 실제 코딩은 on_f4에 해주었습니다. 이는 코드 분석을 용이하게 할 뿐이지 필수는 아닙니다.

    PERFORM f4_kkref_new 에서 Possible Entry를 띄우는 코딩을 해줍니다. 이전 포스팅을 보셨다면 일반적인 방법이 있습니다.  ( 2020/12/30 - [ABAP] - [SAP ABAP 강좌 12] Search Help 예제 )

     

    pt_event_data->m_event_handled 'X' 구문은 Standard F4를 무시하라는 파라미터입니다.

    CHECK pv_display space. 이 파라미터는 DIsplay Only로 사용할지 결정합니다. Space면 값 변경 허용.

     

    PERFORM f4_kkref_new에서 띄운 Possible Entry 중 사용자가 선택한 값을 pv_fieldvalue로 리턴을 해주면 이 값을 화면에 넣어줍니다.

    3) Possible Entry로 선택된 값을 ALV에 넣기 위해 ALV를 Edit 가능하게 해 줍니다.

    Field Catalog를 생성하고 값을 입력받을 필드의 속성 edit = 'X'로 Editable 가능하게 변경합니다.

    ALV의 Editable 방법에는 여러 가지가 있습니다. 저는 필드 하나만을 대상으로 하였으나 몇 가지 방법을 보면

     

    i) 전체 ALV필드를 모두 Editable 하려면 ALV layout의 EDIT = 'X'로 세팅합니다.

       gs_layout-edit  'X'

     

    ii) 필드 개별로 Editable 하려면 ALV Field Catalog에서 필드별로 EDIT = 'X'로 세팅합니다.

       gt_fieldcat-edit 'X'.

     

    iii) Internal Table 선언시 celltab 필드를 선언하고 속성을 제어하여 Editable할수 있습니다.

        이방법은 ALV를 다룰때 더 자세히 보겠습니다.

        선언

        celltab TYPE lvc_t_styl

        구현

        celltab-style = cl_gui_alv_grid=>mc_style_enabled

     

    iv) set_ready_for_input 세팅은 위의 방법으로 만든 Edit 세팅을 켜거나 끌 수 있습니다.  1 = Editable, 0 = Non Editable

    사용자 환경에 따라 Editable을 선택적으로 허용할 때 사용합니다.

     

    CALL METHOD gc_alv_grid->set_ready_for_input
      EXPORTING
         i_ready_for_input 1.

     

    4) Possible Entry를 구현할 필드를 등록해줍니다. register_f4_for_fields Method 사용.

     

    CALL METHOD gc_alv_grid->register_f4_for_fields
      EXPORTING
         it_f4 lt_f4.

     

    위구 문은 Possible Entry를 만들 필드를 지정해주는 부분입니다.

    fieldname에 Possible Entry를 달 필드를 지정해주고, register 'X'를 합니다.

    나머지 두 필드getbefore, chngeafter 매개변수는 

    Data_change 이벤트를 F4 전에 타게 할지 후게 타게할지 정해주는 부분으로 F4후에 값의 변경이 필요하다면

    chngeafter = 'X'를 사용해야 합니다. 

     

    5) ALV의 Event Hander에 선언된 Method를 사용 가능하게 매핑을 해줍니다.

     

     

    상단의 mc_evt_enter, mc_evt_modified는 ALV에 값을 입력할 때 Enter로 입력을 허용할지, Enter + F4선택 값을 허용할지 세팅하는  파라미터입니다.

     

    Enter로 값 입력

    CALL METHOD gc_alv_grid->register_edit_event
      EXPORTING
         i_event_id = cl_gui_alv_grid=>mc_evt_enter.

     

    Enter + F4로 값 입력
    CALL METHOD gc_alv_grid->register_edit_event
      EXPORTING
         i_event_id = cl_gui_alv_grid=>mc_evt_modified.

     

    set_ready_for_input은 ALV의 Editable을 허용할지 막을지를 세팅 가능하게 합니다. 여기서는 꼭 필요하지는 않습니다. 

    1 = Editable, 0 = Non Editable

    CALL METHOD gc_alv_grid->set_ready_for_input
      EXPORTING
         i_ready_for_input 1.

     

    마지막을 ALV의 이벤트를 처리하는 Event Receiver를 설정하고 사용할 이벤트들을 등록합니다.

     

      CREATE OBJECT gc_event_receiver.
      SET HANDLER gc_event_receiver->handle_on_f4 FOR gc_alv_grid.

     

    이렇게 하고 나면 사용자 정의 ALV Possible Entry가 생성되게 됩니다. 화면은 아래와 같습니다.

     

    ALV의 경우 세팅 항목이 많아서 따로 Possible Entry 구현법을 살펴보았습니다.

     

    긴 글 읽어주셔서 감사합니다.

    728x90
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기