SAP中多层扩展有效地bom

功能: 根据指定的Mbom 以及 序列号 和有效期来查找有效的Mbom

(假设 Mbom的 变更 包括 按有效期 和 按序列号)

函数组:ZPLM_BOM_FG

1 function module:

(1) 读取单层的有效Mbom

ZPLM_GET_USED_BOM

import:

P_SERNR like AEEF-SERNR_LO 序列号

P_DATUV like AENR-DATUV 开始生效日期

P_MATNR like MAST-MATNR 物料号

P_WERKS like MAST-WERKS 工厂

P_STLAN like MAST-STLAN BOM用途

P_STLAL like MAST-STLAL 可选的BOM

tables:

TAB_BOMlike ZPLM_BOM_USE 查找使用的bom用到的结构

source code:

<!--StartFragment --> <style type="text/css"> SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } </style>FUNCTIONzplm_get_used_bom.
*"----------------------------------------------------------------------
*"*"Localinterface:
*"IMPORTING
*"VALUE(P_SERNR)LIKEAEEF-SERNR_LO
*"VALUE(P_DATUV)LIKEAENR-DATUVOPTIONAL
*"VALUE(P_MATNR)LIKEMAST-MATNR
*"VALUE(P_WERKS)LIKEMAST-WERKSOPTIONAL
*"VALUE(P_STLAN)LIKEMAST-STLAN
*"VALUE(P_STLAL)LIKEMAST-STLALOPTIONAL
*"TABLES
*"TAB_BOMSTRUCTUREZPLM_BOM_USE
*"----------------------------------------------------------------------


CHECKp_matnrISNOTINITIAL
ANDp_werksISNOTINITIAL
ANDp_stlanISNOTINITIAL.



DATA:v_datuvTYPEcapp_itm-datuv,
v_stltyTYPEstko-stlty,
v_stlalTYPEstko-stlal,
v_stlnrTYPEstko-stlnr,
v_werksTYPEmkal-werks,
v_BMENGtypestko-BMENG.

DATA:v_objktTYPEaeoi-objkt,
v_usobjTYPEaeoi-usobj.


DATA:lt_exp_bom_itemTYPESTANDARDTABLEOFcapp_itmWITHHEADERLINE.




v_stlty='M'.
v_werks=p_werks.
IFp_stlalISINITIAL.
v_stlal='1'.
ELSE.
v_stlal=p_stlal.
ENDIF.

IFp_datuvISINITIAL.
v_datuv=sy-datum.
ELSE.
v_datuv=p_datuv.
ENDIF.


*得到bom单号and可选bom
SELECTSINGLEm~stlnrm~stlaln~BMENGINTO(v_stlnr,v_stlal,v_BMENG)
FROMmastASmINNERJOINstkoASnONm~stlnr=n~stlnrANDm~stlal=n~stlal
WHEREm~matnr=p_matnrANDn~stlty=v_stlty
ANDm~stlal=v_stlalANDm~werks=p_werks
ANDm~stlan=p_stlan.
IFsy-subrc=0.

*读取有效期内的bom
CALLFUNCTION'CABM_READ_BOM_ITEM'
EXPORTING
i_stlty=v_stlty
i_stlnr=v_stlnr
i_stlal=v_stlal
i_date_from=v_datuv
i_werks=v_werks
TABLES
exp_bom_item=lt_exp_bom_item.

*如果有序列号参数,则处理序列号变更的组件
IFp_sernrISNOTINITIAL.

DATA:lt_posTYPETABLEOFty_pos,
ls_posTYPEty_pos.

DATA:lt_aeoiTYPETABLEOFty_aeoi,
ls_aeoiTYPEty_aeoi.

DATA:lt_aeefTYPETABLEOFty_aeef,
ls_aeefTYPEty_aeef.

DATA:lt_maktTYPETABLEOFty_makt,
ls_maktTYPEty_makt.

DATA:lt_marcTYPETABLEOFty_marc,
ls_marcTYPEty_marc.


CONCATENATEv_stltyv_stlnrINTOv_objkt.


