SAP 취소된 자재문서 제외하고 가져오는 방법 (ECC vs S/4HANA)

SAP에서 자재 이력 관련 레포트를 구현하다 보면 가장 까다로운 부분 중 하나가 “취소된 자재문서”를 올바로 처리하는 것입니다. 단순히 자재 이동 데이터만 가져오면 입고와 입고 취소가 모두 포함되어 데이터가 왜곡된 결과를 가져오게 됩니다.

특히, SAP ECC에서 S/4HANA로 전환하면서 자재문서 테이블 구조가 바뀌었기 때문에, 각 버전에 맞는 올바른 구현 방법을 알고 있어야 합니다. 이번 포스팅에서는 SAP ECC와 S/4HANA 환경에서 취소된 자재문서를 정확하게 제외하고 가져오는 방법을 알아보겠습니다.

취소된 자재문서 제외가 필요한 이유

SAP에서 자재 이동(입고, 출고, 재고 이전 등)이 발생하면 해당 이동의 근거로 자재문서(Material Document)가 생성됩니다. 중요한 점은 재고 이동이 잘못되어 취소할 때, 기존 자재문서를 삭제하는 것이 아니라, 별도의 자재문서를 새로 생성한다는 것입니다.

🔎 예시

  1. 구매입고
    • 자재문서 번호: 10000001
    • 이동유형: 101 (구매입고)
    • 수량: +100 EA
  2. 구매입고 취소
    • 자재문서 번호: 10000002 (새로 생성)
    • 이동유형: 102 (구매입고 취소)
    • 수량: -100 EA
    • 참조 문서: 10000001

이 경우, 단순히 이동유형 101(구매입고)만 집계하면 실제 0 EA 입고인데도 100 EA가 입고된 것처럼 잘못 표시됩니다.

따라서 이중 집계 및 데이터 왜곡을 방지하기 위해서 취소된 자재문서를 정확하게 식별하여 제외하는 로직이 반드시 필요합니다.

SAP 취소된 자재문서 제외하고 가져오는 방법

SAP ECC 버전

SAP ECC에서는 자재문서 헤더 테이블 MKPF와 품목 테이블 MSEG를 사용합니다.

취소된 자재문서를 구분하기 위해 MSEG의 SJAHR, SMBLN, SLBLP 필드를 활용할 수 있습니다. 이 필드들은 취소된 자재문서에만 채워지며, 참조한 원본 자재문서 번호가 저장됩니다.

SAP 입고, 입고취소 MSEG 테이블 주요 식별 필드 값

즉, MSEG 테이블에 SJAHR, SMBLN, SLBLP 값이 존재하는 문서는 취소문서이므로 제외하면 됩니다.

방법 1: LOOP + SELECT 방식

SELECT *
FROM mseg
INTO TABLE @DATA(lt_mseg)
WHERE bwart = '101'.

LOOP AT lt_mseg INTO DATA(ls_mseg).
  " 이 문서가 취소되었는지 확인
  SELECT SINGLE mblnr
  FROM mseg
  INTO @DATA(lv_cancelled)
  WHERE sjahr = @ls_mseg-mjahr
    AND smbln = @ls_mseg-mblnr
    AND smblp = @ls_mseg-zeile.
    
  IF sy-subrc = 0.
    " 취소된 문서이므로 제외
    DELETE lt_mseg.
  ENDIF.
ENDLOOP.

방법 2: NOT EXISTS 활용

SELECT *
  FROM mseg AS m
 WHERE m~bwart = '101'
   AND NOT EXISTS (
         SELECT *
           FROM mseg AS c
          WHERE c~sjahr = m~mjahr
            AND c~smbln = m~mblnr
            AND c~smblp = m~zeile ).

S/4HANA 버전

S/4HANA에서는 기존 MKPF, MSEG가 통합되어 MATDOC 단일 테이블로 관리됩니다.

취소 여부를 확인할 수 있는 방법이 두 가지가 있습니다.

  1. MATDOC의 SMBLN, SMBLP 필드 활용 (ECC와 동일)
  2. MATDOC에 새로 추가된 CANCELLED 필드 활용
    • CANCELLED = ‘X’ → 취소된 자재문서
    • CANCELLED = 공백 → 정상 자재문서

방법: CANCELLED 필드 활용

SELECT * 
  FROM matdoc
 WHERE bwart = '101'
   AND cancelled = @abap_false 
  INTO TABLE @DATA(lt_matdoc). 

자주하는 질문(FAQ)

S/4HANA에서도 MKPF/MSEG를 쓸 수 있을까?

✔️ 결론: 가능합니다.

S/4HANA 전환, 기존 ECC 코드의 호환성을 보장하기 위해 MKPF, MSEG 테이블이 물리적으로 삭제하지 않고 Compatibility View(호환성 뷰)로 남겨두었습니다.

즉, 기존에 MKPF/MSEG를 참조하는 쿼리를 실행하면 내부적으로는 MATDOC을 바라보도록 리다이렉션됩니다.

기존 테이블을 사용하는 것이 가능하지만, 새로운 개발이나 코드 개선 시에는 MATDOC 테이블을 직접 사용하는 것을 권장합니다.

Similar Posts