개요 및 핵심 정리
SAP S/4HANA 환경에서 구매 발주(PO)의 납기 관리는 공급망 운영의 핵심입니다. I_ScheduleLine은 EKET(Scheduling Agreement Schedule Lines) 테이블을 기반으로 하는 표준 CDS View로, 발주 항목별 납기 일정 라인(Schedule Line) 정보를 정규화된 형태로 제공합니다.
- EKET 테이블의 키 구조와
I_ScheduleLine의 필드 매핑 이해 - 납기일(Delivery Date), 예정 수량(Scheduled Quantity), 통계 납기일 등 핵심 필드 활용
- CDS View 기반 납기 데이터 조회 및 조인 패턴 작성
- 지연 납품 감지, 미납 잔량 계산 등 실무 분석 시나리오 구현
- 성능 최적화 및 권한 체크 적용 방법 습득
환경 및 버전 요구사항
I_ScheduleLine은 S/4HANA 표준으로 제공되는 Basic Interface View입니다.
- SAP S/4HANA: 2020 이상(On-Premise) 또는 SAP S/4HANA Cloud 최신 릴리즈
- ABAP Platform: 7.55 이상 (CDS Annotation 최신 기능 지원)
- 개발 도구: Eclipse + ADT 플러그인 (최신 버전 권장)
EKET와 I_ScheduleLine의 동작 원리
구매 발주는 3단계 구조로 저장됩니다. EKKO(헤더) → EKPO(품목) → EKET(일정 라인)의 계층 구조이며, 한 품목은 여러 납기 일정 라인을 가질 수 있습니다.
| EKET 필드 | I_ScheduleLine 필드 | 설명 |
|---|---|---|
| EBELN | PurchaseOrder | 발주 번호 |
| EBELP | PurchaseOrderItem | 발주 품목 번호 |
| ETENR | ScheduleLine | 일정 라인 번호 |
| EINDT | ScheduleLineDeliveryDate | 납기 예정일 |
| MENGE | ScheduleLineOrderQuantity | 예정 수량 |
| WEMNG | GoodsReceiptQuantity | 입고 완료 수량 |
| SLFDT | StatisticsDeliveryDate | 통계용 납기일 |
실전 코드 1단계: 기본 조회 예제
특정 발주 번호의 모든 납기 일정 라인을 조회하는 코드입니다.
REPORT z_demo_schedule_line_basic.
PARAMETERS: p_ebeln TYPE ebeln DEFAULT '4500000123'.
SELECT PurchaseOrder,
PurchaseOrderItem,
ScheduleLine,
ScheduleLineDeliveryDate,
ScheduleLineOrderQuantity,
GoodsReceiptQuantity
FROM i_scheduleline
WHERE PurchaseOrder = @p_ebeln
ORDER BY PurchaseOrderItem, ScheduleLine
INTO TABLE @DATA(lt_result).
LOOP AT lt_result INTO DATA(ls_result).
WRITE: / ls_result-purchaseorder,
ls_result-purchaseorderitem,
ls_result-scheduleline,
ls_result-schedulelinedeliverydate,
ls_result-schedulelineorderquantity UNIT 'EA'.
ENDLOOP.
실전 코드 2단계: 지연 납품 감지 및 로깅
오늘 기준 납기일이 지났는데 입고가 완료되지 않은 일정 라인을 탐지합니다.
REPORT z_overdue_delivery_check.
TYPES: BEGIN OF ty_overdue,
purchase_order TYPE ebeln,
purchase_order_item TYPE ebelp,
schedule_line TYPE etenr,
delivery_date TYPE eindt,
ordered_qty TYPE menge_d,
received_qty TYPE menge_d,
open_qty TYPE menge_d,
days_overdue TYPE i,
END OF ty_overdue.
DATA: lt_overdue TYPE TABLE OF ty_overdue.
PARAMETERS: p_date TYPE dats DEFAULT sy-datum.
TRY.
SELECT PurchaseOrder, PurchaseOrderItem, ScheduleLine,
ScheduleLineDeliveryDate, ScheduleLineOrderQuantity,
GoodsReceiptQuantity
FROM i_scheduleline
WHERE ScheduleLineDeliveryDate < @p_date
AND ScheduleLineOrderQuantity > GoodsReceiptQuantity
INTO TABLE @DATA(lt_raw).
LOOP AT lt_raw INTO DATA(ls_raw).
DATA(lv_open) = ls_raw-schedulelineorderquantity
- ls_raw-goodsreceiptquantity.
DATA(lv_days) = p_date - ls_raw-schedulelinedeliverydate.
APPEND VALUE #(
purchase_order = ls_raw-purchaseorder
purchase_order_item = ls_raw-purchaseorderitem
schedule_line = ls_raw-scheduleline
delivery_date = ls_raw-schedulelinedeliverydate
ordered_qty = ls_raw-schedulelineorderquantity
received_qty = ls_raw-goodsreceiptquantity
open_qty = lv_open
days_overdue = lv_days
) TO lt_overdue.
ENDLOOP.
cl_demo_output=>display( lt_overdue ).
CATCH cx_sy_open_sql_db INTO DATA(lx_sql).
MESSAGE lx_sql->get_text( ) TYPE 'E'.
ENDTRY.
실전 코드 3단계: 프로덕션 레벨 집계 및 권한 적용
CDS View에 비즈니스 로직을 캡슐화하고, ABAP 코드는 호출만 담당하는 패턴입니다.
@AbapCatalog.sqlViewName: 'ZVSCHEDDELAY'
@AccessControl.authorizationCheck: #CHECK
@VDM.viewType: #COMPOSITE
define view ZC_PO_ScheduleDelay
as select from I_ScheduleLine as sl
{
key sl.PurchaseOrder,
key sl.PurchaseOrderItem,
key sl.ScheduleLine,
sl.ScheduleLineDeliveryDate,
sl.ScheduleLineOrderQuantity,
sl.GoodsReceiptQuantity,
cast( sl.ScheduleLineOrderQuantity - sl.GoodsReceiptQuantity
as abap.quan( 13, 3 ) ) as OpenQuantity,
cast( dats_days_between(
sl.ScheduleLineDeliveryDate,
$session.system_date ) as abap.int4 ) as DaysOverdue,
case when sl.GoodsReceiptQuantity >= sl.ScheduleLineOrderQuantity
then 'C'
when sl.ScheduleLineDeliveryDate < $session.system_date
then 'D'
else 'O'
end as DeliveryStatus
}
where sl.ScheduleLineOrderQuantity > 0;
현장에서 자주 마주치는 문제와 해결법
Q1. I_ScheduleLine을 조회했는데 일부 발주의 일정 라인이 보이지 않습니다.
EKET는 발주 품목의 일정 라인이 명시적으로 등록된 경우에만 데이터가 존재합니다. 단일 납기로 등록된 PO는 EKPO의 EINDT에 납기일이 직접 저장되고 EKET에는 라인이 생성되지 않을 수 있습니다.
Q2. ScheduleLineDeliveryDate와 StatisticsDeliveryDate는 어떻게 다른가요?
전자(EINDT)는 공급사에 통보된 실제 납기 약속일이고, 후자(SLFDT)는 MRP 및 통계 분석용으로 사용되는 내부 기준일입니다. KPI 측정에는 StatisticsDeliveryDate 사용이 권장됩니다.
Q3. 대량 데이터 조회 시 성능이 매우 느립니다.
SELECT *를 피하고 필요한 필드만 명시하세요. WHERE 절에 키 필드(PurchaseOrder) 또는 인덱스가 있는 필드(ScheduleLineDeliveryDate)를 포함시키고, 날짜 범위 조건을 함께 적용하는 것이 권장됩니다. ABAP 루프 내에서 SELECT를 호출하는 패턴은 절대 피하세요.
심화 학습 방향 및 연계 주제
- C_PurchaseOrderScheduleLine: Consumption View 계층으로 Fiori 앱과 직접 연동
- CDS Table Function: AMDP와 결합하여 복잡한 납기 분석 로직을 HANA SQLScript로 구현
- RAP(RESTful ABAP Programming Model): I_ScheduleLine을 Behavior와 결합해 OData 서비스 노출
- Embedded Analytics: @Analytics.dataCategory: #FACT로 납기 KPI 분석 큐브 구축
- Application Job: 야간 배치로 지연 납품 알림 자동화
댓글 0
아직 댓글이 없습니다.