关于生产订单修改记录

本文讨论了一家公司使用网络代码进行生产订单修改,两年后才发现错误,提出对SAP代码的修改和优化,包括取消不必要的检查、获取用户IP和主机名、记录变更历史以及处理组件变更的逻辑。同时,代码中增加了对新增和删除组件的处理,并考虑了组件数量变更的情况。

关于生产订单修改,相信大家网上一搜,一大堆,最后发现,差不多都是一样,我们公司也是自2020年3月10日,直接引用网络一字不改,使用了两年多,才发现有一些记录不正确,为什么没有开发人员或业务顾问仔细研究一下,明显的错误都没有发现吗?无语。。。。。。。

言归正传,首先用SMOD,打开(或新增)增强,

找组件

 

然后,写代码(以下代码引用网络稍加调整,在S4 Hana SAP上验证,红色部分已经取消或替代替原网上代码):

*&---------------------------------------------------------------------*
*& 包含               ZXCO1U01
*&---------------------------------------------------------------------*

  TABLES:caufv,resb.
  DATA: BEGIN OF old_resb OCCURS 0, "更改后未保存之RESB.
          aufnr LIKE resb-aufnr,
          posnr LIKE resb-posnr,
          matnr LIKE resb-matnr,
          rsnum LIKE resb-rsnum,
          rspos LIKE resb-rspos,
          xloek LIKE resb-xloek,
          bdmng LIKE resb-bdmng,
          objnr LIKE resb-objnr,
        END OF old_resb.
  DATA: BEGIN OF new_resb OCCURS 0. "数据库中的RESB.
      INCLUDE STRUCTURE old_resb.
  DATA: END OF new_resb.
  DATA: BEGIN OF obj_resb OCCURS 0. "插入的RESB
      INCLUDE STRUCTURE old_resb.
  DATA: END OF obj_resb.
  DATA: i_zpco02 LIKE zpco002 OCCURS 0 WITH HEADER LINE.
  DATA: i_temp LIKE zpco002 OCCURS 0 WITH HEADER LINE.
  DATA: iporg     LIKE msxxlist-hostadr,
        ipdec(16) TYPE c,
        host(18)  TYPE c.
  DATA:char1(20) TYPE c,
       char2(20) TYPE c.
  DATA: inst_flg TYPE c VALUE 'N',
        chan_had TYPE c VALUE  'N'.


 ' CHECK sy-tcode EQ 'CO02'.''取消。怕其他事务码也可能引起生产订单变更CO40、CO41等
** Get user IP,hostname
  CALL FUNCTION 'TH_USER_INFO'  " Get user IP,hostname
    EXPORTING
      client   = sy-mandt
      user     = sy-uname
    IMPORTING
      hostaddr = iporg
      terminal = host
    EXCEPTIONS
      OTHERS   = 1.
**"Conv.IP addr to format "xxx.xxx.xxx.xxx"
  CALL FUNCTION 'GWY_IPADR2STRING'   "Conv.IP addr
    EXPORTING
      ipadr  = iporg
    IMPORTING
      string = ipdec.
