Cookbook: 'REUSE_ALV_GRID_DISPLAY' Wie man ihn benutzt?!

Posten Sie hier Tutorials & Cookbooks.

Cookbook: 'REUSE_ALV_GRID_DISPLAY' Wie man ihn benutzt?!

Postby Emre397 » Fri Jun 25, 2004 3:34 pm

Hallo allerseits,
erste Mal würde ich gern loswerden, dass das hier echt ein klasse Forum ist! ein Dank and die Webmaster, macht echt Spaß, sich hier zu tummeln. Meiner Meinung nach, ist das hier im deutschsprachigen Raum das Beste.

Aus dem Grund hab ich mich entschlossen, hier nen kleinen Aufsatz über ALV zu schreiben. (nicht nur, außer mir etwas davon hat... ich hoffe, daß ihr mir Feedback gebt. Und ich meine Programme dadurch optimieren kann ;))

Vorwort:
Vor einiger Zeit habe ich den Auftrag bekommen einen Report zu schreiben, der eine Auswertung macht. Wie die Auswertung am Schluss dargestellt werden sollte wurde mir überlassen. Ich habe mich für den ALV Grid entschieden. Jedoch musste ich schnell feststellen, dass dieser so seine Tücken hat. und auch die Informationen dazu etwas spärlich sind... Aber genug gequakt, lasst uns mal eine kleine Applikation bauen:
Ich wollte in meinem Report keine Dynpros zeichnen und habe in dem Forum folgenden Beitrag gefunden: http://www.abapforum.com/forum/viewtopic.php?t=834.

1. Einfachstaufruf des FuBas 'REUSE_ALV_GRID_DISPLAY'
Der Baustein REUSE_ALV_GRID_DISPLAY baut selbständig einen ALV auf. Der Einfachstaufruf sieht wie folgt aus:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * call ALV
  2.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  3.     EXPORTING
  4.       I_STRUCTURE_NAME = 'SFLIGHT'
  5.     TABLES
  6.       t_outtab      = lt_sflight
  7.     EXCEPTIONS
  8.       program_error = 1
  9.       OTHERS        = 2.
GeSHi ©

Der an I_STUCTURE_NAME übergebene Parameter ist der Name der Struktur aus dem die Tabelle lt_sflight besteht. Diese Struktur verwendet der ALV um sich die Tabellennamen und Tabelldefinitionen zu ziehen (z.B. ob es sich bei Spalte X ein Datumsfeld handelt, um die dann nach Userzeitzone aufzubereiten)
Das Ergebnis ist ein ALV mit der alt bekannten Buttonleiste. Als Spalten sehen wir die Felder aus der die Tabelle besteht.

2. Ausgabe der Felder anpassen -> REUSE_ALV_FIELDCATALOG_MERGE'
Damit nicht alle Felder angezeigt werden muss man dem ALV einen Fieldcatalog mitgeben. Das ist eine Definition von Feldern die in einer Tabelle übergeben werden. Um die Tabelle nicht mühsam händisch aufbauen zu müssen, verwende ich den Baustein 'REUSE_ALV_FIELDCATALOG_MERGE'.
Der Aufruf sieht wie folgt aus:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  2.     EXPORTING
  3.       i_structure_name       = 'SFLIGHT'
  4.     CHANGING
  5.       ct_fieldcat            = lt_fieldcat
  6.     EXCEPTIONS
  7.       inconsistent_interface = 1
  8.       program_error          = 2
  9.       OTHERS                 = 3.
  10.   IF sy-subrc <> 0.
  11. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  12. *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  13.   ENDIF.
GeSHi ©

Der FuBa liefert uns also eine komplette Definition aller Felder der Struktur SFLIGHT. Um eine Tabelle von dem geforderten Typ anzulegen muß man folgende Type-Pool includieren slis. Dies geschieht über die anweisung (meist ganz am anfang des reports):
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
GeSHi ©

Nun erst mal die unnötigen Felder rausschmeißen:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   DELETE lt_fieldcat WHERE NOT &#40; fieldname = 'CARRID'
  2.                              OR  fieldname = 'CONNID'
  3.                              OR  fieldname = 'FLDATE'
  4.                              OR  fieldname = 'PLANETYPE'&#41;.
GeSHi ©

