Tabellen im LiveCycle Designer
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 Adobe Forms-Schnittstelle
In der Schnittstelle vom Formular ZOM_ORDER wird u. a. eine Tabelle IT_ZOM_FORM_POS mitgeliefert, was auch am Symbol zu erkennen ist.
Der Importparameter IT_ZOM_FORM_POS (Positionsdaten für Formular) hat den Typ (hier Tabellentyp) ZOM_ORDER_DATA_FORM_POS_T.
Der Tabellentyp ZOM_ORDER_DATA_FORM_POS_T typisiert auf den Zeilentyp (Struktur) ZOM_ORDER_DATA_FORM_POS.
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.
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 . 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.
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.
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.
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".
Es werden 5 Spalten gewünscht und eine Kopfzeile, und keine Fußzeile.
Kopfzeile und Positionszeile(n) einfügen
Unter dem Tabellensymbol POS_NEU gibt es das Kopfzeilensymbol POS_KOPF und das Positionssymbol POS_DAT.
Kopfzeile
Unter der Kopfzeile POS_KOPF gibt es hier fünf Felder GV_LEISTUNGSNR, GV_BEZEICHNUNG etc. Sie haben in diesem Fall den Typ , da in diesem Fall der Text über die Schnittstelle sprachabhängig geliefert wird. Sehr häufig wird der Typ verwendet und der Beschreibungstext direkt in die Formularvorlage geschrieben.
Positionszeilen
Meist gibt es in einer Tabelle nur eine Positionszeile. Die Datenbindung des DATA-Knotens wird dann auch an den Positionsknoten gebunden.
Gibt es in einer Tabelle mehrere Positionszeilen, dann ist es leider NICHT MÖGLICH an jede Positionszeile den DATA-Knoten zu hängen. Versucht man das, wird nur die erste Positionszeile ausgegeben.
Da in diesem Fall jedoch pro Datensatz der internen Tabelle weitere Felder in separaten Zeilen ausgegeben werden sollen und gibt es fünf weitere Positionszeilen (POS_LEISTUNGSBESCHR, POS_LIEFERTERMIN, ..). Dann kann der DATA-Knoten an den Tabellennamen/Wurzelknoten der Tabelle (hier „POS_NEU“) gebunden werden. In so einem Fall würde jedoch die Kopfzeile und die Fußzeile auch für jeden DATA-Datensatz ausgegeben werden. Das ist meist nicht erwünscht.
Es ist in so einer Konstellation möglich genau eine Positionszeile zu nutzen, an der der DATA-Knoten gebunden ist, und in dieser einen Positionszeile fügt man dann alle Itemfelder ein, die mittels Teilformularen strukturiert werden.
Angepasste Positionszeilen einfügen
Bei den weiteren Positionszeilen POS_LEISTUNGSBESCHR, POS_LIEFERTERMIN, POS_KOSTENSTELLE und POS_KONTONUMMER gibt es jeweils ein Feld pro Zeile.
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.
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.
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.
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.
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.
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.
Die eigentliche Untertabelle hängt am Teilformular "TAB_STAWN". Hier ist die Bindung/der Loop über "$.STAWN.DATA[*]".
Hier ist nun das Feld "STAWN" enthalten.
Nun wird das Feld "STAWN" mit mehreren Einträgen pro Zeile dargestellt.
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.
Untertabelle hinzufügen vom Typ "Tabelle" (Schulungsbeispiel "FP_TEST_NESTED_TABLE")
Im SAP-Schulungsformular "FP_TEST_NESTED_TABLE" sieht man auch gut den korrekten Aufbau zur Nutzung von mehreren hierarchischen Tabellen.
In diesem Fall im Flugdatenmodell eine Tabelle mit CONNECTIONS (Flugverbindungen) und eine untergeordnete Tabelle mit BOOKINGS (Buchungen der Flugverbindungen).
Die Ausgabe (Programm = FP_TEST_NESTED_TABLE) ist nicht schön, aber man sieht die Verschachtelung der Flugverbindungen und der Buchungen.
Tabelle mit Kopfzeile, Itemzeilen und Fußzeile
Diese Tabelle hat eine Kopfzeile, Itemzeilen und eine Fußzeile.
Die Tabelle referenziert auf die Tabelle im Kontext.
Während die Kopfzeile der Tabelle keine Bindung hat, da hier nur Überschrifttexte sind, bindet die Itemzeile auf den DATA-Knoten der Tabelle.
Die einzelnen Felder unter dem DATA-Knoten müssen so also nur noch den Feldnamen binden, wie hier $.VOTXT.
In der Fußzeile, die hier etwas unglücklich ZEILE1[1] benannt ist, bindet auf ein Feld im Kontext außerhalb der Tabelle.
Kopfzeile in aufeinander folgenden Seiten
Aus optischen Gründen ist es bei einer Tabelle oft erwünscht, dass sich die Überschriftenzeile auf jeder Ausgabeseite wiederholt. So lassen sich die DATA-Spalten auf den Folgeseiten besser zuordnen.
Hier soll die Überschriftenzeile "Ueberschriften" auf jeder Ausgabeseite wiederholt werden.
Die Überschriftzeile ist vom Typ "Kopfzeile".
Auf dem Reiter "Paginierung" sind die Checkboxen bei "Kopfzeile in erste Seite einschließen" und bei "Kopfzeile in aufeinanderfolgenden Seiten" gesetzt.
Soll die Kopfzeile auf jeder Ausgabeseite wiederholt werden, muss auch "Zeile für jedes Datenelement wiederholen" gesetzt sein, sonst würde die Kopfzeile nur 1 x ausgegeben werden.
Wenn die Tabellenzeile keine Kopfzeile ist, wie hier bei der DATA-Tabellenzeile, sind auch die Felder für die Darstellung der Kopfzeile inaktiv.
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.
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.
Die Teilformulare binden
$.DATA.[ZEILENLAYOUT == "01"]
oder
$.DATA.[ZEILENLAYOUT == "02"]
oder
$.DATA.[ZEILENLAYOUT == "03"]
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.
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.
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.
Tabellenhöhe dynamisch
Die Tabellenhöhe ist für die Tabelle und deren Tabellenzeilen immer dynamisch. Das lässt sich nicht deaktivieren.
Bei den Zellen in den Tabellenzeilen hängt es davon ab welcher Datentyp die Objekte in den Zellen haben.
Bei einem Feld vom Typ "Text" ist die dynamische Höhe deaktiv, weil während der Laufzeit sich der Text auch nicht ändern kann.
Bei Feldern mit variablem Inhalt wie "Textfeld", "Numerisches Feld", "Dezimalfeld", "Datums-/Uhrzeitfeld" etc. lässt sich die Checkbox bei der Höhe "Passend erweitern" setzen.
Wenn bei der Ausgabe von Feldern mit dynamischem Inhalt zwar die Checkbox "Mehrere Zeilen zulassen" gesetzt ist, aber nicht bei der Höhe "Passend erweitern", dann kommt es manchmal dazu, dass der Text eines Feldes abgeschnitten wird. Hier muss dann die Checkbox bei der Höhe "Passend erweitern" gesetzt werden.
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.
Die Gruppenstufe fügt man über die Schaltfläche 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.
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
Adobe Forms Tabelle zusammenhalten (Titel, Überschriftenzeile, Data)
Tabellenabschnitt
- Mit einem Tabellenabschnitt lassen sich Zeilen einer Tabelle zu einer Einheit zusammenfassen.
- Die Zeilen lassen sich markieren mit gehaltener STRG+Taste, um mehrere Zeilen zu markieren und dann mit rechter Maustaste "Als Abschnitt gruppieren".
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
- SAP-Hilfe: Tabellen in SAP Adobe-Forms
- mind-forms.de: Verwendung von Teilformularen in Adobe Forms
- Adobe-Hilfe: Kalkulationen in einer Tabelle
Literatur
- SAP Interactive Forms by Adobe, 2. Auflage, von Jürgen Hauser, Andreas Deutesfeld, Stephan Rehmann, Thomas Szücs und Philipp Thun, S. 296ff.