用ECN号查询对应BOM的修改记录
具体效果:
代码如下:
*&---------------------------------------------------------------------*
*& Report ZHHPP018
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhhpp018.
TABLES: mseg,stpo.
DATA: gt_fieldcatalog TYPE lvc_t_fcat,
gw_fieldcatalog TYPE lvc_s_fcat,
gt_ddval TYPE lvc_t_drop, "定义存储下拉列表的数据
gw_ddval TYPE lvc_s_drop,
gt_sort TYPE lvc_t_sort,
gw_sort TYPE lvc_s_sort,
gt_events TYPE slis_t_event,
gw_events TYPE slis_alv_event,
gw_layout TYPE lvc_s_layo,
gt_exclude TYPE slis_t_extab,
g_repid TYPE sy-repid VALUE sy-repid,
gw_grid_setting TYPE lvc_s_glay,
g_ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:BEGIN OF it_data OCCURS 0 ,
werks TYPE werks_d,
matnr TYPE matnr,
stlnr TYPE stpo-stlnr,
STLKN TYPE stpo-STLKN,
aennr TYPE stpo-aennr,
vgknt TYPE stpo-vgknt,
andat TYPE stpo-andat,
annam TYPE stpo-annam,
idnrk TYPE stpo-idnrk,
potx1 TYPE stpo-potx1,
menge TYPE stpo-menge,
aedat TYPE stpo-aedat,
aenam TYPE stpo-aenam,
ecn_to TYPE stpo-ecn_to,
CMAKTX TYPE ATWRT,
qian TYPE string,
hou TYPE string,
maktx TYPE makt-maktx,
END OF it_data.
DATA it_data2 LIKE TABLE OF it_data WITH HEADER LINE.
DATA it_data3 LIKE TABLE OF it_data WITH HEADER LINE.
DATA it_data1 LIKE TABLE OF it_data WITH HEADER LINE.
DEFINE macro_fill_fcat.
CLEAR gw_fieldcatalog.
gw_fieldcatalog-fieldname = &1.
gw_fieldcatalog-coltext = &2.
gw_fieldcatalog-outputlen = &3.
gw_fieldcatalog-fix_column = 'X'.
APPEND gw_fieldcatalog TO gt_fieldcatalog.
END-OF-DEFINITION.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS: s_werks FOR mseg-werks ."DEFAULT '1011'.
SELECT-OPTIONS: s_matnr FOR mseg-matnr ."DEFAULT '80100003050A0'.
SELECT-OPTIONS: s_aennr FOR stpo-aennr .
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
START-OF-SELECTION.
PERFORM get_data.
PERFORM init_fieldcat.
PERFORM show_alv.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_data .
* IF s_matnr[] IS INITIAL AND s_aennr[] IS INITIAL .
* MESSAGE '物料与ECN号不能同时为空' TYPE 'S' DISPLAY LIKE 'E'.
* STOP.
* ENDIF.
SELECT mast~matnr mast~werks stpo~stlnr stpo~STLKN stpo~aennr stpo~vgknt stpo~andat stpo~annam stpo~idnrk stpo~potx1
stpo~menge
FROM mast
JOIN stpo ON stpo~stlnr = mast~stlnr
INTO CORRESPONDING FIELDS OF TABLE it_data
WHERE mast~matnr IN s_matnr
AND mast~werks IN s_werks
AND stpo~aennr IN s_aennr
AND stpo~valid_to > sy-datum.
.
SELECT mast~matnr mast~werks stpo~stlnr stpo~STLKN stpo~aennr stpo~vgknt stpo~andat stpo~annam stpo~idnrk stpo~potx1
stpo~menge stpo~aedat stpo~aenam stpo~ecn_to
FROM mast
JOIN stpo ON stpo~stlnr = mast~stlnr
INTO CORRESPONDING FIELDS OF TABLE it_data2
WHERE mast~matnr IN s_matnr
AND mast~werks IN s_werks
AND stpo~aennr IN s_aennr
AND stpo~valid_to =< sy-datum.
.
SORT it_data2 BY matnr werks aennr idnrk .
it_data1[] = it_data[].
SORT it_data1 by matnr.
DELETE ADJACENT DUPLICATES FROM it_data1 COMPARING matnr.
LOOP AT it_data1.
CALL FUNCTION 'ZHHMM_001'
EXPORTING
I_MATNR = it_data1-matnr
I_ATNAM = 'CMAKTX'
IMPORTING
E_ATWRT = it_data1-CMAKTX
.
SELECT SINGLE maktx FROM makt INTO it_data1-maktx WHERE matnr = it_data1-matnr AND spras = '1'."物料描述
MODIFY it_data1.
ENDLOOP.
SORT it_data1 by matnr.
LOOP AT it_data.
READ TABLE it_data1 WITH KEY matnr = it_data-matnr.
IF sy-subrc = 0.
it_data-CMAKTX = it_data1-CMAKTX.
it_data-maktx = it_data1-maktx.
ENDIF.
IF it_data-potx1 NE '' AND it_data-idnrk = ''.
it_data-idnrk = it_data-potx1.
ENDIF.
MODIFY it_data.
ENDLOOP.
LOOP AT it_data2.
READ TABLE it_data1 WITH KEY matnr = it_data2-matnr.
IF sy-subrc = 0.
it_data2-CMAKTX = it_data1-CMAKTX.
it_data2-maktx = it_data1-maktx.
ENDIF.
IF it_data2-potx1 NE '' AND it_data2-idnrk = ''.
it_data2-idnrk = it_data2-potx1.
ENDIF.
MODIFY it_data2.
ENDLOOP.
LOOP AT it_data.
LOOP AT it_data2 WHERE matnr = it_data-matnr AND werks = it_data-werks AND idnrk = it_data-idnrk."数量改变的
CLEAR it_data3.
MOVE-CORRESPONDING it_data TO it_data3.
IF it_data2-menge NE it_data-menge.
it_data3-qian = it_data2-menge.
it_data3-hou = it_data-menge.
APPEND it_data3.
ENDIF.
IF it_data2-menge = it_data-menge AND it_data2-idnrk = it_data-idnrk.
it_data3-hou = it_data2-idnrk.
APPEND it_data3.
ENDIF.
DELETE it_data2.
ENDLOOP.
IF sy-subrc NE 0.
LOOP AT it_data2 WHERE matnr = it_data-matnr and STLKN = it_data-vgknt."组件或数量改变的
MOVE-CORRESPONDING it_data TO it_data3.
IF it_data2-idnrk NE it_data-idnrk.
it_data3-qian = it_data2-idnrk.
it_data3-hou = it_data-idnrk.
APPEND it_data3.
ENDIF.
IF it_data2-MENGE NE it_data-MENGE.
it_data3-qian = it_data2-menge.
it_data3-hou = it_data-menge.
APPEND it_data3.
ENDIF.
CLEAR it_data3.
delete it_data2.
ENDLOOP.
IF sy-subrc ne 0.
CLEAR it_data3.
MOVE-CORRESPONDING it_data TO it_data3.
APPEND it_data3.
ENDIF.
ENDIF.
CLEAR it_data3.
ENDLOOP.
LOOP AT it_data2."组件删除的
CLEAR it_data3.
MOVE-CORRESPONDING it_data2 TO it_data3.
it_data3-qian = it_data2-idnrk.
it_data3-idnrk = ''.
it_data3-andat = it_data2-aedat .
it_data3-annam = it_data2-aenam .
it_data3-aennr = it_data2-ecn_to .
APPEND it_data3.
ENDLOOP.
SORT it_data3 by werks matnr.
LOOP AT it_data3.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = it_data3-matnr
IMPORTING
output = it_data3-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = it_data3-idnrk
IMPORTING
output = it_data3-idnrk.
MODIFY it_data3.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form init_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM init_fieldcat .
macro_fill_fcat:
'WERKS' '工厂' '4' ,
'MATNR' '物料编号' '18' ,
'MAKTX' '物料描述' '12',
'CMAKTX' '客户机种名' '12',
* 'STLNR' '物料清单' '8' ,
'AENNR' '变更编号' '10' ,
'ANDAT' '修改日期' '8' ,
'ANNAM' '修改账号' '6' ,
'IDNRK' '组件' '18' ,
* 'POTX1' '项目文本' '18',
'MENGE' '数量' '8',
'QIAN' '变更前' '18',
'HOU' '变更后' '18'
.
ENDFORM.
FORM show_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
* i_callback_pf_status_set = 'SET_STAT'
* i_callback_user_command = 'USER_COMMAND'
it_fieldcat_lvc = gt_fieldcatalog
TABLES
t_outtab = it_data3
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.
*FORM set_stat USING rt_extab TYPE slis_t_extab.
* "SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB .
* SET PF-STATUS 'ZSTATUS' EXCLUDING gt_status ." EXCLUDING rt_extab."窗体按钮
*ENDFORM.
*FORM user_command USING r_ucomm LIKE sy-ucomm "按钮功能
* rs_selfield TYPE slis_selfield."光标的参数
* DATA:
* ls_layout TYPE lvc_s_layo,
* lv_grid TYPE REF TO cl_gui_alv_grid.
*
* CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
* IMPORTING
* e_grid = lv_grid.
*
* CALL METHOD lv_grid->check_changed_data.
* rs_selfield-refresh = 'X'.
* rs_selfield-col_stable = 'X'.
* rs_selfield-row_stable = 'X'.
* CASE r_ucomm.
* WHEN 'SAVE' OR '&SAVE'.
* READ TABLE in_data WITH KEY icon = icon_red_light.
* IF sy-subrc = 0.
* MESSAGE '上载的数据中存在错误,请先处理错误再继续维护!' TYPE 'S' DISPLAY LIKE 'E'.
* EXIT.
* ENDIF.
* READ TABLE in_data WITH KEY icon = icon_green_light.
* IF sy-subrc = 0.
* MESSAGE '不可重复处理!' TYPE 'S' DISPLAY LIKE 'E'.
* EXIT.
* ENDIF.
** IF str = ''.
* PERFORM save_data.
** ELSE.
**
** ENDIF.
*
* ENDCASE.
* CLEAR r_ucomm.
*ENDFORM.
结果不知道是否非常准确,有需要的可以参考看看