matinal:SAP ABAP 获取自建表变更历史记录

🚀欢迎来到本文🚀
🍉个人简介:matinal,目前职业是IT行业,一个正在慢慢前行的普通人。
🏀系列专栏:涵盖SAP各模块,Python,Excel,人工智能等
💡 其他专栏:一些平时学习的技术,感兴趣的小伙伴可以看看。

🍔公众号:matinal
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​
⛱️万物从心起,心动则万物动🏄‍♂️


前言:SAP中有很多标准表的字段变动,会有变更历史记录,这些记录存在于系统中,本文将介绍如何把自开发表的变更记录写入这两个表。

🦙(工作遇到傻逼,千万要远离。道路千万条,远离傻逼第一条)


自定义表

SE11先创建一个自定义表ZTMARA

需要记录变更的字段,数据元素的"更改文档"需要勾选上!!!

创建变更对象

1.打开TCODE:  SCDO,输入ZTMARA后,点新建图标

2.在表中输入ZTMARA,勾选内部表/删除文档/插入文档

3.点生成图标,选择类

4.继续点生成

6.点信息图标,双击ZCL_ZTMARA_CHDO,或者SE24直接进

7.ZCL_ZTMARA_CHDO类中已经自动生成了变更记录的write方法,我们再额外增加两个方法和一个数据类型定义

7.1新增类型tt_changenr

TYPES:
tt_changenr TYPE STANDARD TABLE OF cdhdr-changenr WITH EMPTY KEY.

7.2 新增save_single和save_multi方法定义

 CLASS-METHODS save_single
      IMPORTING
        !is_ztmara         TYPE ty_ztmara
      RETURNING
        VALUE(rv_changenr) TYPE cdhdr-changenr .
  CLASS-METHODS save_multi
    IMPORTING
      VALUE(it_ztmara)   TYPE tt_ztmara
    RETURNING
      VALUE(rt_changenr) TYPE tt_changenr .

7.3  save_multi方法实现

 METHOD save_multi.
    CHECK it_ztmara[] IS NOT INITIAL.
    SORT it_ztmara BY matnr.
    DELETE ADJACENT DUPLICATES FROM it_ztmara COMPARING matnr.
    LOOP AT it_ztmara INTO DATA(ls_ztmara).
      DATA(rv_changenr) = save_single( ls_ztmara ).
      IF rv_changenr IS NOT INITIAL.
        APPEND rv_changenr TO rt_changenr.
      ENDIF.
      CLEAR rv_changenr.
    ENDLOOP.
  ENDMETHOD.

7.4 save_single方法实现,

将自动生成的write方法的尾部注释的代码段,拷贝过来,然后取消注释,增加部分处理逻辑,可参考下面这部分为自己新增逻辑代码部分

METHOD save_single.
    "  Code snippets to be used with COPY+PASTE
    "  uncomment the needed parts
    "  change names if needed

    "  Start of default parameter part
    DATA: objectid                TYPE cdhdr-objectid,
          tcode                   TYPE cdhdr-tcode,
          planned_change_number   TYPE cdhdr-planchngnr,
          utime                   TYPE cdhdr-utime,
          udate                   TYPE cdhdr-udate,
          username                TYPE cdhdr-username,
          cdoc_planned_or_real    TYPE cdhdr-change_ind,
          cdoc_upd_object         TYPE cdhdr-change_ind VALUE 'U',
          cdoc_no_change_pointers TYPE cdhdr-change_ind.
    DATA: cdchangenumber          TYPE cdhdr-changenr.
    "  End of default parameter part

    " Begin of dynamic DATA part for class ZCL_ZTMARA_CHDO
    "   table with the NEW content of: ZTMARA
    DATA xztmara TYPE zcl_ztmara_chdo=>tt_ztmara.
    "   table with the OLD content of: ZTMARA
    DATA yztmara TYPE zcl_ztmara_chdo=>tt_ztmara.
    "   change indicator for table: ZTMARA
    DATA upd_ztmara TYPE if_chdo_object_tools_rel=>ty_cdchngindh.

    "     Change Number of Document
    DATA changenumber TYPE if_chdo_object_tools_rel=>ty_cdchangenr.

    " End of dynamic DATA part for class ZCL_ZTMARA_CHDO

