4AP.de ~ alles fuer ABAP-Programmierer - Infos zur SAP Programmiersprache


das Neueste

10 Jahre 4ap.de

10 Jahre 4ap.de - kleines und stilles Jubiläum

|

 

Buchrezensionen

Einige neue Buchrezensionen sind vorhanden.

|

 

neues Coding: braune Kekse

Lange schwebte mir die Idee vor, aber es fehlte schlicht die Zeit. Heute war es endlich soweit: ich nahm sie mir, die Zeit :-) Ergebnis unter: braune Kekse.

|

 

neues Kontaktformular

Wegen Formularspoofing wurde eine neue Kontaktmöglichkeit geschaffen.
|

 

Codings gesucht

Codings gesucht, die NICHT im SDN stehen.
|

 

Suche



 


Dieser Inhalt wurde zuletzt geändert am:
21.04.2009 von TN

ALV-Liste oo [ausführlich]

www.4AP.de - Syntaxbeispiel ALV Listausgabe objekt orientiert

Beispielcoding: ALV-Listausgabe über OO (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
 
 

 

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