物料BOM与生产BOM对比表
*&---------------------------------------------------------------------*
*& 包含 ZSDR013A_TOP
*&---------------------------------------------------------------------*
TABLES:vbak,vbap,vbrp,ekpo,ekko,vbrk,bkpf.
TYPE-POOLS:slis.
"定义ALV输出所需变量
DATA: s_layout TYPE slis_layout_alv,
gt_fieldcat TYPE slis_t_fieldcat_alv.
TYPES: BEGIN OF gts_data,
vbeln TYPE vbap-vbeln, "销售凭证
posnr TYPE vbap-posnr, "销售凭证项目
werks TYPE vbap-werks, "工厂
matnr TYPE vbap-matnr, "销售料号
kwmeng TYPE vbap-kwmeng, "订单数
emeng TYPE stko-bmeng, "订单数
matnr_wm TYPE vbap-matnr, "物料BOM母件
ojtxb_wm TYPE ojtxb, "物料BOM母件描述
idnrk_wz TYPE idnrk, "物料BOM子件
ojtxb_wz TYPE ojtxb, "物料BOM子件描述
menge_wz TYPE kmpmg, "物料BOM子件子件数量
meins_wz TYPE meins, "单位
zdbjg(15) , "对比结果
aufnr TYPE resb-aufnr, "生产订单号
baugr_sm TYPE resb-baugr, "生产BOM母件
ojtxb_sm TYPE ojtxb, "生产BOM母件描述
matnr_sz TYPE resb-matnr, "生产BOM子件
ojtxb_sz TYPE ojtxb, "生产BOM子件描述
bdmng_sz TYPE resb-bdmng, "生产BOM子件子件数量
flag(1),
END OF gts_data.
DATA: gt_data TYPE TABLE OF gts_data WITH HEADER LINE.
DATA: gt_datab TYPE TABLE OF gts_data WITH HEADER LINE.
DATA: gt_datas TYPE TABLE OF gts_data WITH HEADER LINE.
DATA: gt_data1 TYPE TABLE OF gts_data WITH HEADER LINE.
DATA: gt_switch TYPE TABLE OF gts_data WITH HEADER LINE.
DATA: gs_data TYPE gts_data.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_werks LIKE vbap-werks OBLIGATORY . "采购订单类型
SELECT-OPTIONS:
s_vbeln FOR vbap-vbeln MODIF ID c1, "公司代码
s_posnr FOR vbap-posnr MODIF ID c1. "发票过账日期
SELECTION-SCREEN END OF BLOCK b1.
*&---------------------------------------------------------------------*
*& 包含 ZSDR013A_FOM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM screen_setting .
* LOOP AT SCREEN.
* CASE screen-group1.
* WHEN 'M1'.
* screen-input = '0'.
* ENDCASE.
* MODIFY SCREEN.
* ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM fom_getdata .
CLEAR:gt_data[].
CLEAR:gs_data.
"" 取销售订单数据
SELECT vbap~vbeln "销售凭证
vbap~posnr "销售凭证项目
vbap~werks "工厂
vbap~matnr "销售料号
vbap~kwmeng "订单数
vbap~matnr AS matnr_wm "物料BOM母件
INTO CORRESPONDING FIELDS OF TABLE gt_data[]
FROM vbap
WHERE vbap~werks = p_werks
AND vbap~vbeln IN s_vbeln
AND vbap~posnr IN s_posnr
.
IF gt_data[] IS NOT INITIAL.
DATA topmat LIKE cstmat .
DATA dstst LIKE csdata-xfeld .
DATA stb TYPE TABLE OF stpox WITH HEADER LINE.
DATA it_a TYPE TABLE OF cscmat WITH HEADER LINE.
DATA it_b TYPE TABLE OF cscmat WITH HEADER LINE.
DATA matcat TYPE TABLE OF cscmat WITH HEADER LINE.
LOOP AT gt_data[] INTO gs_data WHERE flag IS INITIAL .
gs_data-emeng = gs_data-kwmeng .
gs_data-matnr_wm = gs_data-matnr .
DATA gl_flag TYPE c .
*-----------------------------------------------------------------
CLEAR stb[] .
CLEAR matcat[] .
CLEAR topmat .
CLEAR dstst .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PC01' "应用程序一般为PP01
datuv = sy-datum "通常为系统的当前日期
mtnrv = gs_data-matnr_wm "要展开BOM的物料
mehrs = 'X' " x表示多层展开﹐space表示只展开第一层
werks = gs_data-werks "通常为1000
emeng = gs_data-emeng "需求数量
IMPORTING
topmat = topmat
dstst = dstst
TABLES
stb = stb "展开的BOM存放在该内表
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
conversion_error = 8
OTHERS = 9
.
IF stb IS NOT INITIAL.
LOOP AT stb WHERE stufe = 1.
* READ TABLE matcat WITH KEY matnr = stb-idnrk .
* IF sy-subrc <> 0.
gs_data-idnrk_wz = stb-idnrk. "物料BOM子件
* gs_data-ojtxb_wz = stb-ojtxb. "物料BOM子件描述
gs_data-menge_wz = stb-menge. "物料BOM子件子件数量
gs_data-meins_wz = stb-meins. "单位
gs_data-flag = 'X'.
gl_flag = 'X'.
APPEND gs_data TO gt_data.
* ENDIF.
ENDLOOP.
ENDIF.
DELETE matcat[] WHERE verid IS INITIAL .
CLEAR it_a[] .
it_a[] = matcat[] .
WHILE NOT it_a[] IS INITIAL. "递归算法
LOOP AT it_a.
CLEAR stb[] .
CLEAR matcat[] .
CLEAR topmat .
CLEAR dstst .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PC01' "应用程序一般为PP01
datuv = sy-datum "通常为系统的当前日期
mtnrv = it_a-matnr "要展开BOM的物料
mehrs = 'X' " x表示多层展开﹐space表示只展开第一层
werks = gs_data-werks "通常为1000
emeng = gs_data-emeng "需求数量
IMPORTING
topmat = topmat
dstst = dstst
TABLES
stb = stb "展开的BOM存放在该内表
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
conversion_error = 8
OTHERS = 9
.
IF stb IS NOT INITIAL.
LOOP AT stb WHERE stufe = 1.
* READ TABLE matcat WITH KEY matnr = stb-idnrk .
* IF sy-subrc <> 0.
gs_data-matnr_wm = it_a-matnr .
gs_data-idnrk_wz = stb-idnrk. "物料BOM子件
* gs_data-ojtxb_wz = stb-ojtxb. "物料BOM子件描述
gs_data-menge_wz = stb-menge. "物料BOM子件子件数量
gs_data-meins_wz = stb-meins. "单位
gs_data-flag = 'X'.
APPEND gs_data TO gt_data.
* ENDIF.
ENDLOOP.
ENDIF.
DELETE matcat[] WHERE verid IS INITIAL .
APPEND LINES OF matcat[] TO it_b[].
CLEAR it_a .
ENDLOOP.
SORT it_b BY matnr .
DELETE ADJACENT DUPLICATES FROM it_b[] COMPARING matnr.
it_a[] = it_b[] .
CLEAR it_b[] .
ENDWHILE.
IF gl_flag IS NOT INITIAL.
gs_data-flag = 'D'.
ENDIF.
MODIFY gt_data[] FROM gs_data .
CLEAR gs_data .
ENDLOOP .
DELETE gt_data[] WHERE flag = 'D' .
* SORT gt_data[] BY vbeln posnr werks matnr matnr_wm idnrk_wz .
* DELETE ADJACENT DUPLICATES FROM gt_data[] COMPARING vbeln posnr werks matnr matnr_wm idnrk_wz.
gt_switch[] = gt_data[] .
LOOP AT gt_data INTO gs_data.
* SELECT SINGLE AUFNR INTO GS_DATA-AUFNR FROM RESB
* WHERE KDAUF = GS_DATA-VBELN
* AND KDPOS = GS_DATA-POSNR
* .
*
* IF SY-SUBRC = 0.
* GS_DATA-BAUGR_SM = GS_DATA-MATNR .
* SELECT SINGLE MAKTX INTO GS_DATA-OJTXB_SM FROM MAKT
* WHERE MATNR = GS_DATA-MATNR
* AND SPRAS = 1
* .
* SELECT SINGLE BAUGR INTO GS_DATA-BAUGR_SM FROM RESB
* WHERE KDAUF = GS_DATA-VBELN
* AND KDPOS = GS_DATA-POSNR
* AND AUFNR = GS_DATA-AUFNR
* AND BAUGR = GS_DATA-MATNR
* .
READ TABLE gt_switch WITH KEY vbeln = gs_data-vbeln
posnr = gs_data-posnr
werks = gs_data-werks
matnr = gs_data-matnr
idnrk_wz = gs_data-matnr_wm .
IF sy-subrc = 0.
gs_data-menge_wz = gs_data-menge_wz * gt_switch-menge_wz .
ENDIF.
SELECT MAX( afpo~aufnr ) INTO gs_data-aufnr
FROM afpo
INNER JOIN caufv ON caufv~aufnr = afpo~aufnr
WHERE afpo~kdauf = gs_data-vbeln
AND afpo~kdpos = gs_data-posnr
AND afpo~matnr = gs_data-matnr_wm
AND caufv~autyp = '10'
AND caufv~loekz = ''
.
SELECT SINGLE
resb~baugr AS baugr_sm
resb~matnr AS matnr_sz
resb~bdmng AS bdmng_sz
INTO CORRESPONDING FIELDS OF gs_data
FROM resb
WHERE resb~baugr = gs_data-matnr_wm
AND resb~matnr = gs_data-idnrk_wz
AND resb~aufnr = gs_data-aufnr
AND resb~xloek = ''
.
IF sy-subrc <> 0."废弃没有内容的生产订单号
CLEAR gs_data-aufnr .
ENDIF.
* SELECT SINGLE aufnr baugr AS baugr_sm matnr AS matnr_sz bdmng AS bdmng_sz INTO CORRESPONDING FIELDS OF gs_data FROM resb
* WHERE kdauf = gs_data-vbeln
* AND kdpos = gs_data-posnr
* AND baugr = gs_data-matnr_wm
* AND matnr = gs_data-idnrk_wz
* .
*
* IF sy-subrc <> 0.
* SELECT SINGLE aufnr baugr AS baugr_sm INTO CORRESPONDING FIELDS OF gs_data FROM resb
* WHERE kdauf = gs_data-vbeln
* AND kdpos = gs_data-posnr
* AND baugr = gs_data-matnr_wm
* .
*
* IF sy-subrc <> 0 .
* SELECT SINGLE aufnr INTO CORRESPONDING FIELDS OF gs_data FROM resb "baugr AS baugr_sm
* WHERE kdauf = gs_data-vbeln
* AND kdpos = gs_data-posnr
* AND baugr = gs_data-matnr
* .
* ENDIF .
*
* ENDIF.
SELECT SINGLE maktx INTO gs_data-ojtxb_sm FROM makt
WHERE matnr = gs_data-baugr_sm
AND spras = 1
.
SELECT SINGLE maktx INTO gs_data-ojtxb_sz FROM makt
WHERE matnr = gs_data-matnr_sz
AND spras = 1
.
* ENDIF.
*BAUGR AS BAUGR_SM MATNR AS MATNR_SZ BDMNG AS BDMNG_SZ
MODIFY gt_data FROM gs_data .
CLEAR gs_data .
ENDLOOP.
LOOP AT gt_data INTO gs_data.
SELECT SINGLE maktx INTO gs_data-ojtxb_wm FROM makt
WHERE matnr = gs_data-matnr_wm
AND spras = 1
.
SELECT SINGLE maktx INTO gs_data-ojtxb_wz FROM makt
WHERE matnr = gs_data-idnrk_wz
AND spras = 1
.
* gs_data-menge_wz = gs_data-menge_wz * gs_data-kwmeng .
IF gs_data-kwmeng IS NOT INITIAL.
gs_data-bdmng_sz = gs_data-bdmng_sz / gs_data-kwmeng .
ENDIF.
READ TABLE gt_switch WITH KEY vbeln = gs_data-vbeln
posnr = gs_data-posnr
werks = gs_data-werks
matnr = gs_data-matnr
matnr_wm = gs_data-idnrk_wz
.
IF sy-subrc = 0.
gs_data-flag = 'D' .
ENDIF.
IF gs_data-idnrk_wz = gs_data-matnr_sz.
IF gs_data-menge_wz = gs_data-bdmng_sz.
gs_data-zdbjg = '完全一致' .
ELSE .
gs_data-zdbjg = '料号一致数量不一致' .
ENDIF.
ELSE .
gs_data-zdbjg = '完全不一致' .
ENDIF.
MODIFY gt_data FROM gs_data .
CLEAR gs_data .
ENDLOOP.
CLEAR gt_datab[] .
gt_datab[] = gt_data[] .
SORT gt_datab[] BY vbeln posnr .
DELETE ADJACENT DUPLICATES FROM gt_datab[] COMPARING vbeln posnr .
* DELETE gt_datab[] WHERE matnr_wm IS INITIAL .
CLEAR gt_datas[] .
SELECT
afpo~aufnr
afpo~kdauf AS vbeln
afpo~kdpos AS posnr
afpo~matnr AS matnr_wm
INTO CORRESPONDING FIELDS OF TABLE gt_datas[]
FROM afpo
INNER JOIN caufv ON caufv~aufnr = afpo~aufnr
FOR ALL ENTRIES IN gt_datab[]
WHERE afpo~kdauf = gt_datab-vbeln
AND afpo~kdpos = gt_datab-posnr
* AND afpo~matnr = gt_datab-matnr_wm
AND afpo~dauty = '10'
AND afpo~kdauf <> ''
AND afpo~kdpos <> ''
AND caufv~autyp = '10'
AND caufv~loekz = ''
.
SORT gt_datas[] BY vbeln posnr aufnr .
* DELETE ADJACENT DUPLICATES FROM gt_datas[] COMPARING vbeln posnr .
IF gt_datas[] IS NOT INITIAL.
CLEAR gt_data1[] .
SELECT resb~aufnr
resb~baugr AS baugr_sm
resb~matnr AS matnr_sz
resb~bdmng AS bdmng_sz
INTO CORRESPONDING FIELDS OF TABLE gt_data1[]
FROM resb
FOR ALL ENTRIES IN gt_datas[]
WHERE aufnr = gt_datas-aufnr
AND xloek = ''
.
SORT gt_data1[] BY aufnr .
LOOP AT gt_data1.
READ TABLE gt_data WITH KEY aufnr = gt_data1-aufnr
baugr_sm = gt_data1-baugr_sm
matnr_sz = gt_data1-matnr_sz
.
IF sy-subrc <> 0.
SELECT SINGLE vbap~vbeln "销售凭证
vbap~posnr "销售凭证项目
vbap~werks "工厂
vbap~matnr "销售料号
vbap~kwmeng "订单数
* vbap~matnr AS matnr_wm "物料BOM母件
INTO CORRESPONDING FIELDS OF gt_data1
FROM vbap
INNER JOIN afpo ON vbap~vbeln = afpo~kdauf AND vbap~posnr = afpo~kdpos
WHERE afpo~aufnr = gt_data1-aufnr .
SELECT SINGLE maktx INTO gt_data1-ojtxb_sm FROM makt
WHERE matnr = gt_data1-baugr_sm
AND spras = 1
.
SELECT SINGLE maktx INTO gt_data1-ojtxb_sz FROM makt
WHERE matnr = gt_data1-matnr_sz
AND spras = 1
.
IF gt_data1-kwmeng IS NOT INITIAL.
gt_data1-bdmng_sz = gt_data1-bdmng_sz / gt_data1-kwmeng .
ENDIF.
gt_data1-zdbjg = '完全不一致' .
APPEND gt_data1 TO gt_data[] .
ENDIF.
CLEAR gt_data1 .
ENDLOOP.
ENDIF.
SORT gt_data[] BY vbeln posnr matnr matnr_wm idnrk_wz aufnr baugr_sm matnr_sz.
DELETE ADJACENT DUPLICATES FROM gt_data[] COMPARING vbeln posnr matnr matnr_wm idnrk_wz aufnr baugr_sm matnr_sz.
* DELETE gt_data[] WHERE flag = 'D' .
*TYPES: BEGIN OF GTS_DATA,
* VBELN TYPE VBAP-VBELN, "销售凭证
* POSNR TYPE VBAP-POSNR, "销售凭证项目
* WERKS TYPE VBAP-WERKS, "工厂
* MATNR TYPE VBAP-MATNR, "销售料号
* KWMENG TYPE VBAP-KWMENG, "订单数
* EMENG TYPE STKO-BMENG, "订单数
* MATNR_WM TYPE VBAP-MATNR, "物料BOM母件
* OJTXB_WM TYPE OJTXB, "物料BOM母件描述
* IDNRK_WZ TYPE IDNRK, "物料BOM子件
* OJTXB_WZ TYPE OJTXB, "物料BOM子件描述
* MENGE_WZ TYPE KMPMG, "物料BOM子件子件数量
* MEINS_WZ TYPE MEINS, "单位
* ZDBJG(15) , "对比结果
* AUFNR TYPE RESB-AUFNR, "生产订单号
* BAUGR_SM TYPE RESB-BAUGR, "生产BOM母件
* OJTXB_SM TYPE OJTXB, "生产BOM母件描述
* MATNR_SZ TYPE RESB-MATNR, "生产BOM子件
* OJTXB_SZ TYPE OJTXB, "生产BOM子件描述
* BDMNG_SZ TYPE RESB-BDMNG, "生产BOM子件子件数量
* FLAG(1),
* END OF GTS_DATA.
ELSE.
MESSAGE '没有符合条件的数据' TYPE 'I'.
STOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display .
CLEAR s_layout.
s_layout-zebra = 'X'.
s_layout-colwidth_optimize = 'X'.
* s_layout-box_fieldname = 'BOX'.
PERFORM frm_fill_field .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = s_layout
it_fieldcat = gt_fieldcat
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
i_callback_user_command = 'USER_COMMAND'
TABLES
t_outtab = gt_data[].
ENDFORM.
FORM frm_fill_field .
DATA: wa_fieldcat TYPE slis_fieldcat_alv.
DEFINE fill_field.
wa_fieldcat-fieldname = &1.
wa_fieldcat-seltext_l = &2.
* wa_fieldcat-checkbox = &3.
* wa_fieldcat-edit = &4.
IF wa_fieldcat-fieldname = 'MATNR' OR wa_fieldcat-fieldname = 'MATNR_WM'
OR wa_fieldcat-fieldname = 'IDNRK_WZ' OR wa_fieldcat-fieldname = 'BAUGR_SM'
OR wa_fieldcat-fieldname = 'MATNR_SZ'.
wa_fieldcat-ref_tabname = 'VBAP'.
wa_fieldcat-ref_fieldname = 'MATNR'.
ENDIF.
IF wa_fieldcat-fieldname = 'OJTXB_WM' OR wa_fieldcat-fieldname = 'OJTXB_WZ'
OR wa_fieldcat-fieldname = 'OJTXB_SM' OR wa_fieldcat-fieldname = 'OJTXB_SZ' .
wa_fieldcat-ref_tabname = 'MAKT'.
wa_fieldcat-ref_fieldname = 'MAKTX'.
ENDIF.
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR wa_fieldcat.
END-OF-DEFINITION.
fill_field :
'VBELN' '销售凭证',
'POSNR' '销售凭证项目',
'WERKS' '工厂',
'MATNR' '销售料号',
'KWMENG' '订单数',
'MATNR_WM' '物料BOM母件',
'OJTXB_WM' '物料BOM母件描述',
'IDNRK_WZ' '物料BOM子件',
'OJTXB_WZ' '物料BOM子件描述',
'MENGE_WZ' '物料BOM子件子件数量',
'MEINS_WZ' '单位',
'ZDBJG' '对比结果',
'AUFNR' '生产订单号',
'BAUGR_SM' '生产BOM母件',
'OJTXB_SM' '生产BOM母件描述',
'MATNR_SZ' '生产BOM子件',
'OJTXB_SZ' '生产BOM子件描述',
'BDMNG_SZ' '生产BOM子件子件数量'.
ENDFORM.
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM user_command USING i_ucomm LIKE sy-ucomm
is_selfield TYPE slis_selfield.
DATA: ref TYPE REF TO cl_gui_alv_grid.
DATA : lv_stable TYPE lvc_s_stbl. "刷新稳定性
RANGES: l_werks FOR t001w-werks.
RANGES: l_matnr FOR mara-matnr.
DATA:l_bukrs TYPE t001k-bukrs.
lv_stable-row = '1'.
lv_stable-col = '1'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref.
CALL METHOD ref->check_changed_data.
CASE i_ucomm.
WHEN 'DEL_DJ'.
ENDCASE.
CALL METHOD ref->refresh_table_display
EXPORTING
is_stable = lv_stable.
ENDFORM.
INITIALIZATION .
AT SELECTION-SCREEN OUTPUT.
PERFORM screen_setting.
START-OF-SELECTION.
PERFORM fom_getdata .
PERFORM frm_display.