Dokumentation zur VorgehensweiseGesamtsummen berechnen und ausgeben

 

Sie wollen die Gesamtsumme über eine Spalte Ihrer Tabelle bilden und ausgeben. Es ist dabei möglich, daß die Summe am Ende der gesamten Tabelle und Zwischensummen am Ende von jeder Seite ausgegeben werden.

Empfehlung Empfehlung

Falls Sie nicht über verschiedene Währungen oder Mengeneinheiten summieren wollen, nutzen Sie die Berechnungs-Registerkarte des Tabellen-Knotens (siehe: Berechnungen).

Die hier beschriebene Lösung bezieht sich auf die alte Tabellenausgabe. Sie kann jedoch leicht auf den neuen Tabellentyp übertragen werden.

Ende der Empfehlung.

Hinweis Hinweis

Das Formular SF_TOTALS im System illustriert, wie man mit dem neuen oder dem alten Tabellentyp Gesamtsummen über verschiedene Währungen ausgibt. Mit dem Anwendungsprogramm SF_TOTALS können Sie dieses Formular aufrufen.

Ende des Hinweises

Voraussetzungen

Sie geben bereits eine Tabelle über den Tabellen-Knoten aus, für die Sie eine Gesamtsumme ausgeben wollen.

Vorgehensweise

Wenn Sie eine Zwischensumme der Gesamtsumme vor einem Seitenumbruch ausgeben wollen, ist eine besondere Berechnung der Summe nötig. Aber auch im anderen Fall, d.h. wenn Sie lediglich am Ende der Tabellenausgabe die Gesamtsumme ausgeben wollen, funktioniert die hier beschriebene Methode.

Die Summierung soll hier an Hand des Flugdatenmodells erklärt werden. In einem Formular wird bereits eine Tabelle mit den Flügen der Fluggesellschaften ausgegeben. Die zugehörige interne Tabelle (T_SFLIGHT) ist dabei in der Formularschnittstelle definiert und vom Typ TABLE OF SFLIGHT. Für die Ausgabe einer Tabellenzeile haben Sie zudem bereits das Feld GS_SFLIGHT vom Typ +u als globales Feld definiert. Nun soll die Summe über den Preis des Fluges gebildet werden, wobei zu beachten ist, daß die Fluggesellschaften Ihren Preis nach unterschiedlichen Währungen berechnen.

  1. Legen Sie drei zusätzliche Felder in den globalen Definitionen an:

    • GT_TOTAL vom Typ TABLE OF SFLIGHT

    • GS_TOTAL vom Typ SFLIGHT

    • GS_4NEXT_ADDITION vom Typ SFLIGHT

  2. Im Navigationsbaum geben Sie bereits die Tabelle über den Tabellen-Knoten B im Hauptfenster aus. Zur Vereinfachung besteht die Tabellenausgabe in unserem Beispiel (s.u.) nur aus den Knoten C (für den Preis) und E (für die Währung). Erweitern Sie die Formularlogik folgendermaßen:

Formularlogik für die Berechnung der Gesamtsumme

Navigationsbaum

Knotenattribute/Inhalt/Bedingungen

A

  • Ausgabeparameter: GT_TOTAL, GS_4NEXT_ADDITION

  • Programmzeilen: refresh gt_total.

    clear: gs_total,

    gs_4next_addition.

B

LOOP-Schleife:

interne Tabelle T_SFLIGHT INTO GS_SFLIGHT

C

&GS_SFLIGHT-PRICE&

D

  • Eingabeparameter: GS_SFLIGHT, GS_4NEXT_ADDITION

  • Ausgabeparameter: GT_TOTAL, GS_4NEXT_ADDITION

  • Programmzeilen: if not gs_4next_addition is initial.

    collect gs_4next_addition into gt_total.

    endif.

    gs_4next_addition-price = gs_sflight-price.

    gs_4next_addition-currency = gs_sflight-currency.

E

&GS_SFLIGHT-CURRENCY&

Fußbereich

Stellen Sie sicher, daß sie dem Fußbereich eine ausreichende Höhe zuweisen.

F

Bedingung: nur am Ende des Abschnitts

  • Eingabeparameter: GS_4NEXT_ADDITION

  • Ausgabeparameter: GT_TOTAL

  • Programmzeilen: if not gs_4next_addition is initial. collect gs_4next_addition into gt_total.

    endif.

G

