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.
Und es müssen zwei Dynpros definiert werden: das Dynpro 100 mit dem Custom-Control für die ALV-Ausgabe.
Sowie das Dynpro 500 für die Ausgabe der Texte o.ä.. Es enthält 'nichts'. Nur den Modulaufruf.
|
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