ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ABAP 타입풀 상수명 추출
    SAP 2026. 6. 12. 17:46

    abap_typepool_const_extract.html
    0.01MB

     

     

    ABAP 타입풀 상수명 추출 — READ REPORT + 정규식

    ABAP 타입풀 상수명 추출

    READ REPORT + PCRE 정규식으로 zhan_ko_* 상수 목록 가져오기

    1. 핵심 개념

    타입풀의 리포지터리 내부 프로그램명은 %_C<타입풀명> 형태로 생성된다.
    예를 들어 타입풀 ZHAN의 소스는 READ REPORT '%_CZHAN'로 읽어온다.

    타입풀명READ REPORT 에 넘길 프로그램명
    ABAP%_CABAP
    VRM%_CVRM
    ZHAN%_CZHAN

    2. 상수 정의 패턴

    타입풀 소스의 상수 선언은 아래 두 가지 형태를 가진다.

    구분예시
    ① TYPE / LIKE CONSTANTS zhan_ko_abc TYPE char10 VALUE 'X'.
    ② 길이 지정 (num) CONSTANTS zhan_ko_def(5) TYPE c VALUE 'HELLO'.

    두 형태 모두 상수명 뒤에 (숫자)가 있을 수도 없을 수도 있고, 이어서 TYPE 또는 LIKE가 반드시 온다는 공통 구조를 가진다.

    3. 정규식 설명

    (zhan_ko_\w+)\s*(?:\(\d+\))?\s+(?:TYPE|LIKE)\b
    조각역할
    (zhan_ko_\w+)상수명 캡처
    \s*(?:\(\d+\))?(10) 같은 길이 지정부가 있으면 통과, 없어도 됨
    \s+(?:TYPE|LIKE)\b뒤에 TYPE 또는 LIKE가 와야만 정의로 인정 (참조 등장 시 걸러짐)
    💡 마지막 (?:TYPE|LIKE)\b 조건이 핵심이다.
    다른 상수의 VALUE zhan_ko_a.처럼 참조로만 등장하는 이름은 뒤에 TYPE/LIKE가 없으므로 자동으로 걸러진다.

    4. 전체 소스

    REPORT zr_read_tp_const.
    
    DATA: lt_source TYPE TABLE OF string,
          lt_name   TYPE STANDARD TABLE OF string,
          lv_prog   TYPE programm,
          lv_text   TYPE string.
    
    " ── 1) 타입풀 소스 읽기 (ZHAN → %_CZHAN) ──────────────
    lv_prog = '%_CZHAN'.
    READ REPORT lv_prog INTO lt_source.
    IF sy-subrc <> 0.
      WRITE: / |소스를 읽을 수 없습니다: { lv_prog }|.
      RETURN.
    ENDIF.
    
    " ── 2) 전체 주석(* ) 라인 제거 후 하나의 텍스트로 결합 ──
    LOOP AT lt_source INTO DATA(lv_line).
      DATA(lv_tmp) = lv_line.
      SHIFT lv_tmp LEFT DELETING LEADING space.
      IF lv_tmp(1) = '*'.
        CONTINUE.
      ENDIF.
      lv_text = |{ lv_text } { lv_line }|.
    ENDLOOP.
    
    " ── 3) 상수명만 추출 ───────────────────────────────────
    "  ① zhan_ko_xxx        TYPE/LIKE ...
    "  ② zhan_ko_xxx(10)    TYPE/LIKE ...
    DATA(lo_m) = cl_abap_matcher=>create_pcre(
      pattern     = `(zhan_ko_\w+)\s*(?:\(\d+\))?\s+(?:TYPE|LIKE)\b`
      ignore_case = abap_true
      text        = lv_text ).
    
    WHILE lo_m->find_next( ) = abap_true.
      APPEND to_lower( lo_m->get_submatch( 1 ) ) TO lt_name.
    ENDWHILE.
    
    " ── 4) 중복 제거 후 출력 ────────────────────────────────
    SORT lt_name.
    DELETE ADJACENT DUPLICATES FROM lt_name.
    
    LOOP AT lt_name INTO DATA(lv_name).
      WRITE: / lv_name.
    ENDLOOP.

    5. 주의사항

    💡 cl_abap_matcher=>create_pcreABAP Platform 2020 (7.55) 이상에서 지원된다.
    구버전이면 create( pattern = ... ) (POSIX 정규식) 으로 교체한다.
    ⚠️ 인라인 주석(") 안에 zhan_ko_x TYPE ... 형태의 문구가 있다면
    잘못 캡처될 수 있다. 그런 케이스가 있다면 2단계에서 인라인 주석 제거 로직을 추가한다.
    ⚠️ %_C 프리픽스는 REPOSRC의 내부 생성 프로그램명이다.
    SE11에서 편집하는 원본 소스와 같은 내용이지만, READ REPORT에는 반드시 이 이름을 사용해야 한다.
    #ABAP #TYPE-POOLS #READ_REPORT #CONSTANTS #PCRE #cl_abap_matcher #S4HANA
Designed by Tistory.