Transaktion SFP - Tabellen

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Eines der zentralen Elemente bei der Formularentwicklung ist die Darstellung von Tabellen, die abhängig von der Anzahl der Datensätze in einer internen Tabelle auf dem Formular ausgegeben werden.

Tabelle in der Schnittstelle

In der Schnittstelle vom Formular ZOM_ORDER wird u. a. eine Tabelle IT_ZOM_FORM_POS mitgeliefert, was auch am Symbol Tabellen4.jpg zu erkennen ist.

Der Importparameter IT_ZOM_FORM_POS (Positionsdaten für Formular) hat den Typ (hier Tabellentyp) ZOM_ORDER_DATA_FORM_POS_T.

Tabellen1.jpg

Der Tabellentyp ZOM_ORDER_DATA_FORM_POS_T typisiert auf den Zeilentyp (Struktur) ZOM_ORDER_DATA_FORM_POS.

Tabellen2.jpg

In der Struktur ZOM_ORDER_DATA_FORM_POS gibt es eine Reihe von Feldern. U. a. gibt es hier ein Feld DEL_LIFADR_TXT, was ebenfalls als Tabellentyp definiert ist. Hier liegt also eine tiefe Struktur vor.

Tabellen3.jpg

Tabelle im Kontext

Die Tabelle IT_ZOM_FORM_POS wird nun aus der Schnittstelle in den Kontext des Formulars ZOM_ORDER gezogen. Die Tabelle erkennt man am Namen IT_ZOM_FORM_POS und dem Tabellensymbol Tabellen4.jpg. Unter dem Tabellensymbol gibt es stets einen Knoten DATA.

Die Liste der Felder unter DATA wird sichtbar, wenn DATA aufgeklappt wird. Hier gibt es wiederum das Feld DEL_LIFADR_TXT, was das Tabellensymbol mit einem DATA-Knoten hat.

Tabellen6.jpg

Die Tabelle kann mit dem Feld "Status" von "Aktiv" auf "Inaktiv" geschaltet werden, wenn man die Tabelle nicht mehr im Formular benötigt. Diesen Schalter kann man auch gut zu Testzwecken nutzen, um temporär eine Tabelle zu deaktivieren. Eher selten wird man die Zeilenausgabe beschränken durch die Felder "Von Zeile" und "Bis Zeile". Die Zeilen werden entsprechend der Sortierung in der internen Tabelle ausgegeben.

Tabellen7.jpg

Tabellenausgabe im PDF

Im Formular soll nun eine Tabelle ausgegeben werden, wo bei Datensatz der internen Tabelle einmal fünf Felder nebeneinander in einer Zeile ausgegeben werden und noch weitere Felder, für die jeweils eine separate Zeile vorgesehen ist. Als weitere Anforderung besteht das Feld "Lieferung" wiederum auch aus einer Tabelle mit n Einträgen. Hier gibt es zwei Einträge "Textzeile1a" und "Textzeile1b". Da es hier bei Datensatz der Kopftabelle mehrere Zeilen gibt, wird auch jeweils die Kopfzeile mit "Einzelleistungs-Nr., "Bezeichnung" etc. wiederholt.

Tabellen8.jpg

Tabelle im Adobe LiveCycle Designer

Tabelle einfügen per Assistent

In der Tabellendefinition vom Formular ZOM_ORDNER gibt es nun in der Hierarchie das Teilformular TAB_LEISTUNGEN. Unter diesem Teilformular wurde ein Tabellenobjekt POS_NEU hinzugefügt über das Menü des Adobe LiveCycle Designer "Tabelle - Tabelle einfügen".

Tabellen11.jpg

Es werden 5 Spalten gewünscht und eine Kopfzeile, und keine Fußzeile.

Tabellen12.jpg

Kopfzeile einfügen

Unter dem Tabellensymbol Tabellen13.jpg POS_NEU gibt es das Kopfzeilensymbol Tabellen14.jpg POS_KOPF und das Positionssymbol Tabellen15.jpg POS_DAT.

