ABAP MD04增强排除MRP元素

场景

MD04跑出来很多MRP元素,用户想手工控制某些MRP元素不参与运算
在这里插入图片描述

分析

增强点还蛮好找的,控制MRP元素是否参与运算用下面的se19三代增强点就可以,打个断点看下MD04进的哪个增强点就行
旧版本的用这个:MD_CHANGE_MRP_DATA
新版本的用这个:MD_ADD_ELEMENTS
这个项目的客户SAP版本比较新,用的MD_ADD_ELEMENTS
只要在这个增强点中找到用户需要排除的行项目,将该行的需求数量置空,同时将参数CH_CHANGED赋值’X’即可
在这里插入图片描述
看到这好像还挺简单的,只要拉个报表把MD04的行项目拉出来,把需要排除的行项目打上标记,在增强点读取出需要排除掉的行项目即可
对于一般的MRP元素上述方案完全可行,但是有些MRP元素是多层的,比如工单涉及的其他下层物料MRP元素也需要一起排除,所以此时用户实际上的需求并不是按屏幕上MD04的行项目去排除,而是按订单去排除…跟业务沟通了好些时候才弄清楚,可能我以前没做过MRP增强而且也比较笨
分析完了就开始冻手观察前台的数据了,通过BAPI【MD_STOCK_REQUIREMENTS_LIST_API】输入工厂和物料可以拉取前台MD04的内表(实际MD04也是用的这个BAPI),前台的内表对应BAPI中的mdezx,后台增强的内表对应mdpsx
在这里插入图片描述
可以通过mdezx-aline找到对应的mdpsx,aline这个字段就代表前台md04内表mdezx在后台增强内表mdpsx的索引值
在这里插入图片描述
现在前后台内表的关联关系也有了,下一步就是排除所有相关的MRP元素对应的单据,业务给我做了条数据,左侧是最上层的工单,右侧是此工单产生的需求,都是要排除掉的

以此工单10000000560为例,增强的内表mdpsx中字段del12,delnr,delps三个字段组合起来可以作为唯一值关联到后续两个MD04的MRP元素,也是找了不少数据做校验才得出这个结论,所以只要能够在MD04增强的内表中组合这三个字段,在后台表中捞取得到就把该行MRP元素排除

实现

我就只放关键代码和自建表了
MRP排除元素自建表,内表mdpsx中字段del12,delnr,delps组合起来形成的主键MRP_ELMENTS才是关键,其他都是没啥用的字段,不重要
在这里插入图片描述
报表取数逻辑

" CODE PART1 
" 报表内表结构
TYPES:BEGIN OF ty_output,

        matnr       TYPE marc-matnr           , " 物料
        maktx       TYPE makt-maktx           , " 物料描述
        werks       TYPE marc-werks           , " 工厂
        name1       TYPE t001w-name1          , " 工厂描述
        del12       TYPE mdps-del12,
        delnr       TYPE mdps-delnr,
        delps       TYPE mdps-delps,
        excld       TYPE c                    , " 排除
        mrp_elments TYPE zppt025-mrp_elments  , " MRP元素号 DEL12+DELNR+DELPS组合字段
        flag        TYPE c                    , " 修改标记
        delb1       TYPE t457t-delb1          . " MRP元素描述

        INCLUDE STRUCTURE mdez.

TYPES:END OF ty_output.

" CODE PART2 
    " 根据物料和工厂获取MD04物料信息
    CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
      EXPORTING
        matnr = ls_data-matnr
        werks = ls_data-werks
      TABLES
        mdpsx = lt_mdps    " MD04前台内表
        mdezx = lt_mdez.   " 后台增强的内表

	" 将前后台的表根据aline做匹配,mdezx中数据量会多一些,具体原因不清楚
    LOOP AT lt_mdez INTO DATA(ls_mdez).
      lv_tabix = sy-tabix.
      READ TABLE lt_zppt024 TRANSPORTING NO FIELDS WITH KEY delkz = ls_mdez-delkz BINARY SEARCH.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING ls_mdez TO gs_output.
        READ TABLE lt_mdps INTO DATA(ls_mdps) INDEX gs_output-aline.
        IF sy-subrc = 0.
          gs_output = VALUE #( BASE gs_output
                               del12       = ls_mdps-del12
                               delnr       = ls_mdps-delnr
                               delps       = ls_mdps-delps
                               mrp_elments = ls_mdps-del12 && ls_mdps-delnr && ls_mdps-delps ). " 重点就是这个字段,后续需要存到数据库中
        ENDIF.
        APPEND gs_output TO gt_output.
      ENDIF.
    ENDLOOP.

