본문 바로가기
ABAP

ALV 6 (필드카탈로그 구성)

by clode 2023. 2. 16.
728x90
반응형

필드카탈로그를 구성하는 방법에는 여러가지가 있다. 구조로 자동 구성하는 방법, 수동으로 일일히 구성해주는 방법, 펑션을 이용하는 방법, 필드심볼을 이용하는 방법을 구현해본다.


> ### 자동 구성 

ALV를 출력하는 메소드를 사용할때 `I_STRUCTURE_NAME`에 구조명을 넣어서 구조와 똑같이 필드카탈로그를 구성한다. 

```
         CALL METHOD g_alv->set_table_for_first_display 
           EXPORTING
             i_structure_name              = 'MARA' 
```
이런식으로 하면 `MARA` 테이블과 구조가 똑같은 필드 카탈로그가 구성이 된다. 이때 사용하는 구조는 TABLES로 선언이 되어있어야 한다.
</BR>

> ### 수동 구성

전체가 아닌 부분적으로 내가 보여주고 싶은 필드들만 ALV에 구현하고 싶을때 일일히 필드를 입력하는 방법이다. 이땐 `IT_FIELDCATALOG`를 사용한다.
</BR>

**1**. 필드카탈로그 속성을 가진 구조를 참조하는 구조를 선언한다.
```
DATA: gs_fieldcat TYPE lvc_s_fcat,
      gt_fieldcat TYPE lvc_t_fcat.
```
**2**. 필드 카탈로그를 구성한다.

```
  gs_fieldcat-fieldname = 'CHECKBOX'.
  gs_fieldcat-coltext = '체크박스'.
  gs_fieldcat-just = 'C'.
  gs_fieldcat-checkbox = 'X'.
  gs_fieldcat-edit = 'X'.  "편집모드
  APPEND gs_fieldcat TO gt_fieldcat.  CLEAR: gs_fieldcat.

  gs_fieldcat-fieldname = 'VBELN'.
  gs_fieldcat-coltext = '판매문서'. 
  gs_fieldcat-just = 'C'. "가운데 정렬
  gs_fieldcat-key = 'X'. "키값 고정
  gs_fieldcat-hotspot = 'X'. "핫스팟
  APPEND gs_fieldcat TO gt_fieldcat.  CLEAR: gs_fieldcat.

  gs_fieldcat-fieldname = 'NETWR'.
  gs_fieldcat-coltext = '정가'.
  gs_fieldcat-just = 'C'.
*  gs_fieldcat-currency = 'KRW'. "통화필드 하드코딩
  gs_fieldcat-cfieldname = 'WAERK'. "참조한 통화단위에 대한 필드이름, 통화필드 참조해서 출력
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
```
이런식으로 수동 구성해주면 된다. 필드 카탈로그 속성을 가진 구조의 필드들을 확인해보면 어떤 기능이 있는지 볼 수 있고 그기능을 사용하면 된다.

**3**. ALV를 출력하는 메소드에 필드카탈로그 구조를 사용한다.
```
  PERFORM make_fieldcat.
  
         CALL METHOD g_alv->set_table_for_first_display "인스턴스명
           CHANGIN
             it_outtab                     =  gt_tab 
             it_fieldcatalog               = gt_fieldcat 
```
이때 수동으로 구성한 필드카탈로그는 ALV를 출력하는 구문 전에 넣어줘야 한다. 

</BR>

> ### 펑션 사용

수동 구성의 `MAKE_FIELDCAT` FORM문만 함수를 사용해서 변경해주면 된다. `LVC_FIELDCATALOG_MERGE`라는 함수를 사용한다.

```
  CLEAR   : gt_fieldcat.
  REFRESH : gt_fieldcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_bypassing_buffer     = 'X'
      i_buffer_active        = 'X'
      i_structure_name       = 'VBRk'
    CHANGING
      ct_fieldcat            = gt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
```
만약 특정필드에 이름을 변경해주고 싶다거나, 핫스팟 기능을 추가해준다거나 다른 속성을 넣고 싶다면
```
  LOOP AT gt_fieldcat into gs_fieldcat.
    IF gs_fieldcat-fieldname = 'VBELN'.
      gs_fieldcat-coltext = '판매문서번호'.
      gs_fieldcat-hotspot = 'X'.
      MODIFY gt_fieldcat FROM gs_fieldcat.
    ENDIF.
  ENDLOOP.
```
이런식으로 구문을 추가해주면 된다. 어찌보면 수동 구성이 귀찮긴하겠지만 이것 저것 속성을 넣어줄땐 편할지도...

</BR>

> ### 필드심볼 사용

먼저 필드심볼 관련 데이터 선언을 먼저 해준다.

```
DATA:   gs_refto     TYPE REF TO data,
        gs_pos       TYPE i.
FIELD-SYMBOLS : <fcat> TYPE lvc_t_fcat.
```

이후 필드카탈로그를 구성해준다. 펑션구성과 같이 펑션을 사용하는데 밑에 필드심볼 구문을 좀 더 넣어주면 된다. 
```
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_bypassing_buffer     = 'X'
      i_buffer_active        = 'X'
      i_structure_name       = 'GT_TAB'
    CHANGING
      ct_fieldcat            = gt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  CLEAR   : gt_fieldcat, gs_pos.
  REFRESH : gt_fieldcat.

  GET REFERENCE OF gt_fieldcat INTO gs_refto.
  ASSIGN gs_refto->* TO <fcat>.

  PERFORM fill_field_catalogs USING :
        'S' 'FIELDNAME' 'PLWRK',
        ' ' 'JUST' 'C',
        ' ' 'KEY' 'X',
        'E' 'COLTEXT'   '계획 플랜트',
        
        'S' 'FIELDNAME' 'PLNUM',
        ' ' 'JUST' 'C',
        ' ' 'HOTSPOT' 'X',
        'E' 'COLTEXT'   '계획오더'.
```
속성들을 필드가 아닌 서브루틴 파라미터를 사용해 입력해주면 된다. 
```
FORM fill_field_catalogs  USING p_gub
                                p_fname
                                p_value.
  DATA l_fname(40).
  FIELD-SYMBOLS <fany> TYPE any.

  IF p_gub = 'S'.
    CLEAR gs_fieldcat.
  ENDIF.

  CONCATENATE 'GS_FIELDCAT-' p_fname INTO l_fname.

  ASSIGN (l_fname) TO <fany>.
  <fany> = p_value.
  IF p_gub = 'E'.
    gs_pos              = gs_pos + 1.
    gs_fieldcat-col_pos = gs_pos.
    APPEND gs_fieldcat TO <fcat>.
  ENDIF.

ENDFORM.
```

728x90
반응형

'ABAP' 카테고리의 다른 글

Simple Tree  (0) 2023.02.20
ALV 7  (0) 2023.02.16
ALV 5 (SPLIT)  (0) 2023.02.16
ALV 4 (Layout)  (0) 2023.02.16
ALV 3 (Hotspot)  (0) 2023.02.16

댓글