Für eine vollständige Druckschleife, die sowohl Folgetabellen als auch Untertabellen korrekt unterstützt muss nun nichts mehr getan werden – der Code aus den beiden letzten Abschnitten stellt sicher, dass der komplette Baum der Tabellenstruktur durchlaufen wird.
Insofern bleibt nur noch Feinarbeit zu leisten – z. B. die Anzeige eines Fortschrittsbalkens. Da das Layout beliebig komplex werden kann, kann nicht mehr einfach die aktuelle Position innerhalb der Datenquelle zur Gesamtzahl der Datensätze in Verhältnis gesetzt werden. Dieser Ansatz funktioniert schon dann nicht mehr korrekt, wenn der Benutzer zwei Tabellen hintereinander im Designer platziert. Daher bietet List & Label über die Funktion LlPrintDbGetRootTableCount() die Möglichkeit, die Anzahl der Tabellen auf der obersten Ebene ("Root") zu bestimmen. Dann können Sie die Fortschrittsanzeige immer dann aktualisieren, wenn Sie auf dieser Ebene einen Datensatz ausgeben.
Für den maximal pro Tabelle verfügbaren Prozentsatz gilt
INT nMaxPerc = 100/LlPrintDbGetRootTableCount();
Wenn Sie die Root-Tabellen von 0.. LlPrintDbGetRootTableCount()-1 durchindizieren, können Sie den Gesamt-Prozentsatz dann als
INT nPercTotal = nMaxPerc*nIndexCurrentTable+(nPerc/100*nMaxPerc);
berechnen, wobei nPerc der Prozentposition innerhalb der aktuellen Tabelle entspricht. Für die eigentliche Aktualisierung der Prozentanzeige kann dann die DruckeTabelle()-Funktion aus dem letzten Abschnitt angepasst werden. Durch einen weiteren Eingangsparameter kann die augenblickliche Rekursionstiefe bestimmt werden – ist diese 0 wird gerade ein "Root"-Datensatz gedruckt und die Anzeige kann aktualisiert werden:
Funktion
DruckeTabelle(DataTable Datenobjekt, Rekursionstiefe
Tiefe)
{
<wiederhole>
{
<definiere Felder von
DataTable>
...
<wenn Tiefe==0 Fortschrittsanzeige
aktualisieren>
(LlPrintDbGetRootTableCount,
LlPrintSetBoxText)
<drucke
Zeile>
(LlPrintFields)
<solange Warnung
wiederholen>
(LlPrint,
Rückgabewert =
LlPrintFields)
<solange Rückgabewert LL_WRN_TABLECHANGE
wiederholen>
{
...
<Generiere ein passendes
Kind-DataTable-Objekt>
<Rückgabewert=DruckeTabelle(Kind-DataTable, Tiefe+1)>
}
...
}
}