SAP 구매발주 미입고 현황 — 지금 얼마나 안 들어왔고, 뭐가 늦었나
발주했다고 끝이 아닙니다. 발주수량과 입고수량을 맞대어 얼마가 남았는지, 납기가 지났는지를 라인아이템 단위로 보여주는 화면입니다.
구매발주(PO)를 내고 나면 그 다음 궁금한 것은 언제나 같습니다. "그래서 지금 얼마나 들어왔고 얼마가 안 들어왔는가." ME2M이나 ME80FN으로 자재별·구매문서별 목록은 볼 수 있지만, 발주수량과 누적입고수량을 맞대어 미입고수량을 계산하고 납기 경과 여부까지 색으로 구분해 주는 화면은 표준에 없습니다.
SAP 표준 발주(EKPO)·납품일정(EKET)·입고이력(EKBE) 구조를 그대로 이어받아, 라인아이템 단위로 미입고수량을 산출하고 최종 확정납기일과 오늘 날짜를 비교해 정상 · 지연임박 · 지연 · 입고완료 4단계 상태를 자동으로 판정하도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 4종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 발주 라인아이템 — 발주수량·누적입고수량(
EKPO,BSTMG·WEMNG) - 납품일정 — 분할납품 회차별 확정납기일과 수량(
EKET) - 입고이력 — 이동유형 101 입고전표 실적(
EKBE) - 구매처·자재 마스터 — 거래처(
LFA1)와 자재 텍스트(MAKT) - 조회 방식 — 자재별 구매문서(
ME2M)와 구매문서 리스트(ME80FN)의 조건 구성
| 항목 | 내용 |
|---|---|
| 업무 영역 | 구매(MM) · 발주 입고 진행 모니터링 |
| Namespace | zui5.openpo |
| 셸 구조 | 조회조건 영역(우측 조회) + 라인아이템별 입고 진행현황 리스트, 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 입고 진행 상세 |
| 대응 T-code | ME2M · ME80FN |
| 성격 | 조회·모니터링형 — 발주 생성과 입고 전기는 표준 트랜잭션이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 4종 둘러보기
조회조건을 지정해 조회하면 라인아이템이 지연 우선으로 나옵니다 → 미입고수량과 상태를 확인하고 → 행을 열어 납품일정·입고이력 산출근거까지 드릴다운합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 구매조직 · 플랜트 · 구매그룹으로 범위를 좁힙니다. 선택 즉시 자동 재조회됩니다.
- 구매처 · 자재는 코드나 명칭 일부만 넣어도 검색되며, Enter 키로 바로 조회됩니다.
- 납기일(~까지)을 지정하면 그 날짜 이전이 최종납기인 라인아이템만 좁혀 볼 수 있습니다(예: 이번 주까지 납기인 것만).
- 상태로 지연 · 지연임박 · 정상 · 입고완료 중 하나만 골라 볼 수 있습니다.
- 조회·초기화 버튼은 화면 하단이 아니라 조회조건 영역 안, 입력 필드 오른쪽 끝에 있습니다.
- 결과는 지연 → 지연임박 → 정상 → 입고완료 순으로 자동 정렬되며, 같은 상태 안에서는 납기일 빠른 순입니다.
- 행 오른쪽의 상세 아이콘을 열면 납품일정·입고이력·산출근거를 확인할 수 있습니다.
- 결과는 CSV 다운로드로 내려받습니다. UTF-8 BOM 이 붙어 엑셀에서 한글이 깨지지 않습니다.
미입고수량 산정과 지연 상태 판정 로직
이 화면의 핵심은 세 값을 매 조회 시점에 다시 계산하는 것입니다.
미입고수량 = 발주수량(EKPO-BSTMG) − 누적입고수량(EKPO-WEMNG)
지연일수 = 오늘 − 최종납기일(EKET 여러 회차 중 가장 늦은 확정납기일)
상태 판정 (우선순위)
미입고수량 <= 0 → 입고완료
else 지연일수 > 0 → 지연 (최종납기일이 이미 지남)
else 지연일수 >= -3 → 지연임박 (납기 3일 이내, 당일 포함)
else → 정상
가장 늦은 납기일을 기준으로 삼는 이유
분할납품(EKET 여러 회차)이 걸린 라인아이템은 일부 회차만 납기가 지났다고 전체를 지연으로 보지 않습니다. 공급업체와 마지막으로 약속한 날짜를 넘겼을 때 비로소 지연으로 잡습니다. 회차별 개별 납기일과 수량은 상세 다이얼로그에서 모두 확인할 수 있습니다.
조회부터 상세 확인까지 처리 4단계
| 단계 | 내용 |
|---|---|
| ① 조건 확정 | 구매조직·플랜트·구매그룹·구매처·자재·납기일·상태 조건을 설정(전부 비우면 전체 조회) |
| ② 원천 로드 | 발주 라인아이템·납품일정·입고이력 세 데이터셋을 최초 1회 불러와 이후 조회는 메모리에서 필터링 |
| ③ 산출 및 정렬 | 라인아이템마다 미입고수량·지연일수·상태를 계산하고 상태 우선순위 → 납기일 순으로 정렬 |
| ④ 상세 조회 | 행을 열면 해당 라인아이템의 납품일정 전체 회차와 입고전표 전체 이력을 다시 필터링해 표시 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 구매조직 | 선택 | 전체 / 1000 한국 / 2000 미주 |
| 플랜트 | 선택 | 전체 / 경기 본공장 / 청주 제2공장 / 미주 생산법인 |
| 구매그룹 | 선택 | 원자재구매팀 · 전자부품구매팀 · 설비/외주구매팀 |
| 구매처(코드/명) | 선택 | 코드 또는 명칭 일부, Enter 키로 조회 |
| 자재(코드/명) | 선택 | 코드 또는 명칭 일부, Enter 키로 조회 |
| 납기일(~까지) | 선택 | 지정일 이전 최종납기 건만 표시 |
| 상태 | 선택 | 전체 / 지연 / 지연임박 / 정상 / 입고완료 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| PO번호 · Item | EKPO-EBELN · EBELP |
| 구매처코드 · 구매처명 | LFA1 벤더 마스터 기준 |
| 플랜트 | EKPO-WERKS |
| 자재코드 · 자재명 | EKPO-MATNR → MAKT-MAKTX |
| 발주수량 · 입고수량 | EKPO-BSTMG · WEMNG(단위 함께 표시) |
| 미입고수량 | 화면 산출값, 0 초과 시 주황 강조 |
| 납기일 | EKET-EINDT 최종 확정납기일 |
| 지연일수 | 화면 산출값, "N일 지연" · "D-Day" · "D-N" |
| 상태 | 지연=빨강 · 지연임박=노랑 · 입고완료=초록 |
SAP 표준 기능 매핑
표준 실행은 T-code 가 담당하고, 이 화면은 조회·모니터링 관점을 더해 확장한다. 발주와 입고 전기는 SAP 표준 트랜잭션 그대로 이어받고, 이 화면은 그 결과를 라인아이템 단위로 대조해 미입고수량과 지연 상태를 계산하는 조회 전용 레이어다.
| SAP 표준 | 기능 | 이 화면과의 관계 |
|---|---|---|
ME2M | 자재별 구매문서 목록 | 라인아이템 조회의 표준 진입점 — 이 화면은 여기에 미입고수량·상태 산출을 더함 |
ME80FN | 구매문서 리스트(다목적) | 구매조직·구매그룹 등 조건 조합의 표준 리스트 실행 화면 |
MIGO | 입고전기 | EKBE 입고이력의 원천 전기 트랜잭션 — 이 화면은 전기 결과(이력)만 조회 |
MB5T | 재고전기 대상(미입고재고) | 재고이동 관점의 표준 리포트 — 이 화면은 라인아이템·납기 관점을 우선 |
EKPO · EKET · EKBE | 발주 품목 · 납품일정 · 이력 | 조회 원천 |
도입 시 확인이 필요한 부분
지연임박 기준일수(3일)와 상태 색상 경계는 구매 정책에 따라 달라지는 설정값입니다. 또 여러 플랜트·구매조직을 함께 보는 화면이므로, 실제 도입 시에는 권한(구매조직/플랜트 조회 권한) 범위를 먼저 확인해 반영합니다.
참고 CDS 뷰
운영 서비스로 연결할 때는 발주 품목과 납품일정을 결합해 미입고수량·상태를 산출하는 뷰로 서빙하는 구성을 제안합니다.
@AbapCatalog.sqlViewName: 'ZIOPENPOGRSTAT'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '구매발주 미입고 현황'
define view ZI_OpenPurchaseOrderGRStatus
as select from EKPO as PoItem
inner join EKKO as PoHeader on PoItem.Ebeln = PoHeader.Ebeln
left outer join I_PurchaseOrderScheduleLine as Sched
on PoItem.Ebeln = Sched.PurchaseOrder
and PoItem.Ebelp = Sched.PurchaseOrderItem
{
key PoItem.Ebeln as PurchaseOrder,
key PoItem.Ebelp as PurchaseOrderItem,
PoItem.Lifnr as Supplier,
PoItem.Werks as Plant,
PoItem.Matnr as Material,
PoItem.Bstmg as OrderQuantity,
PoItem.Wemng as GoodsReceiptQuantity,
PoItem.Bstmg - PoItem.Wemng as OpenQuantity,
max( Sched.ScheduleLineDeliveryDate ) as LatestDeliveryDate,
case when PoItem.Bstmg - PoItem.Wemng <= 0 then 'COMPLETE'
when max( Sched.ScheduleLineDeliveryDate ) < $session.system_date then 'OVERDUE'
when max( Sched.ScheduleLineDeliveryDate ) <= $session.system_date + 3 then 'DUESOON'
else 'OK' end as GrStatus
}
group by PoItem.Ebeln, PoItem.Ebelp, PoItem.Lifnr, PoItem.Werks, PoItem.Matnr,
PoItem.Bstmg, PoItem.Wemng
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경의 스케줄라인 구조와 권한 범위에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.f.DynamicPage + 조회조건 헤더 · 결과 리스트 · 푸터 |
| 조회조건 | sap.m.Select · sap.m.Input · sap.m.DatePicker — 조회조건 영역 오른쪽 끝에 조회 버튼, change·submit 이벤트로 즉시조회 |
| 결과 리스트 | sap.ui.table.Table — 컬럼 13개(10개 초과)로 sap.m.Table 대신 사용, RowAction 으로 상세 진입 |
| 상세 | sap.m.Dialog + sap.m.Table 3종(납품일정/입고이력/산출근거) |
| 데이터 계층 | OData 미구현 — ModelMock 이 localdata JSON 을 fetch 해 Promise 로 제공 |
| 이벤트 | onPAI 단일 진입점(fcCode 분기) + 행 상세 전용 핸들러 |
결과 테이블을 sap.ui.table.Table 로 만든 이유
PO번호·Item·구매처코드·명·플랜트·자재코드·명·발주수량·입고수량·미입고수량·납기일·지연일수·상태까지
컬럼이 13개입니다. 화면 규약상 10개를 넘는 조회 화면은 sap.ui.table.Table 을 쓰도록
되어 있어, 가로 스크롤 없이 컬럼 폭을 조정할 수 있는 이 컨트롤을 선택했습니다. 소량 표시인 상세
다이얼로그는 규약대로 sap.m.Table 을 그대로 썼습니다.
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment |
Component.js | 디바이스 모델 초기화, 라우터 기동 |
manifest.json | 앱 디스크립터 — 앱 ID(zui5.openpo) · ko 로케일 |
view/Main.view.xml | 조회조건 헤더 + 결과 리스트 + 푸터 골격 |
view/fragments/MainSearch.fragment.xml | 조회조건 + 조회/초기화 버튼(오른쪽 정렬) |
view/fragments/MainTable.fragment.xml | sap.ui.table.Table 결과 리스트, 행 상세 액션 |
view/fragments/DetailDialog.fragment.xml | 납품일정 · 입고이력 · 산출근거 상세 |
controller/Main.controller.js | 조회 · 산출 · 정렬 · 상세 구성 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 수량 · 날짜 · 상태 포맷터 |
localdata/ekpo.json · eket.json · ekbe.json | 발주 라인아이템 150건 · 납품일정 263건 · 입고이력 126건 |
검증 결과
화면 구성에 쓴 데이터는 발주 라인아이템 150건 · 납품일정 263건 · 입고이력 126건입니다.
| 검증 항목 | 결과 |
|---|---|
| 납품일정 수량 합계 = 발주수량 (150건 전수) | 통과 |
| 입고이력 수량 합계 = 누적입고수량 (150건 전수) | 통과 |
| 0 ≤ 누적입고수량 ≤ 발주수량 (150건 전수) | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| i18n 키 · 이벤트핸들러 참조 커버리지 | 누락 0건 |
| 조회 버튼 위치 — 조회조건 영역 내부, 하단 Footer 밖 | DOM 좌표 확인 통과 |
| Enter 키 조회 · Select/DatePicker 변경 즉시조회 | 실동작 확인 |
| 적용 테마 | sap_horizon (런타임 확인) |
| 화면 렌더링 — 실브라우저 조회 → 결과 → 상세 다이얼로그 실동작 후 캡처 | 4/4 |
구매처명 · 자재명 · 수량은 모두 검증용 데이터입니다.
자주 묻는 질문
미입고수량이 0인데도 지연으로 표시되는 경우가 있나요?
아니요. 미입고수량이 0 이하가 되는 즉시 상태는 입고완료로 확정되고 지연 판정 로직을 타지 않습니다. 납기일이 지났더라도 입고가 끝났다면 지연으로 집계하지 않습니다.
분할납품인 경우 납기일은 어느 시점 기준인가요?
가장 늦은 확정납기일을 기준으로 지연 여부를 판정합니다. 회차별 개별 납기일은 라인아이템 상세에서 모두 확인할 수 있습니다.
지연임박은 왜 3일 기준인가요?
납기 당일에야 알아차리면 대응할 시간이 없기 때문입니다. 3일 전부터 지연임박으로 표시해 독촉이나 일정 조정을 미리 준비할 수 있도록 했습니다. 기준일수는 구매 정책에 따라 조정 가능한 값입니다.
SAP 표준 기능과 어떻게 이어지나요?
발주와 입고 전기는 표준 트랜잭션이 담당하고 EKPO·EKET·EKBE에 그대로 남습니다. 이 화면은 그 값을 라인아이템 단위로 대조해 미입고수량과 지연 상태를 계산해 보여주는 조회 전용 레이어로 확장한 것입니다.