*&---------------------------------------------------------------------*
*& Report ZCOD0046_BOM
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test2 MESSAGE-ID zfi001.
DATA: gv_bukrs TYPE bseg-bukrs, ""公司代码
gv_werks TYPE marc-werks, ""工厂
gv_gjahr TYPE bseg-gjahr, ""会计年度
gv_monat TYPE bkpf-monat, ""会计期间
gv_mat TYPE marc-matnr. ""物料编号"
"后面用了INTO TABLE,不要轻易改动
TYPES: BEGIN OF ty_slm,
werks TYPE werks_d, ""工厂
matnr TYPE matnr, ""物料编号"
bklas TYPE bklas, ""评估分类
beskz TYPE beskz, ""采购类型
END OF ty_slm.
"前面的字段需要与ty_slm保持一致
TYPES: BEGIN OF ty_matnr,
werks TYPE werks_d, ""工厂
matnr TYPE matnr, ""物料编号"
END OF ty_matnr.
TYPES: BEGIN OF ty_zmatnr,
idnrk TYPE idnrk, ""BOM组件物料
iwerk TYPE werks_d, ""BOM组件工厂
matnr TYPE matnr, ""主件物料
werks TYPE werks_d, ""主件工厂 ""物料编号"
END OF ty_zmatnr.
"后面用了INTO TABLE,不要轻易改动
TYPES: BEGIN OF ty_wultb,
idnrk TYPE idnrk, ""BOM组件物料
iwerk TYPE werks_d, ""BOM组件工厂
matnr TYPE matnr, ""主件物料
werks TYPE werks_d, ""主件工厂
stlan TYPE stlan, ""物料清单用途
datuv TYPE datuv, ""有效起始日期
zdatuv TYPE datuv, ""有效截止日期
bklas TYPE bklas, ""评估类
alpgr TYPE cs_alpgr, ""替代组
ewahr TYPE ewahr, ""使用概率
menge TYPE kmpmg, ""组件数量
bmeng TYPE basmn, ""基本数量"
END OF ty_wultb.
TYPES: BEGIN OF ty_stpo,
zmatnr TYPE matnr, ""查询的物料
zwerks TYPE werks_d, ""查询的工厂
matnr TYPE matnr, ""主件物料
werks TYPE werks_d, ""主件工厂
idnrk TYPE idnrk, ""BOM组件物料
iwerk TYPE werks_d, ""BOM组件工厂
stlan TYPE stlan, ""物料清单用途
datuv TYPE datuv, ""有效起始日期
zdatuv TYPE datuv, ""有效截止日期
bklas TYPE bklas, ""评估类
alpgr TYPE cs_alpgr, ""替代组
ewahr TYPE ewahr, ""使用概率
menge TYPE kmpmg, ""组件数量
bmeng TYPE basmn, ""基本数量"
END OF ty_stpo.
DATA: gv_matnr TYPE TABLE OF ty_matnr,
gv_zmatnr TYPE TABLE OF ty_zmatnr,
gv_wultb TYPE TABLE OF ty_wultb,
gv_stpo TYPE TABLE OF ty_stpo,
gv_loopcount TYPE i. ""循环次数
DATA : BEGIN OF gv_zwultb OCCURS 0,
idnrk TYPE idnrk, ""BOM组件物料
iwerk TYPE werks_d, ""BOM组件工厂
datas TYPE STANDARD TABLE OF ty_wultb,
END OF gv_zwultb.
DATA gv_ndate2 TYPE d . "当前日期,期末,确定后不可修改
DATA lv_content TYPE zsfi0007b.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-a01.
PARAMETERS p_bukrs LIKE gv_bukrs. ""公司代码
PARAMETERS pn_gjahr LIKE gv_gjahr . ""当前年份
PARAMETERS pn_monat LIKE gv_monat. ""当前月份
SELECT-OPTIONS:
s_matnr FOR gv_mat, "物料编号
s_werks FOR gv_werks. "工厂
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM edit_main.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form EDIT_MAIN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM edit_main .
PERFORM frm_authority_check. "检查权限
PERFORM frm_selection_check_p3. "屏幕检查
PERFORM frm_get_finished_product. "查找成品料号
lv_content-mtype = 'S'.
lv_content-msg = '执行成功'(e05).
"PERFORM frm_give_msg.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_authority_check .
DATA:BEGIN OF lt_bukrs OCCURS 0,
bukrs LIKE t001-bukrs,
END OF lt_bukrs.
SELECT bukrs INTO TABLE lt_bukrs FROM t001 WHERE bukrs = p_bukrs.
IF sy-subrc <> 0.
lv_content-mtype = 'E'.
lv_content-msg = '公司代码不存在'(e01).
PERFORM frm_give_msg.
ENDIF.
LOOP AT lt_bukrs.
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'" 'F_SKA1_BUK'
ID 'BUKRS' FIELD lt_bukrs-bukrs"检查字段
ID 'ACTVT' FIELD '03'.
IF sy-subrc <> 0.
lv_content-mtype = 'E'.
lv_content-msg = '未授权的公司代码'(e02) && lt_bukrs-bukrs.
PERFORM frm_give_msg.
ENDIF.
ENDLOOP.
CLEAR:lt_bukrs,lt_bukrs[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECTION_CHECK_P3
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_selection_check_p3 .
DATA: lv_ndate1 TYPE d , "当前日期,期初,确定后不可修改
lv_ndate2 TYPE d , "当前日期,期末,确定后不可修改
lv_nrq(6) TYPE c, "当前日期 年月,确定后不可修改
lv_fdate1 TYPE d , "未来日期,期初,确定后不可修改
lv_fdate2 TYPE d , "未来日期,期末,确定后不可修改
lv_frq(6) TYPE c. "未来日期 年月,确定后不可修改
IF p_bukrs IS INITIAL.
MESSAGE s000 WITH '“公司代码”为空!'(e06) DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
IF pn_gjahr IS INITIAL.
MESSAGE s000 WITH '“当前年份”为空!'(e03) DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
IF pn_monat IS INITIAL.
MESSAGE s000 WITH '“当前月份”为空!'(e04) DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
lv_nrq = pn_gjahr && pn_monat.
lv_ndate1 = pn_gjahr && pn_monat && '01'.
"获取当前期末日期
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_ndate1
IMPORTING
last_day_of_month = lv_ndate2.
gv_ndate2 = lv_ndate2.
* CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
* EXPORTING
* date = lv_ndate1
* days = '00'
* months = '01'
* signum = '-'
* years = '03'
* IMPORTING
* calc_date = lv_del_date.
*
* lv_del_gjahr = lv_del_date+0(4).
* lv_del_monat = lv_del_date+4(2).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FINISHED_PRODUCT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_finished_product .
DATA: gt_slm TYPE TABLE OF ty_slm,
lt_slm TYPE TABLE OF ty_slm,
gs_slm TYPE ty_slm,
gt_matnr TYPE TABLE OF ty_matnr,
gs_matnr TYPE ty_matnr,
gs_wultb TYPE ty_wultb,
gt_stpo TYPE TABLE OF ty_stpo,
gs_stpo TYPE ty_stpo,
wa_stpo TYPE ty_stpo,
lt_bom TYPE TABLE OF ztco0043b_bom,
gt_bom TYPE TABLE OF ztco0043b_bom.
*取LCM料号
SELECT DISTINCT
werks, ""工厂
matnr, ""物料编号
bklas, ""评估分类
beskz ""采购类型
FROM ztco0043_slm
WHERE bukrs = @p_bukrs
AND lfgja = @pn_gjahr "当前年度
AND lfmon = @pn_monat "当前月份
AND bklas IN ('3000','7900','7920')
AND matnr IN @s_matnr "物料
AND werks IN @s_werks "工厂
INTO TABLE @lt_slm.
DELETE lt_slm[] WHERE werks IS INITIAL.
DELETE lt_slm[] WHERE matnr IS INITIAL.
DELETE lt_slm[] WHERE werks+0(2) = 'NV'."无价工厂不需要计算成品料号
LOOP AT lt_slm INTO gs_slm.
IF gs_slm-bklas = '7920' AND gs_slm-beskz = 'F'.
APPEND gs_slm TO gt_slm.
ELSEIF gs_slm-bklas = '3000' OR gs_slm-bklas = '7900'.
APPEND gs_slm TO gt_slm.
ENDIF.
ENDLOOP.
CLEAR:gs_slm.
*START ----------------- 仅提供IT测试使用 -------------------------------*
DATA lv_test TYPE c VALUE ''.
IF lv_test = 'X'.
CLEAR gt_slm[].
SELECT
werks, ""工厂
matnr ""物料编号
FROM marc
WHERE matnr IN @s_matnr "物料
AND werks IN @s_werks "工厂
INTO TABLE @gt_slm.
ENDIF.
*END ------------------- 仅提供IT测试使用 -------------------------------*
gt_matnr[] = gt_slm[].
IF gt_matnr[] IS INITIAL.
lv_content-mtype = 'E'.
lv_content-msg = 'SLM中没有符号条件的料号'(e03).
PERFORM frm_give_msg.
ENDIF.
SORT gt_matnr BY werks matnr.
*用SQL递归
CLEAR:gv_matnr[],gv_wultb[]."公共变量初始化
gv_loopcount = 0. "循环次数初始化
PERFORM frm_getdata_bom_sql TABLES gt_matnr. "反查BOM
gv_loopcount = 0.
CHECK gv_wultb[] IS NOT INITIAL.
*构造 组件物料 对应 多个主件物料
LOOP AT gv_wultb INTO gs_wultb
GROUP BY ( idnrk = gs_wultb-idnrk
iwerk = gs_wultb-iwerk )
ASCENDING ASSIGNING FIELD-SYMBOL(<group_zwultb>).
LOOP AT GROUP <group_zwultb> ASSIGNING FIELD-SYMBOL(<fs_zwultb>).
gv_zwultb-idnrk = <fs_zwultb>-idnrk."组件物料
gv_zwultb-iwerk = <fs_zwultb>-iwerk."组件工厂
APPEND <fs_zwultb> TO gv_zwultb-datas.
ENDLOOP.
APPEND gv_zwultb.
CLEAR gv_zwultb. "是清除工作区,不是内表
ENDLOOP.
CLEAR gs_wultb.
SORT gv_zwultb[] BY idnrk iwerk.
*递归,找到具体料号的BOM
LOOP AT gt_matnr INTO gs_matnr.
CLEAR:gv_zmatnr[],gv_stpo[]. "公共变量初始化
PERFORM frm_getdata_bom_recursion USING gs_matnr-matnr gs_matnr-werks.
" PERFORM frm_getdata_bom_value TABLES gv_stpo USING gs_matnr-matnr gs_matnr-werks.
PERFORM frm_give_ztco0043b_bom TABLES gv_stpo lt_bom USING gs_matnr-matnr gs_matnr-werks.
APPEND LINES OF lt_bom[] TO gt_bom[].
ENDLOOP.
CLEAR:gs_matnr.
CLEAR:gv_matnr[],gv_zmatnr[],gv_stpo[],gv_wultb[],gv_zwultb[],lt_bom[].
FREE:gv_matnr[],gv_zmatnr[],gv_stpo[],gv_wultb[],gv_zwultb[]."释放内存
*删除底表
PERFORM frm_delete_ztco0043b_bom.
*更新底表
PERFORM frm_update_ztco0043b_bom TABLES gt_bom.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_RECURSION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_STPO
*& --> GS_MATNR_MATNR
*& --> GS_MATNR_WERKS
*&---------------------------------------------------------------------*
FORM frm_getdata_bom_recursion USING pv_matnr TYPE matnr
pv_werks TYPE werks_d.
"此处不能和SQL一样卡控循环次数
CHECK gv_zwultb[] IS NOT INITIAL.
CHECK pv_matnr IS NOT INITIAL.
CHECK pv_werks IS NOT INITIAL.
DATA :lv_recursion TYPE c,
lv_matnr TYPE matnr,
lv_werks TYPE werks_d,
gs_wultb TYPE ty_wultb,
pt_zmatnr TYPE TABLE OF ty_zmatnr,
gs_zmatnr TYPE ty_zmatnr,
gs_stpo TYPE ty_stpo.
lv_matnr = pv_matnr.
lv_werks = pv_werks.
READ TABLE gv_zwultb[] INTO DATA(wa_zwultb) WITH KEY idnrk = lv_matnr iwerk = lv_werks BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT wa_zwultb-datas INTO gs_wultb.
READ TABLE gv_zmatnr TRANSPORTING NO FIELDS WITH KEY idnrk = gs_wultb-idnrk ""BOM组件物料
iwerk = gs_wultb-iwerk ""BOM组件工厂
matnr = gs_wultb-matnr ""主件物料
werks = gs_wultb-werks ""主件工厂
BINARY SEARCH.
IF sy-subrc NE 0."获取不匹配的
gs_zmatnr-idnrk = gs_wultb-idnrk. ""BOM组件物料
gs_zmatnr-iwerk = gs_wultb-iwerk. ""BOM组件工厂
gs_zmatnr-matnr = gs_wultb-matnr. ""主件物料
gs_zmatnr-werks = gs_wultb-werks. ""主件工厂"
COLLECT gs_zmatnr INTO pt_zmatnr.
MOVE-CORRESPONDING gs_wultb TO gs_stpo.
APPEND gs_stpo TO gv_stpo.
PERFORM frm_getdata_bom_recursion USING gs_zmatnr-matnr gs_zmatnr-werks.
ELSE.
lv_recursion = 'X'."如果重复则可能是出现了递归,暂时不提醒
ENDIF.
ENDLOOP.
ENDIF.
CLEAR:gs_wultb,wa_zwultb,gs_wultb,gs_zmatnr,gs_stpo.
CHECK pt_zmatnr[] IS NOT INITIAL.
APPEND LINES OF pt_zmatnr[] TO gv_zmatnr[]."传值给公共变量
SORT gv_zmatnr BY idnrk iwerk matnr werks.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_VALUE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_STPO
*& --> WA_MATNR_MATNR
*& --> WA_MATNR_WERKS
*&---------------------------------------------------------------------*
FORM frm_getdata_bom_value TABLES p_lt_stpo
USING pv_matnr TYPE matnr
pv_werks TYPE werks_d.
CHECK gv_zwultb[] IS NOT INITIAL.
CHECK pv_matnr IS NOT INITIAL.
CHECK pv_werks IS NOT INITIAL.
DATA lt_stpo TYPE TABLE OF ty_stpo.
FIELD-SYMBOLS <fs_stpo> LIKE LINE OF lt_stpo.
lt_stpo[] = p_lt_stpo[].
LOOP AT lt_stpo ASSIGNING <fs_stpo>.
<fs_stpo>-zmatnr = pv_matnr. ""查询的物料
<fs_stpo>-zwerks = pv_werks. ""查询的工厂"
ENDLOOP.
p_lt_stpo[] = lt_stpo[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_SQL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_MATNR
*&---------------------------------------------------------------------*
*测试:料:31MULAN00125N-MB-B 工厂:ML10
*测试:料: 151-18A-0002-N 工厂: 05K1 主件:817-07178ZS001A-N
FORM frm_getdata_bom_sql TABLES p_lt_matnr.
gv_loopcount = gv_loopcount + 1.
IF gv_loopcount > 100. "上个保险,避免死循环
RETURN.
ENDIF.
CHECK p_lt_matnr[] IS NOT INITIAL.
DATA: kt_matnr TYPE HASHED TABLE OF ty_matnr WITH UNIQUE KEY werks matnr,
lt_matnr TYPE TABLE OF ty_matnr,
pt_matnr TYPE TABLE OF ty_matnr,
gs_matnr TYPE ty_matnr,
wa_matnr TYPE ty_matnr.
DATA: gt_wultb TYPE TABLE OF ty_wultb,
gs_wultb TYPE ty_wultb,
lt_wultb TYPE TABLE OF ty_wultb,
wa_wultb TYPE ty_wultb. "
lt_matnr[] = p_lt_matnr[].
LOOP AT lt_matnr INTO gs_matnr.
wa_matnr-werks = gs_matnr-werks. ""工厂
wa_matnr-matnr = gs_matnr-matnr. ""物料
INSERT wa_matnr INTO TABLE kt_matnr.
ENDLOOP.
CLEAR:gs_matnr,wa_matnr.
WITH +wta AS ( SELECT werks,matnr FROM @kt_matnr AS zdata )
SELECT
stpo~idnrk, ""BOM组件物料
mast~werks AS iwerk, ""BOM组件工厂
mast~matnr, ""主件物料
mast~werks, ""主件工厂
mast~stlan, ""物料清单用途
stas~datuv, ""有效起始日期
zstas~datuv AS zdatuv, ""有效截止日期
mbew~bklas, ""评估类
stpo~alpgr, ""替代组
stpo~ewahr, ""使用概率
stpo~menge, ""组件数量
stko~bmeng ""基本数量"
FROM mast "BOM 链接物料
INNER JOIN stko "BOM 表头
ON stko~stlty = 'M' "物料清单类别
AND mast~stlnr = stko~stlnr"物料清单
AND mast~stlal = stko~stlal"备选物料清单
AND stko~lkenz IS INITIAL "删除标识:取空值
AND stko~stlst = '01' "物料清单状态:取01,激活的
AND stko~datuv LE @gv_ndate2 "有效期自小于等于当前月末日期
INNER JOIN stas "BOMs - 项选择 :BOM表头与BOM项目的关联关系
ON stko~stlty = stas~stlty"物料清单类别
AND stko~stlnr = stas~stlnr"物料清单
AND stko~stlal = stas~stlal"备选物料清单
AND stas~lkenz IS INITIAL "删除标识为空!
LEFT JOIN stas AS zstas "左链接 删除日期
ON stas~stlty = zstas~stlty"物料清单类别
AND stas~stlnr = zstas~stlnr"物料清单
AND stas~stlal = zstas~stlal"备选物料清单
AND stas~stlkn = zstas~stlkn"BOM 项目节点号
AND zstas~lkenz IS NOT INITIAL "删除标识不为空!
INNER JOIN stpo "BOM 项目
ON stas~stlty = stpo~stlty"物料清单类别
AND stas~stlnr = stpo~stlnr"物料清单
AND stas~stlkn = stpo~stlkn"BOM 项目节点号
AND stpo~datuv LE @gv_ndate2 "有效期自小于等于当前月末日期
AND stpo~postp = 'L' " 条目类别、项目类别
AND stpo~idnrk IS NOT INITIAL "组件
INNER JOIN +wta AS a
ON mast~werks = a~werks
AND stpo~idnrk = a~matnr
LEFT JOIN mbew "昆山立铠有BOM的料号不一定有评估分类
ON mast~matnr = mbew~matnr ""主件物料
AND mast~werks = mbew~bwkey "工厂
WHERE mast~andat LE @gv_ndate2 ""创建日期小于等于当前月末日期
INTO TABLE @lt_wultb.
DELETE lt_wultb[] WHERE menge = 0."组件数量
DELETE lt_wultb[] WHERE bmeng = 0."基本数量
"如果不是失效,则有效截止日期是空。 删除 有效截止日期 小于等于 当前月末日期
DELETE lt_wultb[] WHERE zdatuv IS NOT INITIAL AND zdatuv LE gv_ndate2.
CHECK lt_wultb[] IS NOT INITIAL.
SORT lt_wultb BY idnrk werks matnr werks stlan "BOM组件物料 BOM组件工厂 主件物料 主件工厂 物料清单用途
datuv DESCENDING "有效起始日期 降序
ewahr DESCENDING "使用概率 降序
menge bmeng."组件数量 基本数量
"按照键值去除重复值
LOOP AT lt_wultb INTO gs_wultb.
wa_wultb = gs_wultb.
AT NEW werks. "声明顺序:idnrk werks matnr werks
APPEND wa_wultb TO gt_wultb.
ENDAT.
ENDLOOP.
CLEAR:gs_wultb,wa_wultb.
APPEND LINES OF gt_wultb[] TO gv_wultb[]."传值给公共变量
"过滤掉重复查找的部分
LOOP AT gt_wultb INTO gs_wultb.
READ TABLE gv_matnr TRANSPORTING NO FIELDS WITH KEY werks = gs_wultb-werks
matnr = gs_wultb-matnr
BINARY SEARCH.
IF sy-subrc NE 0."获取不匹配的
gs_matnr-werks = gs_wultb-werks. ""工厂
gs_matnr-matnr = gs_wultb-matnr. ""物料
COLLECT gs_matnr INTO pt_matnr.
ENDIF.
ENDLOOP.
CLEAR:gs_wultb,gs_matnr.
SORT pt_matnr BY werks matnr.
APPEND LINES OF pt_matnr[] TO gv_matnr[]."传值给公共变量
SORT gv_matnr BY werks matnr.
PERFORM frm_getdata_bom_sql TABLES pt_matnr. "反查BOM
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GIVE_MSG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_give_msg .
CHECK lv_content-mtype IS NOT INITIAL.
EXPORT lv_content TO MEMORY ID 'ZCOD0046B_BOM'.
IF sy-tcode = 'SE38'."此程序主要还是给ZCOD0046调用,本身并没有T-code
MESSAGE lv_content-msg TYPE lv_content-mtype.
ENDIF.
CLEAR lv_content.
LEAVE LIST-PROCESSING.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GIVE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_STPO
*& --> GT_ZTCO0043B_BOM
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_give_ztco0043b_bom TABLES p_lt_stpo p_lt_bom
USING pv_matnr TYPE matnr
pv_werks TYPE werks_d.
CHECK p_lt_stpo[] IS NOT INITIAL.
CLEAR p_lt_bom[].
DATA: ls_gjahr TYPE bseg-gjahr, ""会计年度
ls_monat TYPE bkpf-monat, ""会计期间
ls_bukrs TYPE bseg-bukrs, ""公司代码
lt_stpo TYPE TABLE OF ty_stpo,
ls_stpo TYPE ty_stpo,
lt_bom TYPE TABLE OF ztco0043b_bom,
ls_bom TYPE ztco0043b_bom.
lt_stpo[] = p_lt_stpo[].
ls_gjahr = pn_gjahr.
ls_monat = pn_monat.
ls_bukrs = p_bukrs.
LOOP AT lt_stpo INTO ls_stpo WHERE bklas = '7900' OR bklas = '7920'.
ls_bom-gjahr = ls_gjahr. ""当前期间的会计年度
ls_bom-monat = ls_monat. ""当前期间(过账期间)
ls_bom-bukrs = ls_bukrs. ""公司代码
ls_bom-zmatnr = pv_matnr. ""查询的物料
ls_bom-zwerks = pv_werks. ""查询的工厂"
ls_bom-werks = ls_stpo-werks. ""工厂
ls_bom-matnr = ls_stpo-matnr. ""物料编号
"ls_bom-QPA2 = ls_stpo-QPA2. ""BOM表用量(QPA)
APPEND ls_bom TO lt_bom.
ENDLOOP.
CLEAR:ls_stpo,ls_bom.
"年度 月份 公司代码 查询工厂 查询物料 主件工厂 主件物料
SORT lt_bom BY gjahr monat bukrs zwerks zmatnr werks matnr.
"去重
DELETE ADJACENT DUPLICATES FROM lt_bom COMPARING gjahr monat bukrs zwerks zmatnr werks matnr.
p_lt_bom[] = lt_bom[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_delete_ztco0043b_bom .
DATA: ls_gjahr TYPE bseg-gjahr, ""会计年度
ls_monat TYPE bkpf-monat, ""会计期间
ls_bukrs TYPE bseg-bukrs. ""公司代码
ls_gjahr = pn_gjahr.
ls_monat = pn_monat.
ls_bukrs = p_bukrs.
SELECT COUNT(*)
FROM ztco0043b_bom
WHERE bukrs = @ls_bukrs
AND gjahr = @ls_gjahr
AND monat = @ls_monat.
CHECK sy-subrc = 0."先判断有值再删
DELETE
FROM ztco0043b_bom
WHERE bukrs = @ls_bukrs
AND gjahr = @ls_gjahr
AND monat = @ls_monat.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
MESSAGE s017(zfi01) ."执行成功
ELSE.
ROLLBACK WORK .
MESSAGE s018(zfi01) DISPLAY LIKE 'E'."执行失败
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
FORM frm_update_ztco0043b_bom TABLES p_lt_bom.
CHECK p_lt_bom[] IS NOT INITIAL.
DATA lt_bom TYPE TABLE OF ztco0043b_bom.
lt_bom[] = p_lt_bom[].
MODIFY ztco0043b_bom FROM TABLE lt_bom.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
MESSAGE s017(zfi01) ."执行成功
ELSE.
ROLLBACK WORK .
MESSAGE s018(zfi01) DISPLAY LIKE 'E'."执行失败
ENDIF.
ENDFORM.
ABAP 反查BOM
最新推荐文章于 2025-04-08 14:33:30 发布