# 벌써 어지러운 동적 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이 완성된 것이다.


끝..ㅠ
'.ABAP > ..ALV' 카테고리의 다른 글
| SAP ALV 화면 작을 때( Size 설정 ) (2) | 2025.03.20 |
|---|---|
| SAP ALV Variant 정리 (0) | 2025.02.24 |
| SAP ALV Data Changed, Data Changed Finished 정리 (2) | 2025.01.07 |
| SAP ALV Toolbar Button(버튼) 설정 (1) | 2024.12.05 |
| SAP ALV Tree 정리 - 2 ( 데이터에 따른 노드 설정 ) (0) | 2024.11.24 |