Das typische Beispiel für diesen Fall ist die bereits angesprochene 1:n-Beziehung Bestellung – Bestellposten. In diesem Fall werden nach jeder Datenzeile mit Bestell-Daten n Bestellpositionen ausgegeben. Die Ausgabe einer Zeile erfolgt mit LlPrintFields(). Analog zum Verhalten von LlPrintFieldsEnd() im letzten Abschnitt erhalten Sie – wenn der Benutzer eine Untertabelle platziert hat – nun auch hier LL_WRN_TABLECHANGE zurück und müssen darauf entsprechend reagieren. Sie können die Tabellenbeziehung über LlPrintDbGetCurrentRelation() und den Namen der Kindtabelle über LlPrintDbGetCurrentTableName() erfragen. Mit diesen Informationen können Sie dann wiederum die Hilfsfunktion DruckeTabelle() aus dem vorigen Abschnitt aufrufen. Dieser Aufruf muss direkt nach dem LlPrintFields() erfolgen – also aus der Funktion DruckeTabelle() selbst. Die Funktion muss also dahingehend abgeändert werden, dass sie sich selbst rekursiv aufruft:
Funktion
DruckeTabelle(DataTable
Datenobjekt)
{
// DataTable ist ein
geeignetes Datenzugriffsobjekt, z. B.
eine
// Datenbaktabelle, ein
Klassenarray o. ä.
<wiederhole>
{
<definiere Felder von
DataTable>
(LlDefineField,
LlDefineFieldExt,
LlDefineFieldExtHandle)
<drucke
Zeile>
(LlPrintFields)
<solange Warnung
wiederholen>
(LlPrint,
Rückgabewert =
LlPrintFields)
<solange Rückgabewert LL_WRN_TABLECHANGE
wiederholen>
{
<Hole aktuellen
Tabellennamen>
(LlPrintDbGetCurrentTable)
<Hole aktuelle
Beziehung>
(LlPrintDbGetCurrentTableRelation)
<Hole aktuelle
Sortierung>
(LlPrintDbGetCurrentTableSortOrder)
<Generiere ein passendes
Kind-DataTable-Objekt>
<Rückgabewert=DruckeTabelle(Kind-DataTable)>
}
<nächster Datensatz in
DataTable>
}
<bis letzter Datensatz in
DataTable erreicht>
<Fußzeile
drucken>
(Rückgabewert = LlPrintFieldsEnd)
<solange Warnung "Seite voll"
wiederholen>
(Rückgabewert = LlPrintFieldsEnd)
<Ergebnis = Rückgabewert>
}
Damit können nun auch beliebige Abfolgen von Untertabellen ausgegeben werden. Die Rekursion stellt hierbei sicher, dass dies beliebig "tief" funktioniert, d. h. der Code kann in dieser Form auch mehrstufige Relationen korrekt ansteuern.