und das ganze an unseren ALV übergeben:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * call ALV
  2.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  3.     EXPORTING
  4.       it_fieldcat   = lt_fieldcat
  5.     TABLES
  6.       t_outtab      = lt_poarch
  7.     EXCEPTIONS
  8.       program_error = 1
  9.       OTHERS        = 2.
GeSHi ©


Diesmal haben wir einen etwas schmaleren ALV, der nur die Spalten Carrid, connid, fldate und planetype enthält.

3. Keine ddic Struktur für i_structure_name? Kein Problem für den 'REUSE_ALV_FIELDCATALOG_MERGE'
Doch was machen wir, wenn wir keine DDIC Struktur haben auf die wir uns beziehen können?
Was definitiv nicht geht ist folgendes (hab?s ausprobiert ;)): Lokal einen Type zu definieren und diesen dann an den Parameter I_STRUCTURE_NAME zu übergeben.

Und was nun folgt, ist echt eine klasse Funktion, die in den ?REUSE_ALV_FIELDCATALOG_MERGE' eingebaut wurde. das müsst ihr mal debugged haben - ein traumcoding ;)
Hier erstmal der Aufruf:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  2.     EXPORTING
  3.       i_program_name        = sy-repid
  4.       i_internal_tabname    = 'SRESULT'
  5. *      i_structure_name
  6. *      i_client_never_display
  7.       i_inclname            = 'ZMADDOGTOP'
  8.     CHANGING
  9.       ct_fieldcat            = lt_fieldcat
  10.     EXCEPTIONS
  11.       inconsistent_interface = 1
  12.       program_error          = 2
  13.       OTHERS                 = 3.
  14.   IF sy-subrc <> 0.
  15. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  16. *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  17.   ENDIF.
GeSHi ©

Gibt man dem 'REUSE_ALV_FIELDCATALOG_MERGE' den Programmnamen (Parameter i_program_name) und einen Includenamen (Parameter i_inclname) sowie den Namen des lokalen Datentypen mit (Parameter i_internal_tabname), so parst dieser den Quelltext, sucht dann den definierten Typ und baut anhand dessen einen fieldcatalog zusammen. der Aufruf des FuBas REUSE_ALV_GRID_DISPLAY ist dann wie bei punkt 2.
Der Vorteil den wir hier haben ist, dass wir bei dem select auf die Datenbank gleich ein 'into corresponding fields of table' mitgeben können. Somit werden nicht alle Felder durch die Gegend geschoben (vielleicht kann Frank Dietrich etwas dazu sagen... die Performance lesson habe ich mir leider noch nicht gegeben).

4. Überschrift direkt oberhalb des ALVs - ein kleines Beispiel für Eventing ('REUSE_ALV_EVENTS_GET' - 'REUSE_ALV_COMMENTARY_WRITE')
Um den Benutzern meines Report etwas mehr Informationen über die Daten zu geben die der ALV Ihnen da anzeigt, habe ich mich entschlossen deine Überschriftenspalte einzubauen. Oder wie es in Abap heißt: HTML_TOP_OF_PAGE. Den eigentlichen Inhalt liefert der Baustein 'REUSE_ALV_COMMENTARY_WRITE'. Setzt man den FuBa Aufruf einfach vor den 'REUSE_ALV_GRID_DISPLAY' so erscheint erst unser hübscher ALV. Erst nachdem man auf Back oder F3 geklickt hat, sieht man die gewünschten Kommentare. Und genau hier kommt das Eventing vom ALV GRID ins Spiel. Um bestimmte den ALV flexibel zu halten haben die Entwickler bestimmte Punkte definiert, bei denen man eingreifen kann (Quasi wie BADIS). Die ganze liste aller verfügbaren events liefert der Baustein 'REUSE_ALV_EVENTS_GET'. Dieser hat einen Inputparameter I_LIST_TYPE (für den typ der liste. Nicht alle Listen haben die gleichen events). Dann muss man einfach einem event einen Perform zuordnen den man in seinem Report definiert hat. Diese Eventinformationen übergibt man dann in einer Tabelle an den REUSE_ALV_GRID_DISPLAY. Der Baustein ruft dann automatisch den Perform des eigenen Programms auf.

