ALV-Liste oo [ausführlich] - 4AP.de - Syntaxbeispiel ALV Listausgabe objekt orientiert

(kopieren erlaubt aber auf eigene Gefahr :-))
 


Zur Programmierung des ALVs gibt es in der Transktion SE83 SAP Basis > Controls > Grundlagen > ALV Grid Control jede Menge Beispielprogramme. Allerdings alle objektorientiert.
Die Hilfedatei 00002857.CHM behandelt den ALV aus OO-Sicht.

ALV-Ausgabe Demoprogramm mit objektorientierter Programmierung

*======================================================================*
* Kurzbeschreibung *
*======================================================================*
*
* BTW: die Hilfedatei 00002857.CHM behandelt den ALV
*
* Testprogramm für ALV-Ausgabe in OO-Programmierung
* im ALV befindet sich eine Update-Spalte, die durch Einfachklick
* auf die Checkbox und oder Doppelklick auf die Zeile umgeschaltet
* werden kann.
* Der ALV wird nach jeder Eingabe refreshed.
*
* außer diesem Coding sind noch zwei Dypros 0100 und 0500 zu definieren
* sowie einen GUI-Status ALV_ZUSATZ (erweiterte Kopie des
* BALVSD01 Standard)
* deren Inhalte sind weiter unter beschrieben
*-----------------------------------------------------------------------
*
* Coded by Thorsten Neubüser - www.4ap.de
*

REPORT z_tn_test_alv_oo.
*======================================================================*
* TABELLEN- und DATENDEKLARATION *
*======================================================================*

* Event-Handler für den Doppelklick
CLASS lcl_event_receiver DEFINITION DEFERRED. DATA: event_receiver TYPE REF TO lcl_event_receiver. DATA: ok_code LIKE sy-ucomm, * Nutzdaten in t_daten
* wird keine transparente Tabelle aus dem DDIC genommen, so ist
* eine Struktur anzulegen: SE11 - Datentyp 'z_struc' - Struktur
t_daten TYPE TABLE OF mara WITH HEADER LINE, * auf dem Dynpro 100 ist ein nacktes Custom-Control (C in Ecke)
* mit dem Namen 'TN_CUSTOM_CONTROL' anzulegen.
g_container TYPE scrfname VALUE 'TN_CUSTOM_CONTROL', " Dynpro 100 * dieses besitzt in der Ablaufsteuerung nur die Module
* pbo_100 und pai_100.

* eine ALV-Grid und ein passender Container ist zu deklarieren
alv_grid_tn TYPE REF TO cl_gui_alv_grid, g_custom_container TYPE REF TO cl_gui_custom_container, * Layout des ALVs is_layout TYPE lvc_s_layo, * Feldkatalog ALV it_fieldcat TYPE lvc_t_fcat WITH HEADER LINE, * Sortierung des ALVs it_sort TYPE lvc_t_sort WITH HEADER LINE. *======================================================================*
* SELEKTIONSBILDSCHIRM *
*======================================================================*
SELECT-OPTIONS: s_matnr FOR t_daten-matnr. *======================================================================*
* Initialisierung *
*======================================================================*
INITIALIZATION. *======================================================================*
* Start-of-selection *
*======================================================================*
START-OF-SELECTION. PERFORM daten_holen. *======================================================================*
* END-of-selection *
*======================================================================*
END-OF-SELECTION. * Ausgabe_alv. CALL SCREEN 100. *======================================================================*
* at line-selection *
*======================================================================*
AT LINE-SELECTION. *======================================================================*
* at user-command *
*======================================================================*
AT USER-COMMAND. * siehe CLASS lcl_event_receiver IMPLEMENTATION
* bzw. MODULE pai_100 INPUT


*======================================================================*
* top-of-page *
*======================================================================*
TOP-OF-PAGE. *=====================================================================*
* ab hier nur noch
* FORM - ROUTINEN, Klassen und Module
*=====================================================================*

****************************************************************
* LOCAL CLASSES: Definition
****************************************************************
*===============================================================
* class lcl_event_receiver: local class to handle events
* Definition:
CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS handle_double_click * hier wird definiert dass die Methode 'handle_double_click'
* ausgeführt wird sobald das Ereignis 'double_click' eintritt
FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row. " e_column, * dito für den Hotspot-Click, d.h. eine Spalte ist als Hotspot
* zu definieren (im Feldkatalog; in diesem Beispiel LVORM)
METHODS handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id. " E_COLUMN_ID. PRIVATE SECTION. * wird nicht benötigt ENDCLASS. * lcl_event_receiver (Definition)
*===============================================================

