SAP-ABAP 批量查询SAP标准日志(更改历史記錄)


常用對象名:

描述

OBJECTCLAS對象

物料主数据变更查询(MM03) MATERIAL
采购信息记录变更查询(ME1L) INFOSATZ
采购申请(PR) BANF
采购订单变更查询(PO) EINKBELEG
销售凭证(含合同、订单等) VERKBELEG
客户 DEBI
供应商 KRED
信用(FD32) KLIM

如何查找对象

1.对象表:TCDOB TCDOBT(SE11,根據表查詢對象)/SCDO(根據對象查詢表)
2.用单号,编码模糊查询
3.限定时间与用户进行测试

批量查询标准日志

方法一:事务代码(SE38):RSSCD100 / (RC1CD100\RSSCD1TS)

方法二:后台表(SE11):CDHDR 和 CDPOS

 CDHDR -抬头表

OBJECTCLAS 对象类
OBJECTID 对象值
CHANGENR 文档更改编号
CHANGE_IND

U 更新
I 插入
E 删除 (单字段文档)
D 删除
J 插入 (单字段文档)

CDPOS-项目表
OBJECTCLAS 对象类 
OBJECTID 对象值 
CHANGENR 文档更改编号
TABNAME 表名
TABKEY 已更改的表记录码
FNAME 字段名
CHNGIND 修改类型 (U, I, E, D)
TEXT_CASE 标识:X=文本更改
UNIT_OLD 更改文档,参照的单位
UNIT_NEW 更改文档,参照的单位
CUKY_OLD 更改文档,参照货币 
CUKY_NEW 更改文档,参照货币 
VALUE_NEW 更改字段的新内容
VALUE_OLD 更改字段的新内容
   
*&---------------------------------------------------------------------*
*& Report  ZCDHDR_CDPOS
*&
*&---------------------------------------------------------------------*
*&
*& 标准程序:RSSCD100
*&---------------------------------------------------------------------*
REPORT zcdhdr_cdpos NO STANDARD PAGE HEADING .

TYPE-POOLS: slis.
TABLES: cdhdr,cdred,tcdob.
DATA: fldct TYPE slis_t_fieldcat_alv,
      slayt TYPE slis_layout_alv ,
      varnt LIKE disvariant,
      repid LIKE sy-repid .

DATA: itab TYPE TABLE OF cdred WITH HEADER LINE.
DATA: it_cdhdr TYPE TABLE OF cdhdr WITH HEADER LINE.
DATA: it_cdred TYPE TABLE OF cdred WITH HEADER LINE.

SELECT-OPTIONS :
        s_clas   FOR tcdob-object OBLIGATORY ,
        s_objtid FOR cdhdr-objectid,
        s_usrnam FOR cdhdr-username ,
        s_udate  FOR cdhdr-udate DEFAULT sy-datum,
        s_time   FOR cdhdr-utime,
        s_tcode  FOR cdhdr-tcode,
        s_tab    FOR cdred-tabname,
        s_fname  FOR cdred-fname,
        s_tabkey FOR cdred-tabkey .

AT SELECTION-SCREEN OUTPUT.
  %_s_clas_%_app_%-text   = '对象类'.
  %_s_objtid_%_app_%-text = '对象值'.
  %_s_usrnam_%_app_%-text = '用户名'.
  %_s_udate_%_app_%-text  = '日期'.
  %_s_time_%_app_%-text   = '时间'.
  %_s_tcode_%_app_%-text  = '事务码'.
  %_s_tab_%_app_%-text    = '修改的表名'.
  %_s_fname_%_app_%-text  = '字段名'.
  %_s_tabkey_%_app_%-text = 'KEY值'.

START-OF-SELECTION.
  PERFORM getdata.
  PERFORM outdata.

*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
FORM getdata.
  CLEAR: itab,itab[],it_cdhdr,it_cdhdr[].

  SELECT * INTO TABLE it_cdhdr
     FROM cdhdr
     WHERE objectclas IN s_clas   AND
           objectid   IN s_objtid AND
           username   IN s_usrnam AND
           udate      IN s_udate  AND
           utime      IN s_time   AND
           tcode      IN s_tcode  .

  LOOP AT it_cdhdr.
    CLEAR: it_cdred,it_cdred[].
    CALL FUNCTION 'CHANGEDOCUMENT_READ'
      EXPORTING
        changenumber               = it_cdhdr-changenr
        objectclass                = it_cdhdr-objectclas
        objectid                   = it_cdhdr-objectid
      TABLES
        editpos                    = it_cdred
      EXCEPTIONS
        no_position_found          = 1
        wrong_access_to_archive    = 2
        time_zone_conversion_error = 3
        OTHERS                     = 4.
    IF sy-subrc = 0.
      LOOP AT it_cdred WHERE fname   IN s_fname AND
                             tabname IN s_tab AND
                             tabkey  IN s_tabkey .
        APPEND it_cdred TO itab.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
ENDFORM. "getdata

*&---------------------------------------------------------------------*
*&      Form  outdata
*&---------------------------------------------------------------------*
FORM outdata.
  DATA lines(10).

  slayt-colwidth_optimize = 'X'.
  slayt-zebra             = 'X'.
  slayt-detail_initial_lines = 'X'.   "&ETA 空单元格也显示
  repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = repid
      i_structure_name        = 'CDRED'
      i_save                  = 'A'
      is_layout               = slayt
      i_callback_user_command = 'USER_COMMAND'
    TABLES
      t_outtab                = itab
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
ENDFORM. "outdata

*&--------------------------------------------------------------------*
*&      Form  user_command
*&--------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfld TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&IC1'.
      READ TABLE itab INDEX rs_selfld-tabindex.
      CHECK sy-subrc = 0.
    WHEN 'REFRESH'.
      PERFORM getdata.
  ENDCASE.

  rs_selfld-row_stable = 'X'.
  rs_selfld-col_stable = 'X'.
  rs_selfld-refresh    = 'X'.
ENDFORM. "user_command

*&--------------------------------------------------------------------*
*&      Form  set_status
*&--------------------------------------------------------------------*
FORM set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING rt_extab .
ENDFORM. "set_status
ZCDHDR_CDPOS