Zunächst müssen alle Tabellen bei List & Label bekannt gemacht werden, die Sie dem Benutzer für das Design zur Verfügung stellen möchten:
LlDbAddTable(hJob, "", ""); //
evtl. vorhandene Tabellen löschen
LlDbAddTable(hJob, "Orders",
"Bestellungen");
LlDbAddTable(hJob, "OrderDetails",
"Bestellposten");
Der erste Parameter ist wie üblich das Job-Handle des List & Label-Jobs. Der zweite Parameter ist die TableID, dies ist der Wert, den Sie beim Druckvorgang von LlPrintDbGetCurrentTable() zurückgeliefert bekommen. Der dritte Parameter ist der Anzeigename der Tabelle im Designer. Wenn Sie NULL bzw. einen Leerstring übergeben, sind TableID und Anzeigename identisch.
Eine besondere Rolle kommt dabei dem Tabellennamen "LLStaticTable" zu. Dieser ist reserviert und kann für das Einfügen von 'statischen' Inhalten (feste Texte oder Inhalte von Variablen, Chartunterschriften etc.) verwendet werden. Eine solche statische Tabelle steht dann als "Freier Inhalt" im Datenquellen-Auswahldialog des Designers zur Verfügung und kann vom Benutzer nur mit Datenzeilen befüllt werden. In Ihrem Code müssen Sie entsprechend auf die Tabelle reagieren - wie wird im Druck-Unterkapitel erläutert.
Im nächsten Schritt werden die Beziehungen zwischen den Tabellen definiert. List & Label unterscheidet hierbei nicht direkt zwischen unterschiedlichen Beziehungstypen (n:m, 1:n) – Sie melden eine Beziehung einfach mit einer ID an, die Sie hinterher im Druck abfragen können:
LlDbAddTableRelation(hJob,
"OrderDetails", "Orders",
"Orders2OrderDetails", NULL);
Mit diesem Befehl haben Sie bekanntgemacht, dass "OrderDetails" im Designer als Untertabelle für die Tabelle "Orders" zur Verfügung stehen soll. In diesem Falle wurde nur die ID der Relation übergeben, diese erscheint dann auch im Designer.
Zuletzt können Sie noch Sortierungen übergeben, die für die jeweiligen Tabellen zur Auswahl stehen sollen. Auch hier erhält wieder jede Sortierung eine eindeutige ID, die Sie im Druck abfragen können:
LlDbAddTableSortOrder(hJob,
"Orders", "OrderDate ASC",
"Order Date
[+]");
LlDbAddTableSortOrder(hJob, "Orders", "OrderDate DESC",
"Order Date [-]");
Nun kann der Benutzer im Designer eine dieser Sortierungen sowie die Grundeinstellung "unsortiert" auswählen. Wenn Sie die Tabellen über LlDbAddTableEx() anmelden können Sie auch Unterstützung für mehrfache Sortierungen signalisieren.
Der restliche Ablauf des Designeraufrufs ist analog zum "normalen" Aufruf, d. h. das gesamte Schema eines Designeraufrufs mit mehreren Tabellen würde so aussehen:
<öffne
Job>
(LlJobOpen,
LlJobOpenLCID)
<definiere List &
Label-Voreinstellungen>
(LlSetOption,
LlSetOptionString,
LlSetDebug,
LlSetFileExtensions,
LlSetNotificationMessage,
LlSetNotificationCallback)
<zu bearbeitende Datei
bestimmen lassen>
LlSelectFileDlgTitleEx
<definiere
Datenstruktur>
(LlDbAddTable,
LlDbAddTableRelation,
LlDbAddTableSortOrder)
<definiere
Variablen>
(LlDefineVariableStart,
LlDefineVariable,
LlDefineVariableExt,
LlDefineVariableExtHandle)
<definiere
Felder>
(LlDefineFieldStart,
LlDefineField,
LlDefineFieldExt,
LlDefineFieldExtHandle)
<sperre
Funktionen>
(LlDesignerProhibitAction,
LlDesignerProhibitFunction)
<Aufruf des
Designers>
(LlDefineLayout)
<schließe
Job>
(LlJobClose)
Alle Felder einer Tabelle müssen in der Form "<TabellenID>.<Feldname>" benannt werden, damit List & Label diese korrekt den einzelnen Tabellen zuordnen kann. Stellen Sie also sicher, dass Sie jedem Feldnamen die TabellenID voranstellen.
Wenn Sie zusätzlich zu den Feldern einer Tabelle alle Felder von 1:1 verknüpften Tabellen zur Verfügung stellen möchten, beachten Sie bitte die Hinweise im Kapitel Umgang mit 1:1-Relationen.