Normal wird es in einer Tabelle nur eine Positionszeile geben. Da in diesem Fall jedoch pro Datensatz der internen Tabelle weitere Felder in separaten Zeilen ausgegeben werden sollen, gibt es fünf weitere Positionszeilen (POS_LEISTUNGSBESCHR, POS_LIEFERTERMIN, ..).

Tabellen9.jpg

Unter der Kopfzeile POS_KOPF gibt es nun fünf Felder GV_LEISTUNGSNR, GV_BEZEICHNUNG etc. Sie haben hier den Typ Tabellen18.jpg, da in diesem Fall der Text über die Schnittstelle sprachabhängig geliefert wird. Sehr häufig wird der Typ Tabellen19.jpg verwendet und der Beschreibungstext direkt in die Formularvorlage geschrieben.

Tabellen16.jpg

Die Variablen aus dem Kontext kommen hierarchisch aus dem Pfad "$record.HEADERTEXTE".

Hier ist auch entscheidend den Haken bei "Zeile für jedes Datenelement wiederholen" zu setzen. Ansonsten werden keine Tabelleneinträge angezeigt. Es muss auch kein "Min-Zähler" gesetzt sein.

Tabellen17.jpg

Das Feld GV_LEISTUNGSNR hat innerhalb dieses Pfades die Bindung auf "$.GV_LEISTUNGSNR".

Tabellen20.jpg

Positionszeile einfügen

Unter der Positionszeile POS_DAT werden nun auch wie in der Kopfzeile fünf Felder eingefügt. Die Anzahl und Breite der Felder in der Positionszeile richten sich zunächst nach der Anzahl und Breite der Kopfzeilenfelder.

Tabellen21.jpg

Die Datenbindung wird häufig auch an den Positionsknoten gebunden. Da hier jedoch noch mehrere andere Positionszeilen kommen, wird an dem übergeordneten Knoten, dem Tabellenknoten POS_NEU, die Bindung "$.IT_ZOM_FORM_POS.DATA[*]" vorgenommen.

Tabellen22.jpg

Angepasste Positionszeilen einfügen

Bei den weiteren Positionszeilen POS_LEISTUNGSBESCHR, POS_LIEFERTERMIN, POS_KOSTENSTELLE und POS_KONTONUMMER gibt es jeweils ein Feld pro Zeile.

Tabellen24.jpg

Wenn man eine Positionszeile in der Hierarchie kopiert, hatte er natürlich zunächst auch jeweils fünf Felder für die eingefügte Positionszeile. Man kann dann auch nicht einfach vier Felder löschen. Das lässt der Adobe LiveCycle Designer nicht zu. Man kann jedoch die fünf Felder markieren und über das Kontextmenü "Zellen zusammenführen" wählen. Dann werden die Felder auf ein Feld zusammengefasst.

Tabellen23.jpg

Untertabelle hinzufügen vom Typ "Tabelle"

In der Positionszeile POS_LIEFERUNG befindet sich nun auch eine Tabelle DELIVERY.

Hier gibt es eine Kopfzeile und eine Positionszeile.

Tabellen25.jpg

In diesem Fall hat diese Tabelle auch nur eine Spalte TDLINE. Sie kann wie die übergeordnete Tabelle POS_NEU eingefügt werden. In der Positionszeile "Zeile1" gibt es nun eine Tabelle mit fünf Einträgen "Herr", "Max Lieferung", etc. Nach dieser Untertabelle wird die nächste Positionszeile POS_KOSTELLE dargestellt.

Tabellen26.jpg

Untertabelle hinzufügen vom Typ "Teilformular"

Hat man eine geschachtelte Tabellenhierarchie mit Oberteile und abhängiger Untertabelle kann die Untertabelle auch als Teilformular hinzufügt werden.

Tabellen35.JPG

Tabellen27.JPG