****************************************************************
* LOCAL CLASSES: Implementation
****************************************************************
*===============================================================
* class lcl_event_receiver (Implementation)
* only event DOUBLE_CLICK is caught
CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_double_click. * Hier folgen die eigentlichen Handlungsanweisungen für Doppelklick
* The event DOUBLE_CLICK provides parameters for row and column
* of the click. Use row parameter to select a line of the
* corresponding internal table.
PERFORM mark_field USING e_row-index. ENDMETHOD. "handle_double_click METHOD handle_hotspot_click. * The event HOTSPOT_CLICK provides parameters for row and column
* of the click. Use row parameter to select a line of the
* corresponding internal table.
PERFORM mark_field USING e_row_id-index. ENDMETHOD. "handle_hotspot_click ENDCLASS. * lcl_event_receiver (Implementation)
*===================================================================


*&---------------------------------------------------------------------*
*& Form mark_field
*&---------------------------------------------------------------------*
FORM mark_field USING row_index. READ TABLE t_daten INDEX row_index. * wir setzen mal das Kennzeichen Löschvormerkung um, just for fun IF t_daten-lvorm = 'X'. t_daten-lvorm = ''. ELSE. t_daten-lvorm = 'X'. ENDIF. MODIFY t_daten INDEX row_index. * alle neu macht der Mai, ALV refreshen DATA: is_stable TYPE lvc_s_stbl. is_stable-row = 'X'. " Zeile ist fixiert CALL METHOD alv_grid_tn->refresh_table_display EXPORTING is_stable = is_stable * I_SOFT_REFRESH = EXCEPTIONS finished = 1 OTHERS = 2 . " Punkt 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. " mark_field *&---------------------------------------------------------------------*
*& Form daten_holen
*&---------------------------------------------------------------------*
FORM daten_holen. SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE t_daten UP TO 100 ROWS " damit es nicht zuviel wird WHERE matnr IN s_matnr. * nur fortfahren wenn mindestens 1 Satz selektiert wurde DESCRIBE TABLE t_daten LINES sy-tfill. IF sy-tfill = 0. MESSAGE i010(es). " nix gefunden ENDIF. " sy-tfill = 0 ENDFORM. " daten_holen *&---------------------------------------------------------------------*
*& Module pbo_100 OUTPUT
*&---------------------------------------------------------------------*
MODULE pbo_100 OUTPUT. * Anpassung der Feldleiste etc. PERFORM vorbereiten_ausgabe_alv TABLES it_fieldcat.
* den Status 'BALVSD01 Standard' kopieren und abändern:
* der eigene Funktionstastenstatus enthält die Tasten
* 'UPDATE_O' als selbstdefinierte Drucktaste 'Update online'
* und die 'vorgefertigten Funktionen '&ALL' und '&SAL'
* = alles markieren, alles demarkieren
SET PF-STATUS 'ALV_ZUSATZ'. * container initialisieren IF g_custom_container IS INITIAL. CREATE OBJECT g_custom_container EXPORTING container_name = g_container. CREATE OBJECT alv_grid_tn EXPORTING i_parent = g_custom_container. CALL METHOD alv_grid_tn->set_table_for_first_display EXPORTING * I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = " Typ Any
* I_CONSISTENCY_CHECK =
i_structure_name = 'MARA' " Typ DD02L-TABNAME * IS_VARIANT = " Typ DISVARIANT
* I_SAVE = " Typ CHAR01
* I_DEFAULT = 'X' " Typ CHAR01
is_layout = is_layout " Typ LVC_S_LAYO * IS_PRINT = " Typ LVC_S_PRNT
* IT_SPECIAL_GROUPS = " Typ LVC_T_SGRP
* IT_TOOLBAR_EXCLUDING = " Typ UI_FUNCTIONS
* IT_HYPERLINK = " Typ LVC_T_HYPE
* IT_ALV_GRAPHICS = " Typ DTC_T_TC
* IT_EXCEPT_QINFO =
CHANGING it_outtab = t_daten[] it_fieldcatalog = it_fieldcat[] " Typ LVC_T_FCAT it_sort = it_sort[] " Typ LVC_T_SORT * IT_FILTER = " Typ LVC_T_FILT EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4 . " Punkt IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. " g_custom_container IS INITIAL * ->Create Object to receive events and link them to handler methods.
* When the ALV Control raises the event for the specified instance
* the corresponding method is automatically called.
CREATE OBJECT event_receiver. SET HANDLER event_receiver->handle_double_click FOR alv_grid_tn. SET HANDLER event_receiver->handle_hotspot_click FOR alv_grid_tn. ENDMODULE. " pbo_100 OUTPUT *&---------------------------------------------------------------------
*& Form vorbereiten_ausgabe_alv
*&---------------------------------------------------------------------
FORM vorbereiten_ausgabe_alv TABLES p_fieldcat TYPE lvc_t_fcat. * Grundsätzliches Layout des ALVs beeinflussen
* kleine Titelzeile
is_layout-smalltitle = 'X'. * optomierte Spaltenbreite is_layout-cwidth_opt = 'X'. * Titel zwischen Grid Control und Toolbar. is_layout-grid_title = 'Testprogramm für ALV-Ausgabe in OO-Programmierung'. " max 70 Char * Selektionsmodus is_layout-sel_mode = 'C'. " A, B, C oder D siehe Hilfe * gestreifte Ausgabe is_layout-zebra = 'X'. * Sortierung voreinstellen CLEAR: it_sort. it_sort-spos = '1'. " Sortierreihenfolge it_sort-fieldname = 'ERSDA'. " LV-Control: Feldname * it_sort-up = 'X'. it_sort-down = 'X'. APPEND it_sort. CLEAR: it_sort. it_sort-spos = '2'. it_sort-fieldname = 'MATNR'. it_sort-up = 'X'. * it_sort-down = 'X'. APPEND it_sort. * Build the fieldcat according to DDIC structure: CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING * hier ist die Struktur von t_daten anzugeben i_structure_name = 'MARA' CHANGING ct_fieldcat = p_fieldcat[]. * Felder einzeln anpassen LOOP AT p_fieldcat. IF p_fieldcat-fieldname = 'LVORM'. p_fieldcat-hotspot = 'X'. p_fieldcat-checkbox = 'X'. p_fieldcat-outputlen = 7. MODIFY p_fieldcat. * nur mal so zur Demo wird die Ausgabe der MATNR modifiziert ELSEIF p_fieldcat-fieldname = 'MATNR'. p_fieldcat-scrtext_l = 'lange Materianummer'. " max 40 Char p_fieldcat-scrtext_m = 'mittlere Materialnr.'. " max 20 Char p_fieldcat-scrtext_s = 'k. MATNR'. " max 10 Char * es soll der mittlere Text ausgegeben werden p_fieldcat-colddictxt = 'M'. " 'L', 'M', 'S' und 'R' * Ausrichtung mittig p_fieldcat-just = 'C'. " 'L', 'C', 'R' * Augabelänge p_fieldcat-outputlen = 30. * Abweichende Spalte p_fieldcat-col_pos = 3. MODIFY p_fieldcat. ENDIF. * So, Rest NICHT zur Anzeige bringen IF sy-tabix > 12. p_fieldcat-no_out = 'X'. " ausgeblendet MODIFY p_fieldcat. ENDIF. " sy-tabix > 12 ENDLOOP. " AT p_fieldcat ENDFORM. " vorbereiten_ausgabe_alv *&---------------------------------------------------------------------*
*& Module pai_100 INPUT
*&---------------------------------------------------------------------*
MODULE pai_100 INPUT. * to react on oi_custom_events: CALL METHOD cl_gui_cfw=>dispatch. ok_code = sy-ucomm. CASE ok_code. WHEN 'UPDATE_O'. " update_online * PERFORM lvorm_irgenwie_abarbeiten. CALL METHOD alv_grid_tn->refresh_table_display * EXPORTING * IS_STABLE = * I_SOFT_REFRESH = EXCEPTIONS finished = 1 OTHERS = 2 . " Punkt IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. WHEN '&ALL'. " alles markieren PERFORM select_all USING 'X'. WHEN '&SAL'. PERFORM select_all USING ''. * Standardfunktionalitäten **Unter 4.7 andere Funktionscodes:
* WHEN 'BACK'. " 'BACK'
** wenn beim Verlassen noch eine Liste ausgegeben werden soll
** ist natürlich auch bei jedem andern Funktionscode möglich
* PERFORM fehlerliste.
* WHEN '%EX'. " 'CANCEL'.
* PERFORM exit_program.
* WHEN 'RW'. " 'EXIT'.
* PERFORM exit_program.
WHEN '&F03'. " 'BACK' * wenn beim Verlassen noch eine Liste ausgegeben werden soll
* ist natürlich auch bei jedem andern Funktionscode möglich
PERFORM fehlerliste. WHEN '&F12'. " 'CANCEL'. PERFORM exit_program. WHEN '&F15'. " 'EXIT'. PERFORM exit_program. WHEN OTHERS. * do nothing ENDCASE. CLEAR ok_code. ENDMODULE. " pai_100 INPUT *---------------------------------------------------------------------*
* FORM EXIT_PROGRAM *
*---------------------------------------------------------------------*
FORM exit_program. CALL METHOD g_custom_container->free. CALL METHOD cl_gui_cfw=>flush. LEAVE PROGRAM. ENDFORM. *&---------------------------------------------------------------------*
*& Form fehlerliste
*&---------------------------------------------------------------------*
FORM fehlerliste. CALL METHOD g_custom_container->free. CALL METHOD cl_gui_cfw=>flush. * Fehlerliste ausgeben. * auf diesem Screen 500 befindet sich: NICHTS * der Screen 500 hat einzig ein PBO-Modul: call_list_500. CALL SCREEN 500. " = Listausgabe LEAVE PROGRAM. " fättisch ENDFORM. " fehlerliste *&---------------------------------------------------------------------*
*& Form select_all
*&---------------------------------------------------------------------*
FORM select_all USING flag. * unter 4.6C gibt es ein spezielles 'Feature' (its a feature not a bug)
* wenn 'alles markieren' einmal geklickt wurde lassen sich anschließend
* die Felder nicht mehr mit einem Einzelklick ändern, erst ein
* erneutes Klicken 'alles markieren' schafft Abhilfe
LOOP AT t_daten. IF flag = ''. t_daten-lvorm = ''. ELSE. t_daten-lvorm = 'X'. ENDIF. MODIFY t_daten. ENDLOOP. " at t_daten CALL METHOD alv_grid_tn->refresh_table_display * EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS finished = 1 OTHERS = 2 . " Punkt 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. " select_all *&---------------------------------------------------------------------*
*& Module call_list_500 OUTPUT
*&---------------------------------------------------------------------*
MODULE call_list_500 OUTPUT. LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0. SET PF-STATUS space. SUPPRESS DIALOG. WRITE: / 'was guckst du??'. ENDMODULE. *

