ABAP

KP26 없이 CO 활동 요율 3줄로 뽑기 #shorts #SAP #ABAP

▶ YouTube에서 보기

개요 및 이 글에서 얻을 것

SAP S/4HANA의 관리회계(CO) 영역에서 활동 유형(Activity Type)은 원가센터가 제공하는 서비스나 작업 능력을 정량화하는 핵심 마스터입니다. I_ActivityType은 이 마스터를 CDS 뷰로 노출한 표준 인터페이스이며, 내부적으로는 CSLA(Cost Element for Secondary Allocations) 계열 테이블 구조와 배부(Allocation) 요율 정보를 담고 있습니다. 이 글은 I_ActivityType의 컬럼 구성, 조인 패턴, 요율(Rate) 결정 로직, 그리고 RAP·Analytics에서의 재사용 방법까지를 실전 예제로 다룹니다.

  • I_ActivityType의 키 구조와 CO Area 종속성 이해
  • CSLA(2차 원가요소) 및 KSML(가격 마스터)과의 관계 파악
  • Activity Type × Cost Center × Fiscal Year 조합의 요율 조회 예제 작성
  • 배부 실행(KSU5/KB21N) 관점에서의 유효성 검증 포인트
  • CDS Consumption View와 Fiori 리스트 리포트로 확장

사전에 알아둘 개념

이 글은 SAP CO 모듈의 기본 개념(원가센터, 2차 원가요소, 계획/실적 배부)을 이해하고 있고, ABAP CDS의 define view·association·어노테이션 문법을 다룰 수 있는 독자를 대상으로 합니다. 또한 @ObjectModel.representativeKey, @Semantics.unitOfMeasure 같은 시맨틱 어노테이션의 목적을 알고 있으면 예제 이해가 수월합니다.

실행 환경과 준비물

본 글의 코드는 다음 환경 기준으로 검증했다고 가정합니다. 릴리즈가 다르면 필드명이 달라질 수 있으므로 ADT의 Where-Used로 실제 컬럼을 확인하는 것을 권장합니다.

  • SAP S/4HANA 2022 FPS02 (온프레미스) 또는 SAP S/4HANA Cloud Public 2402 이상
  • ABAP Development Tools (Eclipse) 3.36 이상
  • 사용자 권한: S_RS_AUTH, S_DEVELOP(CDS 개발), F_KLPR(활동가격 조회)
  • 테스트 데이터: 최소 1개 이상의 CO Area(예: 1010), 활동 유형(예: LABOR, MACHINE)
  • 필요 시 KL01(활동유형 생성) / KP26(계획 요율 등록) 트랜잭션 접근 권한

핵심 개념 상세

활동 유형은 "원가센터가 시간당 얼마의 비용으로 얼마만큼의 서비스를 제공하는가"를 표현하는 단위입니다. 예를 들어 조립 라인 원가센터가 시간 단위로 인건을 제공한다면, LABOR라는 활동 유형에 시간당 45,000원이라는 요율이 붙습니다. 이 요율에 소비 시간을 곱한 값이 수령 오브젝트(생산오더, WBS 등)에 배부됩니다.

테이블 관점에서 활동 유형 마스터는 전통적으로 CSLA(활동 유형 헤더)와 CSLT(텍스트), 그리고 요율은 COST·COSL·COKL 계열에 저장되어 왔습니다. S/4HANA에서는 ACDOCA·ACDOCP가 저널을 담고, 마스터는 CSLA가 유지되며 CDS 뷰 I_ActivityType이 이를 컨트롤러 레벨에서 노출합니다.

비유하자면 CSLA는 "메뉴판의 항목"이고, KP26에 입력되는 계획 요율은 "월별로 바뀌는 가격표"입니다. I_ActivityType은 메뉴판(항목명, 단위, 유효기간)만 보여주고, 가격은 I_ActivityPrice 계열 뷰로 별도 조회합니다.

키 구조는 ControllingArea + CostCtrActivityType + 유효기간(ValidityStartDate/ValidityEndDate)입니다. 여기에 ActivityTypeCategory(1=수동입력·수동배부, 2=간접결정 등), ActivityUnit(H, MIN, EA 등), AllocationCostElement(연결된 2차 원가요소)가 붙습니다. RAP나 SAC(SAP Analytics Cloud)에서 재사용할 때는 이 필드들이 조인 키가 되므로, Association을 명시적으로 정의해 두면 하위 뷰가 훨씬 간결해집니다.

실전 예제 1단계 — I_ActivityType 기본 조회

가장 먼저 표준 뷰의 컬럼과 데이터를 확인합니다. 아래는 특정 CO Area에서 유효한 활동 유형을 조회하는 최소 예제입니다.

REPORT zdemo_actv_type_read.