*查询所有序列号变更的
SELECTa~idnrka~mengea~posnra~postpa~meinsa~aennr
INTOCORRESPONDINGFIELDSOFTABLElt_pos
FROMstpoASaINNERJOINstasASb
ONa~stlnr=b~stlnr
ANDa~stlty=b~stlty
ANDa~stlkn=b~stlkn
INNERJOINaenrASc
ONa~aennr=c~aennr
WHEREa~stlnr=v_stlnr
ANDb~stlal=v_stlal
ANDa~stlty=v_stlty
ANDa~postpIN('L','X')
ANDc~clint=5
.
*查询序列号变更区间和日期
IFsy-subrc=0.
*查询序列号变更日期
SELECTaennrobjktusobjobjdt
INTOTABLElt_aeoi
FROMaeoi
FORALLENTRIESINlt_pos
WHEREaennr=lt_pos-aennr
ANDaetyp='02'
ANDobjkt=v_objkt.
*查询序列号区间
SELECTaennrsernr_losernr_hi
INTOTABLElt_aeef
FROMaeef
FORALLENTRIESINlt_pos
WHEREaennr=lt_pos-aennr.

LOOPATlt_posINTOls_pos.
CLEARv_usobj.
*获得usobj
PERFORMget_usobjUSING
p_matnrp_werksp_stlanv_usobj.

READTABLElt_aeoiINTOls_aeoiWITHKEY
aennr=ls_pos-aennr
objkt=v_objkt
usobj=v_usobj.
IFsy-subrc=0.
ls_pos-objdt=ls_aeoi-objdt.
ENDIF.

READTABLElt_aeefINTOls_aeefWITHKEY
aennr=ls_pos-aennr.
IFsy-subrc=0.
ls_pos-sernr_lo=ls_aeef-sernr_lo.
ls_pos-sernr_hi=ls_aeef-sernr_hi.
ENDIF.
MODIFYlt_posFROMls_pos.
ENDLOOP.
ENDIF.

DELETElt_posWHEREobjdt>v_datuv."删除所有变更日期为应用日期之后的
DELETElt_posWHEREsernr_lo>p_sernr
ORsernr_hi<p_sernr."删除更改的序列号区间在当前序列号之外的

CLEARtab_bom.REFRESHtab_bom.
IFlt_pos[]ISNOTINITIAL.
*删除掉重复的数据
SORTlt_posDESCENDINGBYidnrkposnrobjdt.
DELETEADJACENTDUPLICATESFROMlt_posCOMPARINGidnrkposnrobjdt.
*用序列号变更的数量更新到bom中
LOOPATlt_exp_bom_item.
READTABLElt_posINTOls_pos
WITHKEYidnrk=lt_exp_bom_item-idnrk
posnr=lt_exp_bom_item-posnr.
IFsy-subrc=0.
lt_exp_bom_item-menge=ls_pos-menge.
MODIFYlt_exp_bom_item.
ENDIF.
ENDLOOP.

*把序列号变更新加的组件加进去
LOOPATlt_posINTOls_pos.
READTABLElt_exp_bom_item
WITHKEYidnrk=ls_pos-idnrk
posnr=ls_pos-posnr.
IFsy-subrc<>0.
CLEARlt_exp_bom_item.
MOVE-CORRESPONDINGls_posTOlt_exp_bom_item.
APPENDlt_exp_bom_item.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
*把使用的bom放到tab_bom表中
IFlt_exp_bom_item[]ISNOTINITIAL.
LOOPATlt_exp_bom_item.
MOVE-CORRESPONDINGlt_exp_bom_itemTOtab_bom.
tab_bom-matnr=lt_exp_bom_item-idnrk.
tab_bom-stlnr=v_stlnr.
tab_bom-stlal=v_stlal.
tab_bom-BMENG=v_BMENG.
APPENDtab_bom.
ENDLOOP.
ENDIF.

*读取物料描述
IFtab_bom[]ISNOTINITIAL.
SELECTmatnrmaktxFROMmakt
INTOTABLElt_makt
FORALLENTRIESINtab_bom
WHEREmatnr=tab_bom-matnr
ANDspras=sy-langu.

