이 글에서 다룰 것
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_CostCenter와 I_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) | 설명 |
|---|---|---|
ControllingArea | CEPC-KOKRS | 컨트롤링 영역 키. 이익 센터 키의 일부. |
ProfitCenter | CEPC-PRCTR | 이익 센터 코드(10자리). |
ProfitCenterName | CEPCT-LTEXT | 현재 언어 기준 이익 센터 명칭. |
CompanyCode | CEPC-BUKRS | 대표 회사 코드(있는 경우). |
ValidityStartDate / ValidityEndDate | CEPC-DATAB / DATBI | 유효 기간. 시간 종속 행 식별에 사용. |
ResponsiblePersonName | CEPC-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으로 검증
참고 자료
- SAP S/4HANA Cloud — Help Portal
- SAP S/4HANA on-premise — Help Portal
- ABAP Platform / ABAP CDS Development Guide — help.sap.com
- SAP API Business Hub — VDM / CDS View 카탈로그
- EC-PCA Profit Center Accounting — help.sap.com
- SAP Community — ABAP / CDS 토픽
핵심 한 줄
I_ProfitCenter는 CEPC+CEPCT를 한 줄로 대체하는 표준 VDM이다.
댓글 0
아직 댓글이 없습니다.