Und nun zur Praxis:
Zuerst baue ich mir den Header auf:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *&--------------------------------------------------------------------*
  2. *&      Form  DO_TOP_OF_PAGE
  3. *&--------------------------------------------------------------------*
  4. *       text
  5. *---------------------------------------------------------------------*
  6. FORM do_top_of_page.
  7.   DATA: ls_line TYPE slis_listheader,
  8.         lt_top_of_page TYPE TABLE OF slis_listheader.
  9.  
  10. * Listenüberschrift: Typ H
  11.   CLEAR ls_line.
  12.   ls_line-typ  = 'H'.
  13. * LS_LINE-KEY:  not used for this type
  14.   ls_line-info = 'Na'.
  15.   APPEND ls_line TO lt_top_of_page.
  16. * Kopfinfo: Typ S
  17.   CLEAR ls_line.
  18.   ls_line-typ  = 'S'.
  19.   ls_line-key  = 'wie'.
  20.   ls_line-info = 'gehts'.
  21.   APPEND ls_line TO lt_top_of_page.
  22. * Aktionsinfo: Typ A
  23.   CLEAR ls_line.
  24.   ls_line-typ  = 'A'.
  25. * LS_LINE-KEY:  not used for this type
  26.   ls_line-info = 'so?'.
  27.   APPEND ls_line TO  lt_top_of_page.
  28.  
  29.   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
  30.     EXPORTING
  31.       it_list_commentary = lt_top_of_page.
  32.  
  33. ENDFORM.                    "DO_TOP_OF_PAGE
GeSHi ©

Danach bestimme ich, bei welchem event diese form aufgerufen werden soll:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *&--------------------------------------------------------------------*
  2. *&      Form  set_event_for_alv
  3. *&--------------------------------------------------------------------*
  4. *       text
  5. *---------------------------------------------------------------------*
  6. *      -->LT_EVENTS  text
  7. *---------------------------------------------------------------------*
  8. FORM set_event_for_alv  USING lt_events TYPE slis_t_event.
  9.   DATA: ls_event TYPE slis_alv_event.
  10.  
  11.   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
  12.     EXPORTING
  13.       i_list_type = 0
  14.     IMPORTING
  15.       et_events   = lt_events.
  16. * prüfen, ob das event für den listentyp 0 gibt.
  17.   READ TABLE lt_events WITH KEY name =  slis_ev_top_of_page
  18.                            INTO ls_event.
  19.   IF sy-subrc = 0.
  20. * wenn ja dann unseren Perform setzten.
  21.     MOVE 'DO_TOP_OF_PAGE' TO ls_event-form.
  22.     APPEND ls_event TO lt_events.
  23.   ENDIF.
  24. ENDFORM.                    "set_event_for_alv
GeSHi ©

Für Kopf ist es der event TOP_OF_PAGE. Den setzten wir nun auf unseren Perform 'DO_TOP_OF_PAGE'. Damit dieser zum entsprechenden Zeitpunkt vom ALV gerufen
wird.

Und nun brauchen wir nur noch unseren altbekannten Baustein 'REUSE_ALV_GRID_DISPLAY' aufzurufen:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * call ALV
  2.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  3.     EXPORTING
  4.       i_callback_program = sy-repid
  5.       it_fieldcat        = lt_fieldcat
  6.       it_events          = lt_events
  7.     TABLES
  8.       t_outtab           = lt_poarch
  9.     EXCEPTIONS
  10.       program_error      = 1
  11.       OTHERS             = 2.
GeSHi ©

Worauf zu achten ist, dass man hier noch den Parameter i_callback_program mit dem aktuellen Programm befüllt. Das ist wichtig, damit der FuBa unseren in der Tabelle lt_events angegeben Perform findet.
Und das war?s auch schon. Nun haben wir einen ALV der nur die Daten aus unserem Fieldcatalog hat und eine entsprechende Listenüberschrift.

Über Feedback oder Ergänzungen würde ich mich freuen.

Gruß Azreal

ps. als anhang findet ihr das im Punkt 4 beschriebene Programm
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby Leona853 » Sat Jun 26, 2004 9:07 am

Super Tipp IMHO!

Danke! Kann ich selbst und viele andere sicher gut gebrauchen.

