一、接口逻辑







二、接口代码










FUNCTION z_fmpp_010.
*”———————————————————————-
*”*”本地接口:
*” IMPORTING
*” VALUE(I_DATA_GD) TYPE ZSBC_IF_GD
*” VALUE(I_INPUT) TYPE STRING
*” EXPORTING
*” VALUE(E_OUTPUT) TYPE STRING
*”———————————————————————-
DATA: lt_stb TYPE TABLE OF stpox WITH HEADER LINE,
lw_topmat TYPE cstmat.
DATA:
ls_input TYPE zspp_010_in,
ls_output TYPE zspp_010_out,
lt_retrun TYPE zstpp_010,
lw_msg TYPE zsbc_msg.
DATA: ls_log TYPE ztbc_log_table.
DATA: flg_typ TYPE c,
return_msg TYPE bapi_msg.
RANGES:r_matnr FOR mast-matnr,
* r_stlan FOR mast-stlan,
r_stlal FOR mast-stlal.
DATA: lw_bom_head TYPE zspp_010_head,
lt_bom_item TYPE zstpp_010_bom,
lw_bom_item LIKE LINE OF lt_bom_item,
lt_return TYPE zstpp_010,
lw_retrun LIKE LINE OF lt_return.
DATA: r_stlan TYPE RANGE OF mast-stlan .
CALL FUNCTION 'ZFM_BREAK_POINT' .
MOVE-CORRESPONDING i_data_gd TO ls_log.
ls_log-btype = 'PP0007'.
flg_typ = 'S'.
BREAK guoxiongjie .
CLEAR:ls_input,ls_output,lt_retrun[] .
CALL FUNCTION 'Z_FMBC_JSONTOABAP'
EXPORTING
i_json = i_input
IMPORTING
e_data = ls_input.
DEFINE marco_check_input.
IF ls_input-&1 IS INITIAL.
flg_typ = 'E' .
return_msg = return_msg && &2 && '为空;'.
ENDIF.
END-OF-DEFINITION.
IF i_data_gd-guid IS INITIAL OR i_data_gd IS INITIAL OR i_input IS INITIAL.
flg_typ = 'E' .
return_msg = '入参输入不完整;' .
ENDIF.
marco_check_input: zcxrq '查询日期',
werks '工厂代码',
matnr '物料' .
IF flg_typ = 'S'.
ls_input-matnr = |{ ls_input-matnr ALPHA = IN WIDTH = 18 }|.
IF ls_input-stlan IS NOT INITIAL.
r_stlan = VALUE #( ( SIGN = 'I' option = 'EQ' low = ls_input-stlan ) ) .
ENDIF.
SELECT
marc~matnr ,
mast~werks ,
CAST( @space AS CHAR( 1 ) ) AS done,
mast~stlan,
mast~stlnr,
* mast~stlal,
* mara~meins,
* marc~beskz,
* marc~sobsl,
* mara~matkl,
* mast~andat AS datuv
stko~bmeng,
stko~datuv
* INTO TABLE @DATA(lt_mat)
FROM mara INNER JOIN marc ON mara~matnr = marc~matnr
INNER JOIN mast ON marc~matnr = mast~matnr AND marc~werks = mast~werks
INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
WHERE marc~werks = @ls_input-werks
AND marc~matnr = @ls_input-matnr
AND mara~lvorm = ' '
AND marc~lvorm = ' '
AND mast~stlan IN @r_stlan
AND mast~stlal = '01'
INTO TABLE @DATA(lt_mast).
* SELECT SINGLE MIN( a~stlan ) FROM @lt_mast AS a INTO @DATA(lv_stlan) .
LOOP AT lt_mast INTO DATA(lw_mast) .”WHERE stlan = lv_stlan.
CALL FUNCTION 'ZCS_BOM_EXPL_MAT_V2'
EXPORTING
* aufsw = ' '
capid = 'PP01'
datuv = lw_mast-datuv
ehndl = '1'
emeng = lw_mast-bmeng
mtnrv = lw_mast-matnr
mehrs = 'X' “多层
stlan = lw_mast-stlan ” BOM用途
stlal = '01' “备选物料清单
werks = lw_mast-werks
IMPORTING
topmat = lw_topmat
* dstst = lv_dstst
TABLES
stb = lt_stb.
LOOP AT lt_stb.
lt_retrun = VALUE #( BASE lt_retrun (
werks = lw_topmat-werks
matnr = |{ lw_topmat-matnr ALPHA = OUT }|
stlan = lw_topmat-stlan
bmeng = lw_topmat-bmeng
bmein = lw_topmat-bmein
stufe = lt_stb-stufe
posnr = lt_stb-posnr
idnrk = |{ lt_stb-idnrk ALPHA = OUT }|
menge = lt_stb-menge
meins = lt_stb-meins
ausch = lt_stb-ausch
* alpgr = lt_stb-aplgr
* alprf = lt_stb-aplrf
* alpst = lt_stb-alpst
) ) .
ENDLOOP.
ENDLOOP.
ls_output-retrun = lt_retrun .
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = ls_output
IMPORTING
e_json = e_output.
ENDIF.
* IF flg_typ = 'S'.
* IF NOT ls_input-matnr IS INITIAL.
* DATA(lv_matnr) = |{ ls_input-matnr ALPHA = IN WIDTH = 18 }|.
* INSERT VALUE #( sign = 'I' option = 'EQ' low = lv_matnr ) INTO TABLE r_matnr.
* ENDIF.
* IF NOT ls_input-stlan IS INITIAL.
* INSERT VALUE #( sign = 'I' option = 'EQ' low = ls_input-stlan ) INTO TABLE r_stlan.
* ENDIF.
* IF NOT ls_input-stlal IS INITIAL.
* INSERT VALUE #( sign = 'I' option = 'EQ' low = ls_input-stlal ) INTO TABLE r_stlal.
* ENDIF.
*
* SELECT
* mast~werks,
* mast~matnr,
* mast~stlan,
* mast~stlnr,
* stko~stlal,
* stko~bmeng,
* stko~bmein,
* stko~datuv,
* stko~stlst,
* stpo~posnr,
* stpo~idnrk,
* stpo~menge,
* stpo~meins,
* stpo~ausch,
* stpo~alpgr,
* stpo~alprf,
* stpo~alpst
* INTO TABLE @DATA(lt_bom)
* FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
* INNER JOIN stpo ON stko~stlnr = stpo~stlnr AND stko~stlty = stpo~stlty
* WHERE ( stko~andat = @ls_input-zcxrq OR stko~aedat = @ls_input-zcxrq
* OR stpo~andat = @ls_input-zcxrq OR stpo~aedat = @ls_input-zcxrq )
* AND mast~werks = @ls_input-werks
* AND mast~matnr IN @r_matnr
* AND mast~stlan IN @r_stlan AND mast~stlal IN @r_stlal .
*
* SORT lt_bom .
* DELETE ADJACENT DUPLICATES FROM lt_bom .
*
* IF lt_bom[] IS INITIAL.
* return_msg = '查询无数据!' .
* ELSE.
* return_msg = '查询OK' .
* CLEAR:ls_output,lw_retrun,lt_return .
*
* SORT lt_bom ASCENDING BY matnr posnr .
* LOOP AT lt_bom INTO DATA(lw_bom).
* AT END OF stlst .
* DATA(flg_end) = 'X' .
* ENDAT .
*
* MOVE-CORRESPONDING lw_bom TO lw_bom_item .
* lw_bom_item-idnrk = |{ lw_bom_item-idnrk ALPHA = OUT }|.
* APPEND lw_bom_item TO lt_bom_item .
*
* IF flg_end = 'X'.
* SORT lt_bom_item ASCENDING BY posnr .
*
* MOVE-CORRESPONDING lw_bom TO lw_bom_head .
* lw_bom_head-matnr = |{ lw_bom_head-matnr ALPHA = OUT }|.
*
* lw_retrun-head = lw_bom_head .
* lw_retrun-item = lt_bom_item .
* APPEND lw_retrun TO lt_return .
*
* CLEAR: flg_end,lw_bom_item,lt_bom_item,lw_bom_head ,lw_retrun.
* ENDIF.
*
* ENDLOOP.
* ENDIF.
* ENDIF.
* lw_msg = VALUE #( type = flg_typ id = '00' number = '001' message = return_msg ) .
*
*
* ls_log-status = '@0A@'.
* IF flg_typ = 'S'.
* ls_log-status = '@08@'.
* ENDIF.
* ls_log-message = return_msg .
* ls_output-zs_outmsg = lw_msg .
* ls_output-retrun = lt_return .
* CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
* EXPORTING
* i_data = ls_output
* IMPORTING
* e_json = e_output.
* ls_log-direction = 'INBOUND'.
* ls_log-reqdat = i_input. “传入参数
* ls_log-resdat = e_output . “返回参数
*
* MODIFY ztbc_log_table FROM ls_log .
* IF sy-subrc = 0.
* COMMIT WORK AND WAIT.
* ELSE.
* ROLLBACK WORK.
* ENDIF.
* “写入查询日志
* DATA:lt_015 TYPE TABLE OF ztpp015 WITH HEADER LINE,
* lv_serial TYPE zde_serial.
*
* LOOP AT lt_return INTO DATA(lw_return).
* ADD 1 TO lv_serial .
* lt_015-zcxrq = ls_input-zcxrq .
* lt_015-datum = sy-datum .
* lt_015-uzeit = sy-uzeit .
* lt_015-serial = lv_serial .
* lt_015-type = flg_typ .
* lt_015-message = return_msg .
* DATA(lw_head) = lw_return-head .
* MOVE-CORRESPONDING lw_head TO lt_015 .
* APPEND lt_015 .
* ENDLOOP.
* MODIFY ztpp015 FROM TABLE lt_015 .
* IF sy-subrc = 0.
* COMMIT WORK AND WAIT.
* ELSE.
* ROLLBACK WORK.
* ENDIF.
ENDFUNCTION.