Hier gibt es eine Obertabelle, wo der Loop in der Positionszeile "ZEILE" erfolgt mit der Bindung "$.HAUPTDATEN.HU_ANZHU.DATA[*]". Hier werden Spalten wie "ANZHU" und "VEBEZ" dargestellt. Das Feld "STAWN" ist jedoch eine Untertabelle der Obertabelle ZEILE.

Tabellen28.JPG

Man muss jedoch aufpassen, wenn die Untertabelle eine Spalte der Obertabelle ist, dass das Teilformular, auf dass die Datenbindung auf die Untertabelle erfolgt, unter einem Teilformular hängt, was nicht gebunden ist. Sonst werden die Datensätze der Untertabelle nicht innerhalb der Spalte dargestellt. Das Teilformular "TAB_STAWN_spalte" ist nicht gebunden.

Tabellen29.JPG

Tabellen30.JPG

Die eigentliche Untertabelle hängt am Teilformular "TAB_STAWN". Hier ist die Bindung/der Loop über "$.STAWN.DATA[*]".

Tabellen31.JPG

Tabellen32.JPG

Hier ist nun das Feld "STAWN" enthalten.

Tabellen33.JPG

Tabellen34.JPG

Nun wird das Feld "STAWN" mit mehreren Einträgen pro Zeile dargestellt.

Tabellen36.JPG

Hinweis zur Vorsicht

  • In einem Formular in einem Projekt wurde eine zweistufige Tabellenhierarchie realisiert. Auf oberster Ebene eine Tabelle als Tabellenobjekt und auf der Positionszeile der (Ober-)Tabelle gab es für zwei Spalten jeweils eine Untertabelle. Die eine Untertabelle wurde durch einen normalen Tabellenknoten realisiert, die andere Untertabelle durch ein Teilformular mit Tabellenbindung. Auf der Obertabelle und den Untertabellen gab es sehr viele Datensätze. Dies sah für 12 DIN-A4 alles korrekt aus. Die Untertabellen wurden jeweils innerhalb des MAIN-Bereichs korrekt umgebrochen. Ab Seite 13 wurde die Untertabelle, die als Teilformular realisiert war, jedoch bis zum letzten Millimeter auf der betreffenden DIN-A4-Seite dargestellt und der Rest wurde abgeschnitten. Jede weitere Seite hatte den gleichen Fehler. Dies sah nach einem heftigen Adobe Forms-Bug aus, welcher einen OSS-Hinweis erfordern würde.
  • Als das Teilformular mit Tabellenbindung auf einen klassischen Tabellenknoten umgestellt wurde, verschwand jedoch der Fehler.
  • Im Zweifel sollte daher ein klassischer Tabellenknoten verwendet werden und zumindest nicht auf einer Untertabellenebene Tabellenknoten und Teilformulare mit Tabellenbindung vermischt werden.

Tabelle mit Kopfzeile, Itemzeilen und Fußzeile

Tabellentyp2.JPG

Diese Tabelle hat eine Kopfzeile, Itemzeilen und eine Fußzeile.

Tabellentyp1.JPG


Die Tabelle referenziert auf die Tabelle im Kontext.

Tabellentyp3.JPG


Während die Kopfzeile der Tabelle keine Bindung hat, da hier nur Überschrifttexte sind, bindet die Itemzeile auf den DATA-Knoten der Tabelle.

Tabellentyp4.JPG


Die einzelnen Felder unter dem DATA-Knoten müssen so also nur noch den Feldnamen binden, wie hier $.VOTXT.

Tabellentyp5.JPG


In der Fußzeile, die hier etwas unglücklich ZEILE1[1] benannt ist, bindet auf ein Feld im Kontext außerhalb der Tabelle.

Tabellentyp6.JPG

Tabellentyp7.JPG

Tabellensätze ausgeben mit Bedingung

Sehr nützlich kann es sein, Positionen einer Tabelle nur unter bestimmten Bedingungen auszugeben, bzw. entsprechend von Ausprägungen von Werten in einer Zeile unterschiedliche Formate auszugeben.

Hier gibt es eine Seite DATA_TABELLE, in der auf einen Tabelle im Kontext bindet.

