关于预留单Reservation的更改记录及预留单检查的浅析(二)

关于预留单Reservation的更改记录及预留单检查的浅析(二)

作者:袁云飞(AlbertYuan)- 微信号yuanalbert

以下内容均为原创,希望对初学者有一些辅助作用,本人主要从事MM/QM/WM的相关工作,不专业处请多多指点,十足干货,码字不易,且行且珍惜,加入粉丝您将能看到更多相关主题文章,转载请引用出处,感激不尽;

上一篇为小伙伴们浅析了使用增强EXIT_SAPMM07R_001为预留建立修改记录的方法,其实大家发现这个增强在保存预留单的时候介入,小伙伴们是不是觉得这个增强还能用来检查预留单里的信息,然后报错,以便阻止预留单的保存呢?答案是肯定的,并且完全没有问题,只是介入时机是在记账保存的时候;
下面代码就是在这个增强里,我们通过识别ok_code=YES,表示用户即将整单从数据库删除该预留号,我们不允许这么做所指定的机制;

  IF sy-ucomm eq 'YES'."如果点击的是删除整个预留单,则不允许保存

  MESSAGE E001(00) WITH '不允许整单从数据库删除预留,请在行项目标记删除'.

  ENDIF.

如果我们需要在MB21/MB22创建或修改预留的时候对用户输入数据进行额外的检查,且是在非保存阶段,而是用户在操作数据的时候就开始介入,防止错误发生,并提报相关消息的时候,我们可以使用BADI MB_RESERVATION_BADI来完成该需求,里面的类方法DATA_CHECK就是专门做这个事情的,其介入时间是在方法DATA_MODIFY之后,同时对于预留的屏幕SAPMM07R 0510里的所有的字段都可以进行检查(屏幕可以使用SE51查看);

这个增强里不要去试图更改任何数据库的操作,更不要执行COMMIT WORK语句;如果要提报相关消息,要使用EXTERNAL_MESSAGE,也就是该类里的异常处理方法来提报消息;代码例子如下;

MESSAGE E001(00) WITH '数据有误,无法保存' RAISING EXTERNAL_MESSAGE.

在这里插入图片描述
该方法提供了足够多的可用信息,够我们进行相关的逻辑判断了;

IT_CHANGEABLE该內表提供了本次操作的预留单里可以被修改的字段,当然这个方法里肯定是不能进行修改的,后面我们讲DATA_MODIFY方法的时候会继续这个话题;
在这里插入图片描述
IS_RKPF和IS_RESB返回每次触发时的表头和行项目的数据结构,从中我们看出,该增强是每行都触发增强的,所以返回的不是一个表结构;

I_NEW_ITEM基于上面述说,这个字段的值表示你首次通过增强调用这个行项目,其值就是X,如果再次调用或触发,这个值就是空了;

所以使用这个DATA_CHECK方法我们可以检查每个预留单行项目在回车,屏幕切换,菜单点击时的任何数据,然后完成数据校验并及时提报对应的消息;比如,如果需要在创建预留单的时候必须填入批次号,这个增强是非常适合的;

同样是这个增强,我们来讨论一下方法DATA_MODIFY,如果我们需要在创建,编辑预留单的时候,自动化的填入一些字段的值,或者去按条件逻辑替代用户输入的字段的值的时候,使用这个方法非常合适;

这个方法里是不能提报消息的,但能修改预留单里的字段的值,该增强方法在总览行项目界面回车进入单个行项目明细界面的时候介入,同时,在行项目明细界面切换到不同行项目明细界面的时候也会介入;

方法中IT_CHANGEABLE內表存储了本次预留单操作上能进行修改的字段名字;
CS_RKPF/CS_RESB这两个结构里存储的是每个被触发的预留单行项目的所有字段数据;这些数据是可以进行修改的;

针对这个增强方法,我们来举个例子,比如我们需要限定创建或修改预留单的时候,只要是MVT=311的预留,发出库位只能是7000,接收库位只能是3001,并且需要自动化完成,同时,允许移动字段必须自动设置为空(为后续进行批准移动做前置条件),项目文本必须自动填入创建者名字,日期,时间;

这种情况下,我们使用这个方法来完成所有的自动化的设置;代码如下:

    DATA: zdate(10),"创建及修改日期
          ztime(8)."创建及修改时间

    IF cs_rkpf-BWART EQ '311' AND CS_Rkpf-UMWRK EQ '1000' AND CS_RESB-WERKS EQ '1000'.

      CS_RESB-LGORT = '7000'.
      cs_rkpf-UMLGO = '3001'.
      WRITE sy-datum to zdate USING EDIT MASK '____.__.__'.
      WRITE sy-UZEIT to ztime USING EDIT MASK '__:__:__'.
      CS_RESB-sgtxt = sy-uname && '#' && zdate && '#' && ztime.
      CS_RESB-XWAOK = ''.

    ENDIF.

在这里插入图片描述
以上就是本次讨论的全部内容;

发布了33 篇原创文章 · 获赞 0 · 访问量 904

猜你喜欢

转载自blog.csdn.net/weixin_44853659/article/details/103968897