***Common var.
  MOVE: sy-mandt TO i_temp-mandt,
  sy-uname TO i_temp-aenam,
  sy-datum TO i_temp-laeda,
  sy-uzeit TO i_temp-times,
  sy-tcode TO i_temp-tcode,
  ipdec TO i_temp-hostip,
  host TO i_temp-host,
  header_table-aufnr TO i_temp-aufnr.


  SELECT SINGLE gamng gstrp INTO (caufv-gamng, caufv-gstrp)
  FROM caufv WHERE aufnr EQ header_table-aufnr.

  IF header_table-gamng NE caufv-gamng.
    MOVE: caufv-gamng TO char1, header_table-gamng TO char2.
    MOVE-CORRESPONDING i_temp TO i_zpco02.
    MOVE: '更改工单总数' TO i_zpco02-filed,
    'U' TO i_zpco02-chnid,
    char1 TO i_zpco02-value_old,
    char2 TO i_zpco02-value_new.
    APPEND i_zpco02.
    inst_flg = 'Y'.
   ' chan_had = 'Y'.
  ENDIF.

  IF header_table-gstrp NE caufv-gstrp.
    MOVE-CORRESPONDING i_temp TO i_zpco02.
    MOVE: '更改开工日期' TO i_zpco02-filed,
    'U' TO i_zpco02-chnid,
    caufv-gstrp TO i_zpco02-value_old,
    header_table-gstrp TO i_zpco02-value_new.
    APPEND i_zpco02.
    inst_flg = 'Y'.
  ENDIF.
  IF inst_flg = 'Y'.
    INSERT zpco002 FROM TABLE i_zpco02 ACCEPTING DUPLICATE KEYS.
    inst_flg = 'N'.
  ENDIF.

  LOOP AT component_table WHERE vbkz EQ 'U'
  OR vbkz EQ 'I'
  OR vbkz EQ 'D'.
    CASE component_table-vbkz.
      WHEN 'I'.
        MOVE-CORRESPONDING i_temp TO i_zpco02.
        MOVE: '新增组件' TO i_zpco02-filed,
        'I' TO i_zpco02-chnid,
        '' TO i_zpco02-value_old, "old_resb-matnr
        component_table-matnr TO i_zpco02-value_new,
        '新增的组件' TO i_zpco02-matnr,
        component_table-alpos TO i_zpco02-alpos,
        sy-tabix TO i_zpco02-loopid.
        APPEND i_zpco02.
        inst_flg = 'Y'.
      WHEN 'D'.
        MOVE-CORRESPONDING i_temp TO i_zpco02.
        MOVE: '删除组件' TO i_zpco02-filed,
        'D' TO i_zpco02-chnid,
        resb-xloek TO i_zpco02-value_old,
        component_table-xloek TO i_zpco02-value_new,
        component_table-matnr TO i_zpco02-matnr,
        component_table-alpos TO i_zpco02-alpos,
        sy-tabix TO i_zpco02-loopid.
        APPEND i_zpco02.
        inst_flg = 'Y'.
      WHEN 'U'.
        SELECT SINGLE matnr bdmng INTO (resb-matnr, resb-bdmng)
        FROM resb

      WHERE

       'aufnr EQ component_table-aufnr
        'AND posnr EQ component_table-posnr
        'AND matnr EQ component_table-matnr
        'AND      ''RESB 表的主键就是预留单号、行号,没有必要这么多查询条件,条件多了有可能查不出来想要的值。

        rsnum EQ component_table-rsnum
        AND rspos EQ component_table-rspos.
        IF component_table-matnr NE resb-matnr.
          MOVE-CORRESPONDING i_temp TO i_zpco02.
          MOVE: '更改组件' TO i_zpco02-filed,
          'U' TO i_zpco02-chnid,
          resb-matnr TO i_zpco02-value_old,
          component_table-matnr TO i_zpco02-value_new,
          '更改的工单组件' TO i_zpco02-matnr,
          component_table-alpos TO i_zpco02-alpos,
          sy-tabix TO i_zpco02-loopid.
          APPEND i_zpco02.

        '*当组件变更,数量也变更时  "新加逻辑 可能当初没有考虑到
            IF component_table-bdmng NE resb-bdmng.
               MOVE: component_table-bdmng TO char1, resb-bdmng TO char2.
               MOVE-CORRESPONDING i_temp TO t_zpco02.
               MOVE: '需求数量' TO t_zpco02-filed,
               'U' TO t_zpco02-chnid,
               char2 TO t_zpco02-value_old,
               char1 TO t_zpco02-value_new,
               component_table-matnr TO t_zpco02-matnr,
               component_table-alpos TO t_zpco02-alpos,
               sy-tabix TO t_zpco02-loopid.
               APPEND t_zpco02.
            ENDIF.

          inst_flg = 'Y'.
        ELSEIF component_table-bdmng NE resb-bdmng.
          CHECK chan_had NE 'Y'.
          MOVE: component_table-bdmng TO char1, resb-bdmng TO char2.
          MOVE-CORRESPONDING i_temp TO i_zpco02.
          MOVE: '需求数量' TO i_zpco02-filed,
          'U' TO i_zpco02-chnid,
          char2 TO i_zpco02-value_old,
          char1 TO i_zpco02-value_new,
          component_table-matnr TO i_zpco02-matnr,
          component_table-alpos TO i_zpco02-alpos,
          sy-tabix TO i_zpco02-loopid.
          APPEND i_zpco02.
          inst_flg = 'Y'.
        ENDIF.
    ENDCASE.
  ENDLOOP.
  IF inst_flg = 'Y'.
    INSERT zpco002 FROM TABLE i_zpco02 ACCEPTING DUPLICATE KEYS.
    IF sy-subrc EQ 0.
      inst_flg = 'N'.
      "chan_had = 'N'.