Zusätzlich zu programmieren:


Wie im Coding beschrieben wird noch ein GUI status benötigt: am Besten den BALVSD01 Standard kopieren und abändern.

GUI-Status für die Sonderbefehle im ALV

Und es müssen zwei Dynpros definiert werden: das Dynpro 100 mit dem Custom-Control für die ALV-Ausgabe.

Dynpro 100 mit dem Custom-Control für den ALV
Ablaufsteerung zum Dynpro 100 mit dem Custom-Control für den ALV

Sowie das Dynpro 500 für die Ausgabe der Texte o.ä.. Es enthält 'nichts'. Nur den Modulaufruf.

das nackte Dynpro 500
 
 
- es ist keine Bildbeschreibung verfügbar -

 

Sollen jetzt z.B. einige Bedienbuttons des ALVs ausgeblendet werden, so ist folgende Coding-Strecke hilfreich:

  *   einige Toolbar-Buttons ausblenden
    DATA: it_toolbar_excluding TYPE ui_functions,
          wa_it_toolbar_excluding TYPE LINE OF ui_functions.
*   Delete-Button in ALV-Toolbar ausblenden
    wa_it_toolbar_excluding = cl_gui_alv_grid=>mc_fc_loc_delete_row.
*   Hinweis: ein Doppelklick auf  MC_FC_LOC_DELETE_ROW zeigt Liste an!!!
*   Bezugstyp UI_FUNC: MC_FC_... = Funktionen  MC_MB_... = Menü-Buttons
    APPEND wa_it_toolbar_excluding TO it_toolbar_excluding.
