ALV-Vorlage REUSE ALV GRID DISPLAY LVC

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Reporting.

Siehe Report-Vorlage mit Form-Routinen.

Siehe Report-Vorlage mit Lokaler Klasse.

Siehe ALV-Vorlage CL GUI ALV GRID.

Siehe ALV-Vorlage REUSE ALV GRID DISPLAY LVC.

Siehe ALV-Vorlage CL SALV* (Factory).

Siehe Vorlage Upload/Download Datei Frontend.

Siehe Vorlage Upload CSV-Datei mit Job-Steps und Suche nach Stichwort in Programmen.

Siehe Kategorie: ALV.

Siehe Kategorie: ABAP-Vorlagen.

Die Nutzung dieses ALV-Funktionsbausteins "REUSE_ALV_GRID_DISPLAY_LVC" ist häufig sehr effektiv. Mit der entsprechenden Vorlage (Wie hier) kommt man sehr schnell zu Ergebnissen, das Coding ist relativ übersichtlich, gut kopierbar von einem Report zum nächsten, optisch ansehnlich, es sind eingabefähige ALV-Listen möglich und die Funktionalität des Funktionsbausteins kann bei Bedarf auch objektorientiert durch ALV-Methoden erweitert werden.

Allerdings funktioniert dieser Funktionsbaustein nicht in globalen Klassen, da bei diesem Funktionsbaustein auch Form-Routinen genutzt werden und die sind in Klassen nicht zulässig. Als Workaround könnte man in globalen Klassen einen Z-Funktionsbaustein aufrufen, der das Coding vom Funktionsbaustein REUSE_ALV_GRID_DISPLAY_ALV enthält. Siehe Nutzung Form-Routinen im Funktionsbaustein. Möchte man dem LVC-Baustein im Z-Funktionsbaustein einen GUI-Status oder GUI-Title zuordnen, sind diese im Programm der Funktionsgruppe (dem Hauptprogramm des Includes des Z-Funktionsbausteins) zu speichern. Meist wird man in Klassen jedoch die objektorientierten ALV-Ausgaben programmieren. Die Kombination von Klassen und dem LVC-Baustein in einem Z-Funktionsbaustein wird eher für hartgesottene Fans des LVC-Bausteins sein, die sich nicht mit den objektoriertierten ALV-Varianten anfreunden können. Hier ist Mut zu machen an die SAP-Entwickler und den Einarbeitungsaufwand nicht zu scheuen, sich in die objektorientierten ALV-Varianten einzuarbeiten und die eigene Werkzeugkiste um die objektorientierte ALV-Technologie zu erweitern und sich dann eine Vorlage zu erstellen, die als Kopiervorlage für neue objektorientierte ALV-Ausgaben dient.

Was ist noch zu tun nach dem Einfügen des Codings ab "Data & Types
  1. Die Felder im Type TY_ITAB durch die benötigten Felder ersetzen.
  2. Die Parameter/Select-Options einfügen.
  3. Die Form-Routine GET_DATA anpassen mit der Datenselektion.
  4. Die Form-Routine ALV_ITAB_FCAT mit Feldern des Feldkatalogs einfügen.

"Data & Types

****************
* DATA & TYPES *
****************
Types: begin of ty_itab,
       kunnr type kna1-kunnr,
       end of ty_itab.

Types: tty_itab type standard table of ty_itab. 

Data: gt_itab type Standard table of ty_itab ##NEEDED.

"Parameters

**************
* PARAMETERS *
**************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

PARAMETERS: p_vari TYPE disvariant-variant. "Layout

SELECTION-SCREEN END OF BLOCK b1.

"Initialization

******************
* INITIALIZATION *
******************
INITIALIZATION.
 PERFORM initialization.

"At Selection-Screen

***********************
* AT SELECTION-SCREEN *
***********************
at selection-screen.


"At Selection-Screen on value-request for p_vari

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST FOR <field>
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
 PERFORM at_selection_screen_for_vari
     USING if_salv_c_layout=>restrict_none "benutzerspz. und allg. Layoutvarianten
  CHANGING p_vari.

"Start-of-Selection

