메뉴 건너뛰기

SAP 한국 커뮤니티



REPORT z_demo_alv_refresh_button_4

노름마치 2007.11.05 12:59 조회 수 : 3560

REPORT z_demo_alv_refresh_button_4.
*>*********************************************************************
* This report reads and displays data from table MARA,                *
* using the FM : REUSE_ALV_LIST_DISPLAY                               *
* Button  > : displays the next N records                             *
* Button  < : displays the previous N records                         *
* Button I< : displays the first page                                 *
* Button >I : displays the last page                                  *
* When the buttons Sort up, sort down, Filter, Delete Filter are      *
* pressed, N record are still displayed                               *
*---------------------------------------------------------------------*
* Author : Michel PIOUD                                               *
* Email : mpioud@yahoo.fr  HomePage : http://www.geocities.com/mpioud *
*>*********************************************************************


SELECTION-SCREEN :
 BEGIN OF LINE,COMMENT 10(20) v_1 FOR FIELD p_max.          "#EC NEEDED
PARAMETERS p_max(2) TYPE n DEFAULT '33' OBLIGATORY.
SELECTION-SCREEN END OF LINE.


TYPE-POOLS: slis, kkblo.               " ALV global types


CONSTANTS:
  c_first_page TYPE syucomm VALUE '&CRB',
  c_next_page  TYPE syucomm VALUE '&CRR',
  c_prev_page  TYPE syucomm VALUE '&CRL',
  c_last_page  TYPE syucomm VALUE '&CRE'.


DATA:
  BEGIN OF gt_mara OCCURS 0,           " Data displayed
    matnr LIKE mara-matnr,             " Material number
    ernam LIKE mara-ernam,             " Name of Person who Created
    ersda LIKE mara-ersda,             " Creation date
    brgew LIKE mara-brgew,             " Gross weight
  END OF gt_mara,


  gt_mara_ftr LIKE gt_mara OCCURS 0,   " Data filtered
  gt_mara_all LIKE gt_mara OCCURS 0.   " Data readfrom DB


*---------------------------------------------------------------------*
INITIALIZATION.


  v_1 = 'Lines per page'.


*---------------------------------------------------------------------*
START-OF-SELECTION.


  SELECT matnr ernam ersda brgew
    INTO TABLE gt_mara_all
    FROM mara.


  gt_mara_ftr[] = gt_mara_all[].


  PERFORM f_read_data USING c_first_page.


  PERFORM f_display_data.


*---------------------------------------------------------------------*
*       Form  f_read_data
*---------------------------------------------------------------------*
FORM f_read_data USING u_ucomm TYPE syucomm.


  STATICS :
    l_1   TYPE sytabix,
    l_2   TYPE sytabix.


  DATA l_max TYPE sytabix.             " Internal table size


  DESCRIBE TABLE gt_mara_ftr LINES l_max.


  CASE u_ucomm.
    WHEN c_first_page.                 " 1st page
      l_1 = 1.
    WHEN c_prev_page.                  " Previous page
      SUBTRACT p_max FROM l_1.
      IF l_1 < 1.
        l_1 = 1.
      ENDIF.
    WHEN c_next_page.                  " Next page
      IF l_1 IS INITIAL.
        l_1 = 1.
      ELSE.
        ADD p_max TO l_1.
      ENDIF.


      IF l_1 > l_max.
        l_1 = l_max.
      ENDIF.
    WHEN c_last_page.                  " Last page
      l_1 = l_max - p_max + 1.
      IF l_1 < 1.
        l_1 = 1.
      ENDIF.
  ENDCASE.


  l_2 = l_1 + p_max - 1.


  IF l_2 > l_max.
    l_2 = l_max.
  ENDIF.


  REFRESH gt_mara.
  IF l_max > 0.
    APPEND LINES OF gt_mara_ftr FROM l_1
                                  TO l_2
                                  TO gt_mara.
  ENDIF.


ENDFORM.                               " F_READ_DATA
*---------------------------------------------------------------------*
*      Form  f_display_data
*---------------------------------------------------------------------*
FORM f_display_data.


* Macro definition
  DEFINE m_fieldcat.
    add 1 to ls_fieldcat-col_pos.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-ref_tabname = 'MARA'.
    append ls_fieldcat to lt_fieldcat.
  END-OF-DEFINITION.


  DEFINE m_sort.
    add 1 to ls_sort-spos.
    ls_sort-fieldname = &1.
    ls_sort-up        = &2.
    append ls_sort to lt_sort.
  END-OF-DEFINITION.


  DEFINE m_event_exit.
    clear ls_event_exit.
    ls_event_exit-ucomm = &1.
    ls_event_exit-after = 'X'.
    append ls_event_exit to lt_event_exit.
  END-OF-DEFINITION.


  DATA :
    ls_layout     TYPE slis_layout_alv,
    ls_fieldcat   TYPE slis_fieldcat_alv,
    lt_fieldcat   TYPE slis_t_fieldcat_alv,
    lt_sort       TYPE slis_t_sortinfo_alv,
    ls_sort       TYPE slis_sortinfo_alv,
    lt_event_exit TYPE slis_t_event_exit,
    ls_event_exit TYPE slis_event_exit.


* Build Sort Table
  m_sort 'MATNR' 'X'.


* Build Field Catalog
  m_fieldcat 'MATNR'.
  m_fieldcat 'ERNAM'.
  m_fieldcat 'ERSDA'.
  m_fieldcat 'BRGEW'.