报表成品长这样,用户勾选哪行要删除的话,对应的字段del12,delnr,delps组合起来形成主键mrp_elments保存到数据库
在这里插入图片描述
增强代码

  METHOD if_ex_md_add_elements~add_change_elements.

    TYPES:BEGIN OF ty_data,

            index       TYPE i                    , " 索引
            mrp_elments TYPE zppt025-mrp_elments  , " MRP元素号 DEL12+DELNR+DELPS组合字段

          END OF ty_data.

    DATA: lv_index TYPE i,
          lt_data  TYPE TABLE OF ty_data,
          lr_delkz TYPE RANGE OF zppt024-delkz.

    IF sy-tcode = 'SE38' OR sy-tcode = 'ZPPR026'. " 跑程序的时候需要拉所有清单,不做过滤
      EXIT.
    ENDIF.

    " 获取配置表,拉取需要排除的订单类型
    " zppt024这个表也是个配置表,用户想在MD04排除某一特定类型的单据,好像是预留单被排除掉了...
    SELECT
      *
    FROM zppt024
    WHERE
      excld = 'X'
    INTO TABLE @DATA(lt_zppt024).
    SORT lt_zppt024 BY delkz.

    lr_delkz[] = VALUE #( FOR lw_zppt024 IN lt_zppt024
                          ( sign = 'I' option = 'EQ' low = lw_zppt024-delkz ) ).


    " 拉取所有元素,预处理索引和MRP元素
    LOOP AT ch_copy_mdpsx INTO DATA(ls_mdps).
      lt_data = VALUE #( BASE lt_data
                         ( index       = lv_index + 1
                           mrp_elments = ls_mdps-del12 && ls_mdps-delnr && ls_mdps-delps ) ).

      " 工单特殊处理,下钻的时候有可能带上预留单,所以要通过这个方式筛选出下钻的工单
      lt_data = VALUE #( BASE lt_data
                         ( index       = lv_index + 1
                           mrp_elments = ls_mdps-del12 && ls_mdps-delps ) ).

      " 委外订单特殊处理,下钻的时候需要通过AUFVR和POSVR找到上层的委外订单,才能删除下钻的预留单
      IF ls_mdps-delvr = 'BE' AND ls_mdps-delkz = 'BB'. " 采购 & 外协
        lt_data = VALUE #( BASE lt_data
                           ( index       = lv_index + 1
                             mrp_elments = ls_mdps-aufvr && ls_mdps-posvr ) ).
      ENDIF.

      lv_index += 1.
    ENDLOOP.
    SORT lt_data BY index mrp_elments.
    DELETE ADJACENT DUPLICATES FROM lt_data COMPARING ALL FIELDS.

    IF lt_data IS INITIAL.
      EXIT.
    ENDIF.

    " 读取需要被排除的mrp_elments
    SELECT
      tb~index,
      zppt025~mrp_elments
    FROM zppt025
      INNER JOIN @lt_data AS tb ON tb~mrp_elments = zppt025~mrp_elments              " 其次在MRP元素中删除所有该单据
    WHERE
      zppt025~exclude     = 'X'
    INTO TABLE @DATA(lt_zppt025).
    SORT lt_zppt025 BY index.
    DELETE ADJACENT DUPLICATES FROM lt_zppt025 COMPARING index.

    IF lt_zppt025 IS INITIAL.
      EXIT.
    ENDIF.

	" 按mrp_elments排除单据
    LOOP AT lt_zppt025 INTO DATA(ls_zppt025).
      READ TABLE ch_copy_mdpsx ASSIGNING FIELD-SYMBOL(<fs_mdps>) INDEX ls_zppt025-index.
      IF sy-subrc = 0.
        CLEAR <fs_mdps>-mng01.
        ch_changed = 'X'.
      ENDIF.
    ENDLOOP.

	" 按单据类型排除单据
    IF lr_delkz[] IS NOT INITIAL.
      LOOP AT ch_copy_mdpsx ASSIGNING <fs_mdps> WHERE delkz IN lr_delkz.
        CLEAR <fs_mdps>-mng01.
        ch_changed = 'X'.
      ENDLOOP.
    ENDIF.

  ENDMETHOD.

收工!追番!为美好的世界献上祝福!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Socket中的心跳机制(心跳包)

Socket中的心跳机制(心跳包) 1. 什么是心跳机制&#xff1f;(心跳包) 在客户端和服务端长时间没有相互发送数据的情况下&#xff0c;我们需要一种机制来判断连接是否依然存在。直接发送任何数据包可以实现这一点&#xff0c;但为了效率和简洁&#xff0c;通常发送一个空包&am…

数据结构 | 详解二叉树——堆与堆排序

&#x1f95d;堆 堆总是一棵完全二叉树。 大堆&#xff1a;父节点总是大于子节点。 小堆&#xff1a;父节点总是小于子节点。 注意&#xff1a;1.同一个节点下的两个子节点并无要求先后顺序。 2.堆可以是无序的。 &#x1f349;堆的实现 &#x1f334;深度剖析 1.父节点和子…