SELECTmatnrwerksbeskzsobslFROMmarc
INTOTABLElt_marc
FORALLENTRIESINtab_bom
WHEREmatnr=tab_bom-matnr
ANDwerks=P_WERKS.


LOOPATtab_bom.
READTABLElt_maktINTOls_makt
WITHKEYmatnr=tab_bom-matnr.
IFsy-subrc=0.
tab_bom-maktx=ls_makt-maktx.
MODIFYtab_bom.
ENDIF.

READTABLElt_marcINTOls_marc
WITHKEYmatnr=tab_bom-matnr
werks=P_WERKS
.
IFsy-subrc=0.
tab_bom-beskz=ls_marc-beskz.
tab_bom-sobsl=ls_marc-sobsl.
MODIFYtab_bom.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDFUNCTION.

(2) 读取多层层的有效Mbom

ZPLM_GET_USED_BOM_EXP

import:

P_SERNR like AEEF-SERNR_LO 序列号

P_DATUV like AENR-DATUV 开始生效日期

P_MATNR like MAST-MATNR 物料号

P_WERKS like MAST-WERKS 工厂

P_STLAN like MAST-STLAN BOM用途

P_STLAL like MAST-STLAL 可选的BOM

tables:

TAB_BOMlike ZPLM_BOM_USE 查找使用的bom用到的结构

source code:

<!--StartFragment --> <style type="text/css"> SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } </style>FUNCTIONZPLM_GET_USED_BOM_EXP.
*"----------------------------------------------------------------------
*"*"Localinterface:
*"IMPORTING
*"VALUE(P_SERNR)LIKEAEEF-SERNR_LO
*"VALUE(P_DATUV)LIKEAENR-DATUVOPTIONAL
*"VALUE(P_MATNR)LIKEMAST-MATNR
*"VALUE(P_WERKS)LIKEMAST-WERKSOPTIONAL
*"VALUE(P_STLAN)LIKEMAST-STLAN
*"VALUE(P_STLAL)LIKEMAST-STLALOPTIONAL
*"TABLES
*"TAB_BOMSTRUCTUREZPLM_BOM_USE
*"----------------------------------------------------------------------


CHECKp_matnrISNOTINITIAL
ANDp_werksISNOTINITIAL
ANDp_stlanISNOTINITIAL.

data:cindex2typetext10.
data:ileveltypei.
data:cleveltypetext20.

data:iratetypeKMPMG.

oindex=0.
cindex=oindex.
oindex=1.
cindex2=oindex.


ilevel=0.
clevel='0'.

irate=1.





refreshit_bom.clearit_bom.

it_bom-matnr=p_matnr.
it_bom-myid=cindex2.
it_bom-ilevel=clevel.
it_bom-pid=cindex.
it_bom-irate=irate.
appendit_bom.


cindex=oindex.
cindex2=cindex.
performget_exp_bomusing
p_sernr
p_datuv
p_matnr
p_werks
p_stlan
p_stlal
cindex2
ilevel
irate.
ifit_bomisnotinitial.
appendlinesofit_bomtotab_bom.
endif.

ENDFUNCTION.

2 definetions:

