功能: 根据指定的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