【传知代码】自监督高效图像去噪(论文复现)

前言&#xff1a;在数字化时代&#xff0c;图像已成为我们生活、工作和学习的重要组成部分。然而&#xff0c;随着图像获取方式的多样化&#xff0c;图像质量问题也逐渐凸显出来。噪声&#xff0c;作为影响图像质量的关键因素之一&#xff0c;不仅会降低图像的视觉效果&#xf…

python基础知识总结(第一节)

一、python简介&#xff1a; Python是一种解释型&#xff0c;面向对象的高级语言。 Pyhton的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法&#xff1a;…

【busybox记录】【shell指令】mkfifo

目录 内容来源&#xff1a; 【GUN】【mkfifo】指令介绍 【busybox】【mkfifo】指令介绍 【linux】【mkfifo】指令介绍 使用示例&#xff1a; 创建管道文件 - 创建的时候同时指定文件权限 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来…

月赚2万佣金的AI数字人,已成为新型带货神器,完整制作教程分享

大家好&#xff0c;我是设计师阿威 今天和大家分享一下用AI绘画制作数字人带货的副业创收教程&#xff0c;目前数字人类型的账号在短视频平台上&#xff0c;数字人带货能力非常强&#xff01; 今天我会分享4个爆款数字人账号案例&#xff0c;深度讲解目前数字人的最新玩法。 …

开源代码分享(31)-计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

参考文献&#xff1a; [1]孙惠娟,刘昀,彭春华,等.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度[J].电网技术,2021,45(09):3534-3545.DOI:10.13335/j.1000-3673.pst.2020.1720. 1.摘要 为了促进多能源互补及能源低碳化&#xff0c;提出了计及电转气协同的含碳捕集与垃…

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象&#xff0c;new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

Web会话管理

一、会话管理的概念&#xff1a; 在人机交互时&#xff0c;会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程会话管理分类: 桌面会话管理、浏览器会话管理、Web服务器的会话管理。 二、为什么需要会话管理&#xff1f; HTTP是一种无状态协议&#xff0c;一次请…

day12

第一题 本题我们可以使用以下方法&#xff1a; 方法一&#xff1a; 使用hash表<元素&#xff0c;出现次数>来统计字符串中不同元素分别出现的次数&#xff0c;当某一个元素的次数大于1时&#xff0c;返回false&#xff0c;如果每个元素的出现次数都为1&#xff0c;则返回…

ABB 控制柜

1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴计算机板的接口、连接安全面板的接口、不同的现场总线卡接口(比…

web刷题记录(1)

[GXYCTF 2019]Ping Ping Ping 进入页面&#xff0c;发现有一个传入参数的框&#xff0c;目的就是为了让我们通过参数传入内容来执行代码。这里先传入本地ip&#xff0c;方便后面的ping命令运行 ls命令来查看&#xff0c;目录中的文件 传入后&#xff0c;发现目录下有flag.php,…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

攀爬二叉树,发现新的美

二叉树 什么是二叉树? 二叉树的基础概念? 性质? 问题? 文章目录 二叉树一、二叉树的概念(一)认识二叉树(二)二叉树的性质 二、遍历二叉树1.前序遍历2.中序遍历3.后序遍历4.层序遍历 三丶创建二叉树总结 一、二叉树的概念 (一)认识二叉树 二叉树是一种非线性的数据结构,…

NSSCTF-Web题目4

[SWPUCTF 2021 新生赛]hardrce 1、题目 2、知识点 rce&#xff1a;远程代码执行、url取反编码 3、解题思路 打开题目 出现一段代码&#xff0c;审计源代码 题目需要我们通过get方式输入变量wllm的值 但是变量的值被过滤了&#xff0c;不能输入字母和\t、\n等值 所以我们需…

目标检测 | R-CNN、Fast R-CNN与Faster R-CNN理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1af4y1m7iL?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、R-CNN R-CNN&#xff08;Region with CNN feature&#xff09;是由Ross Girshick在2014年提出的&#xff0c;在PAS…

mysql中InnoDB的统计数据

大家好。我们知道&#xff0c;mysql中存在许多的统计数据&#xff0c;比如通过SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;今…

未在计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序和未在本地计算机上注册“microsoft.ACE.OLEDB.12.0”提供程序

程序运行出现下图的错误&#xff0c; 或者下图的错误&#xff0c; 首先看一下是不是运行的程序的位数&#xff08;32/64&#xff09;不对&#xff1b; 查看系统位数的方法如下图&#xff1b;下图显示是64位操作系统&#xff1b; 如果运行的程序的位数没有问题&#xff1b; 则需…

Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计

主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步相量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; ②并采用牛顿-拉夫逊方法进行系统潮流计算&#xff0c;结果作为理论分…