Die Technik aus Tutorial 10 zur Anzeige von Tabellen im aufgeklappten Detailbereich eignet sich gut für kleinere Tabellen. Bei größeren Tabellen, z.B. mit 100 Zeilen, wird das Einblenden in die Grundliste für den Benutzer etwas unübersichtlich. In solchen Fällen ist es wünschenswert, auch in der Untertabelle die Funktionen der S10-Tabelle zur Verfügung zu haben, wie Sortieren, Selektieren, individuelle Konfiguration über Layout und Filter, und möglicherweise das Aufklappen eines Detailbereichs pro Vorgang. Die hier präsentierte Lösung ermöglicht die separate Anzeige der Vorgangstabelle incl. aller S10-Tabellenfunktionen; sie kann analog für alle ähnlichen Aufgabenstellungen verwendet werden. Das Ergebnis unserer Beispielanwendung sieht wie folgt aus:

Statt die Vorgangstabelle direkt in den Detailbereich der Grundliste einzublenden, enthält der aufgeklappte Detailbereich eine Drucktaste "Vorgänge anzeigen", mit der sich die Vorgänge separat anzeigen lassen.

 

Dem Benutzer stehen nun auch in der Vorgangstabelle alle S10-Möglichkeiten zur Selektion der Daten und zur Layoutkonfiguration zur Verfügung.

 

 

Auch die Sortierung nach einzelnen Spalten und das Auf- und Zuklappen des Filterbereichs funktionieren genau wie in der Grundliste:

 

Ein Klick auf den Rückwärtspfeil führt zurück in die Grundliste, und zwar genau an die Stelle, von der wir gestartet waren. Der gesamte Zustand der Grundliste, einschließlich der angewendeten Filter, Sortierung und aufgeklappten Details, bleibt unverändert.

Nun zur Implementierung. Wir bauen die Vorgangstabelle nicht direkt in das ABAP-Programm für die Grundliste ein, sondern verwenden dazu ein separates ABAP-Programm. Dies ist technisch anspruchsvoller, bietet jedoch folgende Vorteile:

Vorgehensweise:

1. Die Anzeige der Vorgänge mit Transaktion /s10/util als separate Liste generieren

Wir verwenden als Ausgangstabelle die Tabelle AFVC der Vorgänge.

 

Bitte dabei beachten:

 

2. In der Detailanzeige der Auftragsliste eine Drucktaste "Vorgänge anzeigen" aufnehmen (HTML)

 <div class="infoblock" style="padding: 4px;"
            data-s10title="Link Vorgangstabelle" name="display_items">

    <button type="button" class="button"
            onclick="S10Apply('display_items');">
                Vorgänge anzeigen
    </button>
</div>

Der Name "display_items" des "infoblock" ist dabei beliebig. Durch die onclick-Angabe der Drucktaste rufen wir die Methode "display_items" auf, in der wir im nächsten Schritt die Anzeige der Vorgangstabelle aufrufen werden.

Tipp: Die direkte Ausgabe der Vorgangsliste aus Tutorial 10 in der HTML-Datei belassen, sodass später in der Layoutdefinition entschieden werden kann, ob die Vorgänge direkt im Detailbereich angezeigt oder über die Drucktaste eingeblendet werden. Optional können dann auch sowohl die Drucktaste als auch die direkte Anzeige im Layout eingeschaltet werden, wobei die unmittelbar angezeigte Vorgangstabelle dazu am besten auf eine Maximalhöhe, z.B. 200px, beschränkt wird (style='max-heigth:200px' im "infoblock" in HTML). Der Benutzer hat dann eine kleine scrollbare Vorabanzeige und kann für die volle Anzeige die Drucktaste verwenden:

 

3. In der Konfiguration der Detailsicht den "Link Vorgangstabelle" statt "Vorgangstabelle" auswählen  (oder beide, siehe Tipp oben)

 

4. In der ABAP-Klasse der Grundliste eine Methode "display_items" zum Aufruf der Vorgangsliste implementieren

Durch die Drucktaste "Vorgänge anzeigen" wird die Methode "display_items" der Grundliste (Klasse "viaufkst_manager") aufgerufen. Dort implementieren wir nun den Aufruf der Vorgangstabelle:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
* method to display items in a separate screen
  method display_items.

* read current entry in tabviaufk
    read table tabviaufk
        index s10contextinfo( )->rownumber
          assigning field-symbol(<viaufk>).

* create object to display the items
    data:  iw_order_items type ref to /s10/any.
    create object iw_order_items type ('\PROGRAM=ZZS10_IW_ORDER_ITEMS\CLASS=MAIN').

* call up method to display items, pass order number
   call method  iw_order_items->('DISPLAY')
      exporting
        aufnr = <viaufk>->aufnr.

  endmethod.

    Erläuterungen:

Bei häufiger genutzen Objekten ist es praktisch, die externe Klasse (bei uns also die Klasse zur  Anzeige der Auftragsvorgänge) in der ABAP Klassenbibliothek SE24 zu definieren, zum Beispiel unter dem Namen /ABC/IW_DISPLAY_ORDERITEMS wobei /ABC/ Ihr Namensraum wäre. Das Anlegen des Objekts und der Methodenaufruf lassen sich dann einfacher formulieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
* method to display items in a separate screen
  method display_items.