**********************
* START-OF-SELECTION *
**********************
start-of-selection.
perform get_data
  changing gt_itab.

********************
* END-OF-SELECTION *
********************
end-of-selection.

************************
* Aufruf der ALV-Liste *
************************
perform alv_itab 
    using gt_itab.

"Form-Routinen

"Form Initialization

*&---------------------------------------------------------------------*
*&      Form  INITIALIZATION
*&---------------------------------------------------------------------*
*       Default Routinen
*----------------------------------------------------------------------*
FORM initialization.

 DATA: ls_variant TYPE disvariant. "Anzeigevariante (externe Verwendung)

"SET TITLEBAR 'TITLE' WITH 'Neuer Reporttitel'.

"CONSTANTS: lc_handle_num1 TYPE c VALUE '1'.  "nur nötig, wenn es in einem Report > 1 ALV-Listen gibt

* Defaultlayoutvariante wird in das Feld P_VARI geschrieben
 ls_variant-report = sy-repid.
"ls_variant-handle = lc_handle_num1.

 CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
   EXPORTING
     i_save     = 'A'
   CHANGING
     cs_variant = ls_variant
   EXCEPTIONS
     not_found  = 2.
 IF sy-subrc = 0.
   p_vari = ls_variant-variant.
 ENDIF.

ENDFORM.                    "INITIALIZATION

"Form at_selection_screen_for_vari

*&---------------------------------------------------------------------*
*&      Form  AT_SELECTION_SCREEN_FOR_VARI
*&---------------------------------------------------------------------*
*       Liste aller Layoutvarianten wird angeboten und gewählt
*----------------------------------------------------------------------*
FORM at_selection_screen_for_vari
  USING    iv_restrict TYPE salv_de_layout_restriction
  CHANGING cv_vari TYPE disvariant-variant.

 DATA: ls_layout TYPE salv_s_layout_info,
       ls_key    TYPE salv_s_layout_key.

  ls_key-report = sy-repid.
* ls_key-HANDLE = 'NUM1'. "Wenn mehrere ALV-Liste im Report, die mit HANDLE unterschieden werden

  ls_layout = cl_salv_layout_service=>f4_layouts(
    s_key    = ls_key
    restrict = iv_restrict ).

  cv_vari = ls_layout-layout.
 
ENDFORM.                    " AT_SELECTION_SCREEN_FOR_VARI

"Form alv_itab

**&---------------------------------------------------------------------
**& Form alv_itab
*&---------------------------------------------------------------------
* ALV Function Mod. 'REUSE_ALV_GRID_DISPLAY_LVC'                    
*----------------------------------------------------------------------
FORM alv_itab
     using it_itab type tty_itab.

  type-pools: slis.

  data: lv_repid     type sy-repid,
        lt_fcat      type LVC_T_FCAT,
        ls_layout    type LVC_S_LAYO,
*       ls_sort      type LVC_S_SORT,
*       lt_sort      type LVC_T_SORT,
*       lt_excluding TYPE SLIS_T_EXTAB,
        lt_events    type slis_t_event,
        ls_variant   type disvariant.       
       
  lv_repid = sy-repid.

****************
* Fill Variant *
****************
  ls_variant = value #( report   = lv_repid
                        username = sy-uname
                        variant  = p_vari ).


***************
* Fill Layout *
***************
perform alv_itab_layout
  changing ls_layout.
 

*************
* Fill Sort *
*************
*lt_sort = value #( base lt_sort
*                    ( fieldname = ' '          "Identische Werte, die übereinander stehen, werden
*                     spos      = '1'          "verbunden und nur der oberste Wert wird angezeigt
*                     up        = 'X'
*                     group     = 'UL'
*                     subtot    = 'X' ) ).     "Zwischensummen

***************
* Fill Events *
***************
  perform alv_itab_events            "Definition Events und Form-Routinten für
    changing lt_events.              "User-Command, Top-Of-List und Status

