ABAP

I_ProfitCenter 30초 만에 — CEPC 직접 JOIN 대체 #shorts #SAP #ABAP

▶ YouTube에서 보기

이 글에서 다룰 것

SAP ERP/S/4HANA 환경에서 이익 센터(Profit Center) 데이터를 조회할 때 많은 개발자가 여전히 CEPC 테이블과 CEPCT 텍스트 테이블을 직접 JOIN해 사용합니다. 이 방식은 동작은 하지만 시간 종속(time-dependent) 처리, 다국어 텍스트 처리, 컨트롤링 영역(Controlling Area) 키 처리 등을 매번 직접 작성해야 하는 부담이 있습니다.

이 글에서는 I_ProfitCenter라는 SAP 표준 VDM(Virtual Data Model) CDS 뷰가 어떤 식으로 CEPC 기반 로직을 한 줄로 대체하는지 살펴봅니다.

  • CEPC/CEPCT 원천 테이블과 I_ProfitCenter VDM 뷰의 차이
  • JOIN을 직접 작성하는 코드 vs. I_ProfitCenter 한 줄 조회 비교
  • ControllingArea·ProfitCenter 조건 필터링 패턴
  • I_CostCenter와의 크로스 조인으로 책임센터-이익센터 매핑 만들기
  • 주요 필드(ProfitCenter, ControllingArea, ProfitCenterName, CompanyCode) 의미와 활용 포인트

이 글을 보기 전에

이 글은 beginner 수준이지만, 다음 정도는 익숙하다고 가정합니다.

  • ABAP SELECT ... FROM ... INTO TABLE 기본 문법
  • 내부 테이블 선언(TYPES, DATA, @DATA)과 LOOP 처리
  • CDS 뷰가 무엇인지에 대한 기초 개념 (DDL 소스, @AbapCatalog.sqlViewName)
  • EC-PCA(Profit Center Accounting) 모듈의 큰 그림(이익 센터·컨트롤링 영역 관계)

RAP나 OData까지는 몰라도 됩니다. 이 글은 읽기 전용 CDS 뷰를 ABAP에서 SELECT하는 패턴에 집중합니다.

CEPC vs I_ProfitCenter — 원천 테이블 vs VDM

CEPC는 이익 센터 마스터의 원천 테이블입니다. 키 필드는 일반적으로 KOKRS(컨트롤링 영역), PRCTR(이익 센터), DATBI(유효 종료일)이며, 시간 종속(time-dependent) 구조라 한 이익 센터에 여러 행이 존재할 수 있습니다. 이름은 별도의 CEPCT 텍스트 테이블(언어 키 SPRAS 포함)에 저장됩니다.

반면 I_ProfitCenter는 SAP S/4HANA의 VDM(Virtual Data Model) 계층에서 제공되는 표준 CDS 뷰로, 일반적으로 다음 역할을 합니다.

  • CEPC와 CEPCT를 미리 JOIN해 텍스트(ProfitCenterName)를 함께 제공
  • 현재 로그온 언어($session.system_language)에 맞춰 텍스트 필터링
  • SAP 표준 필드명을 의미 있는 영문 명칭(ProfitCenter, ControllingArea, CompanyCode)으로 노출
  • 시간 종속 키 중 현재 유효한 행을 권장 패턴으로 노출(릴리스 노트 기준)
비유하자면 CEPC는 "원자재 창고"이고, I_ProfitCenter는 "라벨이 붙어 출하 준비된 박스"입니다. 동일한 데이터지만 조회 시점의 부담을 VDM이 흡수합니다.

도식으로 보면 다음과 같습니다.

CEPC (마스터)        CEPCT (텍스트)
   |  KOKRS/PRCTR        |  KOKRS/PRCTR/SPRAS
   +---------+-----------+
             |
             v
       I_ProfitCenter  (VDM CDS 뷰)
             |
             v
   소비용 CDS / OData / ABAP SELECT

기본 조회 — JOIN 직접 작성 vs I_ProfitCenter 한 줄

먼저 전통적인 방식입니다. CEPC와 CEPCT를 직접 LEFT OUTER JOIN하고 언어와 유효 종료일을 직접 필터링해야 합니다.