<!--StartFragment --> <style type="text/css"> SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S52 { color: #0000FF; } </style>FUNCTION-POOLzplm_bom_fg."MESSAGE-ID..


TYPES:BEGINOFty_pos,
idnrkLIKEstpo-idnrk,"组件
mengeLIKEstpo-menge,
posnrLIKEstpo-posnr,"项目
postpLIKEstpo-postp,
meinsLIKEstpo-meins,
objdtTYPEaeoi-objdt,
aennrLIKEstpo-aennr,
sernr_loTYPEaeef-sernr_lo,
sernr_hiTYPEaeef-sernr_hi,
ENDOFty_pos.

TYPES:BEGINOFty_aeoi,
aennrLIKEaeoi-aennr,
objktLIKEaeoi-objkt,
usobjLIKEaeoi-usobj,
objdtTYPEaeoi-objdt,
ENDOFty_aeoi.


TYPES:BEGINOFty_aeef,
aennrLIKEaeef-aennr,
sernr_loLIKEaeef-sernr_lo,
sernr_hiLIKEaeef-sernr_hi,
ENDOFty_aeef.

TYPES:BEGINOFty_makt,
matnrTYPEmakt-matnr,
maktxTYPEmakt-maktx,
ENDOFty_makt.


TYPES:BEGINOFty_marc,
matnrTYPEmarc-matnr,
werksTYPEmarc-werks,
beskztypemarc-beskz,
sobsltypemarc-sobsl,
ENDOFty_marc.


data:oindextypei.
data:cindextypetext10.

DATA:it_bomTYPESTANDARDTABLEOFZPLM_BOM_USEWITHHEADERLINE.

3 subroutins:

<!--StartFragment --> <style type="text/css"> SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } </style>*&---------------------------------------------------------------------*
*&Formget_usobj
*&---------------------------------------------------------------------*
*获得更改的对象的usobj
*----------------------------------------------------------------------*
*-->P_P_MATNR物料
*-->P_P_WERKS工厂
*-->P_P_STLAN类型
*-->P_V_USOBJusobj
*----------------------------------------------------------------------*
FORMget_usobjUSINGp_p_matnr
p_p_werks
p_p_stlan
p_v_usobj.
DATAmatnr(18).
CALLFUNCTION'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input=p_p_matnr
IMPORTING
output=matnr.

p_v_usobj+0(18)=matnr.
p_v_usobj+18(4)=p_p_werks.
p_v_usobj+22(1)=p_p_stlan.
ENDFORM."get_usobj


*&---------------------------------------------------------------------*
*&Formget_exp_bom
*&---------------------------------------------------------------------*
*递归获得子bom
*----------------------------------------------------------------------*
*-->p_sernr序列号
*-->p_datuv有效期
*-->p_matnr物料号
*-->p_werks工厂
*-->p_stlanbom用途
*-->p_stlal可选bom
*-->p_index索引
*-->p_level层次
*-->p_rate比例
*----------------------------------------------------------------------*
formget_exp_bomusing
p_sernr
p_datuv
p_matnr
p_werks
p_stlan
p_stlal
p_index
p_level
p_rate
.

DATA:it_bom1TYPESTANDARDTABLEOFZPLM_BOM_USEWITHHEADERLINE.

data:cindex2typetext10.

data:ileveltypei.
data:cleveltypetext20.

data:iratetypeKMPMG.

clearit_bom1.refreshit_bom1.
CALLFUNCTION'ZPLM_GET_USED_BOM'
EXPORTING
p_sernr=p_sernr
P_DATUV=p_datuv
p_matnr=p_matnr
P_WERKS=p_werks
p_stlan=p_stlan
P_STLAL=p_stlal
tables
tab_bom=it_bom1
.

ilevel=p_level+1.
performget_levelusing
ilevelclevel.
loopatit_bom1.
oindex=oindex+1.
cindex=oindex.
irate=p_rate*it_bom1-menge/it_bom1-BMENG.
moveit_bom1toit_bom.
it_bom-pid=p_index.
it_bom-myid=cindex.
it_bom-ilevel=clevel.
it_bom-irate=irate.
appendit_bom.
cindex2=cindex.
performget_exp_bomusing
p_sernr
p_datuv
it_bom1-matnr
p_werks
p_stlan
p_stlal
cindex2
ilevel
irate.
endloop.
endform."get_exp_bom
*&---------------------------------------------------------------------*
*&Formget_level
*&---------------------------------------------------------------------*
*生成level信息串
*----------------------------------------------------------------------*
*-->p_level_num层数
*<--p_level_str层串
*----------------------------------------------------------------------*
formget_levelusing
p_level_num
p_level_str.
clearp_level_str.
dop_level_numtimes.
concatenatep_level_str'.'intop_level_str.
enddo.
datastrtypetext20.
str=p_level_num.
condensestrno-gaps.
concatenatep_level_strstrintop_level_str.
endform."get_level

4 sturctures:

ZPLM_BOM_USE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值