FUNCTION zcs_bom_expl_mat_v2.
*”———————————————————————-
*”*”本地接口:
*” IMPORTING
*” REFERENCE(CAPID) TYPE TC04-CAPID
*” REFERENCE(DATUV) TYPE STKO-DATUV
*” REFERENCE(EHNDL) TYPE CSDATA-XFELD
*” REFERENCE(EMENG) TYPE STKO-BMENG
*” REFERENCE(MTNRV) TYPE MARA-MATNR
*” REFERENCE(MEHRS) TYPE CSDATA-XFELD
*” REFERENCE(STLAN) TYPE STZU-STLAN
*” REFERENCE(STLAL) TYPE STKO-STLAL
*” REFERENCE(WERKS) TYPE MARC-WERKS
*” REFERENCE(I_STLAN) TYPE STLAN OPTIONAL
*” EXPORTING
*” REFERENCE(TOPMAT) LIKE CSTMAT STRUCTURE CSTMAT
*” TABLES
*” STB STRUCTURE STPOX
*”———————————————————————-
DATA: lt_stb TYPE TABLE OF stpox WITH HEADER LINE,
lw_topmat TYPE cstmat.
TYPES:BEGIN OF ty_bom ,
SORT TYPE char200.
INCLUDE STRUCTURE stpox .
TYPES:END OF ty_bom .
* DATA:BEGIN OF lt_bom OCCURS 0,
* sort TYPE char200.
* INCLUDE STRUCTURE stpox .
* DATA:END OF lt_bom ,
* lt_bom_tmp LIKE TABLE OF lt_bom WITH HEADER LINE.
DATA: lt_bom TYPE TABLE OF ty_bom.
DATA: lw_bom TYPE ty_bom.
DATA: lt_bom_tmp TYPE TABLE OF ty_bom .
DATA: lw_bom_tmp TYPE ty_bom .
TYPES:BEGIN OF ty_tab,
SORT TYPE char200,
idnrk TYPE idnrk,
stufe TYPE numc2,
wegxx TYPE numc3,
stlan TYPE stlan,
stlal TYPE stlal,
flag TYPE C,
END OF ty_tab .
DATA:lt_tab TYPE TABLE OF ty_tab .
DATA:lw_tab TYPE ty_tab .
DATA:lv_index TYPE I,
lv_sort TYPE numc5,
lv_stufe TYPE numc2,
lv_wegxx TYPE numc3.
* BREAK guoxiongjie .
CLEAR: topmat,lw_topmat,stb[],lt_stb[] .
DATA:lv_stlan_tmp TYPE stlan .
DATA(lv_matnr) = |{ mtnrv ALPHA = OUT }|.
lw_tab = VALUE #( SORT = lv_matnr idnrk = mtnrv stlan = stlan stufe = 0 flag = '' ).
* BREAK guoxiongjie .
“最上阶物料的BOM用途为3,字段ZTMM_MARA-ZZBBH 以A0/B0/C0等以0为结尾的值优先取1, ≠ A0/B0/C0 等以0为结尾的值优先取2.
CLEAR lv_stlan_tmp .
IF stlan = 3 .
SELECT stlan INTO TABLE @DATA(lt_tmp) FROM mast WHERE matnr = @mtnrv AND stlan IN ('1', '2').
SELECT SINGLE zzbbh INTO @DATA(lv_zzbbh) FROM ztmm_mara WHERE matnr = @mtnrv .
IF sy-subrc EQ 0 AND lv_zzbbh IS NOT INITIAL.
IF lv_zzbbh+1(1) = '0' .
READ TABLE lt_tmp INTO DATA(lw_tmp) WITH KEY stlan = '1' .
IF sy-subrc EQ 0.
lv_stlan_tmp = '1' .
ENDIF.
ELSE.
READ TABLE lt_tmp INTO lw_tmp WITH KEY stlan = '2' .
IF sy-subrc EQ 0.
lv_stlan_tmp = '2' .
ENDIF.
ENDIF.
ENDIF.
ENDIF.
APPEND lw_tab TO lt_tab .
DATA lv_stlal TYPE stko-stlal .
lv_stlal = stlal .
DATA(lv_bmeng) = emeng .
DATA lop_num TYPE I .
lop_num = 0 .
LOOP AT lt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>) WHERE flag = ''.
ADD 1 TO lop_num .
IF lop_num > 1000.
RETURN .
ENDIF.
ADD 1 TO lv_index .
<sy_tab>-flag = 'X' .
IF lv_stlal IS INITIAL.
lv_stlal = <sy_tab>-stlal .
ENDIF.
SELECT SINGLE bmeng FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
WHERE matnr = @<sy_tab>-idnrk AND werks = @werks AND stlan = @<sy_tab>-stlan
AND datuv LE @sy-datum AND valid_to GE @sy-datum
INTO @lv_bmeng .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
* aufsw = ' '
capid = capid
datuv = sy-datum “datuv
ehndl = ehndl
emeng = lv_bmeng “emeng
mtnrv = <sy_tab>-idnrk ” mtnrv
mehrs = '' “mehrs “多层
mmory = '1'
stlan = <sy_tab>-stlan “stlan ” BOM用途
stlal = lv_stlal “stlal “备选物料清单
werks = werks
aumgb = 'X'
IMPORTING
topmat = lw_topmat
* dstst = lv_dstst
TABLES
stb = lt_stb
* matcat = matcat
EXCEPTIONS
material_not_found = 4
no_plant_data = 8
no_bom_found = 12
no_suitable_bom_found = 16
alt_not_found = 24
missing_authorization = 28
conversion_error = 36.
CLEAR lv_stlal .
IF sy-subrc EQ 0.
IF topmat IS INITIAL.
topmat = lw_topmat .
ENDIF.
CLEAR lv_sort .
LOOP AT lt_stb .
lt_stb-stufe = lt_stb-stufe + <sy_tab>-stufe .
MOVE-CORRESPONDING lt_stb TO lw_bom .
lv_matnr = |{ lt_stb-idnrk ALPHA = OUT }|.
lv_wegxx = lt_stb-wegxx .
lv_stufe = lt_stb-stufe .
* ADD 1 TO lv_stufe .
* CONCATENATE <sy_tab>-sort lv_stufe lv_wegxx lv_matnr INTO lw_bom-sort .
ADD 1 TO lv_sort .
CONCATENATE <sy_tab>-SORT lv_sort INTO lw_bom-SORT .
lw_bom-CLASS = lv_bmeng .
APPEND lw_bom TO lt_bom .
IF mehrs = 'X'.
MOVE-CORRESPONDING lw_bom TO lw_bom_tmp .
APPEND lw_bom_tmp TO lt_bom_tmp .
ENDIF.
ENDLOOP.
“查找BOM用途是否存在
SELECT a~matnr, a~werks, a~stlan,a~stlal
FROM mast AS a INNER JOIN stko AS s ON s~stlnr = a~stlnr AND s~stlal = a~stlal AND lkenz = ''
INNER JOIN @lt_bom_tmp AS b ON a~matnr = b~idnrk AND a~werks = b~werks
WHERE s~datuv LE @sy-datum AND s~valid_to GE @sy-datum
* AND a~stlan in ( @<sy_tab>-stlan , '3' )
* AND a~stlal = @stlal
INTO TABLE @DATA(lt_stlan) .
LOOP AT lt_bom_tmp INTO lw_bom_tmp .
MOVE-CORRESPONDING lw_bom_tmp TO lw_tab .
READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0. “存在BOM才继续往下展
READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = lv_stlan_tmp TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0 AND lv_stlan_tmp IS NOT INITIAL. “父阶BOM用途为3, 且考虑版本号的情况
lw_tab-stlan = lv_stlan_tmp .
APPEND lw_tab TO lt_tab .
ELSE. “父阶BOM用途1/2
* SORT lt_stlan BY stlan ASCENDING .
* lw_tab-stlan = lt_stlan[ 1 ]-stlan.
IF i_stlan IS NOT INITIAL.
READ TABLE lt_stlan INTO DATA(lw_stlan)
WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = i_stlan.
IF sy-subrc EQ 0.
lv_stlan_tmp = i_stlan .
ENDIF.
ENDIF.
IF lv_stlan_tmp IS INITIAL.
READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = stlan TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0.
lv_stlan_tmp = stlan .
ELSE.
SELECT MIN( a~stlan ) FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks
INTO @lv_stlan_tmp .
IF lv_stlan_tmp NE '3'.
CLEAR lv_stlan_tmp .
SELECT MIN( a~stlan ) FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks AND stlan = '3'
INTO @lv_stlan_tmp .
IF sy-subrc <> 0.
CONTINUE .
ENDIF.
ENDIF.
ENDIF.
ENDIF.
SELECT SINGLE a~stlal FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks AND stlan = @lv_stlan_tmp
INTO @lw_tab-stlal .
lw_tab-stlan = lv_stlan_tmp .
APPEND lw_tab TO lt_tab .
* READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = stlan TRANSPORTING NO FIELDS.
* IF sy-subrc NE 0 .”不存在选中BOM用途,则读取用途为3的BOM
* IF stlan = '3'.
* lw_tab-stlan = '1' .
* ELSE.
* READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = '3' TRANSPORTING NO FIELDS.
* IF sy-subrc EQ 0.
* lw_tab-stlan = '3' .
* ENDIF.
* ENDIF.
* APPEND lw_tab TO lt_tab .
* ELSE. “不是父阶物料时, 继续向下面展
* IF lv_index > 1.
* lw_tab-stlan = stlan .
* APPEND lw_tab TO lt_tab .
* ENDIF.
* ENDIF.
ENDIF.
ENDIF.
CLEAR:lv_stlan_tmp.
ENDLOOP.
CLEAR: lt_bom_tmp[] .
ENDIF.
ENDLOOP.
SORT lt_bom[] ASCENDING BY SORT .”stufe.
MOVE-CORRESPONDING lt_bom[] TO stb[] .
ENDFUNCTION.