REPORT z_pc_classic.

DATA: lt_pc TYPE TABLE OF cepc,
      lt_pc_with_name TYPE TABLE OF: BEGIN OF ty_row,
        kokrs TYPE cepc-kokrs,
        prctr TYPE cepc-prctr,
        datbi TYPE cepc-datbi,
        ltext TYPE cepct-ltext,
      END OF ty_row.

SELECT a~kokrs, a~prctr, a~datbi, b~ltext
  FROM cepc AS a
  LEFT OUTER JOIN cepct AS b
    ON  b~kokrs = a~kokrs
    AND b~prctr = a~prctr
    AND b~datbi = a~datbi
    AND b~spras = @sy-langu
  WHERE a~datbi >= @sy-datum
  INTO TABLE @DATA(lt_classic).

같은 결과를 I_ProfitCenter 한 줄로 대체할 수 있습니다.

SELECT ControllingArea,
       ProfitCenter,
       ProfitCenterName
  FROM I_ProfitCenter
  INTO TABLE @DATA(lt_vdm).

JOIN, 언어 필터, 유효일 필터가 모두 VDM 안에 캡슐화되어 있어 호출자는 "무엇을 가져올지"에만 집중하면 됩니다. 일반적으로 코드 라인 수가 60~70% 줄어들며, 휴먼 에러(언어 조건 누락 등)도 함께 사라집니다.

조건 필터링 — ControllingArea/ProfitCenter 검색

실무에서는 특정 컨트롤링 영역과 이익 센터 범위만 필요한 경우가 많습니다. WHERE 절은 일반 테이블과 동일한 문법을 따릅니다. 예를 들어 컨트롤링 영역 1000의 이익 센터 PC1000~PC1999를 가져오는 코드입니다.

TRY.
    SELECT ControllingArea,
           ProfitCenter,
           ProfitCenterName,
           CompanyCode
      FROM I_ProfitCenter
      WHERE ControllingArea = @CONV #( '1000' )
        AND ProfitCenter   BETWEEN @CONV #( 'PC1000' )
                               AND @CONV #( 'PC1999' )
      ORDER BY ProfitCenter
      INTO TABLE @DATA(lt_pc).

    IF lt_pc IS INITIAL.
      MESSAGE |해당 조건의 이익 센터가 없습니다.| TYPE 'I'.
      RETURN.
    ENDIF.

    LOOP AT lt_pc INTO DATA(ls_pc).
      WRITE: / ls_pc-ProfitCenter, ls_pc-ProfitCenterName.
    ENDLOOP.

  CATCH cx_sy_open_sql_db INTO DATA(lx_db).
    " 일반적으로 권한, DB 오류, 잘못된 호스트 변수 타입 등에서 발생
    MESSAGE lx_db->get_text( ) TYPE 'E'.
ENDTRY.

여기서 두 가지 포인트가 있습니다. 첫째, @CONV #( ... )를 사용해 호스트 변수 타입을 명확히 합니다. CEPC의 PRCTR 도메인은 길이 10이라 짧은 리터럴을 그대로 넣으면 타입 추론이 다르게 동작할 수 있습니다. 둘째, cx_sy_open_sql_db 예외를 잡아 로깅하는 것이 권장됩니다.

CostCenter 크로스 조인 — I_CostCenter + I_ProfitCenter

EC-PCA 환경에서는 코스트 센터별 책임 이익 센터를 함께 보고하는 일이 잦습니다. 원천 테이블로 풀면 CSKS + CSKT + CEPC + CEPCT 4개를 묶어야 하지만, VDM에서는 I_CostCenterI_ProfitCenter를 ASSOCIATION 또는 일반 JOIN으로 연결합니다.

SELECT cc~ControllingArea,
       cc~CostCenter,
       cc~CostCenterName,
       cc~ProfitCenter,
       pc~ProfitCenterName,
       pc~CompanyCode
  FROM I_CostCenter AS cc
  INNER JOIN I_ProfitCenter AS pc
    ON  pc~ControllingArea = cc~ControllingArea
    AND pc~ProfitCenter    = cc~ProfitCenter
  WHERE cc~ControllingArea = @CONV #( '1000' )
  ORDER BY cc~CostCenter
  INTO TABLE @DATA(lt_cc_pc).

