背景
SAP标准查询BOM引用程序是CS15,输入条件麻烦,且一次只能查询一个料,对公司日常操作不太友好,且电子行业替代料特别多,业务部门希望查到BOM引用的同时,带出其替代料,下面的程序为实现源码,主要用到了CS_WHERE_USED_MAT函数抓取BOM引用,这个函数只能抓上阶,如果想抓顶阶的话需要再封装一下,第二个函数为封装好的顶阶抓取方式。
界面
主程序
*&---------------------------------------------------------------------*
*& Report ZPPR503 批量BOM反查
*&---------------------------------------------------------------------*
*& add by john 220221.
*&---------------------------------------------------------------------*
REPORT zppr503 NO STANDARD PAGE HEADING..
TYPE-POOLS: slis.
TABLES: marc, makt.
DATA: stb LIKE stpox OCCURS 0 WITH HEADER LINE,
wa_alv_field TYPE slis_fieldcat_alv, "列描述内表,列清单
wa_alv_fieldcat TYPE slis_t_fieldcat_alv, "定义内表
layout TYPE slis_layout_alv,
gs_layout TYPE slis_layout_alv,
gt_list_top_of_page TYPE slis_t_listheader,
counter TYPE i VALUE 0,
g_repid LIKE sy-repid,
g_user_command TYPE slis_formname VALUE 'USER_COMMAND'.
DATA: BEGIN OF my_data,
matnr LIKE marc-matnr, "子零件编码
maktx(80) TYPE c, "子零件描述
werks LIKE marc-werks,
idnrk LIKE mara-matnr, "子零件编码
maktr(80) TYPE c, "子零件描述
POSNR LIKE stpox-POSNR, "BOM行号
MENGE LIKE stpox-MENGE, "数量
ALPRF LIKE stpox-ALPRF, "优先级
ALPGR LIKE stpox-ALPGR, "替代组
ALPST LIKE stpox-ALPST, "策略
POTX1 LIKE stpox-POTX1, "行文本
STLAN LIKE stpox-STLAN, "物料清单类别
STLAL LIKE stpox-STLAL, "BOM备选清单
EWAHR LIKE stpox-EWAHR, "BOM备选清单
labst LIKE mard-labst, "库存
sel TYPE c,
END OF my_data.
DATA: it_data LIKE my_data OCCURS 0.
DATA: BEGIN OF dllh_data,
matnr LIKE marc-matnr, "物料编码
werks LIKE marc-werks, "物料编码
maktx LIKE makt-maktx,
bmeng TYPE i, "BOM中的基本数量
END OF dllh_data.
DATA: tdllh_data LIKE dllh_data OCCURS 0.
DATA: BEGIN OF usedtab OCCURS 100.
INCLUDE STRUCTURE stpov.
DATA: END OF usedtab.
DATA: BEGIN OF equicat OCCURS 100.
INCLUDE STRUCTURE cscequi.
DATA: END OF equicat.
DATA: BEGIN OF kndcat OCCURS 100.
INCLUDE STRUCTURE cscknd.
DATA: END OF kndcat.
DATA: BEGIN OF matcat OCCURS 100.
INCLUDE STRUCTURE cscmat.
DATA: END OF matcat.
DATA: BEGIN OF stdcat OCCURS 100.
INCLUDE STRUCTURE cscstd.
DATA: END OF stdcat.
DATA: BEGIN OF tplcat OCCURS 100.
INCLUDE STRUCTURE csctpl.
DATA: END OF tplcat.
DATA:gt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat.
DATA:gs_fieldcat LIKE LINE OF gt_fieldcat.
DATA: BEGIN OF ls_mard,
matnr LIKE mard-matnr,
werks LIKE mard-werks,
labst LIKE mard-labst,
END OF ls_mard.
DATA: lt_mard LIKE TABLE OF ls_mard.
DATA: ls_mard_sum LIKE ls_mard,
lt_mard_sum LIKE TABLE OF ls_mard.
DATA: gt_ZPPFU503 TYPE STANDARD TABLE OF zppfu503 INITIAL SIZE 10 WITH HEADER LINE.
DATA: BEGIN OF wlxx_data,
matnr LIKE mara-matnr, "物料编码
normt LIKE mara-normt, "延伸机种,即机型
maktx(80) TYPE c, "物料描述
groes LIKE mara-groes, "描述补充
END OF wlxx_data.
DATA: twlxx_data LIKE wlxx_data OCCURS 0.
DATA: it_stpox LIKE stpox OCCURS 0 WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
SELECT-OPTIONS: s_matnr FOR marc-matnr, " OBLIGATORY, "物料编码
s_werks FOR marc-werks OBLIGATORY,
s_maktx FOR makt-maktx, "物料描述
bdate FOR sy-datum DEFAULT sy-datum TO sy-datum NO-EXTENSION OBLIGATORY.
SELECTION-SCREEN SKIP 1.
PARAMETERS:rb_non RADIOBUTTON GROUP rg1, " 显示没有 BOM用到的物料
rb_haf RADIOBUTTON GROUP rg1, " 展 开 BOM 的 上一层显示相应的成品(半成品)
rb_hab RADIOBUTTON GROUP rg1 DEFAULT 'X',
rb_tt RADIOBUTTON GROUP rg1.
SELECTION-SCREEN END OF BLOCK blk1.
INITIALIZATION.
g_repid = sy-repid.
START-OF-SELECTION.
SELECT t1~matnr,t1~werks,t2~maktx
INTO TABLE @tdllh_data "取得物料编码内表
FROM marc AS t1
INNER JOIN makt AS t2 ON t1~matnr = t2~matnr AND t2~spras = @sy-langu
WHERE t1~matnr IN @s_matnr AND t1~werks IN @s_werks AND t2~maktx IN @s_maktx .
SORT tdllh_data BY matnr werks.
CLEAR: dllh_data.
LOOP AT tdllh_data INTO dllh_data. "循环每个物料号
CLEAR: usedtab.
IF rb_hab = 'X'. "取顶阶
FREE gt_zppfu503.
CALL FUNCTION 'ZPPFU503'
EXPORTING
i_matnr = dllh_data-matnr
i_werks = dllh_data-werks
TABLES
o_zppfu503 = gt_zppfu503.
LOOP AT gt_zppfu503.
my_data-matnr = dllh_data-matnr. "物料编码
my_data-maktx = dllh_data-maktx. "物料编码
my_data-werks = dllh_data-werks. "工厂
my_data-idnrk = gt_zppfu503-matnr. "物料编码
my_data-maktr = gt_zppfu503-ojtxb. "物料编码
APPEND my_data TO it_data.
ENDLOOP.
ELSE.
CALL FUNCTION 'CS_WHERE_USED_MAT'
EXPORTING
datub = bdate-high
datuv = bdate-low
matnr = dllh_data-matnr
werks = dllh_data-werks
TABLES
wultb = usedtab
equicat = equicat
kndcat = kndcat
matcat = matcat
stdcat = stdcat
tplcat = tplcat
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 rb_non = 'X'. "如果选择了展开BOM的上一层显示相应的成品(半成品)
IF usedtab IS INITIAL.
my_data-matnr = dllh_data-matnr. "物料编码
my_data-maktx = dllh_data-maktx. "物料编码
my_data-werks = dllh_data-werks. "物料编码
APPEND my_data TO it_data.
ENDIF.
ELSEIF rb_haf = 'X'. "上阶
IF usedtab IS NOT INITIAL.
LOOP AT usedtab. "循环内表USEDTAB把相应的成品号追加到IT_DATA
my_data-matnr = dllh_data-matnr. "物料编码
my_data-maktx = dllh_data-maktx. "物料编码
my_data-werks = dllh_data-werks. "物料编码
my_data-idnrk = usedtab-matnr. "物料编码
my_data-maktr = usedtab-ojtxb. "物料编码
my_data-POSNR = usedtab-POSNR. "BOM行号
my_data-MENGE = usedtab-MENGE / usedtab-BMENG. "数量
my_data-ALPRF = usedtab-ALPRF. "优先级
my_data-ALPGR = usedtab-ALPGR. "替代组
my_data-ALPST = usedtab-ALPST. "策略
my_data-POTX1 = usedtab-POTX1. "行文本
my_data-STLAN = usedtab-STLAN. "物料清单类别
my_data-STLAL = usedtab-STLST. "BOM备选清单
my_data-EWAHR = usedtab-EWAHR. "BOM备选清单
APPEND my_data TO it_data.
ENDLOOP.
ENDIF.
ELSEIF rb_tt = 'X'.
LOOP AT usedtab. "循环内表USEDTAB把相应的成品号追加到IT_DATA
" APPEND my_data TO it_data.
"如果是有替代组的,带出替代组
IF usedtab-alpgr IS NOT INITIAL.
FREE it_stpox[].
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01' "设置为PP01
mdmps = ''
mehrs = '' "要设置‘X’才会展开虚拟阶
emeng = 100000
datuv = sy-datum
mtnrv = usedtab-matnr
werks = usedtab-werks
"stlal = ls_data-stlal
stlan = usedtab-stlan "这个栏位决定了第一次展BOM的类型,如果是2,则先展E-BOM,之后再按照PP01的方式有P展P。
TABLES
stb = it_stpox
matcat = matcat
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.
IF it_stpox[] IS NOT INITIAL.
LOOP AT it_stpox INTO DATA(ls_stpox) WHERE alpgr = usedtab-alpgr.
my_data-matnr = ls_stpox-IDNRK. "物料编码
my_data-maktx = ls_stpox-OJTXP. "物料编码
my_data-werks = ls_stpox-werks. "物料编码
my_data-idnrk = usedtab-matnr. "物料编码
my_data-maktr = usedtab-ojtxb. "物料编码
my_data-POSNR = ls_stpox-POSNR. "BOM行号
my_data-MENGE = ls_stpox-MNGKO / 100000. "数量
my_data-ALPRF = ls_stpox-ALPRF. "优先级
my_data-ALPGR = ls_stpox-ALPGR. "替代组
my_data-ALPST = ls_stpox-ALPST. "策略
my_data-POTX1 = ls_stpox-POTX1. "行文本
my_data-STLAN = ls_stpox-STLAN. "物料清单类别
my_data-STLAL = ls_stpox-STLAL. "BOM备选清单
my_data-EWAHR = ls_stpox-EWAHR. "BOM备选清单
APPEND my_data TO it_data.
ENDLOOP.
ENDIF.
ELSE.
my_data-matnr = dllh_data-matnr. "物料编码
my_data-maktx = dllh_data-maktx. "物料编码
my_data-werks = dllh_data-werks. "物料编码
my_data-idnrk = usedtab-matnr. "物料编码
my_data-maktr = usedtab-ojtxb. "物料编码
my_data-POSNR = usedtab-POSNR. "BOM行号
my_data-MENGE = usedtab-MENGE / usedtab-BMENG. "数量
my_data-ALPRF = usedtab-ALPRF. "优先级
my_data-ALPGR = usedtab-ALPGR. "替代组
my_data-ALPST = usedtab-ALPST. "策略
my_data-POTX1 = usedtab-POTX1. "行文本
my_data-STLAN = usedtab-STLAN. "物料清单类别
my_data-STLAL = usedtab-STLST. "BOM备选清单
my_data-EWAHR = usedtab-EWAHR. "BOM备选清单
APPEND my_data TO it_data.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
SELECT mara~matnr mara~normt makt~maktx mara~groes
INTO TABLE twlxx_data
FROM mara
INNER JOIN makt ON mara~matnr = makt~matnr
WHERE makt~spras = sy-langu.
SORT twlxx_data BY matnr.
SELECT matnr
werks
labst
INTO TABLE lt_mard
FROM mard
FOR ALL ENTRIES IN it_data
WHERE matnr = it_data-matnr
AND werks = it_data-werks.
SORT lt_mard BY matnr werks.
LOOP AT lt_mard INTO ls_mard.
MOVE-CORRESPONDING ls_mard TO ls_mard_sum.
COLLECT ls_mard_sum INTO lt_mard_sum.
CLEAR ls_mard.
ENDLOOP.
LOOP AT it_data INTO my_data.
CLEAR: wlxx_data.
READ TABLE twlxx_data INTO wlxx_data WITH KEY matnr = my_data-matnr
BINARY SEARCH.
CONCATENATE wlxx_data-maktx wlxx_data-groes INTO wlxx_data-maktx.
my_data-maktx = wlxx_data-maktx.
CLEAR ls_mard_sum.
READ TABLE lt_mard_sum INTO ls_mard_sum WITH KEY matnr = my_data-matnr
werks = my_data-werks.
IF sy-subrc = 0.
my_data-labst = ls_mard_sum-labst.
ENDIF.
MODIFY it_data FROM my_data.
ENDLOOP.
PERFORM comment_build CHANGING gt_list_top_of_page[].
PERFORM sub_fieldcat.
PERFORM layout_init CHANGING gs_layout.
DATA ls_layout TYPE lvc_s_layo.
ls_layout-zebra = abap_on. "斑马线显示,颜色隔行交替显示
ls_layout-cwidth_opt = abap_on. "ALV网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整
ls_layout-info_fname = 'COLOR'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid "注意点
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = g_user_command
is_layout_lvc = ls_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = it_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
* CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "调用ALV显示表单数据
* EXPORTING
* i_callback_program = sy-repid
* i_callback_top_of_page = 'TOP_OF_PAGE'
* it_fieldcat = wa_alv_fieldcat
* is_layout = gs_layout
* i_callback_user_command = g_user_command
* TABLES
* t_outtab = it_data
* 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.
*屏幕定义字段头
DEFINE fill_field.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1. "ALV 控制: 内部表字段的字段名称
gs_fieldcat-scrtext_l = &2. "长字段标签
gs_fieldcat-no_zero = &3. "ALV 控制: 为输出隐藏零
gs_fieldcat-ref_table = &4. "参考表
gs_fieldcat-ref_field = &5. "参考字段
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form FRM_SET_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_status USING lt_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS01'.
ENDFORM.
FORM sub_fieldcat.
* ls_layout-zebra = abap_on. "斑马线显示,颜色隔行交替显示
* ls_layout-cwidth_opt = abap_on. "ALV网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整
* ls_layout-info_fname = 'COLOR'.
fill_field 'MATNR' '物料编码' 'X' '' ''.
fill_field 'MAKTX' '物料描述' 'X' '' ''.
fill_field 'IDNRK' 'BOM料' 'X' '' ''.
fill_field 'MAKTR' 'BOM料说明' 'X' '' ''.
fill_field 'WERKS' '工厂' 'X' '' ''.
fill_field 'STLAN' '物料清单类别' 'X' '' ''.
fill_field 'STLAL' 'BOM备选清单' 'X' '' ''.
fill_field 'POSNR' 'BOM行号' 'X' '' ''.
"fill_field 'MATNR' '物料编码' 'X' '' ''.
"fill_field 'MAKTX' '物料描述' 'X' '' ''.
fill_field 'ALPGR' '替代组' 'X' '' ''.
fill_field 'ALPRF' '优先级' 'X' '' ''.
fill_field 'MENGE' '数量' 'X' '' ''.
fill_field 'ALPST' '策略' 'X' '' ''.
fill_field 'POTX1' '行文本' 'X' '' ''.
fill_field 'EWAHR' '使用概率' 'X' '' ''.
fill_field 'LABST' '库存' 'X' '' ''.
* PERFORM add_field USING 'MATNR' '物料编码'.
* PERFORM add_field USING 'MAKTX' '物料描述'.
* "PERFORM add_field USING 'WERKS' '工厂'.
* "PERFORM add_field USING 'STLAN' '物料清单类别'.
* "PERFORM add_field USING 'STLAL' 'BOM备选清单'.
* "PERFORM add_field USING 'POSNR' 'BOM行号'.
* PERFORM add_field USING 'IDNRK' 'BOM料'.
* PERFORM add_field USING 'MAKTR' 'BOM料说明'.
* "PERFORM add_field USING 'POSNR' 'BOM行号'.
*
*
* PERFORM add_field USING 'WERKS' '工厂'.
* PERFORM add_field USING 'STLAN' '物料清单类别'.
* PERFORM add_field USING 'STLAL' 'BOM备选清单'.
* PERFORM add_field USING 'POSNR' 'BOM行号'.
*
* PERFORM add_field USING 'MATNR' '物料编码'.
* PERFORM add_field USING 'MAKTX' '物料描述'.
*
* PERFORM add_field USING 'ALPGR' '替代组'.
* PERFORM add_field USING 'ALPRF' '优先级'.
* PERFORM add_field USING 'MENGE' '数量'.
* PERFORM add_field USING 'ALPST' '策略'.
* PERFORM add_field USING 'POTX1' '行文本'.
* " PERFORM add_field USING 'STLAN' '物料清单类别'.
* " PERFORM add_field USING 'STLAL' 'BOM备选清单'.
* PERFORM add_field USING 'EWAHR' '使用概率'.
* PERFORM add_field USING 'LABST' '库存'.
*
ENDFORM.
FORM add_field USING i_fieldname TYPE slis_fieldname i_text TYPE string.
CLEAR wa_alv_field.
wa_alv_field-fieldname = i_fieldname.
wa_alv_field-tabname = 'IT_DATA'.
wa_alv_field-ddictxt = 'L'.
wa_alv_field-no_zero = 'X'.
wa_alv_field-seltext_l = i_text.
APPEND wa_alv_field TO wa_alv_fieldcat.
ENDFORM. "ADD_FIELD
FORM layout_init CHANGING rs_layout TYPE slis_layout_alv.
rs_layout-colwidth_optimize = 'X'.
rs_layout-box_fieldname = 'SEL'.
rs_layout-zebra = 'X'.
rs_layout-detail_popup = 'X'.
ENDFORM. "LAYOUT_INIT
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = gt_list_top_of_page.
ENDFORM. "TOP_OF_PAGE
FORM comment_build CHANGING lt_top_of_page TYPE slis_t_listheader.
DATA ls_line TYPE slis_listheader.
CLEAR ls_line.
ls_line-typ = 'H'.
ls_line-info = '批量BOM反查'.
APPEND ls_line TO lt_top_of_page.
CLEAR ls_line.
ls_line-typ = 'S'.
ls_line-key = '查询时间:'.
ls_line-info = sy-datum.
APPEND ls_line TO lt_top_of_page.
ls_line-key = '查询人:'.
ls_line-info = sy-uname.
APPEND ls_line TO lt_top_of_page.
ENDFORM. "COMMENT_BUILD
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'. " SAP STANDARD CODE FOR DOUBLE-CLICKING
IF rs_selfield-sel_tab_field = 'IT_DATA-MATNR'.
SET PARAMETER ID 'MAT' FIELD rs_selfield-value.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDCASE.
ENDFORM.
取顶阶函数
DATA LS_ZPPFU503 TYPE ZPPFU503.
DATA: gt_ZPPFU503 TYPE STANDARD TABLE OF ZPPFU503 INITIAL SIZE 10 WITH HEADER LINE.
FUNCTION zppfu503.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_MATNR) TYPE RC29L-MATNR
*" VALUE(I_WERKS) TYPE RC29L-WERKS
*" EXPORTING
*" REFERENCE(O_MATNR) TYPE Z_MATNR
*" REFERENCE(O_MATXT) TYPE Z_MATNR
*" TABLES
*" O_ZPPFU503 STRUCTURE ZPPFU503
*"----------------------------------------------------------------------
DATA: BEGIN OF usedtab OCCURS 100.
INCLUDE STRUCTURE stpov.
DATA: END OF usedtab.
DATA: BEGIN OF equicat OCCURS 100.
INCLUDE STRUCTURE cscequi.
DATA: END OF equicat.
DATA: BEGIN OF kndcat OCCURS 100.
INCLUDE STRUCTURE cscknd.
DATA: END OF kndcat.
DATA: BEGIN OF matcat OCCURS 100.
INCLUDE STRUCTURE cscmat.
DATA: END OF matcat.
DATA: BEGIN OF stdcat OCCURS 100.
INCLUDE STRUCTURE cscstd.
DATA: END OF stdcat.
DATA: BEGIN OF tplcat OCCURS 100.
INCLUDE STRUCTURE csctpl.
DATA: END OF tplcat.
CALL FUNCTION 'CS_WHERE_USED_MAT'
EXPORTING
datub = sy-datum
datuv = sy-datum
matnr = i_matnr
werks = i_werks
TABLES
wultb = usedtab
equicat = equicat
kndcat = kndcat
matcat = matcat
stdcat = stdcat
tplcat = tplcat
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.
FREE gt_ZPPFU503.
IF usedtab IS NOT INITIAL.
LOOP AT usedtab INTO data(ls_usedtab).
PERFORM GET_DATA USING ls_usedtab-matnr ls_usedtab-werks ls_usedtab-OJTXB.
ENDLOOP.
ENDIF.
SORT gt_ZPPFU503 BY matnr werks.
DELETE ADJACENT DUPLICATES FROM gt_ZPPFU503 COMPARING ALL FIELDS.
"料号串联
LOOP AT gt_ZPPFU503.
IF O_MATNR IS INITIAL.
O_MATNR = gt_ZPPFU503-MATNR.
ELSE.
CONCATENATE O_MATNR gt_ZPPFU503-MATNR INTO O_MATNR SEPARATED BY '&'.
ENDIF.
ENDLOOP.
move gt_ZPPFU503[] to o_ZPPFU503[].
ENDFUNCTION.
FORM GET_DATA USING p_matnr p_werks P_OJTXB.
" DATA LS_ZPPFU503 TYPE ZPPFU503.
DATA: BEGIN OF lt_usedtab OCCURS 100.
INCLUDE STRUCTURE stpov.
DATA: END OF lt_usedtab.
DATA: BEGIN OF lt_equicat OCCURS 100.
INCLUDE STRUCTURE cscequi.
DATA: END OF lt_equicat.
DATA: BEGIN OF lt_kndcat OCCURS 100.
INCLUDE STRUCTURE cscknd.
DATA: END OF lt_kndcat.
DATA: BEGIN OF lt_matcat OCCURS 100.
INCLUDE STRUCTURE cscmat.
DATA: END OF lt_matcat.
DATA: BEGIN OF lt_stdcat OCCURS 100.
INCLUDE STRUCTURE cscstd.
DATA: END OF lt_stdcat.
DATA: BEGIN OF lt_tplcat OCCURS 100.
INCLUDE STRUCTURE csctpl.
DATA: END OF lt_tplcat.
CALL FUNCTION 'CS_WHERE_USED_MAT'
EXPORTING
datub = sy-datum
datuv = sy-datum
matnr = p_matnr
werks = p_werks
TABLES
wultb = lt_usedtab
equicat = lt_equicat
kndcat = lt_kndcat
matcat = lt_matcat
stdcat = lt_stdcat
tplcat = lt_tplcat
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 lt_usedtab IS NOT INITIAL.
LOOP AT lt_usedtab INTO DATA(ls1_usedtab).
PERFORM GET_DATA USING ls1_usedtab-matnr ls1_usedtab-werks ls1_usedtab-OJTXB.
ENDLOOP.
ELSE. "代表当前料为顶阶
LS_ZPPFU503-MATNR = p_matnr.
LS_ZPPFU503-WERKS = p_werks.
LS_ZPPFU503-OJTXB = P_OJTXB.
APPEND LS_ZPPFU503 TO gt_ZPPFU503.
ENDIF.
ENDFORM.