솔루션 홈
ME2M · ME80FN · 구매발주

SAP 구매발주 미입고 현황 — 지금 얼마나 안 들어왔고, 뭐가 늦었나

발주했다고 끝이 아닙니다. 발주수량과 입고수량을 맞대어 얼마가 남았는지, 납기가 지났는지를 라인아이템 단위로 보여주는 화면입니다.

구매발주(PO)를 내고 나면 그 다음 궁금한 것은 언제나 같습니다. "그래서 지금 얼마나 들어왔고 얼마가 안 들어왔는가." ME2M이나 ME80FN으로 자재별·구매문서별 목록은 볼 수 있지만, 발주수량과 누적입고수량을 맞대어 미입고수량을 계산하고 납기 경과 여부까지 색으로 구분해 주는 화면은 표준에 없습니다.

SAP 표준 발주(EKPO)·납품일정(EKET)·입고이력(EKBE) 구조를 그대로 이어받아, 라인아이템 단위로 미입고수량을 산출하고 최종 확정납기일과 오늘 날짜를 비교해 정상 · 지연임박 · 지연 · 입고완료 4단계 상태를 자동으로 판정하도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 4종을 함께 공개합니다.

SAP 표준 기능을 그대로 이어받은 부분

  • 발주 라인아이템 — 발주수량·누적입고수량(EKPO, BSTMG·WEMNG)
  • 납품일정 — 분할납품 회차별 확정납기일과 수량(EKET)
  • 입고이력 — 이동유형 101 입고전표 실적(EKBE)
  • 구매처·자재 마스터 — 거래처(LFA1)와 자재 텍스트(MAKT)
  • 조회 방식 — 자재별 구매문서(ME2M)와 구매문서 리스트(ME80FN)의 조건 구성
항목내용
업무 영역구매(MM) · 발주 입고 진행 모니터링
Namespacezui5.openpo
셸 구조조회조건 영역(우측 조회) + 라인아이템별 입고 진행현황 리스트, 상세 Dialog
화면 수조회 화면 1개 + 입고 진행 상세
대응 T-codeME2M · ME80FN
성격조회·모니터링형 — 발주 생성과 입고 전기는 표준 트랜잭션이 담당
UI 테마sap_horizon 단일 적용

실제 화면 4종 둘러보기

조회조건을 지정해 조회하면 라인아이템이 지연 우선으로 나옵니다 → 미입고수량과 상태를 확인하고 → 행을 열어 납품일정·입고이력 산출근거까지 드릴다운합니다.

아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.

zui5.openpo — Main.view.xml
구매발주 미입고 현황 초기 조회조건 화면
초기 조회조건 화면 — 구매조직·플랜트·구매그룹·구매처·자재·납기일·상태를 지정합니다. 조회·초기화 버튼은 조회조건 영역 오른쪽 끝에 있습니다.
zui5.openpo — Enter 키 조회
구매처 텍스트 입력 후 Enter 키 조회 결과
Enter 키 조회 — 구매처 입력란에 이름 일부를 넣고 Enter 를 누르면 별도 버튼 클릭 없이 즉시 재조회됩니다.
zui5.openpo — 전체 조회결과
라인아이템별 입고 진행현황, 지연 우선 정렬
라인아이템별 입고 진행현황 — 발주수량·입고수량·미입고수량·납기일·지연일수·상태를 지연 우선으로 정렬해 보여 줍니다. 지연 건이 있으면 상단 메시지스트립이 경고 색상으로 바뀝니다.
zui5.openpo — 입고 진행 상세
라인아이템 상세 다이얼로그 — 납품일정·입고이력·산출근거
라인아이템 상세 다이얼로그 — 행을 열면 분할납품 일정(회차별 납기·수량)과 입고전표 이력, 산출근거 값이 함께 펼쳐집니다. 입고전표가 아직 없으면 그 사실을 그대로 보여 줍니다.

조작 방법

  1. 구매조직 · 플랜트 · 구매그룹으로 범위를 좁힙니다. 선택 즉시 자동 재조회됩니다.
  2. 구매처 · 자재는 코드나 명칭 일부만 넣어도 검색되며, Enter 키로 바로 조회됩니다.
  3. 납기일(~까지)을 지정하면 그 날짜 이전이 최종납기인 라인아이템만 좁혀 볼 수 있습니다(예: 이번 주까지 납기인 것만).
  4. 상태로 지연 · 지연임박 · 정상 · 입고완료 중 하나만 골라 볼 수 있습니다.
  5. 조회·초기화 버튼은 화면 하단이 아니라 조회조건 영역 안, 입력 필드 오른쪽 끝에 있습니다.
  6. 결과는 지연 → 지연임박 → 정상 → 입고완료 순으로 자동 정렬되며, 같은 상태 안에서는 납기일 빠른 순입니다.
  7. 행 오른쪽의 상세 아이콘을 열면 납품일정·입고이력·산출근거를 확인할 수 있습니다.
  8. 결과는 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번호 · ItemEKPO-EBELN · EBELP
구매처코드 · 구매처명LFA1 벤더 마스터 기준
플랜트EKPO-WERKS
자재코드 · 자재명EKPO-MATNRMAKT-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.htmlOpenUI5 부트스트랩 — 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.xmlsap.ui.table.Table 결과 리스트, 행 상세 액션
view/fragments/DetailDialog.fragment.xml납품일정 · 입고이력 · 산출근거 상세
controller/Main.controller.js조회 · 산출 · 정렬 · 상세 구성 · CSV
model/ModelMock.jslocaldata 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에 그대로 남습니다. 이 화면은 그 값을 라인아이템 단위로 대조해 미입고수량과 지연 상태를 계산해 보여주는 조회 전용 레이어로 확장한 것입니다.

구매발주 미입고 현황, 지금 쓰는 SAP 위에서 확장해 보세요

발주수량과 입고수량을 맞대어 무엇이 늦고 있는지 매일 아침 한 화면에서 확인할 수 있으면 독촉 업무가 훨씬 단순해집니다. 현재 SAP 환경 기준으로 어떻게 적용되는지 함께 확인해 드립니다.

구매발주 미입고현황Open POME2MME80FNEKPOEKETEKBEOpenUI5