프로덕션 관점에서 다음을 권장합니다.

  • 성능: VDM 뷰는 HANA에서 처리되도록 최적화되어 있으므로, 가능하면 ABAP 메모리로 끌어와서 LOOP로 후처리하기보다 WHERE/AGGREGATION으로 DB에서 거르세요.
  • 테스트: ABAP Unit + CDS Test Double Framework(cl_cds_test_environment)를 활용해 I_ProfitCenter의 mock 데이터를 주입하면 로컬에서도 회귀 테스트가 가능합니다.
  • 보안/권한: 분석용 시나리오에서는 DCL(Data Control Language)이 적용된 C_ 또는 분석용 표면 뷰가 별도로 존재할 수 있으므로, 사용자 권한 컨텍스트가 필요한 경우 해당 소비용 뷰를 우선 검토하세요.

주요 필드 설명

I_ProfitCenter에서 자주 쓰는 필드는 다음과 같습니다. (실제 노출 필드는 릴리스에 따라 다를 수 있으므로 ADT의 Element Info에서 확인하는 것을 권장합니다.)

VDM 필드원천(CEPC/CEPCT)설명
ControllingAreaCEPC-KOKRS컨트롤링 영역 키. 이익 센터 키의 일부.
ProfitCenterCEPC-PRCTR이익 센터 코드(10자리).
ProfitCenterNameCEPCT-LTEXT현재 언어 기준 이익 센터 명칭.
CompanyCodeCEPC-BUKRS대표 회사 코드(있는 경우).
ValidityStartDate / ValidityEndDateCEPC-DATAB / DATBI유효 기간. 시간 종속 행 식별에 사용.
ResponsiblePersonNameCEPC-VERAK이익 센터 책임자(필드 명칭은 릴리스별 차이 있음).

흔한 실수 / 트러블슈팅

  • Q1. I_ProfitCenter 결과가 CEPC 행 수와 다르게 나옵니다.
    CEPC는 시간 종속이라 같은 PRCTR에 대해 여러 유효 기간 행이 존재합니다. VDM은 일반적으로 현재 유효한 행 중심으로 노출하거나 키에 유효일을 포함합니다. ADT에서 Element Info를 확인하고, 과거 시점 데이터가 필요하면 CEPC를 직접 보거나 시간 종속 분석용 뷰를 검토하세요.
  • Q2. ProfitCenterName이 비어 있습니다.
    CEPCT에 해당 언어(SPRAS) 텍스트가 없을 때 발생합니다. 사용자 세션 언어가 EN인데 한글 텍스트만 등록되어 있다면 NULL이 됩니다. 텍스트 등록 여부를 SE16N으로 확인하거나, SET LOCALE LANGUAGE로 테스트하세요.
  • Q3. I_ProfitCenter 뷰가 시스템에 없습니다.
    VDM 뷰는 S/4HANA 릴리스/스택에 따라 제공 여부가 다릅니다. ECC나 매우 낮은 S/4HANA 릴리스에서는 대체 뷰(예: 분석용 또는 레거시 CDS)를 사용하거나, 직접 CEPC + CEPCT 기반 커스텀 Z CDS를 만들어야 할 수 있습니다.

다음 단계 / 관련 주제

  • I_CostCenter — CSKS/CSKT 기반 코스트 센터 VDM, 본 글의 JOIN 예제와 함께 학습
  • I_CompanyCode / I_ControllingArea — 조직 단위 마스터 VDM. 보고서 헤더에 자주 사용
  • 분석용 큐브 CDS — 이익 센터 실적(GLPCA/ACDOCA)과 결합해 EC-PCA/Universal Journal 리포트 작성
  • RAP Read-Only Service — I_ProfitCenter를 OData로 노출해 Fiori Elements List Report 빠르게 만들기
  • CDS Test Double Framework — VDM 의존 코드를 ABAP Unit으로 검증

참고 자료

핵심 한 줄

I_ProfitCenter는 CEPC+CEPCT를 한 줄로 대체하는 표준 VDM이다.

댓글 0

아직 댓글이 없습니다.