SAP事务码scu3,获取表日志修改明细记录

在这里插入图片描述
需要拿到DBTABLOG表这里的明细数据,以下代码可实现:

*&---------------------------------------------------------------------*
*& Report ZTEST05
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST05.

TYPE-POOLS stprt .

DATA: lv_tabname TYPE tabname VALUE 'ZTSDXD01',    "所需查看表修改日志的表名
      lv_date_s  TYPE d VALUE '20200401',
      lv_date_e  TYPE d VALUE '20200605'.

DATA: lt_tablist     TYPE stprt_h_tablist WITH HEADER LINE,
      lt_dfies       TYPE TABLE OF dfies,
      ls_dfies       TYPE dfies,
      ls_head        TYPE x030l,
      lv_tabdata_old TYPE logdata,
      lt_log         TYPE stprt_log_stable_type,
      ls_log         TYPE LINE OF stprt_log_stable_type.

DATA:BEGIN OF WA_OUTPUT.
  INCLUDE STRUCTURE dbtablog.
*  LOGDATE TYPE DBTABLOG-LOGDATE,
*  LOGTIME TYPE DBTABLOG-LOGTIME,
*  USERNAME TYPE DBTABLOG-USERNAME,
*  TABNAME TYPE DBTABLOG-TABNAME,
*  TCODE TYPE DBTABLOG-TCODE.
  INCLUDE STRUCTURE ZTSDXD01.

DATA:  END OF WA_OUTPUT.

DATA: IT_OUTPUT LIKE TABLE OF WA_OUTPUT.

DATA:  dyn_wa    TYPE REF TO data.
TYPES:BEGIN OF timestamp_type2,
             date TYPE d,
             time TYPE t,
      END OF timestamp_type2.
*DATA:p_field TYPE any.
FIELD-SYMBOLS: <x_field>, <c_field>, <timestamp> TYPE timestamp_type2,
                 <xkey> TYPE x,
                 <FS> TYPE ANY,
                 <curfld> TYPE ANY, <oldfld> TYPE ANY,
                 <curfld_x> TYPE x, <oldfld_x> TYPE x.

**************************************************************

REFRESH lt_dfies . CLEAR ls_head .
CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    tabname        = lv_tabname
  IMPORTING
    x030l_wa       = ls_head
  TABLES
    dfies_tab      = lt_dfies
  EXCEPTIONS
    not_found      = 1
    internal_error = 2
    OTHERS         = 3.
SORT lt_dfies BY position .

CHECK lt_dfies[] IS NOT INITIAL .

CREATE DATA dyn_wa TYPE (lv_tabname).       " 定义动态结构
ASSIGN dyn_wa->* TO <FS>.

REFRESH: lt_log,lt_tablist .

lt_tablist-tab = lv_tabname .
INSERT TABLE lt_tablist.
CALL FUNCTION 'DBLOG_READ_TABLE'
  EXPORTING
    from_day = lv_date_s
    to_day   = lv_date_e
    obj_list = lt_tablist[]
  CHANGING
    log_list = lt_log.

LOOP AT lt_log INTO ls_log ." WHERE optype <> 'U'.

  CHECK ls_log-versno >= '01'.

  MOVE ls_log-logdata(ls_log-dataln) TO lv_tabdata_old.
*
  LOOP AT lt_dfies INTO ls_dfies WHERE tabname = lv_tabname.
* convert endianess
    ASSIGN: COMPONENT ls_dfies-fieldname OF STRUCTURE <FS> TO <curfld> ,
         <curfld>    TO <curfld_x> CASTING.

    IF ls_log-versno >= '01' OR ls_dfies-keyflag IS INITIAL.

      ASSIGN lv_tabdata_old+ls_dfies-offset(ls_dfies-intlen) TO <oldfld_x> CASTING.

    ELSE.
* Old type of log: key not in data-part
      ASSIGN lv_tabdata_old+ls_dfies-offset(ls_dfies-intlen)
            TO  <oldfld_x> CASTING.
    ENDIF.
    <curfld_x> = <oldfld_x>.

    PERFORM convert_endianess USING lv_tabdata_old
                                    ls_log-versno
                                    ls_dfies
                              CHANGING <curfld>.
*    WRITE:<curfld>.
  ENDLOOP.
  MOVE-CORRESPONDING ls_log TO WA_OUTPUT.
  MOVE-CORRESPONDING <FS> TO WA_OUTPUT.
  APPEND WA_OUTPUT TO IT_OUTPUT.