* read current entry in tabviaufk
    read table tabviaufk
        index s10contextinfo( )->rownumber
          assigning field-symbol(<viaufk>).

* create object to display the items
    data(iw_order_items) = new /abc/iw_display_orderitems( ).

* call up method to display items, pass order number
    iw_order_items->display( <viaufk>->aufnr ).

endmethod.
Falls wir die Anzeige der Vorgänge noch in einer anderen S10-Anwendung benötigen, muss dann dort nur eine Aufruf-Methode wie oben implementiert werden.

 

5.  In der ABAP-Klasse "main" der Vorgangsliste eine Methode "display" zur Anzeige der Vorgänge implementieren

Kopieren Sie das für die Anzeige der Vorgänge generierte ABAP-Programm, z.B. "ZZS10_AFVC", am besten zunächst unter einem anderen Namen, denn sonst überschreibt man sich bei einer erneuten Generierung leicht das Programm, und die eingefügten Methoden sind wieder weg. Wir haben hier für unser Beispiel den Programmnamen "ZZS10_IW_ORDER_ITEMS" gewählt.

DIe Deklaration der neuen Methode "display" erfolgt in der Klasse "main":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
* main class for this application
class main definition inheriting from /s10/any.

  public section.

    data: my_afvc_manager type ref to afvc_manager.

    methods:
      logon,
      display
        importing
          aufnr type aufk-aufnr.

endclass.

Die Implementierung der Methode:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
* display item table in popup
  method display.

*  create manager object
    create object my_afvc_manager.

* set defaults
    my_afvc_manager->set_defaults( ).

* set aufnr
     my_afvc_manager->header_aufnr = aufnr.


* determine aufpl from afko
    select single aufpl from afko into my_afvc_manager->search_aufpl
        where aufnr = aufnr.

* not found ?
    if sy-subrc ne 0.
      s10errormessage( |Invalid order number specified when calling ZZS10_IW_ORDER_ITEMS->DISPLAY: | && aufnr ).
    endif.


* start display
    my_afvc_manager->s10dialog( 'display_items').

  endmethod.

 

Erläuterungen:


Das Attribut "header_aufnr" dazu separat in der Klasse "afc_manager" definieren:
class afvc_manager definition inheriting from /s10/any.

  public section.

* header data
   data: header_aufnr type aufk-aufnr.
...

Wenn wir den Ablauf nun testen, erfolgt eine Fehlermeldung, da die HTML-Datei noch nicht existiert:



Das S10 Framework sucht die HTML-date zunächst in dem lokalen Projektordner und, falls nicht gefunden, in dem "public" Ordner im SAP MIME Repository (projektübergreifend). 

 

6.  Die HTML-Datei "display_items.html" anlegen

Dazu kopieren wir den Ordner "afvc_manager" aus dem generierten Projektordner der Vorgangsanzeige in unser eigenes Projekt. Anschliessend benennen wir dort die HTML-Datei "list.html" in "display_items.html" um. Damit funktioniert die Anzeige schon:

Allerdings noch nicht die Rückkehr in die Grundliste. Wir müssen dazu noch im Kopf der HTML-Seite  den "Zurück"-Button statt "Beenden" einfügen und ergänzen die Anzeige der Auftragsnummer. Der Beginn der HTML-Datei "display_items.html" ist dann wie folgt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel='stylesheet' type='text/css' href='../../../style/s10.style.css'>
    <link rel='stylesheet' type='text/css' href='../../../style/custom.style.css'>
    <script src='../../synactiveS10/synactiveS10.java.js'></script>

    <title>Vorgänge</title>
</head>
<body style="width: 100%; margin: 0px; padding: 0px;" onload='init();' class="colorscheme9">

    <div class="toolbar">

        <button type="button" class="button back" onclick="S10Apply('exit_display_items');">
            &#9664;&#xFE0E;
        </button>

        <b>Vorgänge zum Auftrag <span class='output' name="header_aufnr"></span></b>

        <span style="float: right;" class="tablefilterinfo"></span>

    </div>

    <!-- filter -->
    <div class="tablefilteractive">
...
In der Anzeige erscheint der "Zurück"-Button und die aktuelle Auftragsnummer:

 

Erläuterungen zur HTML-Datei:

Nun fehlt nur noch die Implementierung der Routine "exit_display_items" zur Rückkehr von den Vorgängen in die Auftragsliste:

 

7.  In der ABAP-Klasse "afvc_manager" der Vorgangsliste eine Methode "exit_display_items" zur Rückkehr in die Grundliste implementieren

 Dazu genügt der Aufruf von s10exitdialog( ):

1
2
3
4
* return from itemdisplay
  method exit_display_items.
    s10exitdialog( ).
  endmethod.

Damit ist unsere Implementierung der separat angezeigten Vorgangsliste komplett.