*   keine Filter zulassen
    wa_it_toolbar_excluding = cl_gui_alv_grid=>mc_mb_filter.
    APPEND wa_it_toolbar_excluding TO it_toolbar_excluding.

Und das natürlich auch bei 'first-display' einbinden:

  CALL METHOD alv_grid_tn->set_table_for_first_display
    EXPORTING
*      I_BYPASSING_BUFFER   = 'X'
*      I_BUFFER_ACTIVE      = 'X'         " TYPE Any
*      I_CONSISTENCY_CHECK  =
      i_structure_name     = 'IT_DATEN'      " TYPE DD02L-TABNAME
      is_variant           = is_variant  " TYPE DISVARIANT
* U = User darf Varianten nur für sich oder A = für alle abspeichern
      i_save               = 'A'         " TYPE CHAR01
      i_default            = 'X'         " TYPE CHAR01
      is_layout            = is_layout   " TYPE LVC_S_LAYO
*      IS_PRINT             =             " TYPE LVC_S_PRNT
*      IT_SPECIAL_GROUPS    =             " TYPE LVC_T_SGRP
      it_toolbar_excluding = it_toolbar_excluding  " TYPE UI_FUNCTIONS
*      IT_HYPERLINK           =           " TYPE LVC_T_HYPE
*      IT_ALV_GRAPHICS        =           " TYPE DTC_T_TC
*      IT_EXCEPT_QINFO        =           " TYPE LVC_T_QINF
*      ir_salv_adapter        =           " Type Ref To IF_SALV_ADAPTER
    CHANGING
      it_outtab            = it_daten[]
      it_fieldcatalog      = it_fieldcat[] " TYPE LVC_T_FCAT
      it_sort              = it_sort[]     " TYPE LVC_T_SORT
*      IT_FILTER            =              " TYPE LVC_T_FILT
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4
          . " Punkt

 

- es ist keine Bildbeschreibung verfügbar -