*----------------- 这部分为自己新增逻辑 BEGIN------------------*
    CHECK is_ztmara IS NOT INITIAL.
    DATA ls_yztmara TYPE ztmara.
    objectid = is_ztmara-matnr.
    tcode = sy-tcode.
    utime = sy-uzeit.
    udate = sy-datum.
    username = sy-uname.
*   查原记录
    SELECT SINGLE *
        INTO ls_yztmara
        FROM ztmara
        WHERE matnr = is_ztmara-matnr.
    upd_ztmara = COND #( WHEN is_ztmara-kz IS NOT INITIAL THEN is_ztmara-kz WHEN sy-subrc = 0 THEN 'U' ELSE 'I' ).
    "添加新记录
    APPEND CORRESPONDING ty_ztmara( BASE ( VALUE #( mandt = sy-mandt kz = upd_ztmara ) ) is_ztmara EXCEPT mandt kz ) TO xztmara.
    "添加旧记录
    IF sy-subrc = 0.
      APPEND CORRESPONDING ty_ztmara( BASE ( VALUE #( kz = upd_ztmara ) ) ls_yztmara ) TO yztmara.
    ENDIF.
*----------------- 这部分为自己新增逻辑 END------------------*
    "  Begin of method call part
    "  define needed DATA for error handling
    DATA err_ref TYPE REF TO cx_chdo_write_error.
    DATA err_action TYPE string.

    TRY.
        CALL METHOD zcl_ztmara_chdo=>write
          EXPORTING
            objectid                = objectid
            tcode                   = tcode
            utime                   = utime
            udate                   = udate
            username                = username
            planned_change_number   = planned_change_number
            object_change_indicator = cdoc_upd_object
            planned_or_real_changes = cdoc_planned_or_real
            no_change_pointers      = cdoc_no_change_pointers
            "  End of default method call part
            " Begin of dynamic part for method call
            "   table with the NEW content of: ZTMARA
            xztmara                 = xztmara
            "   table with the OLD content of: ZTMARA
            yztmara                 = yztmara
            "   change indicator for table: ZTMARA
            upd_ztmara              = upd_ztmara
            "     Change Number of Document
          IMPORTING
            changenumber            = cdchangenumber.
      CATCH cx_chdo_write_error INTO err_ref.
        "        MESSAGE err_ref TYPE 'A'.
        "   error information could be determined with default GET_TEXT, GET_LONGTEXT, GET_SOURCE_POSITION methds

    ENDTRY.
    " End of dynamic part for method call
    rv_changenr = cdchangenumber.
  ENDMETHOD.

测试

REPORT zmatinal.
DATA lt_ztmara TYPE STANDARD TABLE OF ztmara.
DATA ls_ztmara TYPE ztmara.
lt_ztmara = VALUE #( (  matnr = 'M001RS' color = '红' size1 = 'S' ztag_price = '100' )
                     (  matnr = 'M001RM' color = '红' size1 = 'M' ztag_price = '100' )
                     (  matnr = 'M001RL' color = '红' size1 = 'L' ztag_price = '100' ) ).

"写新增日志
zcl_ztmara_chdo=>save_multi( CORRESPONDING #( lt_ztmara ) ).
"插入记录
INSERT ztmara FROM TABLE lt_ztmara.
COMMIT WORK AND WAIT.

"写变更日志(公众号:matinal)
ls_ztmara =  VALUE #(  matnr = 'M001RS' color = '黑' size1 = 'S' ztag_price = '150' ) .
zcl_ztmara_chdo=>save_single( CORRESPONDING #( ls_ztmara ) ).
"修改记录
MODIFY ztmara FROM ls_ztmara.
COMMIT WORK AND WAIT.

"写删除日志
ls_ztmara =  VALUE #(   matnr = 'M001RL' color = '红' size1 = 'L' ztag_price = '100'  ).
zcl_ztmara_chdo=>save_single( CORRESPONDING #( BASE ( VALUE #( kz = 'D') ) ls_ztmara ) ).
"删除记录
DELETE ztmara FROM ls_ztmara.
COMMIT WORK AND WAIT.

效果展示

1.打开TCODE: SCD3,输入变更文档对象ZTMARA。

    也可直接SE16N查数据库表CDHDR/CDPOS

2.输入选择条件,点击执行

3.查看变更记录如下


怎么样,在了解此篇文章有何感想?


如果本文对大家有所帮助的话,还望各位能给我点赞、收藏并评论一下,感谢各位💕!!! 另如果大家有什么疑问或者建议的话,欢迎评论区留言。更多精彩内容->在这里

<think>好的,我现在需要处理用户关于SAP系统中车间和仓库盘盈盘亏处理方式及差异的问题。首先,我要回忆之前用户提到的内容,用户之前问过车间库负库存的设置,引用了matinalSAP FICO的资料。现在用户进一步询问盘盈盘亏的具体处理方法和区别,需要结合之前的引用信息,同时可能需要补充其他相关知识。 首先,盘盈盘亏通常涉及库存差异的处理,这在SAP中可能通过不同的移动类型和会计科目来体现。根据引用[1],车间库是虚拟库,允许负库存,而实体仓库不允许。这可能影响盘点的处理方式。例如,车间库的差异可能通过生产订单调整,而实体仓库的差异可能直接通过库存调整科目处理。 然后,引用[2]提到KO88结算生产订单时产生的会计凭证,涉及生产成本和材料成本差异科目。这说明生产相关的差异可能通过生产订单结算流程处理,而仓库的差异可能直接调整库存科目。 接下来,我需要区分车间和实体仓库的处理步骤。车间库作为虚拟库,可能与生产订单相关,盘盈盘亏可能通过调整生产订单的投入或产出来处理,使用特定的移动类型如701/702。而实体仓库的差异可能使用移动类型701/702,并直接过账到差异科目,影响库存价值。 另外,会计处理方面,车间库的差异可能关联到生产成本科目,而实体仓库差异可能对应库存调整科目。需要注意系统配置中是否允许负库存对处理方式的影响,车间库允许负库存可能意味着差异处理更灵活,而实体仓库需要及时调整避免负库存。 用户可能还想知道具体的操作事务代码,比如MI07用于库存盘点,MI20查看差异,以及KO88结算生产订单。同时,需要说明两者的核心区别在于库存类型、会计科目和处理流程。 最后,生成相关问题需要考虑用户可能进一步的问题,比如配置步骤、会计凭证差异、生产订单影响等。确保问题覆盖用户可能的兴趣点,帮助他们深入理解处理机制。</think>### SAP车间与仓库盘盈盘亏处理方法及区别 #### 一、车间库(虚拟库)盘盈盘亏处理 1. **业务背景** 车间库作为配合生产回冲扣料的虚拟库,允许负库存[^1],其差异通常与生产订单执行相关。例如:生产投料未完全消耗或退库未及时记录。 2. **处理步骤** - **差异确认**:通过事务代码`MI07`进行库存盘点,系统生成差异清单。 - **调整方式**: - 盘盈:使用移动类型`701`(库存增加)关联生产订单,冲减生产成本。 - 盘亏:使用移动类型`702`(库存减少)关联生产订单,增加生产成本。 - **会计处理**:差异通过生产订单结算(事务代码`KO88`)转入成本中心或差异科目,例如: ``` 借:生产成本-差异调整 贷:库存-车间库 ``` [^2] #### 二、实体仓库盘盈盘亏处理 1. **业务限制** 实体仓库禁止负库存[^1],差异需立即处理,通常由物料管理模块触发。 2. **处理步骤** - **差异过账**:使用移动类型`701`/`702`直接调整库存,系统自动生成会计凭证: ``` 借/贷:库存商品 贷/借:库存盘盈盘亏科目 ``` - **权限控制**:需审批流程(通过审批码或电子工作流)。 #### 三、核心区别对比 | **维度** | **车间库** | **实体仓库** | |----------------|-----------------------------------|--------------------------------| | **库存类型** | 虚拟库(允许负库存)[^1] | 实物库(禁止负库存) | | **差异来源** | 生产订单执行偏差 | 收发存操作误差 | | **会计科目** | 关联生产成本科目[^2] | 直接使用库存调整科目 | | **处理流程** | 需结合生产订单结算(KO88)[^2] | 独立过账,无需关联订单 | #### 四、配置要点 1. **车间库**:在物料主数据中设置“特殊库存标识”(如生产库存),并配置移动类型与生产订单的关联。 2. **实体库**:在物料管理(MM)模块定义库存调整科目,并设置审批策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值