밥린이의 아밥TIP

[율밥퍼] SAP ABAP- ALV HANDLE_ON_F4

율밥퍼 2023. 9. 14. 07:02

 

오늘은

 

ALV에 내가 만든 F4(서치헬프) 띄우는 법 알려드리겠슴돵.

 

오늘도 스타트

ALV HANDLE_ON_F4란?

이 이벤트는 ALV에 임의의 SEARCH HELP를 띄우고자 할때 사용합니다.

(스탠다드로 연결된 서치헬프는 필드카탈로그를 통해 자동으로 띄울 수 있음)

 

 

DEFINITION과 IMPLEMENTATION 소개먼저 가겠습니다.

*----------------------------------------------------------------------*
*       CLASS LCL_EVT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
CLASS LCL_EVT_RECEIVER DEFINITION.

  METHODS  HANDLE_ON_F4
      FOR EVENT ONF4 OF CL_GUI_ALV_GRID
      IMPORTING E_FIELDNAME
                E_FIELDVALUE
                ES_ROW_NO
                ER_EVENT_DATA
                ET_BAD_CELLS
                E_DISPLAY.

ENDCLASS.
 
*&---------------------------------------------------------------------*
*&      CLASS LCL_EVT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
CLASS LCL_EVT_RECEIVER IMPLEMENTATION.

  METHOD HANDLE_ON_F4.

    PERFORM ON_F4 USING E_FIELDNAME
                        E_FIELDVALUE
                        ES_ROW_NO
                        ER_EVENT_DATA
                        ET_BAD_CELLS
                        E_DISPLAY.

  ENDMETHOD.                    "handle_on_f4

ENDCLASS. "LCL_RECIVR IMPLEMENTATION
 

 

이제 가장 궁금하신 PERFORM문 안으로 들어가겠습니당.

 

 

<ON_F4 예시 로직>

FORM ON_F4 USING PV_FIELDNAME
                 PV_FIELDVALUE
                 PS_ROW_NO     TYPE LVC_S_ROID
                 PO_EVENT_DATA TYPE REF TO CL_ALV_EVENT_DATA
                 PT_BAD_CELLS  TYPE LVC_T_MODI
                 PV_DISPLAY.

  FIELD-SYMBOLS <FS_MODI> TYPE LVC_T_MODI.

  DATA : LT_RETURN TYPE TABLE OF DDSHRETVAL.

* STANDARD F4(Search Help)는 무시
  PO_EVENT_DATA->M_EVENT_HANDLED = ABAP_TRUE.

  CASE PV_FIELDNAME.
    WHEN 'MATNR'.
      SELECT A~MATNR,
             B~MAKTX
        FROM MAKT
       WHERE SPRAS = @SY-LANGU
       ORDER BY MATNR
        INTO TABLE @DATA(LT_MATNR).

      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          RETFIELD     = 'MATNR' "내가 만든 TABLE에서 받아 올 값
          DYNPPROG     = SY-REPID "프로그램명
          DYNPNR       = SY-DYNNR "SCREEN 번호
          VALUE_ORG    = 'S'  "S는 스트럭쳐/ C는 칼럼
          WINDOW_TITLE = '자재코드' "창이름
        TABLES
          VALUE_TAB    = LT_MATNR "SEARCH HELP 데이터를 담은 테이블
          RETURN_TAB   = LT_RETURN[]. "선택값 리턴 받을 테이블.

      CHECK LT_RETURN IS NOT INITIAL.

      ASSIGN PO_EVENT_DATA->M_DATA->* TO <FS_MODI>.

      READ TABLE LT_RETURN INTO DATA(LS_RETURN) INDEX 1.
*  LS_MODI의 TYPE은 LVC_S_MODI입니다.
      DATA(LS_MODI) = VALUE LVC_S_MODI( ROW_ID    = PS_ROW_NO-ROW_ID
                                        FIELDNAME = 'MATNR'
                                        VALUE     = LS_RETURN-FIELDVAL ).

      APPEND LS_MODI TO <FS_MODI>.

  ENDCASE.

ENDFORM.
 

여기서 서브루틴의 파라미터를 소개하자면..

 

모두 F4 이벤트가 발생했을 때의 시점입니다.

 

1. E_FIELDNAME : 필드 이름

 

2. E_FIELDVALUE : 필드에 들어있는 값

 

3. ES_ROW_NO : 몇번째 행인지.

 

