[SAP] CDHDR / CDPOS를 주요 테이블 변경 사항 찾기

 SAP CDHDR / CDPOS를 이용해 주요 테이블(MM, SD, Master) 변경 사항 찾기 


1️⃣ CDHDR / CDPOS 개념 (쉽게 설명)

구분 테이블 내용 비고
변경문서헤더
(Change document header)
CDHDR 누가(Username), 언제(UDATE/UTIME), 어떤 오브젝트(OBJECTCLAS / OBJECTID)를 변경했는지 변경 “행위” 중심
변경문서상세
(Change document items)
CDPOS 어떤 테이블의 필드가 Before → After 로 바뀌었는지 변경 “내용” 중심

 

✅ CDHDR (Change Document Header) 구조

CDHDR   ← 변경 "행위" 기록 (누가/언제/무슨 문서를 변경)
│
├─ OBJECTCLAS  (변경 Object Class, 예: EINKBELEG, VERKBELEG, MATERIAL)
├─ OBJECTID    (문서번호 / 키값, 예: EBELN, VBELN, MATNR)
├─ CHANGENR    (변경 번호, CDPOS와 JOIN KEY)
├─ UDATE       (변경 일자, YYYYMMDD)
├─ UTIME       (변경 시간, HHMMSS)
├─ USERNAME    (수행 사용자)
├─ TCODE       (어떤 트랜잭션(티코드)으로 변경 수행했는지)
└─ LANGU       (언어 Key)

 

✅ CDPOS (Change Document Position) 구조

 
CDPOS   ← 변경 "내용" 기록 (어떤 필드가 무엇에서 무엇으로 바뀌었는지)
│
├─ OBJECTID     (CDHDR와 JOIN KEY)
├─ CHANGENR     (CDHDR와 JOIN KEY)
├─ TABNAME      (변경된 테이블명, 예: EKKO, VBAK, MARA)
├─ TABKEY       (테이블 Key raw value)
├─ FNAME        (필드명, 예: LIFNR, MATNR, EKORG)
├─ VALUE_OLD    (변경 전 값)
├─ VALUE_NEW    (변경 후 값)
└─ CHNGIND      (Change Type (U, I, D) : Update, Insert, Delete)

 

2️⃣  OBJECTCLAS,  OBJECTID  업무/모듈별 예시

업무 OBJECTCLAS OBJECTID
구매 (PO) EINKBELEG EBELN (구매문서번호)
구매요청(PR) BANF BANFN (구매요청번호)
판매(SD) VERKBELEG VBELN (SO/Delivery/Billing 등)
고객마스터 DEBI KUNNR
공급업체마스터 LFA1 LIFNR
자재마스터 MATERIAL MATNR

3️⃣ CDHDR 및 CDPOS를 이용한 변경 추적 프로그램 설계

 

사용자 Input
 └─ 날짜/구분/문서번호

↓ (필터링)

CDHDR (헤더)
 └ OBJECTCLAS / OBJECTID / UDATE / UTIME / USERNAME

↓ (1:N)

CDPOS (라인)
 └ TABNAME / FNAME / VALUE_OLD / VALUE_NEW

↓ (변경 데이터 매핑)

도메인/필드명 설명 변환
└ 예: MATNR → “자재”
└ 예: BSTYP/BSTYP_NA 나타낼 때 구매문서유형 해석

↓ (리포트뷰 생성)

ALV 형식 Output
└ 변경일자/시간
└ 사용자
└ 업무영역 (구매/SD/기준정보)
└ 문서번호
└ 필드명 / 변경 전 → 변경 후

4️⃣ ABAP Source Code 예시

REPORT zchange_log_report.

PARAMETERS: p_date_from TYPE sy-datum DEFAULT sy-datum,
            p_date_to   TYPE sy-datum DEFAULT sy-datum,
            p_objcls    TYPE cdobjectclas OBLIGATORY
                        DEFAULT 'EINKBELEG'  "구매 PO 예시
                        LOWER CASE.

DATA: lt_hdr TYPE TABLE OF cdhdr,
      lt_pos TYPE TABLE OF cdpos,
      ls_hdr TYPE cdhdr,
      ls_pos TYPE cdpos.

" 1) 변경 헤더 추출
SELECT * FROM cdhdr
  INTO TABLE lt_hdr
  WHERE objectclas = p_objcls
    AND udate      BETWEEN p_date_from AND p_date_to.

IF lt_hdr IS NOT INITIAL.

  LOOP AT lt_hdr INTO ls_hdr.

    " 2) 변경 상세 추출 (헤더당 여러건)
    SELECT * FROM cdpos
      INTO TABLE lt_pos
      WHERE changenr   = ls_hdr-changenr.

    LOOP AT lt_pos INTO ls_pos.
      WRITE: / '문서:',     ls_hdr-objectid,
             '변경일시:', ls_hdr-udate, ls_hdr-utime,
             '사용자:',   ls_hdr-username,
             '필드:',     ls_pos-fname,
             'Before:',   ls_pos-value_old,
             'After:',    ls_pos-value_new.
    ENDLOOP.

  ENDLOOP.

ELSE.
  WRITE: / '해당 기간 내 변경 이력 없음'.
ENDIF.