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.'ERP(SAP)' 카테고리의 다른 글
| [SAP] MRP(자재 소요량 계획) 이란? 작동 원리 등 완전 이해하기 (0) | 2025.10.27 |
|---|---|
| [SAP] MM-IM S/4HANA Simplification List 정리 (0) | 2025.10.24 |
| [SAP] RFC란? 개념부터 실무 활용까지 완벽 정리 (0) | 2025.10.22 |
| [SAP] IMG ( Implementation Guide) 세팅, MM 모듈 위주 정리 (0) | 2025.10.21 |
| SAP에서 Data Overflow(데이터 오버플로우) 덤프가 발생하는 주요 원인 (0) | 2025.10.20 |
