金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因

业务场景

为了记录从客户或经销商询单到正式下达销售订单的过程并分析,需要记录销售订单创建和修改时的关键信息,其中包括:客户、物料、订单数量、交货日期、更改原因。

解决方案

创建销售订单时自动记录关键信息到自建表。
更改销售订单时弹出更改原因类别及更改明细说明到自建表。

增强点

使用到的增强点有两个:
1.MV45AFZZ程序USEREXIT_SAVE_DOCUMENT_PREPARE:销售订单保存增强点。
2.MV45AFZA程序USEREXIT_REFRESH_DOCUMENT:这个增强点是销售订单刷新前的增强点。(小声bb:这是我能找到的,能用的,点完保存按钮之后最后执行的增强点)。金色传说这个增强点在创建销售订单时,能取到新产生的销售订单编号

程序实现

1.自建表
这里就贴个图,大家根据自己的需要选择即可。
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第1张图片金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第2张图片
2.找到增强点位置,创建隐式增强(小声bb:创建隐式增强的方法百度一堆,这里就不占字数了)。
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第3张图片
3.销售订单保存增强点代码;

*--------------------------------------------------------------------S*
      "S4    LJ   销售订单创建记录关键信息和修改时的关键信息,其中包括:客户、物料、订单数量、交货日期
*                 销售订单修改订单数量和计划行日期时记录修改的关键信息,其中包括:客户、物料、订单数量、交货日期、更改原因             27.07.2021 10:13:05
*   ZTSD_010  记录表   ZTSD_010A 原因类别表
   DATA:gt_data LIKE TABLE OF ztsd_010,
        gs_data LIKE LINE OF gt_data.
    IF sy-tcode EQ 'VA01'."创建时直接保存下关键数据即可
      CLEAR:gs_data.
      LOOP AT xvbap INTO DATA(ds_vbap).
        gs_data-vbeln = xvbak-vbeln.
        gs_data-kunnr = xvbak-kunnr.
        gs_data-uname = sy-uname.
        gs_data-datum = sy-datum.
        gs_data-uzeit = sy-uzeit.
        gs_data-posnr = ds_vbap-posnr.
        gs_data-matnr = ds_vbap-matnr.
        gs_data-wmeng = ds_vbap-kwmeng.
        gs_data-vrkme = ds_vbap-vrkme.
        LOOP AT xvbep INTO DATA(ds_xvbep) WHERE posnr = ds_vbap-posnr AND edatu IS NOT INITIAL.
          gs_data-etenr = ds_xvbep-etenr.
          gs_data-etdat = ds_xvbep-edatu.
        ENDLOOP.
        gs_data-zxglb = '9999'.
        gs_data-zxgxq = '新建'.
        APPEND gs_data TO gt_data.
*        MODIFY ztsd_010 FROM gs_data.
        CLEAR:gs_data.
      ENDLOOP.
     EXPORT gt_data TO MEMORY ID 'ZSOCHANGELOG'.
    ELSE."VA02等修改订单时,要进行修改前后数据的对比
      DATA: lt_value  TYPE TABLE OF sval,
            ls_value  TYPE sval,
            lv_rtn_cd.
      DATA:zmsg TYPE string,
            zkwmeng TYPE vbap-kwmeng,
            zedatu TYPE vbep-edatu,
            zedatux TYPE vbep-edatu.
      CLEAR:lt_value,ls_value,lv_rtn_cd.
****  组装弹出输入框窗口的原因类别和原因详情字段
      ls_value-tabname = 'ZTSD_010A'.
      ls_value-fieldname = 'ZXGLB'.
      ls_value-field_obl = 'X'."设置弹出框字段必输
      ls_value-value = ''."这里可以给字段默认值
      APPEND ls_value TO lt_value.
      CLEAR:ls_value.

      ls_value-tabname = 'ZTSD_010'.
      ls_value-fieldname = 'ZXGXQ'.
      ls_value-value = ''.
      APPEND ls_value TO lt_value.

      LOOP AT xvbap INTO DATA(ds_xvbap)."循环所有行,有变动的才记录
        SELECT SINGLE kwmeng INTO zkwmeng FROM vbap WHERE vbeln = ds_xvbap-vbeln AND posnr = ds_xvbap-posnr.
        SELECT SINGLE edatu INTO zedatu FROM vbep WHERE vbeln = ds_xvbap-vbeln AND posnr = ds_xvbap-posnr."改之前的
        READ TABLE xvbep INTO DATA(ds_edatu) WITH KEY vbeln = ds_xvbap-vbeln posnr = ds_xvbap-posnr."改之后的

