1. 程式人生 > >ABAP--如何在ALV Grid列印頁上加入頁號

ABAP--如何在ALV Grid列印頁上加入頁號

REPORT zhfnk_alvtest.
*--------------------------------------------------------------------
* This example demonstrates a solution to a problem
* that arises when you want to include the number of pages in
* an ALV report (E.g. Pageno xxx of yyy), and choses to include
* ALV statistics when you print the report.
* When you count the total number of pages it is usually
* calculated from the number of lines in the report table,
* number of lines in the report header and the number of lines
* on each report page. However, if you include the ALV statistics when
* you print the report, this page will not be included in the total
* number of pages.
*The solution demonstrated below, is to use the ALV events
* Top Of Page, Top Of List and End Of List.
*--------------------------------------------------------------------
TYPE-POOLS: slis.
TYPES:
 BEGIN OF t_makt,
    matnr LIKE makt-matnr,
    maktx LIKE makt-maktx,
 END OF t_makt.
DATA:
 it_makt TYPE STANDARD TABLE OF t_makt,
 wa_makt TYPE t_makt.
******************************************************************'
* Data declarations for the ALV grid
******************************************************************
'

DATA:
   r_grid            TYPE REF TO cl_gui_alv_grid,
   alv_fieldcat      TYPE slis_t_fieldcat_alv,
   wa_alv_fieldcat   TYPE slis_fieldcat_alv,
   alv_layout        TYPE slis_layout_alv,
   gt_events         TYPE slis_t_event.
******************************************************************'
* Other data declarations
******************************************************************'

DATA:
    gd_repid               LIKE sy-repid,
    g_first_top_of_page(1) TYPE c, "Flag for first top of page event
    g_totpages(3)          TYPE n,
    g_pageno(3)            TYPE n,
    g_start_of_list(1)     TYPE c.
START-OF-SELECTION.
 g_first_top_of_page = 'X'.
 CLEAR g_start_of_list.
 PERFORM alv_setup.
 PERFORM build_events.
 PERFORM read_data.
END-OF-SELECTION.
 PERFORM display_alv.
*&---------------------------------------------------------------------*
*&      Form read_data
*&---------------------------------------------------------------------*

FORM read_data.
 SELECT matnr maktx
    FROM makt
    INTO TABLE it_makt
    WHERE spras = 'E'.
ENDFORM.                    " read_data
*&---------------------------------------------------------------------*
*&      Form alv_setup
*&---------------------------------------------------------------------*
* Setup of the columns in the ALV grid
*----------------------------------------------------------------------*

FORM alv_setup.
 CLEAR wa_alv_fieldcat.
 REFRESH alv_fieldcat.
* Matnr field
 wa_alv_fieldcat-key = 'X'.                     "This is a key column
 wa_alv_fieldcat-fieldname = 'MATNR'.           "Name of the table eld
 wa_alv_fieldcat-seltext_s = 'Matnr'.           "Short column heading
 wa_alv_fieldcat-seltext_m = 'Material nr.'.    "Medium column heading
 wa_alv_fieldcat-seltext_l = 'Material number'. "Long column heading
 APPEND wa_alv_fieldcat TO alv_fieldcat.
* Mat text field
 wa_alv_fieldcat-key = ''.                   "This is not a key column
 wa_alv_fieldcat-fieldname = 'MAKTX'.
 wa_alv_fieldcat-seltext_s = 'Mat. txt'.
 wa_alv_fieldcat-seltext_m = 'Material txt'.
 wa_alv_fieldcat-seltext_l = 'Material text'.
 APPEND wa_alv_fieldcat TO alv_fieldcat.
ENDFORM.                    " alv_setup
*&------------------------------------------------------------------*
*& Form BUILD_EVENTS
*&------------------------------------------------------------------*
*   Build events tabel for function module
*   REUSE_ALV_GRID_DISPLAY. The events that we are interested in are:
*   Note that each event is assigned to a sub routine that is
*   executed when the event is triggered
*   - Top Of List - Subroutine TOP_OF_LIST
*   - End Of List - END_OF_LIST
*-------------------------------------------------------------------*

FORM build_events.
 DATA: ls_event TYPE slis_alv_event.
 CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
     i_list_type = 0
    IMPORTING
      et_events   = gt_events[].
 READ TABLE gt_events WITH KEY name = slis_ev_top_of_list
                           INTO ls_event.
 IF sy-subrc = 0.
    MOVE 'TOP_OF_LIST' TO ls_event-form.
    MODIFY gt_events INDEX sy-tabix FROM ls_event.
 ENDIF.
 READ TABLE gt_events WITH KEY name = slis_ev_end_of_list
                           INTO ls_event.
 IF sy-subrc = 0.
    MOVE 'END_OF_LIST' TO ls_event-form.
    MODIFY gt_events INDEX sy-tabix FROM ls_event.
 ENDIF.
ENDFORM.                    " BUILD_EVENTS
*&---------------------------------------------------------------------*
*&      Form display_alv
*&---------------------------------------------------------------------*
* Display data in the ALV grid using function module
*----------------------------------------------------------------------*

FORM display_alv.
 gd_repid = sy-repid.
* Configure layout of screen
 alv_layout-colwidth_optimize = 'X'.
 alv_layout-zebra             = 'X'.
 alv_layout-no_min_linesize   = 'X'.
* Call ALV function module
 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
           i_callback_program       = gd_repid
           i_callback_top_of_page   = 'TOP_OF_PAGE' "Ref to form
           is_layout                = alv_layout
           it_fieldcat              = alv_fieldcat
           it_events               = gt_events
*          is_print                = gd_prntparams
      TABLES
            t_outtab               = it_makt
     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.                    " display_alv
*------------------------------------------------------------------*
* Form TOP_OF_LIST
*------------------------------------------------------------------*
* This event is triggerede once at top of the actual list,
* BUT NOT at the top of the ALV Statistics page
*------------------------------------------------------------------*

FORM top_of_list.
* Set flag that indicates that print of the ALV list has begun
 g_start_of_list = 'X'.
ENDFORM.                    "TOP_OF_LIST
*---------------------------------------------------------------------*
* Form TOP_OF_PAGE
*---------------------------------------------------------------------*
* This event is triggered at every top of page including top of
* page inclduing the top of the ALV statistics page
*----------------------------------------------------------------------*
FORM top_of_page.
 DATA: t_header TYPE slis_t_listheader,
        wa_header TYPE slis_listheader,
        pagno(3) TYPE n.
*---------------------------------------------------------------------
* If the list is being printed (Not didslayed) and this is the first
* time the Top Of Page event is triggered, then caculate number
* of pages for the ALV list
*---------------------------------------------------------------------

 IF sy-ucomm EQ 'PRIN' AND g_first_top_of_page = 'X'.
    PERFORM get_total_number_of_pages CHANGING g_totpages.
    CLEAR g_first_top_of_page.
 ENDIF.
* If this is a printed list
 IF sy-ucomm EQ 'PRIN'.
*---------------------------------------------------------------------
*   The Start Of List event has not yet been triggered. Thsi means that
*   we are at the top of an ALV statistics page. Add the
*   ALV statistics page to total number of pages
*---------------------------------------------------------------------

    IF g_start_of_list = ' '.
      g_totpages = g_totpages + 1.
    ENDIF.
*   Create ALV header
    wa_header-typ = 'H'.
    g_pageno = sy-pagno.
    CONCATENATE 'Mylist page' g_pageno 'of' g_totpages
        space INTO wa_header-info SEPARATED BY space.
    APPEND wa_header TO t_header.
    CLEAR wa_header.
    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'