Program : ZMMR001
T-Code : ZMM001
Purpose : 查找替代物料的信息
1、 如果customer 、customer material没有输入:直接从mara marc获取
否从 mara marc knmt获取
2、根据物料一层一层的查找
Input parameter :
1. Customer P/N
2. SAP material number
3. Old material number
4. Logical group material number
Output :
1. Logical group if have
2. Logical group's material
3. Logical group material's customer code, name
4. Related logical group & it's material
5. AVL (Ordering Number + Manufacturer)
6. Related purchase info (with vendor and quoted price)
7. 有权限的用户才能看到price
输入界面:
Customer P/N from to
SAP material number from to
Old material number from to
输出界面的column
material
group's material
Cust Material
Customer Code
Customer Name
Vendor
Vendor Name
Contact price
Standard Price
Unit
Ordering Number
Manufacturer
T-Code : ZMM001
Material / Cust Material/Customer code: VD51
Customer Name : XD03 kna1
Vendor Name :xk03 lfa1
group's material: CS15
Ordering Number / Manufacturer : MM03
vendor :ME01 当MRP=1
Standard Price :Mek1 condition Type :PB00
弹出界面选择第四项
Contact Price :Mek1 condition Type :PB00
弹出界面选择第三项
*&---------------------------------------------------------------------*
*& Progarm : ZMMR001 Author : Jimmy Wong
*& Created : 11 Sep 2012 App : MM
*& Title : Material Info
*& Description : Material Info
*&---------------------------------------------------------------------*
*& Version Author Date description
*& Jimmy 11 Sep 2012 the first version
*&M1 Jimmy 20 Nov 2012 add field alprf EWAHR
*&M2 Jimmy 30 Nov 2012 Add Selection Plant
*&M3 Jimmy 18 Dec 2012 Add Usage prob. by AltItemGroup
*&M4 Jimmy 09 Jan 2013 Enhance Add Usage prob. by AltItemGroup
*&M5 Jimmy 15 Jan 2013 Enhance delete item no display
*&M6 Jimmy Enhance standard price JPY
*& the last update time 2013.02.25 18:00
*&---------------------------------------------------------------------*
report zmmr001 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : mara,knmt,mast.",stpo,mast,eord,marc,konh,konp,prps,kna1.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
data: begin of itab occurs 0,
mm_matnr like knmt-matnr,"
matnr like knmt-matnr,"
kunnr like knmt-kunnr,
name1 like kna1-name1,
kdmat like knmt-kdmat,
bismt like mara-bismt,
gp_matnr(700) type c,
model(700) type c,
mfrpn like mara-mfrpn,
mfrnr like mara-mfrnr,
lifnr like eord-lifnr,
name_v like lfa1-name1,
werks like marc-werks,
st_price type p decimals 5,
cn_price type p decimals 5,
konwa like konp-konwa,
alprf like stpo-alprf,
ewahr like stpo-ewahr,
alpgr like stpo-alpgr, "M3 add
end of itab.
data: itab1 like itab occurs 0 with header line.
data: begin of it_precent occurs 0, "M3 add
matnr like knmt-matnr,"
werks like marc-werks,
alpgr like stpo-alpgr,
ewahr like stpo-ewahr,
end of it_precent.
data:begin of it_fmatnr occurs 0,
matnr like mara-matnr,
werks like marc-werks,
end of it_fmatnr.
data:begin of it_gpmatnr occurs 0,
matnr like mara-matnr,
gp_matnr like mara-matnr,
werks like marc-werks,
stlnr like stpo-stlnr,
stvkn like stpo-stvkn,
stlkn like stpo-stlkn,
end of it_gpmatnr.
data:begin of it_del occurs 0, "M5 add
stlnr like stpo-stlnr,
stvkn like stpo-stvkn,
stlkn like stpo-stlkn,
end of it_del.
data:begin of it_gpmatnr1 occurs 0,
matnr like mara-matnr,
gp_matnr like mara-matnr,
werks like marc-werks,
flag type c,
end of it_gpmatnr1.
data: it_gpmatnr2 like it_gpmatnr1 occurs 0 with header line.
data:begin of it_stpo occurs 0,
werks like marc-werks,
matnr like mara-matnr,
gp_matnr like mara-matnr,
mtart like mara-mtart,
alprf like stpo-alprf,
ewahr like stpo-ewahr,
alpgr like stpo-alpgr, "M3 add
end of it_stpo.
data: t_stpox like stpox occurs 10 with header line, "Add by Lisa wong 02/02/2013
t_cscmat like cscmat occurs 10 with header line.
data : lv_tabix like sy-tabix.
data : lv_authority type c.
data : price type p decimals 5.
data:begin of it_mara occurs 0,
matnr like mara-matnr,
bismt like mara-bismt,
mfrpn like mara-mfrpn,
mfrnr like mara-mfrnr,
end of it_mara.
data:begin of it_marc occurs 0,
matnr like marc-matnr,
werks like marc-werks,
end of it_marc.
data:begin of it_lifnr occurs 0,
matnr like marc-matnr,
werks like marc-werks,
lifnr like lfa1-lifnr,
name1 like lfa1-name1,
end of it_lifnr.
data:begin of it_knmt occurs 0,
kunnr like knmt-kunnr,
matnr like mara-matnr,
vkorg like knmt-vkorg,
kdmat like knmt-kdmat ,
name1 like kna1-name1,
end of it_knmt.
type-pools: slis.
data: fc_hier type slis_t_fieldcat_alv,
wa_hier type slis_fieldcat_alv .
data: is_print type slis_print_alv.
data : w_loop like sy-tabix.
"data: i_grid_title type lvc_title.
*&---------------------------------------------------------------------*
* parameter & select-options
*&---------------------------------------------------------------------*
selection-screen begin of block 1 with frame title text-010.
parameters: p_werks like mast-werks default '8101' obligatory .
select-options: s_kdmat for knmt-kdmat. "custmer p/n"
select-options: s_matnr for knmt-matnr. "sap material code"
select-options: s_bismt for mara-bismt . "old material code"
parameters : p_alpgr as checkbox.
selection-screen end of block 1.
*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
* authority-check object ''
* id '' field sy-uname.
* if sy-subrc <> 0.
* lv_authority = 'X'.
* endif..
perform get_data.
if it_gpmatnr1[] is initial.
message i003(zmm).
exit.
endif.
perform process_data.
*M3 add
if p_alpgr = 'X'.
delete it_precent where ewahr = 100 .
itab1[] = itab[].
clear: itab[],itab.
loop at itab1.
read table it_precent with key matnr = itab1-matnr werks = itab1-werks alpgr = itab1-alpgr.
if sy-subrc eq 0.
itab-mm_matnr = itab1-mm_matnr.
itab-matnr = itab1-matnr.
itab-mfrpn = itab1-mfrpn.
itab-mfrnr = itab1-mfrnr.
itab-alprf = itab1-alprf.
itab-ewahr = itab1-ewahr.
itab-alpgr = itab1-alpgr .
append itab.
clear itab .
endif.
endloop.
delete adjacent duplicates from itab comparing all fields.
free:it_precent.
endif.
*M3 End
if itab[] is initial.
message i003(zmm).
exit.
endif.
perform write_data.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_data .
refresh: it_gpmatnr1 ,it_fmatnr,itab,itab1.
call function 'SAPGUI_PROGRESS_INDICATOR'
exporting
text = 'Getting Data........'.
if s_kdmat[] is initial.
select distinct b~matnr c~werks
into corresponding fields of table it_fmatnr
from mara as b
inner join marc as c on b~matnr = c~matnr
where b~matnr in s_matnr
and b~bismt in s_bismt
and c~werks = p_werks.
else.
select distinct a~matnr c~werks
into corresponding fields of table it_fmatnr
from knmt as a
inner join mara as b on a~matnr = b~matnr
inner join marc as c on a~matnr = c~matnr and a~vkorg = c~werks
where a~vkorg = p_werks
and a~vtweg = '10'
and a~matnr in s_matnr
and a~kdmat in s_kdmat
and b~bismt in s_bismt
and c~werks = p_werks.
endif.
if not it_fmatnr[] is initial.
perform get_gp_material_data.
endif.
endform. " GET_DATA
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form process_data .
data:wa_matnr(255) type c,
wa_model(255) type c,
mm_matnr like mara-matnr,
lv_pspnr like prps-pspnr,
lv_vakey like konh-vakey.
sort it_gpmatnr1 by werks matnr gp_matnr.
delete adjacent duplicates from it_gpmatnr1.
loop at it_gpmatnr1.
itab1-mm_matnr = it_gpmatnr1-matnr.
itab1-matnr = it_gpmatnr1-gp_matnr.
itab1-werks = it_gpmatnr1-werks .
collect itab1.
endloop.
select matnr b~bismt b~mfrpn b~mfrnr
into corresponding fields of table it_mara
from mara as b
for all entries in itab1
where b~matnr = itab1-mm_matnr.
sort it_mara by matnr.
select a~matnr a~werks a~lifnr b~name1
into corresponding fields of table it_lifnr
from eord as a inner join lfa1 as b on a~lifnr = b~lifnr
for all entries in itab1
where a~matnr = itab1-mm_matnr
and a~werks = itab1-werks
and a~autet = '1'.
sort it_lifnr by werks matnr .
* Add by Lisa wong 02/02/2013
loop at itab1.
w_loop = sy-tabix.
refresh t_stpox.
clear t_stpox.
call function 'CS_BOM_EXPL_MAT_V2'
exporting
capid = 'PP01' "BOM Application
datuv = sy-datum
emeng = 1 "Require qty
mtnrv = itab1-matnr "MATERAIL NUMBER
stlan = '1'
* STLAL = P_STLAL
* CUOBJ = CUOBJ
mktls = 'X'
mehrs = 'X'
werks = itab1-werks "'PDGM'
tables
stb = t_stpox
matcat = t_cscmat
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
others = 8.
loop at t_stpox.
clear it_stpo.
it_stpo-gp_matnr = t_stpox-idnrk.
it_stpo-matnr = itab1-matnr.
it_stpo-mtart = t_stpox-mtart.
it_stpo-alprf = t_stpox-alprf.
it_stpo-ewahr = t_stpox-ewahr.
it_stpo-werks = t_stpox-werks.
it_stpo-alpgr = t_stpox-alpgr.
append it_stpo.
endloop.
sy-tabix = w_loop.
endloop.
* Mark by Lisa wong 02/02/2013
* select distinct a~matnr b~idnrk as gp_matnr c~mtart b~alprf b~ewahr a~werks alpgr
* into corresponding fields of table it_stpo
* from mast as a
* inner join stpo as b on a~stlnr = b~stlnr
* inner join mara as c on a~matnr = c~matnr
* for all entries in itab1
* where b~stlty = 'M'
* and b~idnrk = itab1-mm_matnr
* and a~werks = itab1-werks.
sort it_stpo by werks matnr gp_matnr.
loop at it_stpo where mtart = 'ZVFG'.
it_gpmatnr2-gp_matnr = it_stpo-gp_matnr.
it_gpmatnr2-matnr = it_stpo-matnr.
it_gpmatnr2-werks = it_stpo-werks.
collect it_gpmatnr2.
append it_gpmatnr2.
endloop.
sort it_gpmatnr2 by werks gp_matnr .
select a~kunnr a~matnr a~vkorg a~kdmat b~name1
into corresponding fields of table it_knmt
from knmt as a inner join kna1 as b on a~kunnr = b~kunnr
for all entries in itab1
where a~vkorg = itab1-werks
and a~vtweg = '10'
and a~matnr = itab1-mm_matnr.
sort it_knmt by vkorg matnr .
call function 'SAPGUI_PROGRESS_INDICATOR'
exporting
text = 'Processing Data........'.
loop at itab1.
"old material Ordering Number Manufacturer'
read table it_mara with key matnr = itab1-mm_matnr binary search.
if sy-subrc eq 0.
itab1-bismt = it_mara-bismt.
itab1-mfrpn = it_mara-mfrpn.
itab1-mfrnr = it_mara-mfrnr.
endif.
"vendor vendor name
read table it_lifnr with key werks = itab1-werks matnr = itab1-mm_matnr binary search.
if sy-subrc eq 0.
itab1-lifnr = it_lifnr-lifnr.
itab1-name_v = it_lifnr-name1.
endif.
"Model
read table it_gpmatnr2 with key werks = itab1-werks gp_matnr = itab1-mm_matnr binary search.
if sy-subrc eq 0.
loop at it_gpmatnr2 where gp_matnr = itab1-mm_matnr and werks = itab1-werks.
perform tranfer_material using it_gpmatnr2-matnr
changing it_gpmatnr2-matnr.
if wa_model is initial.
wa_model = it_gpmatnr2-matnr.
else.
concatenate wa_model ',' it_gpmatnr2-matnr into wa_model.
endif.
endloop.
endif.
"priority / usage prob.
read table it_stpo with key werks = itab1-werks matnr = itab1-matnr gp_matnr = itab1-mm_matnr .
if sy-subrc eq 0.
itab1-alprf = it_stpo-alprf.
itab1-ewahr = it_stpo-ewahr.
itab1-alpgr = it_stpo-alpgr. "M3 add
endif.
* itab1-gp_matnr = wa_matnr.
itab1-model = wa_model.
itab1-cn_price = 0.
" production lot
select single pspnr into lv_pspnr
from prps
where matnr = itab1-mm_matnr.
if sy-subrc eq 0 and not itab1-lifnr is initial.
concatenate lv_pspnr itab1-lifnr itab1-mm_matnr '%' into lv_vakey .
perform get_price_pb00 using lv_vakey
changing itab1-cn_price itab1-konwa.
endif.
"standard price
if not itab1-lifnr is initial.
clear:lv_vakey.
concatenate itab1-lifnr itab1-mm_matnr '%' into lv_vakey .
perform get_price_pb00 using lv_vakey
changing itab1-st_price itab1-konwa.
endif.
" customer cust material
read table it_knmt with key vkorg = itab1-werks matnr = itab1-mm_matnr .
if sy-subrc eq 0.
loop at it_knmt where matnr = itab1-mm_matnr and vkorg = itab1-werks.
itab1-kunnr = it_knmt-kunnr.
itab1-kdmat = it_knmt-kdmat.
itab1-name1 = it_knmt-name1.
move-corresponding itab1 to itab.
append itab.
endloop.
else.
move-corresponding itab1 to itab.
append itab.
endif.
"M3 add
if itab1-alpgr is not initial.
move-corresponding itab1 to it_precent.
collect it_precent.
endif.
"M3 End
clear: itab,wa_matnr,lv_pspnr,wa_model,it_precent.
endloop.
clear:itab1,itab1[].
free:it_knmt,it_stpo,it_gpmatnr2,it_gpmatnr1,it_gpmatnr,it_lifnr,it_marc,it_mara,it_fmatnr.
endform. " PROCESS_DATA
*&---------------------------------------------------------------------*
*& Form GET_PRICE_PB00
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LV_VAKEY text
* <--P_ITAB_CN_PRICE text
*----------------------------------------------------------------------*
form get_price_pb00 using p_vakey like konh-vakey
changing p_price like price
p_konwa like konp-konwa .
data: lv_kbetr like konp-kbetr,
lv_kpein like konp-kpein.
clear:p_price,p_konwa.
select single b~kbetr b~kpein b~konwa into (lv_kbetr,lv_kpein ,p_konwa)
from konh as a
inner join konp as b on a~knumh = b~knumh
where b~kschl = 'PB00'
and a~vakey like p_vakey .
if sy-subrc eq 0 and lv_kpein ne 0.
perform expand_amount using itab1-konwa changing lv_kbetr. "M6 add
p_price = lv_kbetr / lv_kpein .
endif.
endform. " GET_PRICE_PB00
*&---------------------------------------------------------------------*
*& Form DELETE_PRE_ZREO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ITAB_LIFNR text
* <--P_ITAB_LIFNR text
*----------------------------------------------------------------------*
form tranfer_material using p_old
changing p_new .
call function 'CONVERSION_EXIT_MATN1_OUTPUT'
exporting
input = p_old
importing
output = p_new.
endform. " DELETE_PRE_ZREO
*&---------------------------------------------------------------------*
*& Form GET_GP_MATERIAL_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_gp_material_data .
"get material group material
refresh:it_gpmatnr,it_del.
clear: it_gpmatnr,it_del.
select distinct a~matnr as gp_matnr c~matnr a~werks b~stlnr b~stvkn b~stlkn
into corresponding fields of table it_gpmatnr
from mast as a
inner join stpo as b on a~stlnr = b~stlnr
inner join mara as c on b~idnrk = c~matnr
inner join mara as d on a~matnr = d~matnr
for all entries in it_fmatnr
where b~stlty = 'M'
and b~idnrk = it_fmatnr-matnr
and d~mtart = 'ZLGP'
and a~werks = it_fmatnr-werks.
perform get_all_data using 'H'.
"Find material by group material
if not it_fmatnr[] is initial.
refresh:it_gpmatnr,it_del.
clear: it_gpmatnr,it_del.
select distinct a~matnr as gp_matnr b~idnrk as matnr a~werks b~stlnr b~stvkn b~stlkn
into corresponding fields of table it_gpmatnr
from mast as a
inner join stpo as b on a~stlnr = b~stlnr
for all entries in it_fmatnr
where b~stlty = 'M'
and a~matnr = it_fmatnr-matnr
and a~werks = it_fmatnr-werks.
perform get_all_data using 'D'.
endif.
"Find material is exists by group material
if not it_fmatnr[] is initial.
perform get_gp_material_data.
endif.
endform. " GET_GP_MATERIAL_DATA
*&---------------------------------------------------------------------*
*& Form WRITE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form write_data .
define alv_field.
clear:wa_hier.
wa_hier-col_pos = &1.
wa_hier-fieldname = &2.
wa_hier-seltext_m = &3.
wa_hier-seltext_l = &4.
wa_hier-outputlen = &5.
wa_hier-just = &6.
wa_hier-do_sum = &7.
wa_hier-ref_tabname = &8 .
wa_hier-ref_fieldname = &9 .
append wa_hier to fc_hier.
end-of-definition.
refresh: fc_hier.
alv_field '1' 'MM_MATNR' '' 'SAP Material Code' '18' 'L' '' 'MARA' 'MATNR'.
alv_field '2' 'MATNR' '' 'Logical Group' '18' 'L' '' 'MARA' 'MATNR'.
if p_alpgr is initial. "M3 Add
alv_field '3' 'MODEL' '' 'Model' '20' 'L' '' '' ''.
alv_field '4' 'KDMAT' '' 'Cust Material' '20' 'L' '' '' ''.
alv_field '5' 'KUNNR' '' 'Customer Code' '10' 'L' '' 'KNA1' 'KUNNR'.
alv_field '6' 'NAME1' '' 'Customer Name' '20' 'L' '' '' ''.
alv_field '7' 'LIFNR' '' 'Vendor' '10' 'L' '' 'LFA1' 'LIFNR'.
alv_field '8' 'NAME_V' '' 'Vendor name' '20' 'L' '' '' ''.
if lv_authority is initial.
alv_field '9' 'ST_PRICE' '' 'Standard Price' '' 'R' '' '' ''.
alv_field '10' 'CN_PRICE' '' 'Contract Price' '' 'R' '' '' ''.
alv_field '11' 'KONWA' 'Unit' '' '5' 'L' '' '' ''.
endif.
endif.
alv_field '12' 'MFRPN' '' 'Ordering Number' '15' 'L' '' '' ''.
alv_field '13' 'MFRNR' '' 'Manufacturer' '15' 'L' '' '' ''.
alv_field '14' 'ALPRF' '' 'Priority' '' 'R' '' '' ''.
alv_field '15' 'EWAHR' '' 'Usage Prob' '' 'R' '' '' ''.
alv_field '16' 'ALPGR' '' 'AltItemGroup' '' 'R' '' '' ''.
"I_GRID_TITLE = SY-TITLE.
is_print-no_print_listinfos = 'X'.
data: g_repid like sy-repid.
data: g_save type c.
data: gs_sort type slis_sortinfo_alv,
gt_sort type slis_t_sortinfo_alv.
clear gt_sort.
gs_sort-fieldname = 'MM_MATNR'.
gs_sort-down = 'X'.
append gs_sort to gt_sort.
g_repid = sy-repid.
g_save = 'A'.
sort itab by matnr mm_matnr.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = g_repid
it_fieldcat = fc_hier[]
is_print = is_print
i_save = g_save
" it_sort = gt_sort "sort
tables
t_outtab = itab[]
exceptions
program_error = 1
others = 2.
if sy-subrc ne 0.
" message
endif.
endform. " WRITE_DATA
*&---------------------------------------------------------------------*
*& Form GET_ALL_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_all_data using p_type.
sort it_gpmatnr1 by matnr gp_matnr werks .
sort it_gpmatnr by stlnr stvkn stlkn matnr gp_matnr werks .
if it_gpmatnr[] is not initial.
select distinct stlnr stvkn stlkn
into corresponding fields of table it_del
from stas
for all entries in it_gpmatnr
where stlty = 'M'
and stlnr = it_gpmatnr-stlnr
and stvkn = it_gpmatnr-stvkn
and stlkn = it_gpmatnr-stlkn
and lkenz = 'X'
and aennr ne space.
endif.
sort it_del by stlnr stvkn stlkn .
refresh it_fmatnr.
clear it_fmatnr.
loop at it_gpmatnr.
read table it_del with key stlnr = it_gpmatnr-stlnr
stvkn = it_gpmatnr-stvkn
stlkn = it_gpmatnr-stlkn binary search . "M5 add
if sy-subrc ne 0.
read table it_gpmatnr1 with key matnr = it_gpmatnr-matnr
gp_matnr = it_gpmatnr-gp_matnr
werks = it_gpmatnr-werks binary search.
if sy-subrc ne 0.
move-corresponding it_gpmatnr to it_gpmatnr1.
it_gpmatnr1-flag = 'X'.
collect it_gpmatnr1.
if p_type = 'H'.
it_fmatnr-matnr = it_gpmatnr-gp_matnr.
elseif p_type = 'D'.
it_fmatnr-matnr = it_gpmatnr-matnr.
endif.
it_fmatnr-werks = it_gpmatnr-werks .
collect it_fmatnr.
endif.
endif.
endloop.
endform. " GET_ALL_DATA
*M6 add
*&---------------------------------------------------------------------*
*& Form EXPAND_AMOUNT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ITAB_WAERS text
* <--P_ITAB_NETPR text
*----------------------------------------------------------------------*
form expand_amount using pi_waerk
changing pe_netwr.
data : lv_netwr type bapicurr-bapicurr.
check pi_waerk <> 'HKD'.
check pi_waerk <> 'USD'.
check pi_waerk <> 'EUR'.
check pi_waerk <> 'CNY'.
call function 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
exporting
currency = pi_waerk
amount_internal = pe_netwr
importing
amount_external = lv_netwr.
pe_netwr = lv_netwr.
endform. " EXPAND_AMOUNT
*M6 end