Btw: Ich bin zwar noch nicht so lang dabei wie viele andere hier aber ich muss dir beipflichten, das ist m.A. n. das beste deutschsprachige (SAP-)Forum das ich kenne. (neben der NG de.alt.comp.sapr3)

Gruß,
Christian.
Leona853
...
...
 
Posts: 223
Joined: Mon Mar 01, 2004 5:50 pm

Re: Cookbook: 'REUSE_ALV_GRID_DISPLAY' Wie man ihn benutzt?!

Postby Brian196 » Tue Jul 20, 2004 11:06 am

Azreal hat geschrieben:<snip>
Setzt man den FuBa Aufruf einfach vor den 'REUSE_ALV_GRID_DISPLAY' so erscheint erst unser hübscher ALV. Erst nachdem man auf Back oder F3 geklickt hat, sieht man die gewünschten Kommentare. Und genau hier kommt das Eventing vom ALV GRID ins Spiel.
<snip>
Und das war?s auch schon. Nun haben wir einen ALV der nur die Daten aus unserem Fieldcatalog hat und eine entsprechende Listenüberschrift.
ps. als anhang findet ihr das im Punkt 4 beschriebene Programm

Hi,
Habe den Anhang mal kopiert und getestet.
Zu welchem Zeitpunkt sollte da jetzt die Listüberschrift zu sehen sein?
Ist bei mir immer leer und bei F3 geht es raus aus dem Report/ALV.
Grüße, Alf
Brian196
.
.
 
Posts: 1
Joined: Tue Jul 20, 2004 11:06 am

Postby Emre397 » Thu Jul 22, 2004 5:03 pm

Hi Alf,
hab ich mich da etwa zu ungenau ausgedrückt?!... Mit:
<snip>
Setzt man den FuBa Aufruf einfach vor den 'REUSE_ALV_GRID_DISPLAY' so erscheint erst unser hübscher ALV. Erst nachdem man auf Back oder F3 geklickt hat, sieht man die gewünschten Kommentare. Und genau hier kommt das Eventing vom ALV GRID ins Spiel.


meinte ich eigentlich... Das passiert, wenn man das eventing vom Alv Grid nicht berücksichtigt bzw den FuBa 'REUSE_ALV_COMMENTARY_WRITE' nicht im TOPOFPAGE event des alv grids aufrufst.

Modifiziere den report wie folgt und du hast das ergebnis das ich gemeint habe:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *>>>> START OF DELETION <<<<<
  2. * build up ALV...
  3. DATA: lt_events TYPE slis_t_event.
  4. PERFORM set_event_for_alv USING lt_events.
  5. *>>>> END OF DELETION <<<<<<<
  6. *>>>> START OF INSERTION <<<<
  7. PERFORM do_top_of_page.
  8. *>>>> END OF INSERTION <<<<<<
  9.  
  10.  
GeSHi ©


Gruß und danke fürs lesen!
Azreal
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby Erich410 » Fri Jul 23, 2004 10:20 pm

Hallo Azreal,

tolle Sache, Gratulation!

Jetzt habe ich noch mal eine Frage zu der letzten Korrektur:
Ich habe sie zwar noch nicht ausprobiert, aber Du setzt
>>>Start of Deletion<<< VOR der Definition von lt_events.
Später wird aber der 'REUSE_ALV_GRID_DISPLAY' aufgerufen und bekommt lt_events mitgegeben. Das führt entweder zu Syntaxfehler oder zu Kurzdump wenn es nicht definiert ist.

Bitte noch mal reinsehen, ich bin wirklich interessiert.

Danke
mfg.
babap
Erich410
....
....
 
Posts: 680
Joined: Thu Feb 05, 2004 4:22 pm

Postby Emre397 » Sat Jul 24, 2004 2:53 pm

Hi Babap,
danke für den hinweis! Du hast natürlich voll und ganz recht. So sieht es richtig aus:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *>>>> START OF DELETION <<<<<
  2. PERFORM set_event_for_alv USING lt_events.
  3. *>>>> END OF DELETION <<<<<<<
  4. *>>>> START OF INSERTION <<<<
  5. PERFORM do_top_of_page.
  6. *>>>> END OF INSERTION <<<<<<
GeSHi ©

Das davon, wenn man denkt ohne testen kommt man aus :roll:

