SAP 트랜잭션의 변경 이력 조회를 ABAP 프로그램으로 구현하는 방법 및 사용 예제


SAP ERP 시스템의 특정 트랜잭션에서 변경 작업을 수행하면 대부분 변경 이력(Change Document)을 시스템에 기록하게 됩니다.
이렇게 기록 된 변경 이력은 각 트랜잭션의 환경 메뉴에서 변경 이력 메뉴를 통해 변경된 정보를 조회해 볼 수 있습니다.

대표적으로 판매오더 조회(VA03) 화면에서 환경-변경사항 메뉴가 있으며, 생산오더 조회(CO03) 화면에서 이동-변경관리 메뉴가 있습니다. 그리고 자자마스터 조회(MM03) 화면에서 환경-변경사항 조회 메뉴가 있습니다.
다른 트랜잭션 화면에서도 변경사항 조회 메뉴를 확인할 수 있을 것입니다.

변경 사항 조회를 통해 누가, 언제, 무엇을, 어떻게 변경하였는지 확인할 수 있어 문제가 발생했을 때 원인을 찾는 데 유용하게 사용할 수 있습니다.

이번 글에서는 SAP 트랜잭션의 변경 이력 조회를 ABAP 프로그램으로 구현하는 방법 및 사용 예제에 대해 알아보겠습니다.

변경 이력 조회를 위한 CHANGEDOCUMENT_READ Function 소개

하나의 판매 오더나 하나의 생산 오더 또는 하나의 자재 마스터는 해당 조회 화면에서 변경 사항 조회 메뉴를 통해 쉽게 확인해 볼 수 있습니다. 하지만 여러 건의 자료나 특정 기간의 변경 이력을 일괄적으로 가져와야 할 경우에는 프로그램으로 처리할 수 밖에 없습니다.

※ 참고로 SAP 시스템에서 변경 이력이 저장되는 테이블은 CDHDR, CDPOS 입니다. 아쉽게도 일반적인 테이블과 달리 바로 데이터를 조회해 볼 수는 없습니다.

SAP의 변경 이력을 ABAP 프로그램에서 쉽게 가져올 수 있도록 만들어진 Function이 CHANGEDOCUMENT_READ 입니다.

기본 구조는 아래와 같으며 EXPORTING의 OBJECTCLASS와 TABLES의 EDITPOS 두가지는 필수 입력 사항이 필요합니다.

CALL FUNCTION ‘CHANGEDOCUMENT_READ’
  EXPORTING
*   ARCHIVE_HANDLE                   = 0
*   CHANGENUMBER                     = ‘ ‘
*   DATE_OF_CHANGE                   = ‘00000000’
    OBJECTCLASS                      =
*   OBJECTID                         = ‘ ‘
*   TABLEKEY                         = ‘ ‘
*   TABLENAME                        = ‘ ‘
*   TIME_OF_CHANGE                   = ‘000000’
*   USERNAME                         = ‘ ‘
*   LOCAL_TIME                       = ‘ ‘
*   TABLEKEY254                      = ‘ ‘
*   KEYGUID                          = ‘ ‘
*   DATE_UNTIL                       = ‘99991231’
*   TIME_UNTIL                       = ‘235959’
*   KEYGUID_STR                      = ‘ ‘
*   READ_CHANGEDOCU                  = ‘ ‘
*   TIME_ZONE                        = ‘ ‘
* IMPORTING
*   ET_CDRED_STR                     =
  TABLES
    EDITPOS                          =
* EXCEPTIONS
*   NO_POSITION_FOUND                = 1
*   WRONG_ACCESS_TO_ARCHIVE          = 2
*   TIME_ZONE_CONVERSION_ERROR       = 3
*   OTHERS                           = 4
          .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
 

Exporting 중요 매개변수 설명

  • OBJECTCLASS : 변경문서 생성할 때 가장 최상위 단위의 오브젝트 클래스
  • OBJECTID : 변경문서의 개별 항목. (예, 판매문서번호, 자재코드, 생산오더번호 등)
  • TABLENAME : 변경된 테이블 (예, VBAK, VBAP, MARA, MARC, AUFK 등)
  • USERNAME : 변경 작업자의 SAP ID
  • DATE_OF_CHANGE : 변경 작업일(지정할 일자부터 현재까지 변경이력 가져옴)

