ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SAP STRING 타입 필드 — CDS / AMDP 처리 가이드
    SAP 2026. 5. 13. 18:48
    SAP STRING 타입 필드 — CDS / AMDP 처리 가이드

    SAP STRING 타입 필드 — CDS / AMDP 처리 가이드

    1. STRING 타입이란?

    ABAP Dictionary에서 STRING가변 길이 문자열로, HANA DB에서는 NCLOB (Large Object) 로 물리 저장됩니다.
    CHAR, NUMC, NVARCHAR와 근본적으로 다르며, CDS·AMDP에서 직접 사용 시 다양한 제약이 발생합니다.

    ABAP 타입HANA SQLScript 타입CDS 직접 노출
    CHAR(n)NVARCHAR(n)✅ 가능
    SSTRINGNVARCHAR(≤1333)✅ 가능
    STRINGNCLOB❌ 불가
    RAWSTRINGBLOB❌ 불가

    2. CDS View / Consumption View에서의 제약

    ① SELECT 시 직접 노출 불가

    // ❌ 활성화 오류 — STRING/CLOB은 CDS에서 직접 사용 불가
    define view ZI_MyEntity as select from ztable {
      key mykey,
          string_field    // 활성화 오류!
    }
    
    // ✅ CAST로 변환 필수
    define view ZI_MyEntity as select from ztable {
      key mykey,
          cast(string_field as abap.char(1000)) as string_field
    }
    ⚠️ cast 길이는 실제 데이터 최대 길이보다 크게 잡아야 잘림(truncation) 방지

    ② WHERE 절 / @Consumption.filter 사용 불가

    // ❌ STRING 컬럼에 직접 필터 → 런타임 오류
    where string_field = 'ABC'

    @Consumption.filter 어노테이션도 STRING 필드엔 적용되지 않음

    ③ Association 키 / JOIN 조건으로 사용 불가

    STRING 필드는 Primary Key 또는 Association의 ON 조건으로 사용할 수 없습니다.

    3. AMDP SQLScript에서의 제약

    ① NCLOB 비교 주의

    -- ❌ NCLOB 직접 비교 — 불가 또는 성능 극히 저하
    WHERE string_field = 'ABC'
    
    -- ✅ CAST 후 비교
    WHERE CAST(string_field AS NVARCHAR(500)) = 'ABC'

    ② GROUP BY / ORDER BY / DISTINCT 사용 불가

    -- ❌ NCLOB은 GROUP BY, ORDER BY, DISTINCT 사용 불가
    GROUP BY string_field
    
    -- ✅ CAST 후 사용
    GROUP BY CAST(string_field AS NVARCHAR(200))

    ③ Table Function 반환 타입에 STRING 불가

    " ❌ 반환 구조체에 STRING 필드가 있으면 AMDP 활성화 오류
    CLASS-METHODS get_data
      RETURNING VALUE(rt_result) TYPE TABLE OF zst_with_string.
    
    " ✅ 반환용 구조체는 CHAR / NUMC / DATS 등 고정 길이 타입으로 별도 정의

    4. 최적 전략 — 상황별 결정 가이드

    STRING 필드 발견 │ ├─ 신규 개발 / 테이블 변경 가능? │ └─ YES → ① DB 타입 변경 (근본 해결) │ └─ 레거시 / 테이블 변경 불가? ├─ 데이터 길이 예측 가능 (≤ 1333자)? │ └─ YES → ② SSTRING 또는 CHAR(N) 변환 │ └─ 길이 불명확 or 대용량 텍스트? └─ ③ Interface View CAST 래퍼 패턴

    ① DB 타입 변경 (신규 개발 시 최우선)

    용도추천 타입이유
    일반 텍스트 (≤255자)CHAR(N)CDS/AMDP 완전 호환
    중간 길이 (≤1333자)SSTRING가변길이 + CDS 노출 가능
    장문 (메모·설명)CHAR(1333)CLOB 회피하면서 최대 수용
    ⚠️ STRING → SSTRING 변경은 SE11에서 테이블 조정(Table Adjustment) 필요 → BASIS/전송 일정 협의

    ② Interface View CAST 래퍼 패턴 (레거시 — 가장 현실적인 정답)

    💡 핵심 원칙: CAST는 최하위 레이어(ZI_ Interface View)에서 딱 한 번만 → 상위 레이어는 일반 CHAR처럼 사용
    -- ✅ ZI_ (Interface View): STRING → CHAR 변환은 여기서만!
    define view entity ZI_MyDoc
      as select from ztable
    {
      key docno,
          cast(long_text as abap.char(1000)) as long_text,
          cast(remark   as abap.char(500))  as remark
    }
    -- ✅ ZC_ (Consumption View): 이미 CHAR이므로 필터/정렬 모두 가능
    define view entity ZC_MyDoc
      as select from ZI_MyDoc
    {
      key docno,
          long_text,
          remark
    }
    -- ✅ AMDP도 ZI_ 뷰를 소스로 참조 → CAST 불필요
    RETURN
      SELECT key_field, long_text, remark
        FROM zi_mydoc
        WHERE mandt = SESSION_CONTEXT('CLIENT');

    ③ CAST 길이 산정 가이드

    -- 실측 확인 쿼리 (SE16N 또는 AMDP 내부)
    SELECT MAX(LENGTH(string_field)) FROM ztable
    -- ❌ 무조건 크게 → 성능 손해
    cast(text as abap.char(5000))
    
    -- ✅ 실측 최대값 + 20% 여유
    cast(text as abap.char(500))

    5. 최종 체크리스트

    • CDS View에서 STRING 필드 → cast(... as abap.char(N)) 적용
    • 반환 구조체(TYPE 정의)에 STRING 제거 → CHAR(N)으로 대체
    • AMDP WHERE 조건에 NCLOB 직접 비교 금지 → CAST 후 비교
    • GROUP BY / ORDER BY 대상에 NCLOB 제외
    • Association 키 / CDS Filter 대상으로 STRING 사용 금지
    • CAST 길이는 실제 데이터 MAX 길이 + 20% 여유분 설정
    • CAST는 ZI_ Interface View 한 곳에서만 처리 (중복 방지)
    • 신규 테이블 설계 시 처음부터 SSTRING 또는 CHAR(N) 사용

    6. 한 줄 요약

    상황추천 전략
    신규 테이블 설계처음부터 SSTRING 또는 CHAR(N) 사용
    레거시 (변경 가능)SE11에서 SSTRING으로 타입 변경 + 테이블 조정
    레거시 (변경 불가)Interface CDS View 한 곳에서 CAST 처리
    AMDP는 해당 CDS View를 소스로 참조
    #SAP_ABAP #STRING_TYPE #CDS_View #AMDP #NCLOB #SSTRING #S4HANA
Designed by Tistory.