728x90

# 벌써 어지러운 동적 ALV..


# 동적 ALV은 여러 가지 경우가 많아지게 된다. 동적을 뭐로 가져가냐에 따라서 달라지기 때문에 잘 참고해서 만들어보자. 

# 간단한 동적 예제로, [ SCURX ] Table에서 [ CURRCODE ]에 따라서 ALV 필드가 달라지는 예제를 만들 것이다. 

 

 해당 가격일 때 ' X ' 을 찍는 ALV라고 생각하면 될 것 같다. 

이런 식으로 만들어보자. 

# 여기서  [ 왼쪽 ] 화면에서는 Table 들을 보여줄 것이고, [ 오른쪽 ] 화면에서는 Table에 따른 들을 보여줄 예정이다.

# 또한, [ 왼쪽 ] 화면에서는 [ 핫스팟 ] 이벤트를 설정하여 클릭에 따라서 이 달라지게 해 보자.

 

 

중요한 부분은 

# Internal Table 필드 개수가 동적으로 변하기 때문에 PBO강제로 타는 방법 ALV새로 불러오는 방법으로 알아볼 것이다. 

# 만약 필드 개수를 Refresh 하는 방법이 있으면 알려주세요..ㅠ # 

 

전체적인 그림은 다음과 같다. [ PBO ]라는 점 참고 바란다. 

 

 

# PROCESS BEFORE OUTPUT 


# [ PERFORM ALV_GRID_CONTAINER_INIT ] # 

 

# 01. [ Container ]만 을 그려놓기만 하고 시작해 보자. 

# SAP ALV Split 참고하자.

2023.08.12 - [.ABAP/..ALV] - SAP ALV Split(화면 분할) 정리

 

SAP ALV Split(화면 분할) 정리

ALV Split이란? ALV( ABAP List View )을 여러 개 보여주고 싶거나 분할해서 보여주거나 등등... 말 그대로 ALV 화면 분할이라고 생각하면 된다. 시작하기 앞서 우리가 필요로 하는 OBJECT와 Grid을 생성해 주

potato98.tistory.com

 

 

# [ PERFORM ALV_GRID_LEFT  ]

 

# 01. PERFORM문을 생성해 보자. 

# 02. 그다음 해야 할 것은 [ 왼쪽 ] 화면에 Grid 연결해서 그리고 [ 왼쪽 ] 화면은 정적 ALV이기 때문에 필드 카탈로그넘어가겠다

 

# 03. 다음은 [ 핫스팟 ] 기능을 추가하기 위해서 다음과 같이 필드 카탈로그이벤트를 설정하였다. 

 

# [ 핫스팟 ] 기능에 대해서 알아보고 가자.

2024.04.02 - [.ABAP/..ALV] - SAP ALV Hotspot 정리

 

SAP ALV Hotspot 정리

# HOTSPOT 란# Cell 별로 하이퍼링크? 링크? 처럼 상세한 정보를 보고싶을 때 쓰이기도 한다 # 예를 들어) 전표번호에 Hotspot을 걸어서 스탠다드와 연결 할 수도 있고, 다른 프로그램하고 연결 할 수도

potato98.tistory.com

 

# 04. Layout 설정 타이틀 제거도 추가해 보자. 

 

# 05. 완료가 되었으면 다음과 같이 [ SET_TABLE_FOR_FIRST_DISPLAY ]을 통해서 Display 해보자. 

# [ GT_LIST_L ]은 [ SCURX ] Table에서 가져왔다.

FORM ALV_GRID_LEFT .

  IF GO_GRID01 IS INITIAL.

    " Grid을 그려주자 "
    CREATE OBJECT GO_GRID01
      EXPORTING
        I_PARENT = GO_CONT01.


    " 필드 카탈로그 or HotSpot 설정 "
    DATA:
      LS_FDCAT TYPE LVC_S_FCAT,
      LT_FDCAT TYPE LVC_T_FCAT.

    LS_FDCAT-FIELDNAME = 'CURRKEY'.
    LS_FDCAT-COLTEXT   = '결제 통화'.
    LS_FDCAT-HOTSPOT = 'X'.
    APPEND LS_FDCAT TO LT_FDCAT.

    CREATE OBJECT G_EVENT_RECEIVER01.
    SET HANDLER
      G_EVENT_RECEIVER01->HANDLE_HOTSPOT_CLICK FOR GO_GRID01.

    " 레이아웃 설정 "
    DATA:
      LS_LAYO TYPE LVC_S_LAYO.
    LS_LAYO-CWIDTH_OPT = 'X'.
    LS_LAYO-NO_TOOLBAR = 'X'.


    " Display "
    CALL METHOD GO_GRID01->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        IS_LAYOUT       = LS_LAYO
      CHANGING
        IT_FIELDCATALOG = LT_FDCAT
        IT_OUTTAB       = GT_LIST_L.

  ENDIF.

ENDFORM.                    " ALV_GRID_LEFT

 

실행을 해보면 

 

 

# [ PERFORM ALV_GRID_RIGHT  ] #

# 01. 이제 가장 중요한 동적으로 바뀌는 부분 로직을 짜보자. 

# # 우선 [ 오른쪽 ] 화면에 대한 Grid을 그려보자. 여기서는 동적 인터널 테이블을 사용하기 때문에 초기화를 하면서 다시 불러오는 방식으로 가야 한다.

 

# 02. 그다음 동적 필드 카탈로그를 만들어야 한다.