DATA: lt_activity TYPE STANDARD TABLE OF i_activitytype.

SELECT ControllingArea,
       CostCtrActivityType,
       ActivityUnit,
       ActivityTypeCategory,
       AllocationCostElement,
       ValidityStartDate,
       ValidityEndDate
  FROM I_ActivityType
  WHERE ControllingArea      = '1010'
    AND ValidityEndDate     >= @sy-datum
    AND ValidityStartDate   <= @sy-datum
  INTO TABLE @lt_activity.

LOOP AT lt_activity ASSIGNING FIELD-SYMBOL(<fs>).
  WRITE: / <fs>-CostCtrActivityType,
           <fs>-ActivityUnit,
           <fs>-AllocationCostElement.
ENDLOOP.

포인트는 세 가지입니다. 첫째, CO Area 없이 활동 유형만으로 조회하면 서로 다른 조직의 동일 코드가 섞일 수 있으므로 반드시 ControllingArea를 조건에 넣습니다. 둘째, 유효기간이 이력형이므로 조회 시점을 명시해야 합니다. 셋째, ActivityTypeCategory는 후속 배부 로직 분기의 근거이므로 함께 읽어둡니다.

실전 예제 2단계 — 원가센터·요율과 결합한 실무 뷰

공장 라인 원가센터 PLANT-A01이 제공하는 활동 유형별 계획 요율을 한 화면에 보여주는 시나리오를 가정합니다. I_ActivityType을 축으로 원가센터(I_CostCenter)와 활동 가격(I_ActivityPrice 또는 릴리즈별 I_ActivityTypePrice)을 연결합니다.

@AbapCatalog.sqlViewName: 'ZACTVRATEV'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Activity Type with Planned Rate'
@Metadata.allowExtensions: true
define view Z_ActivityTypeWithRate
  as select from I_ActivityType as ActType

  association [0..1] to I_CostCenter as _CostCenter
    on  $projection.ControllingArea = _CostCenter.ControllingArea
    and $projection.CostCenter      = _CostCenter.CostCenter

  association [0..*] to I_ActivityPrice as _Price
    on  $projection.ControllingArea      = _Price.ControllingArea
    and $projection.CostCtrActivityType  = _Price.CostCtrActivityType
{
  key ActType.ControllingArea,
  key ActType.CostCtrActivityType,
      cast( 'PLANT-A01' as fis_cost_center ) as CostCenter,
      ActType.ActivityUnit,
      ActType.ActivityTypeCategory,
      ActType.AllocationCostElement,
      ActType.ValidityStartDate,
      ActType.ValidityEndDate,

      _Price.FiscalYear,
      _Price.FiscalPeriod,
      @Semantics.amount.currencyCode: 'PriceCurrency'
      _Price.FixedPrice,
      @Semantics.amount.currencyCode: 'PriceCurrency'
      _Price.VariablePrice,
      _Price.PriceCurrency,

      _CostCenter,
      _Price
}
where ActType.ValidityEndDate >= $session.system_date
  and ActType.ValidityStartDate <= $session.system_date;

실무에서 자주 겪는 에러는 요율 조인 시 회계연도·기간을 잊는 것입니다. I_ActivityPrice는 연도·기간·가격구분(계획/실적)까지 키가 되므로, Consumption 단에서 파라미터로 노출하는 것이 좋습니다. 아래는 로깅을 포함한 ABAP 호출 예제입니다.

TRY.
    SELECT SINGLE FixedPrice, VariablePrice, PriceCurrency
      FROM Z_ActivityTypeWithRate
      WHERE ControllingArea     = @iv_co_area
        AND CostCtrActivityType = @iv_actv_type
        AND FiscalYear          = @iv_year
        AND FiscalPeriod        = @iv_period
      INTO ( @DATA(lv_fixed), @DATA(lv_var), @DATA(lv_curr) ).

    IF sy-subrc <> 0.
      MESSAGE i100(zco) WITH iv_actv_type iv_year iv_period.
      RAISE EXCEPTION TYPE zcx_activity_rate_missing
        EXPORTING activity_type = iv_actv_type
                  fiscal_year   = iv_year.
    ENDIF.
  CATCH zcx_activity_rate_missing INTO DATA(lo_ex).
    cl_bali_log_db_writer=>get_instance( )->save(
      log = zcl_co_log=>build( lo_ex->get_text( ) ) ).
ENDTRY.

이 단계에서는 예외 클래스와 애플리케이션 로그(BAL)를 함께 사용해, 요율 누락이 발생한 활동 유형·기간을 즉시 추적할 수 있게 했습니다.

실전 예제 3단계 — 프로덕션 품질의 소비 뷰와 성능 튜닝

프로덕션에서는 다중 사용자 조회, 대량 배부 시뮬레이션, Fiori 리스트 리포트에서의 필터 응답성을 함께 고려해야 합니다. 다음은 파라미터화한 Consumption View 예제입니다.

