SCDO的应用

场景:一些报表需要对价格的变化差异进行存档

1.se11,创建自建表,然后在需要对比数据的字段的数据元素的详细特性的页签下,选中更改文档打上勾;


2.打开scdo ,创建,step by step create,然后 激活,会生成一个函数,可以测试


3.在程序中如何用呢?好吧,自己写个函数


FUNCTION ZRFC_GETRECORD.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(OBJECTCLAS) LIKE  CDHDR-OBJECTCLAS DEFAULT 'ZNEWCH'
*"     VALUE(TAB_NAME) LIKE  DNTAB-TABNAME
*"     VALUE(REPID) TYPE  SY-REPID DEFAULT SY-REPID
*"     VALUE(O_TAB) TYPE  ZOTAB
*"     VALUE(V_TAB) TYPE  ZVTAB
*"     VALUE(I_FLAG) TYPE  CDHDR-CHANGE_IND
*"     VALUE(T_CODE) TYPE  SY-TCODE DEFAULT SY-TCODE
*"----------------------------------------------------------------------
  DATA: NAMETAB TYPE STRING,
        NAMETAB1 TYPE STRING.
  DATA: NAME_TAB LIKE TABLE OF DNTAB WITH HEADER LINE.
  DATA: i_str TYPE string.
  DATA l_refTAB          TYPE REF TO data.
  DATA l_ref          TYPE REF TO data.
  FIELD-SYMBOLS: <o_tab> TYPE STANDARD TABLE,
                 <v_tab> TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <fs>,
                 <fs1>,
                 <fs2>,
                 <fs3>
                 .
  FIELD-SYMBOLS: <l_stab> TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <l_stab1> TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <l_struc> TYPE ANY.
  FIELD-SYMBOLS:<WA>.
  DATA retab TYPE string.
  "获取旧表新表
  CONCATENATE '('  REPID  ')' O_TAB '[' ']' into retab.
  CONDENSE retab.
  ASSIGN (retab) to <o_tab>.
  CLEAR retab.
  CONCATENATE '('  REPID  ')' V_TAB '[' ']' into retab.
  CONDENSE retab.
  ASSIGN (retab) to <v_tab>.
  CONCATENATE 'V' TAB_NAME INTO NAMETAB1.
  "获取传入表结构
  CREATE DATA l_refTAB TYPE TABLE OF (NAMETAB1).
  ASSIGN l_reftab->* TO <l_stab>.
  CREATE DATA l_refTAB TYPE TABLE OF (NAMETAB1).
  ASSIGN l_reftab->* TO <l_stab1>.
  CREATE DATA l_ref TYPE (NAMETAB1).
  ASSIGN l_ref->* TO <l_struc>.
 "赋值更新表
  LOOP AT <o_tab> ASSIGNING <WA>.
    <l_struc> = <WA>.
    ASSIGN COMPONENT 'KZ' OF STRUCTURE <l_struc> TO <FS1>.
    <FS1> = i_FLAG.
    append <l_struc> to <l_stab>.
    CLEAR:<FS1>, <l_struc>.
  ENDLOOP.
  LOOP AT <v_tab> ASSIGNING <WA>.
    <l_struc> = <WA>.
    ASSIGN COMPONENT 'KZ' OF STRUCTURE <l_struc> TO <FS1>.
    <FS1> = i_FLAG.
    append <l_struc> to <l_stab1>.
    CLEAR:<FS1>, <l_struc>.
  ENDLOOP.
  DATA: OBJECTID TYPE  CDHDR-OBJECTID,
        TCODE TYPE  CDHDR-TCODE,
        UTIME TYPE  CDHDR-UTIME,
        UDATE TYPE  CDHDR-UDATE,
        USERNAME  TYPE  CDHDR-USERNAME,
        PLANNED_CHANGE_NUMBER TYPE  CDHDR-PLANCHNGNR,
        OBJECT_CHANGE_INDICATOR TYPE  CDHDR-CHANGE_IND,
        PLANNED_OR_REAL_CHANGES TYPE  CDHDR-CHANGE_IND,
        NO_CHANGE_POINTERS  TYPE  CDHDR-CHANGE_IND,
        UPD_ICDTXT TYPE  CDPOS-CHNGIND,
        UPD_ZDHHDD_ITEM TYPE  CDPOS-CHNGIND.
  DATA: ICDTXT LIKE TABLE OF CDTXT WITH HEADER LINE.

  objectid                = TAB_NAME .
  tcode                   = T_CODE .
  utime                   = sy-uzeit .
  udate                   = sy-datum .
  username                = sy-uname .
  object_change_indicator = i_FLAG .
  upd_icdtxt       = i_FLAG .
  upd_ZDHHDD_ITEM         = i_FLAG.
  IF i_FLAG = 'I' OR i_FLAG = 'D' .
    "取主键内容
    CALL FUNCTION 'NAMETAB_GET'
     EXPORTING
       LANGU                     = SY-LANGU
       ONLY                      = ' '
       TABNAME                   = TAB_NAME
* IMPORTING
*   HEADER                    =
*   RC                        =
      TABLES
        NAMETAB                   = NAME_TAB[]