*****************
* Fill Fieldcat *
*****************
  perform alv_itab_fcat              "Definition Felder, die ausgegeben werden sollen
    changing lt_fcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
     i_interface_check          = 'I'
     i_callback_program         = lv_repid
     is_layout_lvc              = ls_layout    "Layout ALV
     it_fieldcat_lvc            = lt_fcat      "Tabellen mit Feldern der Liste
    "IT_EXCLUDING               = lt_excluding "Funktionscodes, die ausgeschlossen werden sollen
    "it_sort_lvc                = lt_sort      "Sortierung
     i_default                  = 'X'          "Default Variante kann abgespeichert werden
     i_save                     = 'A'          "Benutzerabhängige Varianten können gespeichert werden
     is_variant                 = ls_variant   "Layoutvariante ziehen
     IT_EVENTS                  = lt_events    "Event-Tabelle
    "i_screen_start_column      = 10
    "i_screen_start_line        = 10
    "i_screen_end_column        = 50
    "i_screen_end_line          = 50
  TABLES
     t_outtab                   = it_itab    "Daten Ausgabetabelle
  EXCEPTIONS
     program_error              = 1
     OTHERS                     = 2.

  IF sy-subrc <> 0.
    message i531(0u) with 'Problem beim Fuba REUSE_ALV_GRID_DISPLAY_LVC'. 
  ENDIF.

ENDFORM. " alv_itab

"Form alv_itab_layout

*&---------------------------------------------------------------------*
*& Form ALV_ITAB_LAYOUT
*&---------------------------------------------------------------------*
*& ALV Layout füllen
*&---------------------------------------------------------------------*
FORM alv_itab_layout
  CHANGING cs_layout TYPE lvc_s_layo.

* cs_layout-zebra      = 'X'.        "Liste wird im Zebra-Look ausgegeben
* cs_layout-box_fname  = 'SELKZ'.    "Zeilen der Liste können markiert werden mit Spalte SELKZ
* cs_layout-no_rowmark = abap_true.
* cs_layout-no_toolbar = 'X'.        "Keine Toolbar
* cs_layout-excp_fname = 'AMPEL'.    "'1'=rot, '2'=gelb, '3'=grün
* cs_layout-excp_led   = 'X'.        " 'X'=LED, sonst Ampel
* cs_layout-totals_bef = 'X'.        "Summen vor Einzelsätzen
  cs_layout-cwidth_opt = 'A'.        "Spaltenbreite wird optimiert
  cs_layout-ctab_fname = 'CELLCOL'.  "Tabellenfeld mit Zellfarben
ENDFORM.

"Form pf_status_set

*&---------------------------------------------------------------------*
*&      Form  pf_status_set
*&---------------------------------------------------------------------*
*       Kopie des Standardstatus STANDARD aus der Funktionsgruppe SALV
*----------------------------------------------------------------------*
form alv_itab_pf_status_set
    using it_extab type slis_t_extab.                       "#EC CALLED

  set pf-status 'STATUS' excluding it_extab.
 "set TITLEBAR 'TITLE'.

endform.                    "pf_status_set

"Form alv_itab_events

*&---------------------------------------------------------------------*
*&      Form  alv_itab_events
*&---------------------------------------------------------------------*
*       ALV-Events
*----------------------------------------------------------------------*
form alv_itab_events
   changing pct_events type SLIS_T_EVENT.

pct_events = VALUE #( ( name = 'USER_COMMAND'
                        form = 'ALV_ITAB_USER_COMMAND' )

                      ( name = 'TOP_OF_PAGE'
                        form = 'ALV_ITAB_TOP_OF_PAGE' )

                      ( name = 'PF_STATUS_SET'
                        form = 'ALV_ITAB_PF_STATUS_SET' )
                    ).
 
endform.                    " alv_itab_events

"Form alv_itab_fcat