LVCTabellenloopWhere1.jpg

LVCTabellenloopWhere3.jpg

LVCTabellenloopWhere9.jpg

Im Teilformularsatz IFS_DATA_TABELLE gibt es 3 Teilformulare DATA_TYP_FETT, DATA_TYP_STD und DATA_TYP_FUSS. Sie werden jeweils entsprechend der Ausprägung des Wertes ZEILENLAYOUT mit '01', '02' oder '03" ausgegeben.

LVCTabellenloopWhere2.jpg

Die Teilformulare binden

$.DATA.[ZEILENLAYOUT == "01"]

oder

$.DATA.[ZEILENLAYOUT == "02"]

oder

$.DATA.[ZEILENLAYOUT == "03"]

LVCTabellenloopWhere5.jpg

LVCTabellenloopWhere4.jpg

LVCTabellenloopWhere6.jpg

Unter den 3 Teilformularen DATA_TYP_FETT, DATA_TYP_STD und DATA_TYP_FUSS werden jeweils die Felder/Spalten SPALTE01, SPALTE02, etc. ausgegeben. Das Feld ZEILENLAYOUT wird nicht ausgegeben, da nur für die Logik der Unterscheidung von Header, verschiedenen Items und Fuß diente.

LVCTabellenloopWhere10.jpg

LVCTabellenloopWhere7.jpg

In diesem Beispiel wurde die Headerzeile der Tabellenausgabe auch innerhalb der Items/DATA mitgegeben. Das ist etwas schlechter Stil, da man dann nicht mehr die Tabelle über mehrere Seiten ausgeben kann, wo jeweils die Headerzeile pro Seite wiederholt wird. Manchmal kann man jedoch sicher sein keine Tabellenausgabe über mehrere Seiten zu haben oder es nicht erwünscht, dass sich die Headerzeile auf jeder Seite wiederholt.

LVCTabellenloopWhere13.JPG

LVCTabellenloopWhere14.JPG

In vielen Fällen wird es aber besser sein eine Tabelle über das Datenelement TABELLE auszugeben, wo man explizit eine Headerzeile definieren kann und dann beim Überlauf/Seitenumbruch auch angeben kann, dass diese Headerzeile erneut ausgegeben werden soll.

Tabellen21.jpg

Anzahl Datensätze Tabelle im Formular ausgeben

$record.SEITE_RS.IT_ABLESUNG_03.DATA[*].GV_LINES_03

Gruppenstufen

Mit Gruppenstufen kann eine flache Tabelle hierarchisch ausgegeben werden.

Zum Beispiel bei der Tabelle der Flugverbindungen der Fluggesellschaften SFLIGHT würde eine Fluggesellschaft immer wieder ausgegeben werden, um alle Einzelverbindungen aufzuführen. Besser lesbar kann es sein, wenn man nur einmal die Fluggesellschaft ausgibt und dann in der nächsten Spalte die Flugverbindung.

Gruppenstufen1.JPG

Die Gruppenstufe fügt man über die Schaltfläche Gruppenstufen2.JPG hinzu. Die anderen Felder werden ganz normal unter dem GROUP-DATA-Knoten ausgegeben.

Die interne Tabelle muss bereits vor der Ausgabe nach den Gruppenstufenfeldern sortiert sein.

In diesem Beispiel wird die Tabelle nach GERAET gruppiert.

Gruppenstufen3.JPG

Siehe zu Gruppenstufen auch die SAP-Hilfe und SAP Interactive Forms by Adobe, 2. Auflage, von Jürgen Hauser, u. a., S. 169-173.

Tabellen verbrauchen sich bei Nutzung

Teilformular zur Tabellenausgabe

  • Ein Teilformular kann in vielen Fällen auch sinnvoll für einfache Tabellenausgabe verwendet werden.
  • Komplexe Tabellen sollten jedoch mit dem UI-Tabelle "Tabelle" ausgegeben werden. Hier wird z. B. die Anlage einer Überschriftenzeile und Fußzeile vereinfacht.

Web-Links

Literatur