@AccessControl.authorizationCheck: #CHECK
@OData.publish: true
@EndUserText.label: 'Activity Rate Consumption'
define view entity Z_C_ActivityRate
  with parameters
    p_controlling_area : fis_controlling_area,
    p_fiscal_year      : gjahr,
    p_period           : poper
  as select from Z_ActivityTypeWithRate
{
  key ControllingArea,
  key CostCtrActivityType,
      ActivityUnit,
      ActivityTypeCategory,
      AllocationCostElement,
      FixedPrice,
      VariablePrice,
      PriceCurrency,
      case ActivityTypeCategory
        when '1' then 'Manual entry / Manual allocation'
        when '2' then 'Indirect determination / Indirect allocation'
        when '3' then 'Manual entry / Indirect allocation'
        else          'Other'
      end as CategoryText
}
where ControllingArea = $parameters.p_controlling_area
  and FiscalYear      = $parameters.p_fiscal_year
  and FiscalPeriod    = $parameters.p_period;

성능 관점에서는 세 가지를 권장합니다. 첫째, @ObjectModel.usageType.serviceQuality: #A#TRANSACTIONAL/#ANALYTICAL을 시나리오에 맞게 명시해 HANA가 적절한 실행 계획을 세우도록 유도합니다. 둘째, 요율 조인에서 카테고리별 IF/CASE 분기가 많다면 별도 뷰로 분리해 계산 컬럼 재사용을 극대화합니다. 셋째, DCL(Data Control Language)로 ControllingArea·원가센터 조직 필터를 걸어 사용자별 데이터 슬라이스가 자동 적용되게 합니다.

@MappingRole: true
define role Z_C_ActivityRate_DCL {
  grant select on Z_C_ActivityRate
    where (ControllingArea) =
      aspect pfcg_auth( K_CCA, KOKRS, ACTVT = '03' );
}

테스트는 ABAP Unit + CDS Test Double Framework를 활용합니다. cl_cds_test_environmentI_ActivityTypeI_ActivityPrice의 테스트 더블을 만들어, 요율이 누락된 경우와 유효기간 경계 조건(첫날/마지막날)을 명시적으로 커버합니다.

자주 만나는 함정과 FAQ

표준 뷰 이름이 릴리즈에 따라 I_ActivityType, I_CostCtrActivityType처럼 미묘하게 다를 수 있으니 ADT의 Repository Tree에서 정확한 이름을 확인해야 합니다. 다음 세 가지가 특히 자주 문의되는 사항입니다.

  • Q1. KP26에 요율을 입력했는데 조회에 안 나옵니다. 계획 버전(Version, 보통 '000')과 회계연도가 파라미터에서 누락된 경우가 대부분입니다. I_ActivityPrice는 Version이 키에 포함되므로 조인 조건에 반드시 넣습니다.
  • Q2. 동일 활동 유형이 두 번 나옵니다. 유효기간이 여러 개로 분할되어 있고, 조회 시점이 두 구간 사이가 아닌 겹치는 경계일 가능성이 큽니다. ValidityStartDate <= @sy-datum AND ValidityEndDate >= @sy-datum 조건을 정확히 걸었는지 확인합니다.
  • Q3. 배부 실행 시 "가격이 없다" 오류가 뜹니다. Category가 1 또는 3인 경우 계획 요율이 필수인 반면, 5(정치가격 자동 산정)는 실적 기반으로 결정됩니다. ActivityTypeCategory를 먼저 확인하고 KSII/KSPI 순으로 요율 결정을 재실행하는 것이 일반적입니다.

또 하나 놓치기 쉬운 부분은 통화입니다. I_ActivityPrice의 요율은 CO Area 통화 기준이므로, 회사코드 통화와 다를 수 있습니다. Fiori 화면에 노출할 때는 @Semantics.amount.currencyCode로 통화 컬럼을 반드시 연결해 두어야 표시 스케일이 올바르게 계산됩니다.

이어서 살펴보면 좋은 주제

활동 유형 마스터를 완전히 다루었다면, 다음 단계로는 (1) I_ActivityPrice·I_StatisticalKeyFigure와 함께 계획/실적 배부 시뮬레이션 뷰를 구축하기, (2) RAP Managed BO로 KL01 대체 UI 만들기, (3) ACDOCAKOART='L' 라인과 조합해 활동 소비 트렌드를 분석하는 SAC 스토리로 확장하기를 권장합니다. 특히 Group Reporting이나 프로젝트 시스템(PS)에서 활동 소비가 크다면, I_ActivityType을 축으로 한 통합 뷰가 매우 유용합니다.

더 읽을거리와 링크

댓글 0

아직 댓글이 없습니다.