* Build Event Exit Table
  m_event_exit c_first_page.           " 1st page
  m_event_exit c_prev_page.            " Previous page
  m_event_exit c_next_page.            " Next page
  m_event_exit c_last_page.            " Last page
  m_event_exit '&OUP'.                 " Sort up
  m_event_exit '&ODN'.                 " Sort Down
  m_event_exit '&ILT'.                 " Filter
  m_event_exit '&ILD'.                 " Delete Filter


  ls_layout-zebra = 'X'.


  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
       EXPORTING
            i_callback_program      = sy-cprog
            i_callback_user_command = 'USER_COMMAND'
            is_layout               = ls_layout
            it_fieldcat             = lt_fieldcat
            it_sort                 = lt_sort
            it_event_exit           = lt_event_exit
       TABLES
            t_outtab                = gt_mara.


ENDFORM.                               " F_DISPLAY_DATA
*---------------------------------------------------------------------*
*       FORM USER_COMMAND                                             *
*---------------------------------------------------------------------*
FORM user_command USING u_ucomm     TYPE syucomm
                        us_selfield TYPE slis_selfield.     "#EC CALLED


  CASE u_ucomm.
    WHEN c_first_page OR c_next_page OR
    c_prev_page OR c_last_page.        " Page F, P, N, L
      PERFORM f_read_data USING u_ucomm.             " Update gt_mara
      us_selfield-refresh = 'X'.
    WHEN '&OUP' OR '&ODN'.             " Sort
      PERFORM f_sort_big_table.
      PERFORM f_read_data USING c_first_page.
      us_selfield-refresh = 'X'.
    WHEN '&ILT'.                       " Filter
      PERFORM f_filter_data.
      PERFORM f_read_data USING c_first_page.
      us_selfield-refresh = 'X'.
    WHEN '&ILD'.                       " Delete filter
      gt_mara_ftr[] = gt_mara_all[].
      PERFORM f_read_data USING c_first_page.
      us_selfield-refresh = 'X'.
  ENDCASE.


ENDFORM.                               " USER_COMMAND
*---------------------------------------------------------------------*
*       Form  F_SORT_BIG_TABLE
*---------------------------------------------------------------------*
FORM f_sort_big_table.


  DATA:
    lt_sort_kkblo TYPE kkblo_t_sortinfo,
    lt_sort_slis  TYPE slis_t_sortinfo_alv.


* Read current ALV list information
  CALL FUNCTION 'REUSE_ALV_LIST_LAYOUT_INFO_GET'
       IMPORTING
            et_sort       = lt_sort_slis
       EXCEPTIONS
            no_infos      = 1
            program_error = 2
            OTHERS        = 3.


  IF sy-subrc NE 0.
    EXIT.
  ENDIF.


  CHECK NOT lt_sort_slis[] IS INITIAL.


* Format SLIS --> KKBLO
  CALL FUNCTION 'REUSE_ALV_TRANSFER_DATA'
       EXPORTING
            it_sort = lt_sort_slis
       IMPORTING
            et_sort = lt_sort_kkblo.


* The big tables must be sorted like the small one
  PERFORM fb_outtab_sort(saplkkbl) TABLES gt_mara_ftr
                                          lt_sort_kkblo
                                    USING 'X'
                                          'X'.


  PERFORM fb_outtab_sort(saplkkbl) TABLES gt_mara_all
                                          lt_sort_kkblo
                                    USING 'X'
                                          'X'.


ENDFORM.                               " F_SORT_BIG_TABLE
*---------------------------------------------------------------------*
*      Form  f_filter_data
*---------------------------------------------------------------------*
FORM f_filter_data.


  DATA:
    lt_filter_lvc   TYPE lvc_t_filt        WITH HEADER LINE,
    lt_filter_index TYPE lvc_t_fidx        WITH HEADER LINE,
    lt_filter_slis  TYPE slis_t_filter_alv WITH HEADER LINE.


* Read current ALV list information
  CALL FUNCTION 'REUSE_ALV_LIST_LAYOUT_INFO_GET'
       IMPORTING
            et_filter     = lt_filter_slis[]
       EXCEPTIONS
            no_infos      = 1
            program_error = 2
            OTHERS        = 3.


  IF sy-subrc NE 0.
    EXIT.
  ENDIF.


* Dirty Code
  LOOP AT lt_filter_slis.
    CLEAR lt_filter_lvc.
    MOVE-CORRESPONDING lt_filter_slis TO lt_filter_lvc.
    MOVE lt_filter_slis-or            TO lt_filter_lvc-sign.
    MOVE lt_filter_slis-order         TO lt_filter_lvc-option.
    MOVE lt_filter_slis-valut_int+13  TO lt_filter_lvc-low.
    MOVE lt_filter_slis+433           TO lt_filter_lvc-high.
    CLEAR lt_filter_lvc-valuf.
    CLEAR lt_filter_lvc-valut.
    CLEAR lt_filter_lvc-or.
    APPEND lt_filter_lvc.
  ENDLOOP.


* Find data to filter
  CALL FUNCTION 'LVC_FILTER_APPLY'
       EXPORTING
            it_filter       = lt_filter_lvc[]
       IMPORTING
            et_filter_index = lt_filter_index[]
       TABLES
            it_data         = gt_mara_all.


  gt_mara_ftr[] = gt_mara_all[].


  SORT lt_filter_index DESCENDING.
  LOOP AT lt_filter_index.
    DELETE gt_mara_ftr INDEX lt_filter_index.
  ENDLOOP.


ENDFORM.                               " F_FILTER_DATA
******** END OF PROGRAM Z_DEMO_ALV_REFRESH_BUTTON_4 *******************