ABAP:用ECN号查询BOM的修改记录

用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.

结果不知道是否非常准确,有需要的可以参考看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值