目前新需求:整车A下挂有委外总成件B,总成件B和子件E是层级BOM,且采购类型均为F,信息记录类型均为寄售,按照现在标准MRP逻辑,只能计算第一层级子件需求,无法运行出子件E的需求。

1.实现方式

 1.1自定义表

  ZTMM0093_MRP_WRK

  

  ZTMM0010_MAT_INF:接口-物料主数据明细表

 1.2增强点

  在获取BOM子件中进行增强:函数 GET_STPO 行 311 增加隐式增强点 ZIMP_BADI_MRP_BOM_HIERARCHY

  

  INCLUDE ZMMI0003_MRP_BOM_HIERARCHY程序代码:

 *&---------------------------------------------------------------------*
*& Include ZMMI0003_MRP_BOM_HIERARCHY
*&
*&---------------------------------------------------------------------*
*& Program Name: MRP运行-BOM层级子件
*& Date written: 2018-10-29
*& Author's name: ***
*& Business design:***
*& Last update: 2018-10-29
*& Project Name: ***ERP项目
*& Version: V1.0
*& Modify History:
*& Sketch: MRP运行-BOM层级子件
*&---------------------------------------------------------------------*
*& Variables: 变量
*& MDPSN 采购申请明细
*& MDPSX 订单需求明细(计划订单/生产订单/销售订单/采购订单)
*& MDNBX 订单需求每日汇总
*& CM61X WERKS/PLMOD/BANER/DISER/LIFKZ/TRMPL
*& CM61D MATNR/WERKS
*&---------------------------------------------------------------------*
*& 逻辑:
*& 1.获取工厂,判断配置信息
*& 2.获取BOM第一层级总成件是否含子件信息,
*& 3.判断总成件是否为委外件(查询ZTMM0010_MAT_INF 字段MAKEBUYINDICATOR=CSMT-A)
*& 4.若为委外总成件,则将总成下子件运行MRP
*& 5.子件需求日期 = MRP结果中总成件需求日期 - 总成件收货处理时间 - 子件加工时间(可配置);
*& 6.子件的交货日期 = 子件的需求日期 - 子件收货处理时间
*&---------------------------------------------------------------------*
constants:
lc_check type c value 'X',
lc_stlty type stpo-stlty value 'M',
lc_stlan type mast-stlan value '',
lc_stlal type mast-stlal value '',
lc_postp type stpo-postp value 'L',
lc_makebuyindicator type string value 'CSMT-A',
lc_capid type tc04-capid value 'PP01',
lc_beskz_f type string value 'F',
lc_mtart_zycl type string value 'ZYCL'.
data:
lv_werks like marc-werks,
lv_posnr type stpob-posnr,
lv_index type cszalt-index,
lv_i_matnr type csap_mbom-matnr,
lv_i_plant type csap_mbom-werks,
lv_i_usage type csap_mbom-stlan,
lv_i_alter type csap_mbom-stlal,
lv_i_datuv type datuv_bi,
lv_i_datub type datub_bi.
data:
ls_mrp like ztmm0093_mrp_wrk,
ls_wa type line of cs01_stpob_tab,
ls_matinf like ztmm0010_mat_inf,
ls_i_stpo type stpo_api02.
data:
lt_wa like table of stpob,
lt_addwa type table of cszalt,
lt_stb type table of stpo,
lt_e_stpo type table of stpo_api02.
field-symbols:
<fs_stpo> like stpo,
<fs_estpo> like stpo_api02,
<fs_cwa> like stpob,
<fs_cadd> like cszalt,
<fs_wa> like stpob,
<fs_addwa> like cszalt. read table wa into ls_wa index . "获取工厂
select single wrkan
into lv_werks
from stko
where stlnr = ls_wa-stlnr
and stlty = ls_wa-stlty. select single *
into ls_mrp
from ztmm0093_mrp_wrk
where werks = lv_werks
and fg_bomlevel = lc_check.
if sy-subrc = and ls_mrp-vl_tcode cs sy-tcode.
if ls_mrp-fg_exitdg = lc_check.
break-point.
endif. loop at wa assigning <fs_wa>.
clear:lt_stb,ls_matinf.
"判断是否委外总成件
select single
max( datum ) as datum
max( uzeit ) as uzeit
makebuyindicator
into corresponding fields of ls_matinf
from ztmm0010_mat_inf
where partbase = <fs_wa>-idnrk
group by makebuyindicator.
if ls_matinf-makebuyindicator = lc_makebuyindicator.
* "获取总成件BOM子件
* "BOM执行函数涉及嵌套问题,CK11N成本核算报错
* call function 'CS_BOM_EXPL_MAT_V2'
* exporting
* capid = lc_capid "PP01生产用途
* datuv = sy-datum
* ehndl = '1'
* emeng = <fs_wa>-menge
* mktls = 'X'
* mehrs = '' "分解多层BOM
* mmory = '1'
* mtnrv = <fs_wa>-idnrk
* stlan = '1' "BOM用途
* stpst = 0
* svwvo = 'X'
* werks = lv_werks
* tables
* stb = lt_stb
* exceptions
* alt_not_found = 1
* call_invalid = 2
* material_not_found = 3
* missing_authorization = 4
* no_bom_found = 5
* no_plant_data = 6
* no_suitable_bom_found = 7
* conversion_error = 8
* others = 9. clear:ls_i_stpo,lv_i_matnr,lv_i_plant,lv_i_usage,lv_i_alter,lv_i_datuv,lv_i_datub.
clear:lt_e_stpo,lt_e_stpo[]. lv_i_matnr = <fs_wa>-idnrk.
lv_i_plant = lv_werks.
lv_i_usage = lc_stlan.
"lv_i_alter = alter.
lv_i_datuv = datuv.
lv_i_datub = datub. "获取总成件BOM清单
call function 'CSAP_MAT_BOM_ITEM_SELECT'
exporting
i_stpo = ls_i_stpo
material = lv_i_matnr
plant = lv_i_plant
bom_usage = lv_i_usage
alternative = lv_i_alter
fl_material_check = lc_check
fl_foreign_key_check = lc_check
valid_from = lv_i_datuv
valid_to = lv_i_datub
tables
t_stpo = lt_e_stpo
exceptions
error =
others = .
if sy-subrc <> .
* Implement suitable error handling here
else.
loop at lt_e_stpo assigning <fs_estpo>.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <fs_estpo>-component
importing
output = <fs_estpo>-component.
endloop.
endif. select *
into corresponding fields of table lt_stb
from mast as a inner join stpo as b
on a~stlnr = b~stlnr
where a~stlan = lc_stlan
and a~stlal = lc_stlal
and a~werks = lv_werks
and a~matnr = <fs_wa>-idnrk
and b~stlty = lc_stlty
and b~lkenz = space
and b~datuv <= sy-datum
and b~postp = lc_postp. loop at lt_stb assigning <fs_stpo>.
read table lt_e_stpo assigning <fs_estpo>
with key item_guid = <fs_stpo>-guidx.
if sy-subrc <> .
continue.
endif. select single count(*)
from mara inner join marc
on mara~matnr = marc~matnr
where mara~matnr = <fs_stpo>-idnrk
and mara~mtart = lc_mtart_zycl
and marc~beskz = lc_beskz_f.
if sy-subrc = .
append initial line to lt_wa assigning <fs_cwa>.
move-corresponding <fs_wa> to <fs_cwa>.
<fs_cwa>-idnrk = <fs_stpo>-idnrk.
<fs_cwa>-menge = <fs_stpo>-menge.
<fs_cwa>-meins = <fs_stpo>-meins.
<fs_cwa>-posnr = space.
unassign <fs_cwa>. read table add_wa assigning <fs_addwa>
with key stlkn = <fs_wa>-stlkn
stpoz = <fs_wa>-stpoz.
if sy-subrc = .
append initial line to lt_addwa assigning <fs_cadd>.
move-corresponding <fs_addwa> to <fs_cadd>.
<fs_cadd>-index = space.
unassign:<fs_addwa>,<fs_cadd>.
endif.
endif.
endloop.
endif.
endloop. if lt_wa[] is not initial.
clear:lv_index,lv_posnr. sort wa by posnr descending.
sort add_wa by index descending. read table wa assigning <fs_wa> index .
if sy-subrc = .
lv_posnr = <fs_wa>-posnr.
endif. read table add_wa assigning <fs_addwa> index .
if sy-subrc = .
lv_index = <fs_addwa>-index.
endif. loop at lt_wa assigning <fs_cwa>
where posnr = space.
lv_posnr = lv_posnr + . call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = lv_posnr
importing
output = lv_posnr . <fs_cwa>-posnr = lv_posnr.
endloop. loop at lt_addwa assigning <fs_cadd>
where index = space.
lv_index = lv_index + .
<fs_cadd>-index = lv_index.
endloop. append lines of lt_wa[] to wa[].
append lines of lt_addwa[] to add_wa[].
endif. endif.

