sap_紅白:BOM批量反查(CS15)
http://www.zhsap.com/home.php?mod=space&uid=13587&do=blog&id=587
在SAP中CS15是一個反查BOM的一個T_CODE.
但是CS15只能單個物料進行反查.
最近業務報出要多個物料進行反查.
反查一般用到的功能(我已知的,歡迎補充!)有:
1.CS_WHERE_USED_MAT
2.CS_WHERE_USED_MAT_VIA_CLA
3.CS_WHERE_USED_MAT_ANY
下面用 CS_WHERE_USED_MAT 寫一下代碼(有可優化的地方,請幫忙指出,謝謝).
*&---------------------------------------------------------------------*
*& Report ZPPR012 *
*& Write by:2012.07.19 *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
*& Report ZPPR012 *
*& Write by:2012.07.19 *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
report zppr012 .
tables:rc29l,stpov_alv,stpov.
data: begin of wa_tab,
dstuf like stpov_alv-dstuf, "展開層次 LEVEL
stlan like stpov_alv-stlan, "物料表用途 STLAN
werks like stpov_alv-werks, "工廠 WERKS
objic like stpov_alv-objic, "物件類型
dobjt like stpov_alv-dobjt, "物件 ID MATNR
dstal like stpov_alv-dstal, "替代物料表
dposn like stpov_alv-dposn, "BOM 項目號碼 POSNR
imovf like stpov_alv-imovf, "指示碼:所需數量總額超過最大值
dimng like stpov-bmeng , "需求數量(顯示的)
meopo like stpov_alv-meopo, "計量單位(啟動使用清單物件) MEINS
rmovf like stpov_alv-rmovf, "指示碼:結果數量總額超過最大值
drmng like stpov-bmeng , "結果數量
bmein like stpov_alv-bmein, "BOM 的基礎計量單位
menge like stpov-menge , "元件數量
bmeng like stpov-bmeng , "基礎數量
idnrk like stpov-idnrk,
end of wa_tab.
dstuf like stpov_alv-dstuf, "展開層次 LEVEL
stlan like stpov_alv-stlan, "物料表用途 STLAN
werks like stpov_alv-werks, "工廠 WERKS
objic like stpov_alv-objic, "物件類型
dobjt like stpov_alv-dobjt, "物件 ID MATNR
dstal like stpov_alv-dstal, "替代物料表
dposn like stpov_alv-dposn, "BOM 項目號碼 POSNR
imovf like stpov_alv-imovf, "指示碼:所需數量總額超過最大值
dimng like stpov-bmeng , "需求數量(顯示的)
meopo like stpov_alv-meopo, "計量單位(啟動使用清單物件) MEINS
rmovf like stpov_alv-rmovf, "指示碼:結果數量總額超過最大值
drmng like stpov-bmeng , "結果數量
bmein like stpov_alv-bmein, "BOM 的基礎計量單位
menge like stpov-menge , "元件數量
bmeng like stpov-bmeng , "基礎數量
idnrk like stpov-idnrk,
end of wa_tab.
data : gt_tab like standard table of wa_tab with header line.
data : g_stpov like standard table of stpov with header line.
data : g_stpov like standard table of stpov with header line.
data begin of g_mara occurs 0.
include structure mara .
data end of g_mara.
include structure mara .
data end of g_mara.
data begin of g_prjcat occurs 0.
include structure cscprj .
data end of g_prjcat.
include structure cscprj .
data end of g_prjcat.
data begin of g_tplcat occurs 0.
include structure csctpl .
data end of g_tplcat.
include structure csctpl .
data end of g_tplcat.
data begin of g_stdcat occurs 0.
include structure cscstd .
data end of g_stdcat.
include structure cscstd .
data end of g_stdcat.
data begin of g_matcat occurs 0.
include structure cscmat .
data end of g_matcat.
include structure cscmat .
data end of g_matcat.
data begin of g_kndcat occurs 0.
include structure cscknd .
data end of g_kndcat.
include structure cscknd .
data end of g_kndcat.
data begin of g_equicat occurs 0.
include structure cscequi .
data end of g_equicat.
include structure cscequi .
data end of g_equicat.
data begin of g_wultb occurs 0.
include structure stpov .
data end of g_wultb.
include structure stpov .
data end of g_wultb.
data begin of g_topmat occurs 0.
include structure mc29s .
data end of g_topmat.
include structure mc29s .
data end of g_topmat.
data:lc_grid type ref to cl_gui_alv_grid.
data:gt_fieldcat type slis_t_fieldcat_alv ,
gs_fieldcat like line of gt_fieldcat,
gt_layout type slis_layout_alv ,
gt_repid like sy-repid,
l_event type slis_alv_event.
gs_fieldcat like line of gt_fieldcat,
gt_layout type slis_layout_alv ,
gt_repid like sy-repid,
l_event type slis_alv_event.
data: pos type i .
define set_fieldcat.
clear gs_fieldcat.
pos = pos + 1 .
gs_fieldcat-col_pos = &1.
gs_fieldcat-seltext_l = &2.
gs_fieldcat-fieldname = &3.
gs_fieldcat-tabname = &4.
gs_fieldcat-symbol = &5.
append gs_fieldcat to gt_fieldcat.
end-of-definition.
define set_fieldcat.
clear gs_fieldcat.
pos = pos + 1 .
gs_fieldcat-col_pos = &1.
gs_fieldcat-seltext_l = &2.
gs_fieldcat-fieldname = &3.
gs_fieldcat-tabname = &4.
gs_fieldcat-symbol = &5.
append gs_fieldcat to gt_fieldcat.
end-of-definition.
selection-screen begin of block title1 with frame title text-001.
select-options: sl_matnr for rc29l-matnr obligatory.
selection-screen skip 1.
selection-screen end of block title1.
select-options: sl_matnr for rc29l-matnr obligatory.
selection-screen skip 1.
selection-screen end of block title1.
*SELECTION-SCREEN BEGIN OF BLOCK title2 WITH FRAME TITLE text-002.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_dirkt TYPE kznul DEFAULT ''. "直接
*SELECTION-SCREEN COMMENT 3(10) text-p01.
*PARAMETERS: p_uebkl TYPE kznul DEFAULT ''. "使用類別
*SELECTION-SCREEN COMMENT 16(10) text-p02.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title2.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_dirkt TYPE kznul DEFAULT ''. "直接
*SELECTION-SCREEN COMMENT 3(10) text-p01.
*PARAMETERS: p_uebkl TYPE kznul DEFAULT ''. "使用類別
*SELECTION-SCREEN COMMENT 16(10) text-p02.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title2.
*SELECTION-SCREEN BEGIN OF BLOCK title4 WITH FRAME TITLE text-004.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_doctp TYPE kznul DEFAULT ''. "文件結構
*SELECTION-SCREEN COMMENT 3(10) text-p03.
*PARAMETERS: p_equtp TYPE kznul DEFAULT ''. "設備物料表
*SELECTION-SCREEN COMMENT 16(10) text-p04.
*PARAMETERS: p_kndtp TYPE kznul DEFAULT ''. "訂單物料表
*SELECTION-SCREEN COMMENT 29(10) text-p05.
*PARAMETERS: p_mattp TYPE kznul DEFAULT 'X'. "物料_BOM
*SELECTION-SCREEN COMMENT 42(10) text-p06.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_prjtp TYPE kznul DEFAULT ''. "WBS_物料表
*SELECTION-SCREEN COMMENT 3(10) text-p07.
*PARAMETERS: p_stdtp TYPE kznul DEFAULT ''. "標準物料表
*SELECTION-SCREEN COMMENT 16(10) text-p08.
*PARAMETERS: p_tpltp TYPE kznul DEFAULT ''. "功能位置_BOM
*SELECTION-SCREEN COMMENT 29(10) text-p09.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title4.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_doctp TYPE kznul DEFAULT ''. "文件結構
*SELECTION-SCREEN COMMENT 3(10) text-p03.
*PARAMETERS: p_equtp TYPE kznul DEFAULT ''. "設備物料表
*SELECTION-SCREEN COMMENT 16(10) text-p04.
*PARAMETERS: p_kndtp TYPE kznul DEFAULT ''. "訂單物料表
*SELECTION-SCREEN COMMENT 29(10) text-p05.
*PARAMETERS: p_mattp TYPE kznul DEFAULT 'X'. "物料_BOM
*SELECTION-SCREEN COMMENT 42(10) text-p06.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: p_prjtp TYPE kznul DEFAULT ''. "WBS_物料表
*SELECTION-SCREEN COMMENT 3(10) text-p07.
*PARAMETERS: p_stdtp TYPE kznul DEFAULT ''. "標準物料表
*SELECTION-SCREEN COMMENT 16(10) text-p08.
*PARAMETERS: p_tpltp TYPE kznul DEFAULT ''. "功能位置_BOM
*SELECTION-SCREEN COMMENT 29(10) text-p09.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title4.
selection-screen begin of block title3 with frame title text-003.
parameters: sl_datuv type rc29l-datuv default sy-datum. "生效日期
parameters: sl_datub type rc29l-datub. "有效期限
selection-screen end of block title3.
parameters: sl_datuv type rc29l-datuv default sy-datum. "生效日期
parameters: sl_datub type rc29l-datub. "有效期限
selection-screen end of block title3.
selection-screen begin of block title5 with frame title text-005.
parameters: sl_emeng type rc29l-emeng. "需求數量
parameters: sl_rmeng type rc29l-rmeng. "結果數量
selection-screen end of block title5.
parameters: sl_emeng type rc29l-emeng. "需求數量
parameters: sl_rmeng type rc29l-rmeng. "結果數量
selection-screen end of block title5.
selection-screen begin of block title6 with frame title text-006.
parameters: sl_werks type rc29l-werks obligatory . "工廠
parameters: sl_postp type rc29l-postp. "項目種類
parameters: sl_stlan type rc29l-stlan. "用途
selection-screen end of block title6.
parameters: sl_werks type rc29l-werks obligatory . "工廠
parameters: sl_postp type rc29l-postp. "項目種類
parameters: sl_stlan type rc29l-stlan. "用途
selection-screen end of block title6.
start-of-selection.
if sl_rmeng is initial or sl_emeng is initial .
if sl_emeng >= 0 or sl_emeng >= 0 .
perform frm_get_data.
perform frm_fieldcat.
perform frm_display_alv.
else.
message text-m02 type 'I'.
endif.
if sl_rmeng is initial or sl_emeng is initial .
if sl_emeng >= 0 or sl_emeng >= 0 .
perform frm_get_data.
perform frm_fieldcat.
perform frm_display_alv.
else.
message text-m02 type 'I'.
endif.
else.
message text-m01 type 'I'.
endif.
message text-m01 type 'I'.
endif.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_data .
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_data .
data begin of s_wultb occurs 0.
include structure stpov .
data end of s_wultb.
include structure stpov .
data end of s_wultb.
data begin of s_matcat occurs 0.
include structure cscmat .
data end of s_matcat.
include structure cscmat .
data end of s_matcat.
select *
into corresponding fields of table g_mara
from mara
where mara~matnr in sl_matnr .
into corresponding fields of table g_mara
from mara
where mara~matnr in sl_matnr .
loop at g_mara.
clear:s_wultb,s_matcat.
clear:s_wultb,s_matcat.
call function 'CS_WHERE_USED_MAT'
exporting
datub = sl_datub "有效期限
datuv = sl_datuv "生效日期
matnr = g_mara-matnr "物料號碼
postp = sl_postp "項目類別
stlan = sl_stlan "物料表用途
werks = sl_werks "工廠
importing
topmat = g_topmat
tables
wultb = s_wultb
equicat = g_equicat
kndcat = g_kndcat
matcat = s_matcat
stdcat = g_stdcat
tplcat = g_tplcat
prjcat = g_prjcat
exceptions
call_invalid = 1
material_not_found = 2
no_where_used_rec_found = 3
no_where_used_rec_selected = 4
no_where_used_rec_valid = 5
others = 6.
if sy-subrc <> 0.
" MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
" WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
exporting
datub = sl_datub "有效期限
datuv = sl_datuv "生效日期
matnr = g_mara-matnr "物料號碼
postp = sl_postp "項目類別
stlan = sl_stlan "物料表用途
werks = sl_werks "工廠
importing
topmat = g_topmat
tables
wultb = s_wultb
equicat = g_equicat
kndcat = g_kndcat
matcat = s_matcat
stdcat = g_stdcat
tplcat = g_tplcat
prjcat = g_prjcat
exceptions
call_invalid = 1
material_not_found = 2
no_where_used_rec_found = 3
no_where_used_rec_selected = 4
no_where_used_rec_valid = 5
others = 6.
if sy-subrc <> 0.
" MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
" WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
* append s_wultb to g_wultb.
* append s_matcat to g_matcat.
append lines of s_wultb to g_wultb.
append lines of s_matcat to g_matcat.
endloop.
* append s_matcat to g_matcat.
append lines of s_wultb to g_wultb.
append lines of s_matcat to g_matcat.
endloop.
loop at g_wultb.
* sl_emeng dimng "需求數量
* sl_rmeng drmng "結果數量
* sl_rmeng drmng "結果數量
if sl_emeng is initial and not sl_rmeng is initial .
gt_tab-drmng = sl_rmeng * abs( g_wultb-menge ) / abs( g_wultb-menge ).
gt_tab-dimng = sl_rmeng * g_wultb-menge / abs( g_wultb-bmeng ).
gt_tab-dimng = sl_rmeng * g_wultb-menge / abs( g_wultb-bmeng ).
elseif sl_rmeng is initial and not sl_emeng is initial.
gt_tab-dimng = sl_emeng * abs( g_wultb-menge ) / g_wultb-menge.
gt_tab-drmng = sl_emeng / abs( g_wultb-menge ) / g_wultb-bmeng.
gt_tab-drmng = sl_emeng / abs( g_wultb-menge ) / g_wultb-bmeng.
elseif sl_rmeng is initial and sl_emeng is initial .
gt_tab-dimng = g_wultb-menge.
gt_tab-drmng = g_wultb-bmeng.
gt_tab-drmng = g_wultb-bmeng.
endif.
gt_tab-dstuf = g_wultb-level.
gt_tab-stlan = g_wultb-stlan.
gt_tab-werks = g_wultb-werks.
gt_tab-dobjt = g_wultb-matnr.
gt_tab-dstal = g_wultb-vwalt.
gt_tab-dposn = g_wultb-posnr.
gt_tab-meopo = g_wultb-emeih.
gt_tab-bmein = g_wultb-bmein.
gt_tab-menge = g_wultb-menge.
gt_tab-bmeng = g_wultb-bmeng.
gt_tab-idnrk = g_wultb-idnrk.
append gt_tab.
endloop.
gt_tab-stlan = g_wultb-stlan.
gt_tab-werks = g_wultb-werks.
gt_tab-dobjt = g_wultb-matnr.
gt_tab-dstal = g_wultb-vwalt.
gt_tab-dposn = g_wultb-posnr.
gt_tab-meopo = g_wultb-emeih.
gt_tab-bmein = g_wultb-bmein.
gt_tab-menge = g_wultb-menge.
gt_tab-bmeng = g_wultb-bmeng.
gt_tab-idnrk = g_wultb-idnrk.
append gt_tab.
endloop.
endform. " frm_get_data
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_fieldcat .
set_fieldcat:
pos text-a01 'DSTUF' 'GT_TAB' '',
pos text-a02 'STLAN' 'GT_TAB' '',
pos text-a03 'WERKS' 'GT_TAB' '',
pos text-a04 'OBJIC' 'GT_TAB' '',
pos text-a05 'DOBJT' 'GT_TAB' '',
pos text-a06 'DSTAL' 'GT_TAB' '',
pos text-a07 'DPOSN' 'GT_TAB' '',
pos text-a08 'IMOVF' 'GT_TAB' '',
pos text-a09 'DIMNG' 'GT_TAB' '',
pos text-a10 'MEOPO' 'GT_TAB' '',
pos text-a11 'RMOVF' 'GT_TAB' '',
pos text-a12 'DRMNG' 'GT_TAB' '',
pos text-a13 'BMEIN' 'GT_TAB' '',
pos text-a16 'IDNRK' 'GT_TAB' ''.
" pos text-a14 'MENGE' 'GT_TAB' '',
" pos text-a15 'BMENG' 'GT_TAB' ''.
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_fieldcat .
set_fieldcat:
pos text-a01 'DSTUF' 'GT_TAB' '',
pos text-a02 'STLAN' 'GT_TAB' '',
pos text-a03 'WERKS' 'GT_TAB' '',
pos text-a04 'OBJIC' 'GT_TAB' '',
pos text-a05 'DOBJT' 'GT_TAB' '',
pos text-a06 'DSTAL' 'GT_TAB' '',
pos text-a07 'DPOSN' 'GT_TAB' '',
pos text-a08 'IMOVF' 'GT_TAB' '',
pos text-a09 'DIMNG' 'GT_TAB' '',
pos text-a10 'MEOPO' 'GT_TAB' '',
pos text-a11 'RMOVF' 'GT_TAB' '',
pos text-a12 'DRMNG' 'GT_TAB' '',
pos text-a13 'BMEIN' 'GT_TAB' '',
pos text-a16 'IDNRK' 'GT_TAB' ''.
" pos text-a14 'MENGE' 'GT_TAB' '',
" pos text-a15 'BMENG' 'GT_TAB' ''.
endform. " frm_fieldcat
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_display_alv .
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_display_alv .
gt_layout-colwidth_optimize = 'X' .
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = gt_repid
is_layout = gt_layout
it_fieldcat = gt_fieldcat[]
i_default = 'X'
i_save = 'A'
tables
t_outtab = gt_tab
exceptions
program_error = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
exporting
i_callback_program = gt_repid
is_layout = gt_layout
it_fieldcat = gt_fieldcat[]
i_default = 'X'
i_save = 'A'
tables
t_outtab = gt_tab
exceptions
program_error = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
endform. " frm_display_alv
本文來自:E-Works ,轉載請保留原文鏈接: http://blog.e-works.net.cn/634218/articles/311409.html