****    销售单位订单数量和交货日期日期 时弹出
        IF zkwmeng NE ds_xvbap-kwmeng OR zedatu NE ds_edatu-edatu.
          zmsg = '输入 '&& xvbap-posnr && ' 行的修改原因类别和详情'.
          CALL FUNCTION 'POPUP_GET_VALUES'
          EXPORTING
            popup_title           = zmsg
          IMPORTING
            returncode            = lv_rtn_cd
          TABLES
            fields                = lt_value.

          IF lv_rtn_cd IS INITIAL.
            gs_data-vbeln = xvbak-vbeln.
            gs_data-kunnr = xvbak-kunnr.
            gs_data-uname = sy-uname.
            gs_data-datum = sy-datum.
            gs_data-uzeit = sy-uzeit.
            gs_data-posnr = ds_xvbap-posnr.
            gs_data-matnr = ds_xvbap-matnr.
            gs_data-wmeng = ds_xvbap-kwmeng.
            gs_data-vrkme = ds_xvbap-vrkme.
            LOOP AT xvbep INTO DATA(ds_xvbep1) WHERE posnr = ds_xvbap-posnr AND edatu IS NOT INITIAL.
              gs_data-etenr = ds_xvbep1-etenr.
              gs_data-etdat = ds_xvbep1-edatu.
              CLEAR:ds_xvbep1.
            ENDLOOP.

            READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'ZXGLB'.
            IF sy-subrc = 0.
              SELECT SINGLE zxglb INTO gs_data-zxglb FROM ztsd_010a WHERE zxglb = ls_value-value.
              IF gs_data-zxglb IS INITIAL.
                MESSAGE e005(zsd001).
              ENDIF.
              CLEAR ls_value.
            ENDIF.

            READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'ZXGXQ'.
            IF sy-subrc = 0.
              gs_data-zxgxq = ls_value-value.
              CLEAR ls_value.
            ENDIF.
            APPEND gs_data TO gt_data.
            CLEAR:gs_data.
          ELSEIF lv_rtn_cd EQ 'A'."取消
            MESSAGE e004(zsd001).
          ENDIF.
        ENDIF.
        CLEAR:zkwmeng, zedatu.
      ENDLOOP.
      EXPORT gt_data TO MEMORY ID 'ZSOCHANGELOG'.
    ENDIF.
*--------------------------------------------------------------------E*

金色传说这一步非常重要,因为保存增强点中没有销售订单号,所有把数据放到内存中,在另外的增强点进行接收和更新自建表
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第4张图片
4.销售订单刷新增强点代码:

FORM USEREXIT_REFRESH_DOCUMENT.
ENHANCEMENT 7  ZEN_SD_01.    "active version
*         创建和修改时保存关键信息。  LJ  20210727
 IF sy-tcode EQ 'VA01' OR sy-tcode EQ 'VA02'.
  DATA:gt_data LIKE TABLE OF ztsd_010.
  IMPORT gt_data FROM MEMORY ID 'ZSOCHANGELOG'.

    LOOP AT gt_data INTO DATA(ds_data).
      ds_data-vbeln = xvbak-vbeln."写入订单号
      MODIFY ztsd_010 FROM ds_data.
      CLEAR:ds_data.
    ENDLOOP.

  FREE MEMORY ID 'ZSOCHANGELOG'.
  CLEAR:gt_data.
 ENDIF.
ENDENHANCEMENT.
ENDFORM.

金色传说用完的内存要记得及时释放

成果展示

所有修改了数量或者交货日期的行都会提示输入修改详情
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第5张图片
如果点关闭或取消,则会提示要输入修改原因,会再次弹出上面的输入框。
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第6张图片
以上
不妥之处欢迎留言指正。手动笑脸
欢迎关注公众号,每日更新:
金色传说:SAP-ABAP-销售订单增强:记录销售订单修改信息和修改原因_第7张图片

你可能感兴趣的:(SAP代码分享,sap,abap)