2.系统测试

 2.1基础数据

  

  整车物料:TWL-ZZCH-003

  总成件:TWL0824(包含子件TWL0825)

  

  总成件TWL0824为委外件(类型CSMT-A)

  

  配置表ZTMM0093_MRP_WRK :工厂3302启用BOM层级子件运算,对应的事务码:MD41/MD42/CK11N

 2.2测试-MRP运行

  创建独立需求MD61:

  

  MRP运行MD41:

  

  查看子件 TWL0825 需求清单MD04:

  

  查看整车TWL-ZZCH-003成本核算CK11N:总成件TWL0824与其子件TWL0825都进行核算

ABAP-增强-层级BOM-AB件业务的更多相关文章

  1. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  2. 通用数据水平层级选择控件v0.70升级版使其支持jQuery v1.9.1

    升级原因:作者原来脚本支持的jquery版本太低了,查找了下资料,使得它能支持最新版本的jquery 备注说明:脚本代码源作者跟源文出处很难找,只能在此特感谢他的分享. 更新部分: 1.新版本不再支持 ...

  3. Android 可单选多选的任意层级树形控件

    花了几天研究了下鸿扬大神的博客<Android打造任意层级树形控件,考验你的数据结构和设计>,再结合公司项目改造改造,现在做个笔记. 先看看Demo的实现效果.首先看的是多选效果 再看看单 ...

  4. Android 打造任意层级树形控件 考验你的数据结构和设计

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40212367,本文出自:[张鸿洋的博客] 1.概述 大家在项目中或多或少的可能会 ...

  5. Android 打造任意层级树形控件 考验你的数据结构和设计

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40212367,本文出自:[张鸿洋的博客] 1.概述 大家在项目中或多或少的可能会 ...

  6. Android 打造随意层级树形控件 考验你的数据结构和设计

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40212367,本文出自:[张鸿洋的博客] 1.概述 大家在项目中或多或少的可能会 ...

  7. 浏览器自动化的一些体会6 增强的webBrowser控件

    这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示 ...

  8. DevExpress WinForms v19.1新版亮点:Tree List等控件性能增强

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  9. BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

    介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...