SAP 변경 이력의 오브젝트 클래스(OBJECTCLASS) 찾는 방법

필수 항목인 OBJECTCLASS 찾는 방법은 T-code SCDO에서 찾는 방법과 테이블 TCDOB에서 찾는 방법이 있습니다.

1. 트랜잭션코드 SCDO는 오브젝트 클래스의 개요를 보여주는 것이라 크게 활용하기는 어렵습니다. 그래서 설명은 생략하겠습니다.
궁금하신 분은 직접 SCDO 트랜잭션을 실행해서 확인해 보시면 됩니다.

2. 쉽게 찾을 수 있는 방법이 Table TCDOB에서 찾는 방법 입니다.

SAP 트랜잭션의 변경 이력 조회를 ABAP 프로그램으로 구현하는 방법 및 사용 예제 1

화면처럼 TABNAME에 찾고자 하는 변경 필드가 들어 있는 테이블을 넣고 실행해서 조회해 보면 됩니다.

‘MARA’ 테이블을 넣고 실행한 결과 OBJECT에 ‘MATERIAL‘이 출력 됩니다.

MARA 테이블에 있는 필드의 변경은 ‘METERIAL’이라는 오브젝트 클래스로 모두 저장된다는 의미 입니다.

다시 테이블 TCDOB 선택 화면에서 OBJECT에 ‘MATERIAL’을 넣고 실행하면 아래 화면의 결과가 출력 됩니다.

SAP 트랜잭션의 변경 이력 조회를 ABAP 프로그램으로 구현하는 방법 및 사용 예제 2

이렇게 21개의 테이블이 리스트로 출력 되는 것을 확인할 수 있습니다.
즉, 여기에 표시되는 21개의 테이블에 있는 필드의 변경은 모두 ‘MATERIAL’ 이라는 오브젝트 클래스로 저장된다는 의미 입니다.

사용 예1 – 판매문서 변경이력 조회

DATA IT_CDRED LIKE CDRED OCCURS 0 WITH HEADER LINE.

CALL FUNCTION ‘CHANGEDOCUMENT_READ
  EXPORTING
    OBJECTCLASS = ‘VERKBELEG’   ” 판매오더 관련 오브젝트 클래스
    OBJECTID    = ‘0001574422’     ” 판매오더번호
  TABLES
    EDITPOS     = IT_CDRED.

LOOP AT IT_CDRED.
  WRITE:/ IT_CDRED-USERNAME, UDATE, UTIME, TCODE, F_OLD, F_NEW…….
ENDLOOP.

사용 예2 – 자재코드 변경이력 조회

DATA IT_CDRED LIKE CDRED OCCURS 0 WITH HEADER LINE.

CALL FUNCTION ‘CHANGEDOCUMENT_READ
  EXPORTING
    OBJECTCLASS = ‘MATERIAL’   ” 자재마스터 관련 오브젝트 클래스
    OBJECTID        = ‘M00000001’       ” 자재번호

    TABLENAME    = ‘MARA’                ” MARA 테이블의 변경 이력만
  TABLES
    EDITPOS     = IT_CDRED.

사용 예3 – 자재마스터 BOM 변경이력 조회

DATA IT_CDRED LIKE CDRED OCCURS 0 WITH HEADER LINE.

DATA: LV_OBJECTID LIKE CDHDR-OBJECTID,
       LV_STLNR LIKE MAST-STLNR.

SELECT SINGLE STLNR 
    INTO (LV_STLNR)
    FROM MAST
    WHERE MATNR = ‘M00000001’    ” 자재번호
      AND WERKS = ‘9000’.           ” 플랜트

CONCATENATE SY-MANDT ‘M’ LV_STLNR INTO LV_OBJECTID.

CALL FUNCTION ‘CHANGEDOCUMENT_READ
  EXPORTING
    OBJECTCLASS = ‘STUE’   ” 오브젝트리스트 변경문서
    OBJECTID        = LV_OBJECTID       ” 오브젝트ID

  TABLES
    EDITPOS     = IT_CDRED.


※ 해당 Function을 잘 활용하면 특정 사용자가 변경한 이력이나 특정 기간에 변경된 이력 등을 일괄적으로 확인할 수 있게 됩니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기