*&---------------------------------------------------------------------*
*&      Form  alv_itab_fcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form alv_itab_fcat  "LVC_S_FCAT
  changing ct_fcat type LVC_T_FCAT.
 
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                   key         = abap_true 
*                                 ) ).
*  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).
*  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).
*  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).
*  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).
*  
** Field =
* ct_fcat = value #( base ct_fcat ( fieldname   = ' '
*                                   ref_field   = ' '
*                                   ref_table   = ' '
*                                 ) ).
*
* fieldname   = ' '         "Fieldname Itab ALV, obligatory field
* ref_field   = ' '         "Referencefield
* ref_table   = ' '         "Referecetable
* rollname    = ' '         "Dataelement (alternativ to referencefield and referencetable)
* cfieldname  = ' '         "Reference currency fields
* qfieldname  = ' '         "Referenz quantity fields
* SCRTEXT_L   = ' '
* SCRTEXT_M   = ' '
* SCRTEXT_S   = ' '         "max 10 letters
* REPTEXT     = ' '
* SELTEXT     = ' '
* tooltip     = ' '         "Tooltip
* convexit    = 'ALPHA'     "Konvertierungsexit ALPHA (Columnvalues without leading 0)
* outputlen   = 10          "Outputlength
* emphasize   = 'C300'      "Color column Beige
* edit        = abap_true   "Field with input
* f4availabl  = abap_true   "F4-Valuehelp will be forced
* do_sum      = abap_true   "Sum values on field
* icon        = abap_true   "Display value as Icon
* checkbox    = abap_true   "Display field as checkbox (space/X intern)
* key         = abap_true   "Display field as key (blue color and stable colum while scrolling left/right)
* no_zero     = abap_true   "No display 0-values


endform.                    " alv_fcat

"Form user-command

*&---------------------------------------------------------------------
*& Form USER_COMMAND
*&---------------------------------------------------------------------
*  User Command
*----------------------------------------------------------------------
form alv_itab_user_command                                         "#EC CALLED
  using r_ucomm     type sy-ucomm
        rs_selfield type slis_selfield.

  Data: ls_itab type ty_itab.

  DATA: lo_ref_alv       TYPE REF TO cl_gui_alv_grid,
        lt_index_columns TYPE lvc_t_col,
        lv_valid         TYPE c.                                   "#EC NEEDED

* geänderte Daten holen
* Referenz auf ALV holen
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
       IMPORTING
            e_grid = lo_ref_alv.

* Gibt die geänderte ITAB zurück
* Wenn die Feldprüfung für geänderte Daten nicht erfolgreich, dann ist lv_valid = space
  CALL METHOD lo_ref_alv->check_changed_data
    IMPORTING
      e_valid = lv_valid.
     
* Liest die selektierten Spalten
  CALL METHOD lo_ref_alv->get_selected_columns
    IMPORTING
      et_index_columns = lt_index_columns.

* Prüfe ob ein Doppelklick auf eine Zeile erfolgte
  case r_ucomm.

  when '&IC1'.

*   Read line of clicked item
    read table gt_itab index rs_selfield-tabindex
    into ls_itab.

*    case rs_selfield-fieldname.  

*     
*      when ' '.

*  endcase.
endcase.

endform. " USER_COMMAND_ITAB

"Form top_of_page

*---------------------------------------------------------------------
*      FORM top_of_page                                              
*---------------------------------------------------------------------
*      Fülle Header für ALV-Listen
*----------------------------------------------------------------------
FORM alv_itab_top_of_page.      "#EC CALLED

  DATA: lt_listheader TYPE slis_t_listheader,
        lv_datum(10)  TYPE c.

* Schreibe Anzahl Datensätze Reporte in Grid Titel
  Data(lv_lines) = lines( gt_itab ).

* Datum in Ausgabeform bringen
  WRITE sy-datum TO lv_datum.

 lt_listheader = value #( ( typ = 'S'
                            key = 'Datum'
                            info = lv_datum )

                          ( typ = 'S'
                            key = 'Anzahl Datensätze'
                            info = lv_lines )
                        ).

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
       EXPORTING
           it_list_commentary = lt_listheader.
*          I_LOGO             =
*          I_END_OF_LIST_GRID =

ENDFORM.

"Form get_data

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       Lesen Daten
*----------------------------------------------------------------------*
FORM get_data
  CHANGING ct_itab type tty_itab.

if sy-subrc <> 0.
  MESSAGE i550(fre). "Keine Datensätze gefunden
  leave list-processing.
endif.

ENDFORM.