*  CLEAR <FS> .

ENDLOOP.

DATA: GR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST.
DATA: LO_COLS      TYPE REF TO CL_SALV_COLUMNS.
DATA: LO_COLUMN    TYPE REF TO CL_SALV_COLUMN.

CL_SALV_TABLE=>FACTORY(
      IMPORTING
        R_SALV_TABLE = DATA(LCL_ALV)
      CHANGING
        T_TABLE      = IT_OUTPUT ).
LO_COLS = LCL_ALV->GET_COLUMNS( ).
GR_FUNCTIONS = LCL_ALV->GET_FUNCTIONS( ).
GR_FUNCTIONS->SET_ALL( ABAP_TRUE ).

LCL_ALV->DISPLAY( ).



FORM convert_endianess  USING    p_logdata TYPE logdata
                                 p_versno TYPE dbtablog-versno
                                 p_dfies TYPE dfies
                        CHANGING p_field TYPE any.

  DATA: f_type LIKE x031l-fieldtype.
  FIELD-SYMBOLS: <p_field_x> TYPE x.
  CONSTANTS: type_numc      TYPE fldtype VALUE 'B0',       "UC
             type_clnt      TYPE fldtype VALUE '98',       "UC
             type_lang      TYPE fldtype VALUE '50',       "UC
             type_time      TYPE fldtype VALUE 'BC',       "UC
             type_date      TYPE fldtype VALUE '9C',       "UC
             type_char      TYPE fldtype VALUE '28',       "UC
             type_accp      TYPE fldtype VALUE '94',       "UC
             type_cuky      TYPE fldtype VALUE '40',       "UC
             type_prec      TYPE fldtype VALUE 'B4',       "UC
             type_unit      TYPE fldtype VALUE '44',       "UC
             type_lstr      TYPE fldtype VALUE 'E4',        "#EC *
             type_sstr      TYPE fldtype VALUE 'EC',        "#EC *
             type_rstr      TYPE fldtype VALUE 'E8',
             type_i4        TYPE fldtype VALUE 'AC',        "UF160698B
             type_i2        TYPE fldtype VALUE 'A8',
             type_f         TYPE fldtype VALUE '88',        "UF160698E
             single_byte    TYPE tcp00-cpbyteind VALUE '01', "#EC *
             double_byte    TYPE tcp00-cpbyteind VALUE '02',
             quadruple_byte TYPE tcp00-cpbyteind VALUE '05',
             empty_entry    LIKE dbtablog-optype VALUE '*',  "UF133143/2001
             c_int4len      TYPE i VALUE 4.

* Little/big endian conversion
  CHECK ( NOT p_versno IS INITIAL
          OR ( p_dfies-keyflag = space
               AND 'sIF' CS p_dfies-inttype  ) )
   AND 'PX' NS p_dfies-inttype.
  ASSIGN p_field TO <p_field_x> CASTING.
  CASE p_dfies-inttype.
    WHEN 'C'.
      CASE p_dfies-datatype.
        WHEN 'CHAR'.
          f_type = type_char.
        WHEN 'LANG'.
          f_type = type_lang.
        WHEN 'CLNT'.
          f_type = type_clnt.
        WHEN 'CUKY'.
          f_type = type_cuky.
        WHEN 'UNIT'.
          f_type = type_unit.
      ENDCASE.
    WHEN 'N'.
      IF p_dfies-datatype = 'ACCP'.
        f_type = type_accp.
      ELSE.
        f_type = type_numc.
      ENDIF.
    WHEN 'D'.
      f_type = type_date.
    WHEN 'T'.
      f_type = type_time.
    WHEN 's'.
      IF p_dfies-datatype = 'PREC'.
        f_type = type_prec.
      ELSE.
        f_type = type_i2.
      ENDIF.
    WHEN 'I'.
      f_type = type_i4.
    WHEN 'F'.
      f_type = type_f.
    WHEN 'g'.
* C-string is handled as character:
      f_type = type_char.
    WHEN 'y'.
      f_type = type_rstr.
  ENDCASE.
  CALL FUNCTION 'DB_CONVERT_FIELD_TO_HOST'
    EXPORTING
      type        = f_type
    CHANGING
      field       = <p_field_x>
    EXCEPTIONS
      wrong_param = 0
      OTHERS      = 0.

ENDFORM.                    " convert_endianess
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值