본문 바로가기
ABAP/소스코드

[Form] ALV Field catalog(필드 카탈로그) 생성 서브루틴

by name_text 2023. 8. 28.

ALV Field catalog(필드 카탈로그) 생성 서브루틴

#2023.11.06 : CL_SALV_DDIC의 참조테이블/참조필드 정보가 기존 다른 Function/Class와 상이하여 소스 일부 수정

 

*&---------------------------------------------------------------------*
*&      Form  CM_CREATE_FIELD_CAT_BY_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM cm_create_field_cat_by_itab USING pt_outtab
                               CHANGING    pt_fieldcat TYPE lvc_t_fcat.
  CLEAR pt_fieldcat[].
  DATA ls_fieldcat TYPE lvc_s_fcat.
  DATA: lv_ftype TYPE c,
        lv_comps TYPE i.
  DATA: ld_data TYPE REF TO data,
        ld_line TYPE REF TO data.
  FIELD-SYMBOLS: <lft_outtab> TYPE ANY TABLE,
                 <lfs_outtab> TYPE any.

  DESCRIBE FIELD pt_outtab TYPE lv_ftype COMPONENTS lv_comps.

  IF lv_ftype EQ cl_abap_typedescr=>typekind_table.
    CREATE DATA ld_data LIKE pt_outtab.
    ASSIGN ld_data->* TO <lft_outtab>.
    CREATE DATA ld_line LIKE LINE OF <lft_outtab>.
    ASSIGN ld_line->* TO <lfs_outtab>.
  ELSE.
    ASSIGN pt_outtab TO <lfs_outtab>.
  ENDIF.

  LOOP AT cl_salv_ddic=>get_by_data( pt_outtab ) INTO DATA(ls_dfies).
    IF ls_dfies-lfieldname IS NOT INITIAL.  "STRUCTURE
      ls_fieldcat = CORRESPONDING #( ls_dfies
                                     MAPPING key       = keyflag
                                             ref_table = precfield
                                             ref_field = lfieldname
                                      EXCEPT rollname tabname ).
    ELSE.
      ls_fieldcat = CORRESPONDING #( ls_dfies
                                     MAPPING key       = keyflag
                                             ref_table = reftable
                                             ref_field = reffield
                                     EXCEPT  tabname ).
    ENDIF.

    ls_fieldcat-col_pos = sy-tabix.
    IF ls_fieldcat-datatype EQ 'CLNT'.
      ls_fieldcat-tech = 'X'.
    ENDIF.

    IF ls_fieldcat-ref_table IS INITIAL." AND ls_fieldcat-f4availabl EQ abap_true.
      ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE <lfs_outtab> TO FIELD-SYMBOL(<lfv>).
      DESCRIBE FIELD <lfv> HELP-ID DATA(lv_helpid).
      IF lv_helpid CS '-'.
        CLEAR ls_fieldcat-rollname.
        SPLIT lv_helpid AT '-' INTO ls_fieldcat-ref_table DATA(lv_ref_field).
        IF ls_fieldcat-fieldname NE lv_ref_field.
          ls_fieldcat-ref_field = lv_ref_field.
        ENDIF.
      ELSE.
        CLEAR ls_fieldcat-f4availabl.
      ENDIF.
    ENDIF.

    IF ls_dfies-reftable EQ ls_dfies-precfield AND ls_dfies-reffield IS NOT INITIAL.
      CASE ls_fieldcat-datatype.
        WHEN 'CURR'.
          ls_fieldcat-cfieldname = ls_dfies-reffield.
        WHEN 'QUAN'.
          ls_fieldcat-qfieldname = ls_dfies-reffield.
      ENDCASE.
    ENDIF.
    IF ls_fieldcat-coltext IS INITIAL AND ls_fieldcat-reptext IS INITIAL AND ls_fieldcat-scrtext_l IS INITIAL AND ls_fieldcat-scrtext_m IS INITIAL AND ls_fieldcat-scrtext_s IS INITIAL.
      ls_fieldcat-coltext = ls_dfies-fieldtext.
    ENDIF.
    APPEND ls_fieldcat TO pt_fieldcat.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  CM_CREATE_FIELD_CAT_BY_DDIC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM cm_create_field_cat_by_ddic USING pv_ddicname
                              CHANGING    pt_fieldcat TYPE lvc_t_fcat.
  DATA: lt_dd03t TYPE SORTED TABLE OF dd03t WITH UNIQUE KEY fieldname ddlanguage.

  CLEAR pt_fieldcat[].
  CLEAR: lt_dd03t.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        =
      i_structure_name       = pv_ddicname
*     I_CLIENT_NEVER_DISPLAY = 'X'
*      I_BYPASSING_BUFFER     = abap_true
*     I_INTERNAL_TABNAME     =
    CHANGING
      ct_fieldcat            = pt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  SELECT
    fieldname, ddlanguage, ddtext
  FROM dd03t
  WHERE tabname EQ @pv_ddicname
    AND as4local EQ 'A'
    AND ddlanguage IN ( @sy-langu, 'E' )
  INTO CORRESPONDING FIELDS OF TABLE @lt_dd03t.

  LOOP AT pt_fieldcat ASSIGNING FIELD-SYMBOL(<lfs>).
    <lfs>-col_pos = sy-tabix.
    IF <lfs>-coltext IS INITIAL AND <lfs>-reptext IS INITIAL AND <lfs>-scrtext_l IS INITIAL AND <lfs>-scrtext_m IS INITIAL AND <lfs>-scrtext_s IS INITIAL.
      READ TABLE lt_dd03t INTO DATA(ls_dd03t) WITH TABLE KEY fieldname = <lfs>-fieldname
                                                             ddlanguage = sy-langu.
      IF sy-subrc NE 0.
        READ TABLE lt_dd03t INTO ls_dd03t WITH TABLE KEY fieldname = <lfs>-fieldname
                                                         ddlanguage = 'E'.
      ENDIF.
      IF sy-subrc EQ 0.
        <lfs>-coltext = ls_dd03t-ddtext.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.
ABAP

댓글