* EXCEPTIONS
*   INTERNAL_ERROR            = 1
*   TABLE_HAS_NO_FIELDS       = 2
*   TABLE_NOT_ACTIV           = 3
*   NO_TEXTS_FOUND            = 4
*   OTHERS                    = 5
              .
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.
    LOOP AT <l_stab1> ASSIGNING  <l_struc>.
      LOOP AT NAME_TAB WHERE KEYFLAG = 'X'.
        ASSIGN COMPONENT NAME_TAB-FIELDNAME OF STRUCTURE <l_struc> TO <FS>.
        CONCATENATE ICDTXT-TEILOBJID <FS> INTO ICDTXT-TEILOBJID.
        CONDENSE ICDTXT-TEILOBJID.
      ENDLOOP.
       ICDTXT-TEXTART = 'KEY'.
      ICDTXT-updkz = i_FLAG.
      APPEND ICDTXT.
      CLEAR ICDTXT.
    ENDLOOP.
    CLEAR:<l_stab>,<l_stab1>.
  ENDIF.

  "新增修改删除表记录
  CALL FUNCTION 'CHANGEDOCUMENT_OPEN'
    EXPORTING
      OBJECTCLASS             = OBJECTCLAS
      OBJECTID                = OBJECTID
      PLANNED_CHANGE_NUMBER   = PLANNED_CHANGE_NUMBER
      PLANNED_OR_REAL_CHANGES = PLANNED_OR_REAL_CHANGES
    EXCEPTIONS
      SEQUENCE_INVALID        = 1
      OTHERS                  = 2.

  CASE SY-SUBRC.
    WHEN 0.                                   "OK.
    WHEN 1. MESSAGE A600 WITH 'SEQUENCE INVALID'.
    WHEN 2. MESSAGE A600 WITH 'OPEN ERROR'.
  ENDCASE.

  IF UPD_ZDHHDD_ITEM NE SPACE.
    IF ( <l_stab> IS INITIAL ) AND
       ( <l_stab1> IS INITIAL ).
      UPD_ZDHHDD_ITEM = SPACE.
    ENDIF.
  ENDIF.

  IF UPD_ZDHHDD_ITEM NE SPACE.
    CALL FUNCTION 'CHANGEDOCUMENT_MULTIPLE_CASE'
      EXPORTING
        TABLENAME              = TAB_NAME
        CHANGE_INDICATOR       = UPD_ZDHHDD_ITEM
        DOCU_DELETE            = 'X'
        DOCU_INSERT            = 'X'
      TABLES
        TABLE_OLD              = <l_stab>
        TABLE_NEW              = <l_stab1>
      EXCEPTIONS
        NAMETAB_ERROR          = 1
        OPEN_MISSING           = 2
        POSITION_INSERT_FAILED = 3
        OTHERS                 = 4.

    CASE SY-SUBRC.
      WHEN 0.                                "OK.
      WHEN 1. MESSAGE A600 WITH 'NAMETAB-ERROR'.
      WHEN 2. MESSAGE A600 WITH 'OPEN MISSING'.
      WHEN 3. MESSAGE A600 WITH 'INSERT ERROR'.
      WHEN 4. MESSAGE A600 WITH 'MULTIPLE ERROR'.
    ENDCASE.
  ENDIF.

  IF UPD_ICDTXT NE SPACE.
    CALL FUNCTION 'CHANGEDOCUMENT_TEXT_CASE'
      TABLES
        TEXTTABLE              = ICDTXT
      EXCEPTIONS
        OPEN_MISSING           = 1
        POSITION_INSERT_FAILED = 2
        OTHERS                 = 3.

    CASE SY-SUBRC.
      WHEN 0.                                "OK.
      WHEN 1. MESSAGE A600 WITH 'OPEN MISSING'.
      WHEN 2. MESSAGE A600 WITH 'INSERT ERROR'.
      WHEN 3. MESSAGE A600 WITH 'TEXT ERROR'.
    ENDCASE.
  ENDIF.

  CALL FUNCTION 'CHANGEDOCUMENT_CLOSE'
    EXPORTING
      OBJECTCLASS             = OBJECTCLAS
      OBJECTID                = OBJECTID
      DATE_OF_CHANGE          = UDATE
      TIME_OF_CHANGE          = UTIME
      TCODE                   = TCODE
      USERNAME                = USERNAME
      OBJECT_CHANGE_INDICATOR = OBJECT_CHANGE_INDICATOR
      NO_CHANGE_POINTERS      = NO_CHANGE_POINTERS
    EXCEPTIONS
      HEADER_INSERT_FAILED    = 1
      OBJECT_INVALID          = 2
      OPEN_MISSING            = 3
      NO_POSITION_INSERTED    = 4
      OTHERS                  = 5.

  CASE SY-SUBRC.
    WHEN 0.                                   "OK.
    WHEN 1. MESSAGE A600 WITH 'INSERT HEADER FAILED'.
    WHEN 2. MESSAGE A600 WITH 'OBJECT INVALID'.
    WHEN 3. MESSAGE A600 WITH 'OPEN MISSING'.
*    WHEN 4. MESSAGE A600 WITH 'NO_POSITION_INSERTED'.
* do not abort, if positions are not inserted!!!
    WHEN 5. MESSAGE A600 WITH 'CLOSE ERROR'.
  ENDCASE.

ENDFUNCTION.

在之后,就是在程序中调用这个函数,进行一些自建表的数据变更前后的差异了,这里需要用到2个表:CDPOS和CDHDR


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值