[ABAP] Field Catalog 속성값

J._NA 개발일지·2024년 7월 23일
0

조회프로그램을 만들다가 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.

여기까지 필드를 읽혀오는 과정의 코드이다.

profile
아밥 & 프론트엔드 개발자

0개의 댓글