# 동적 필드 카탈로그를 만들기 위해서는 기준이 필요하다.

 

- 데이터 변함에 따라서 고정 필드가 있는지 없는지에 따라 로직 차이가 난다 -

여기서는 고정 필드3개 정도하고 나머지는 동적 필드로 설정하겠다.

 

# 03. 우선 고정 필드동적 필드를 만들기 위한 필드 카탈로그를 설정해 보자.

 

TOP 선언

( 필드 카탈로그동적 인터널 테이블 설정 )

DATA:
  GT_FCAT      TYPE LVC_T_FCAT,
  GT_LIST_R    TYPE REF TO DATA.

 

# 04. 꼭 PERFORM 문으로 묶어서 필드 카탈로그설정해 보자. 

 

# 그다음 고정 필드는 다음과 같이 설정하였다. 

# 앞에 [ CLEAR : GT_FCAT ]을 넣어주자. 

 

 

# 05. 동적 필드에 따라서 변경되기 때문에 다음과 같이 설정하였다. 

# [ GT_FLIGHT ]에 값은 아직 없기 때문에 선언만 해보자. 

 

# 또한, 여기서는 인터널 테이블 데이터를 어쩔 수 없이 "중복 제거"를 하게 되었지만,

보통 플젝에서는 다른 인터널 테이블의 데이터 값에 따라서  [ FIELDNAME ]을 지정하게 된다. 

## 여기서는 중복 제거를 안 할 시에 [필드 명]이 겹치기 때문에 덤프가 뜬다. 

- PERFORM [ PRICE_CONVER ]은 " . or Space "을 없애는 FORM 문이라고 생각하면 된다 - 

 

# 06. 앞에서 만든 필드 카탈로그를 통해서 동적 테이블선언해 보자. 

# 우리가 사용할 것은 [ CREATE_DYNAMIC_TABLE ]이다. 

 

# 변경될 때마다 이 쌓일  수 있으니 [ Clear ]을 해주었다. 

  " 동적 테이블 설정 "
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = GT_FCAT    " Field Catalog "
    IMPORTING
      EP_TABLE        = GT_LIST_R.   " Pointer to Dynamic Data Table

 

 

TOP 선언

FIELD-SYMBOLS <GT_LIST> TYPE STANDARD TABLE.

 

# 07. 필드 카탈로그를 설정했으면, 이제 동적 인터널타입을 지정해주어야 한다. 

# 앞에서 [ GT_LIST_R ]에 필드 카탈로그를 레퍼런스 했기 때문에 타입지정해 주는 로직이 필요하다. 

    " 인터널 테이블 타입 설정 "
    UNASSIGN <GT_LIST>.
    ASSIGN GT_LIST_R->* TO <GT_LIST>.

 

# 08. 그 이후 생성했던 PERFORM문을 넣어보자. 

 

# 09. 이제 동적 테이블에 값을 넣기 위해 다음과 같이 PERFORM문을 생성해야 한다. 

 

# 10. 동적으로 [ Workarea -> Internal Table ]로 데이터를 넣어야 하기 때문에 다음과 같이 설정하였다. 

  FIELD-SYMBOLS:
    <FS_LIST> TYPE DATA, " <GT_LIST>에 값을 넣기위함 "
    <LV_VALUE> TYPE DATA. 

  DATA:
    LV_DATA  TYPE REF TO DATA,
    LV_FNAME TYPE FIELDNAME.

  CREATE DATA LV_DATA LIKE LINE OF <GT_LIST>.
  ASSIGN LV_DATA->* TO <FS_LIST>.

 

# 11. 이제 정적 필드동적 필드에 따라서 을 넣어주자.

 

# 12. 이제 ALV LIST를 뿌려보자. 

FORM ALV_GRID_RIGHT.

  IF GO_GRID02 IS NOT INITIAL.
    GO_GRID02->FREE( ).
  ENDIF.


  CREATE OBJECT GO_GRID02
    EXPORTING
      I_PARENT = GO_CONT02.


  " 필드 카탈로그 설정 "
  PERFORM SET_FCAT.


  " 생성 동적 테이블 값 넣기 " 
  PERFORM CREATE_DYNAMIC_TABLE.


  CALL METHOD GO_GRID02->SET_TABLE_FOR_FIRST_DISPLAY
    CHANGING
      IT_FIELDCATALOG = GT_FCAT
      IT_OUTTAB       = <GT_LIST>.


ENDFORM.                     " ALV_GRID_RIGHT

 

 

# HOTSPOT 설정 # 


# 01. 선택했을 라인INDEX을 가져와서 [ CURRENCY ] 값을 가져와보자. 

 

# 02. 그 이후 [ SFLIGHT ] Table에서 [ CURRENCY ] 조건에 따른 해당 데이터를 가져와보자. 

 

# 03. 그 이후에 앞에서 생성했던 [ PERFORM SET_FCAT ]을 다시 불러와서, 데이터에 따라 동적으로 변하는 필드 카탈로그를 설정해 보자.

 

# 04. 완료가 되었다면 필드 카탈로그를 Refresh 해보자. 

 

# 05. 그 이후에, 다음 로직을 통해서 강제로 [ PBO ]를 타게 해서 ALV를 다시 불러와야 한다. 

## 그렇지 않으면 동적 인터널 테이블의 필드 개수를 인식하기 때문이다. 

 

# 06. 이제 실행을 해보면 다음과 같이 동적 ALV이 완성된 것이다. 

 

 

 

끝..ㅠ 

 

 

도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!

728x90