조회프로그램을 만들다가 Field영역을 줄였다 넓혔다 했더니 이름값이
바뀌었다. 아초짜라 버그인줄 알았는데 알고보니 길이별 필드값을 설정에
그것을 읽혀오도록 한것이다.
이 설정값은 SE11에서 테이블을 조회하면 해당 테이블에 대한 DATA ELEMENT열이 보여지고, 그 값을 더블 클릭하면 확인할 수 있다.
(T-CODE SE11 -> DATA ELEMENT 값 더블클릭 -> FIELD LABEL 탭에서 확인) 이것을 어떻게 읽어올까 설명해 보겠다.
Field Catalog 속성값
위 사진과 같이 이렇게 필드명이 변경된다.
코드 및 디버깅
*&---------------------------------------------------------------------*
*& Module SET_ALV_GRID_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE SET_ALV_GRID_0100 OUTPUT.
IF GCL_GRID IS NOT BOUND.
PERFORM CREATE_ALV.
" CHECK GCL_GRID IS NOT INITIAL.
" PERFORM REFRESH_ALV_GRID CHANGING GCL_GRID.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form CREATE_ALV
*&---------------------------------------------------------------------*
FORM CREATE_ALV .
DATA : LT_FCAT TYPE LVC_T_FCAT.
" ALV Fieldcatalog
PERFORM SET_ALV_FIELDCAT TABLES LT_FCAT[].
ENDFORM.
0100 화면에서 모듈 OUTPUT 정의 후에 CREATE_ALV가 실행된다.
*&---------------------------------------------------------------------*
*& Form SET_ALV_FIELDCAT
*&---------------------------------------------------------------------*
FORM SET_ALV_FIELDCAT TABLES PT_FCAT TYPE LVC_T_FCAT.
DATA: LT_FCAT TYPE LVC_T_FCAT,
LT_FCAT_TEMP TYPE SLIS_T_FIELDCAT_ALV.
CLEAR : PT_FCAT[].
DATA(LR_STRUC) = CAST CL_ABAP_STRUCTDESCR( CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA( GS_LIST ) ).
DATA(LT_DFIES) = CL_SALV_DATA_DESCR=>READ_STRUCTDESCR( LR_STRUC ).
LT_FCAT[] = CORRESPONDING #( LT_DFIES[] MAPPING REF_TABLE = REFTABLE
REF_FIELD = REFFIELD ).
PERFORM ADJUST_FLDCATS TABLES LT_FCAT[]
PT_FCAT[].
ENDFORM.
설명: 이 코드는 ALV필드 카탈로그를 설정하는 서브루틴이다.
ALV는 데이터 출력과 디스플레이를 위한 표준툴로, 필드 카탈로그는 ALV출력에 표시될 필드와
해당 필드의 속성을 정의한다.
이 서브루틴 SET_ALV_FIELDCAT은 두 개의 내부 테이블 LT_FCAT과
PT_FCAT(필드 카탈로그 테이블)을 사용하여 필드 카탈로그를 설정한다.
- PT_FCAT : ALV 그리드에 필요한 필드 정보를 담고 있음
- 이 서브루틴은 PT_FCAT을 입력 테이블로 받아서 ALV 필드 카탈로그를 설정함
- LT_FCAT : 작업에 사용할 임시 필드 카탈로그 테이블
- LT_FCAT_TEMP : 잠재적으로 다른 임시 작업에 사용될 수 있는 필드 카탈로그 테이블
(변수) LR_STRUC: GS_LIST라는 구조체의 설명을 담고 있는 변수
(매서드) CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA 메서드를
사용하여 구조체 설명을 가져온다.
(테이블) LT_DFIES: LR_STRUC의 구조 설명을 사용하여 필드 속성 정보를 담고 있는 테이블.
CL_SALV_DATA_DESCR=>READ_STRUCTDESCR 메서드를 사용하여 구조체 설명을 읽는다.
*&---------------------------------------------------------------------*
*& Form ADJUST_FILDCATS
*&---------------------------------------------------------------------*
FORM ADJUST_FLDCATS TABLES PT_FCAT TYPE LVC_T_FCAT
PT_FDCAT TYPE LVC_T_FCAT.
" PT_FCAT: 입력 필드 카탈로그 테이블입니다.
" PT_FDCAT: 조정된 필드 카탈로그 테이블입니다.
LOOP AT PT_FCAT[] ASSIGNING FIELD-SYMBOL(<FS_S_FCT>).
" PT_FCAT의 각 항목을 순회하면서 필드 심볼 <FS_S_FCT>에 할당
ASSIGN COMPONENT :
<FS_S_FCT>-FIELDNAME OF STRUCTURE GS_LIST TO FIELD-SYMBOL(<FS_FIELD>).
DESCRIBE FIELD <FS_FIELD> HELP-ID DATA(LV_HELP_ID).
IF LV_HELP_ID CA '-'.
SPLIT LV_HELP_ID AT '-' INTO <FS_S_FCT>-REF_TABLE
<FS_S_FCT>-REF_FIELD.
ENDIF.
" REF_TABLE 및 REF_FIELD 채우기
" GS_LIST 구조체의 필드를 FIELDNAME을 기준으로 할당하여 <FS_FIELD> 필드 심볼을 만듭니다.
" 필드 설명(DESCRIBE FIELD)을 통해 HELP-ID를 가져와서,
HELP-ID에 '-'가 포함된 경우 REF_TABLE과 REF_FIELD를 설정
CASE <FS_S_FCT>-FIELDNAME.
WHEN 'CARRID'.
<FS_S_FCT>-JUST = 'C'.
<FS_S_FCT>-EMPHASIZE = 'C410'.
WHEN 'CARRNAME'.
WHEN 'URL'.
<FS_S_FCT>-OUTPUTLEN = 20.
.
. 생략
.
WHEN OTHERS.
<FS_S_FCT>-TECH = 'X'.
ENDCASE.
APPEND <FS_S_FCT> TO PT_FDCAT[].
ENDLOOP.
ENDFORM.
여기까지 필드를 읽혀오는 과정의 코드이다.