Einfache 1:n-Relationen

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.