LOOP-Schleife:

interne Tabelle GT_TOTAL INTO GS_TOTAL

H

&GS_TOTAL-PRICE&

I

&GS_TOTAL-CURRENCY&

Ergebnis

Wenn die Tabellenausgabe über mehrere Seiten geht, wird am Ende von jeder Seite eine Zwischensumme der Gesamtsumme ausgegeben. Falls Sie die Summe lediglich am Ende der Tabelle ausgeben möchten, versehen Sie den Schleifen-Knoten (G) mit der Bedingung nur am Ende des Abschnitts.

Diskussion

Einige Schritte in der Formularlogik sind intuitiv einleuchtend:

  • Um den Preis währungsgerecht zu summieren, benötigen wir die interne Tabelle GT_TOTAL. Über die ABAP-Anweisung COLLECT ist es dann auf einfache Weise möglich, einen neuen Wert direkt der richtigen Währung beim Addieren zuzuordnen. Ein Eintrag in der Tabelle GT_TOTAL entspricht dann einem Summenwert in einer Währung.

  • Am Beginn der Tabelle müssen alle Summierungs-Felder zurückgesetzt werden (Knoten A).

  • Bei der Ausgabe im Fußbereich geben wir mit Hilfe der Schleife G die Summen nach Währungen getrennt aus.

Dagegen erscheint es auf den ersten Blick verwunderlich, wozu man das Feld gs_4next_addition benötigt. Warum addiert man nicht einfach den aktuellen Wert von gs_sflight auf den zugehörigen Wert in der internen Tabelle GT_TOTAL?

Der Grund liegt in der Ausgabesteuerung für Schleifen und Tabellen. Die Berechnung des Seitenumbruchs erfordert es, Tabellenzeilen zu puffern bevor sie ausgegeben werden. Die Ausgabesteuerung benötigt die Höhenangaben der gesamten Zeile, bevor entschieden werden kann, wann sie den automatische Seitenumbruch auslöst. Die Programmzeilen-Knoten werden dagegen aber nicht gepuffert, sondern direkt bei der Prozessierung ausgeführt.

Hinweis Hinweis

Siehe dazu: Prozessierung von Schleifen und Tabellen.

Ende des Hinweises

Die Ausgabesteuerung erkennt erst bei der ersten Ausgabe der folgenden Zeile, daß die letzte Tabellenzeile beendet ist. Um die Berechnung der Summe mit deren Ausgabe in Einklang zu bringen, muß sie verzögert werden. Und genau für diesen Zweck benötigt man das zusätzliche Feld gs_4next_addition:

  1. Innerhalb der Schleife findet die Berechnung der Summe nach der ersten Ausgabe statt (Knoten D). Der Knoten kann auch weiter unten im Baum liegen. Entscheidend ist, daß die Ausgabesteuerung vorher erkannt hat, daß eine neue Tabellenzeile beginnt (beim neuen Tabellentyp ist dies bereits durch das explizite Anlegen von Tabellenzeilen gegeben). Falls die letzte Zeile dann nicht mehr auf die aktuelle Seite paßt, springt die Ausgabesteuerung in den Fußbereich. Knoten D wird dann also nicht mehr prozessiert, was nicht der Fall wäre, wenn er vor Knoten C eingefügt worden wäre.

  2. Falls keine neue Tabellenzeile beginnt, wird der Wert der letzten Zeile über Knoten D aufsummiert. Da gs_4next_addition am Anfang leer ist, muß dieser Fall abgefangen werden sonst übernimmt die COLLECT-Anweisung eine leere Währung in GT_TOTAL. Danach merkt man sich den aktuellen Wert von gs_sflight erst mal in gs_4next_addition, bevor wir ihn im nächsten Schleifendurchlauf zur Summe hinzuaddieren. Im Prinzip machen wir also das gleiche wie die Ausgabesteuerung mit der Tabellenzeile: Wir puffern den Wert dieser Zeile.

  3. Wenn alle Tabellenzeilen prozessiert worden sind, fehlt noch eine Addition, die wir dann im Fußbereich nachholen. Damit diese Addition nur am Ende der Tabellenausgabe stattfindet, versehen wir den Programmzeilen-Knoten mit einer entsprechenden Bedingung. Auch hier fragen wir ab, ob gs_4next_addition leer ist, für den Fall, daß T_SFLIGHT gar keine Einträge hatte.