4. ER_EVENT_DATA : 이벤트에 대한 데이터 변경

 

5. ET_BAD_CELLS :

이건 한번도 써본적이 없어서 ㅜㅜ 모르는데

설명에 Incorrect Cells 적혀있음..

궁금한데 찾아봐도 안나오네요..

고수님들 보시면 알려주세요

 

6. E_DISPLAY : 서치헬프를 DISPLAY ONLY로 할지 말지 결정.

DISPLAY ONLY 라면 'X'값 줄 것.

 


로직 설명들 해드릴게욤.

 

일단 PV_DISPLAY(=E_DISPLAY)값은 기본적으로 INITIAL이기 때문에

DISPLAY만 하고싶을 때 따로 'X'값을 주면 됩니다.

 

 

PO_EVENT_DATA->M_EVENT_HANDLED = ABAP_TRUE.

 

이건 위에도 써놨듯.

스탠다드 Search Help는 사용하지 않겠다는 뜻입니다.

 

 

혹시 ALV에서 여러가지 필드에 F4를 띄워야할 일이 있으심까?

(나의 파트장님 말투 따라하기)

 

 

그때 PV_FIELDNAME을 사용하면 됩니다.

 

위의 로직처럼

 

CASE PV_FIELDNAME

WHEN 'MATNR'

 

이렇게 사용하시면 돼욥.

 

제가 MATNR에 F4를 띄울 예정이니 그에 맞는 데이터를 SELECT하여 테이블에 담아줍니다.

 

그리고 나서

 

F4IF_INT_TABLE_VALUE_REQUEST

 

이 펑션을 써주시면 됩니다.

 

그리고나서 저는

 

CHECK LT_RETURN IS NOT INITIAL.

 

이 구문으로 만약 선택된 값이 없다면 다음 로직을 안타게 만들었습니당.

소스줄 읽는거 낭비잖아용...

 

ASSIGN PO_EVENT_DATA->M_DATA->* TO <FS_MODI>.
 

이구문은

 

PO_EVENT_DATA는 CL_ALV_EVENT_DATA라는 클래스를 참조하고 있습니다.

 

PO_EVENT_DATA->M_DATA 요걸로 객체의 속성에 접근했고,

 

M_DATA는

TYPE REF TO DATA입니당.

 

즉! 객체의 속성에 접근하여 그 속성값을 역참조 하는 것입니당.

 

암튼 <FS_MODI>는

 

위에서

FIELD-SYMBOLS <FS_MODI> TYPE LVC_T_MODI.

 

요렇게 미리 필드심볼을 선언해 두었고,

 

      DATA(LS_MODI) = VALUE LVC_S_MODI( ROW_ID    = PS_ROW_NO-ROW_ID
                                        FIELDNAME = 'MATNR'
                                        VALUE     = LS_RETURN-FIELDVAL ).

      APPEND LS_MODI TO <FS_MODI>.
 

요렇게 LS_MODI(LVC_S_MODI 타입임)에

 

아까 펑션으로 데이터를 리턴 받은 테이블을 읽어서 선택받은 값을 넣어주면 됩니당.

(LS_RETURN-FIELDVAL이 내가 선택한 값임)

 

그리고 나서 <FS_MODI>에 넣어주면 돼욤.

 

그럼 내가 선택한 값이 ALV에 반영되는 매~직.

 

M_DATA는 위 스샷의 내역을 보면 알듯 CHANGING DATA 하는 속성입니다.

 

그래서 요렇게하면 값이 변경ㅎㅎ


여기까지만 한다고 끝이 아님돵..

 

우리는 PBO에서 약간의 셋팅을 해줘야해욤..

 

일단 첫번째로!

우리 ALV에서 필드카탈로그 설정해줬자나영?

 

거기로가서 내가 F4를 사용하고자 하는 필드에

 

LVC_S_FCAT-f4availabl = 'X'

 

이렇게 X값을 줍니당.

F4를 사용하겠다고 하는거에용ㅎㅎ

 

 

그리고나서 PBO파트에 F4를 사용하겠다고 등록해주는 로직을 적어줘야합니당!!

 

저같은 경우는!

저기 SET_F4보이죵? 저기다가 로직을 짜 넣었슴돵

 

요렇게 넣고

SET HANDLER 설정해주면 끝!!!

 

 

자 이제 어서 ALV 만들러 가세용