Aber dies war nicht wirklich eine korrektur von dem report. Ich wollte vielmehr damit demonstrieren, was passiert wenn man den 'REUSE_ALV_COMMENTARY_WRITE' unabhängig vom ALV aufruft.

An dieser stelle nochmals vielen dank. Bin sehr erstaunt solch positives Feedback zu bekommen (schon allein die tatsache, daß sich jemand den beitrag durchließt ehrt mich ;) )

schönes WE!

Gruß Azreal
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby Elanur354 » Tue Jul 27, 2004 11:12 am

noch nen hinweis zum fieldcatalog merge:
der baustein puffert die einmal gewonnen informationen. also nicht verzweifeln wenn plötzlich die strukturen nicht mehr passen oder alv grid dumpt!
es kann sein dass sich an der struktur die ihr anzeigt etwas geändert hat.

wenn ich mich recht entsinne gibt es in der schnittstelle einen parameter namen bypass_buffer oder so in der art...
ich selbst mach während der entwicklung wenn die strukturen noch nicht 100%ig feststehen immer ein free memory. (ab und zu mal aufräumen kann ja auch nicht schaden) mit dem debugger liesse sich sicherlich auch die memory id für den fieldcatalog-merge ausfindig machen...
Elanur354
..
..
 
Posts: 26
Joined: Wed Mar 31, 2004 8:11 am

Postby Logan3964 » Thu Aug 26, 2004 3:43 pm

Hallo Azreal

super Bsp., hat mir weitergeholfen.
2 Fragen hätte ich noch:

) Wenn ich mein Prog. starte, habe ich wie beschrieben die Überschrift übern ALV.
Drück ich F3 oder BACK, kommt die Überschrift nochmal
(so wie von dir beschrieben, wenn ich kein event setzte). Wie bekomme ich das weg??


) ZITAT: ps. als anhang findet ihr das im Punkt 4 beschriebene Programm
konnte leider nur ein jpg finden

mfg
Richard
Logan3964
...
...
 
Posts: 386
Joined: Wed Jul 07, 2004 1:53 pm

Postby Logan3964 » Thu Aug 26, 2004 4:00 pm

Hallo

Hat sich erledigt.
Irgenwann kapierts ein jeder, auch ich. :oops:

mfg
Richard
Logan3964
...
...
 
Posts: 386
Joined: Wed Jul 07, 2004 1:53 pm

Postby Fatih1965 » Wed Oct 06, 2004 2:44 pm

Hallo,

besten Dank für das gute Beispiel, das ich auch mal nachvollzogen habe.
Trotz allem hatte ich den Kopf erst nach F3. Und nachdem ich hoffentlich die Korrekturen richtig nachgezogen hatte, kam er garnicht mehr.

Mir fiel auf, daß beim Aufruf
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REUSE_ALV_GRID_DISPLAY
  2.      EXPORTING
  3.           i_callback_program = sy-repid
  4.           it_fieldcat        = lt_fieldcat
  5.           it_events          = lt_events
  6.  
GeSHi ©

stand, obwohl in der Doku des FB geschrieben wird, daß dies zwingend auf eine Variable gesetzt werden soll.
Gesagt, getan:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * BEGIN OF DELETION
  2. * call ALV
  3. *CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  4. *     EXPORTING
  5. *          i_callback_program = sy-repid
  6. *          it_fieldcat        = lt_fieldcat
  7. *          it_events          = lt_events
  8. * END OF DELETION
  9. * BEGIN OF INSERTION
  10. * call ALV
  11. DATA: prog    LIKE sy-repid.
  12. prog = sy-repid.
  13. * END OF INSERTION
  14. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  15.      EXPORTING
  16.           i_callback_program = prog
  17.           it_fieldcat        = lt_fieldcat
  18.           it_events          = lt_events
  19. * END OF INSERTION
  20.  
GeSHi ©


Ich hoffe, der Hinweis hilft einigen, die die Überschrift zusammen mit der Liste auf einem Screen sehen wollten, aber nicht bis dahin kamen.
Fatih1965
.
.
 
Posts: 2
Joined: Mon May 17, 2004 4:54 pm

Next

Return to Tutorials & Cookbooks

Who is online

Users browsing this forum: No registered users and 2 guests

cron