随机推荐

  1. NTLM 了解

    NTLM是NT LAN Manager的缩写,这也说明了协议的来源.NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容.Windo ...

  2. Jmeter参数跨线程组传递

    1.利用BeanShell, 请求==>后置==>beanshellpostprocessorScripts内写:props.put("user_name"," ...

  3. 使用MQ要考虑的问题

    一般现代软件系统都会用到MQ,几乎所有开发人员也都会想到用MQ,但真正能用好的人估计不多,因为要用好MQ有很多方面问题要考虑: 1.在原直接交互的系统间增加MQ中间层,MQ的性能.可靠程度会严重影响原 ...

  4. 后台取IE的相关信息

    HttpBrowserCapabilities b = Request.Browser; Response.Write("浏览器名称和版本号:" + b.Type + " ...

  5. phper必知必会之数组指针(四)

    数组指针 1.介绍几个数组指针的函数 current() - 返回数组中的当前单元 end() - 将数组的内部指针指向最后一个单元 prev() - 将数组的内部指针倒回一位 reset() - 将 ...

  6. Django mark_safe

    不用mark_safe: 用mark_safe: 用法: from django.shortcuts import render from django.utils.safestring import ...

  7. DokuWiki

    DokuWiki 1.点我,点我,dokuwiki使用教程一 2.点我,点我,dokuwiki使用教程二 3.点我,点我,dokuWiki语法 4.点我,点我,WARP插件

  8. android 布局入门

    一.LinearLayout RelativeLayout 这俩的区别详见这里 http://www.cnblogs.com/duanweishi/p/4244233.html 二.android:l ...

  9. bzoj 4911: [Sdoi2017]切树游戏

    考虑维护原树的lct,在上面dp,由于dp方程特殊,均为异或卷积或加法,计算中可以只使用fwt后的序列 v[w]表示联通子树的最浅点为w,且不选w的splay子树中的点 l[w]表示联通子树的最浅点在 ...

  10. DNS 解释 --- 解析域名给电脑,电脑只看得懂1.1.1.1.1 这些ip地址 所以要翻译给他

    把域名翻译成IP地址的软件称为域名系统,即DNS 当网络上的一台客户机需要访问某服务器上的资源时,客户机的用户只需要在浏览器中的地址文本框中输入该服务器的网址.就可以与该服务器进行连接,计算机的硬件只 ...