'* MESSAGE ID "ZX" TYPE "W"
'* NUMBER "000" WITH "SAP系统已记录您的更改!".
    ENDIF.
  ENDIF.

 最后就是关于表的定义:时间也设定为主键,怕同一天更改多次。

 

<think>嗯,用户需要查询SAP生产订单修改记录,但标准功能无法实现。用户可能是个SAP运维人员或关键用户,遇到了生产订单被意外修改的情况,急需追溯变更历史。ta的提问很具体,说明对SAP有一定了解,但可能不熟悉技术方案。 从技术角度看,生产订单修改记录属于变更审计需求。SAP标准确实不提供这个功能,就像引用[1]提到的。但有两个可靠方案:CDHDR/CDPOS表或开发报表。引用[2]提到的BOM修改记录方案RCS00100也值得参考思路。 用户可能更关心实操性而非技术原理,所以回复要侧重操作路径。需要强调权限问题——很多用户会卡在第一步的权限校验。另外,时间范围限制也很关键,避免用户查询海量数据。 考虑到用户可能后续需要:1)扩展查询其他对象(如BOM)2)部署永久方案 3)权限申请指导,在相关问题里埋了这些点。特别加入了"修改记录存储时长"的提醒,这是生产环境容易忽略的坑。 最后检查SAP术语准确性:用"事务代码"而非"程序","抬头"而非"header",确保符合用户操作语境。性能提示放在最后,避免干扰主要步骤。</think>在SAP系统中查看生产订单修改记录需通过特定技术方案实现,以下是两种可靠方法: ### 方案一:通过变更凭证表查询(推荐) 1. **执行事务代码** 输入事务代码 `SE16` 或 `SE16N` 进入通用表浏览器 2. **访问核心表** 在表名字段输入: - 修改记录抬头表:`CDHDR` - 修改记录行项目表:`CDPOS` 3. **设置查询条件** 在筛选条件区域输入: ```sql OBJECTCLAS = 'AUFK' -- 对象类固定值表示生产订单 OBJECTID = '生产订单号' -- 如10000001 ``` ![示例筛选条件](https://example.com/sap-filter.png) *图:SE16N查询条件配置示例[^1]* 4. **执行并查看结果** 系统将返回包含字段修改历史的记录: - `FNAME`:被修改字段名(如PLNBEZ=计划数量) - `VALUE_OLD`:原值 - `VALUE_NEW`:新值 - `UDATE`/`UTIME`:修改时间戳 - `USERNAME`:操作用户 ### 方案二:使用预制报表(需权限) 1. **执行事务代码** 输入 `SE38` 进入ABAP编辑器 2. **运行标准报表** 在程序名栏输入 `RCAUFHIS` 执行 3. **设置参数** - 生产订单号:必填 - 日期范围:建议限定避免性能问题 4. **生成修改日志** 报表将输出包含以下信息的清单: ```markdown | 修改日期 | 用户ID | 修改字段 | 原值 | 新值 | |----------|--------|----------|------|------| | 2023.08.15 | USER01 | 计划数量 | 100 | 150 | | 2023.08.16 | USER02 | 状态 | REL | TECO | ``` ### ⚠️ 关键注意事项 1. **权限要求** 需分配以下权限对象: - `S_TABU_NAM` 表访问权限(CDHDR/CDPOS) - `S_DEVELOP` ABAP开发权限(执行SE38时) 2. **数据保留周期** 修改记录默认保留 **90天**(可通过事务代码 `SCU3` 配置保留时长) 3. **性能优化** 查询超过1年的数据时建议: - 使用后台作业执行 - 限制查询字段范围(通过`FNAME`筛选特定字段) > **技术说明**:此功能依赖SAP变更文档机制(Change Document),需在生产订单配置中启用`事务AUFK`的变更记录功能(路径:`SPRO > 生产 > 商店底价控制 > 主数据 > 订单 > 激活生产订单变更记录`)[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东莞寻香苑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值