Fragen zum ILLDataProvider Interface

Ich programmiere gerade weiter an meinem ILLDataProvider Support für Xbase++. Jetzt bin ich etwas erfahrener und sehe Möglichkeiten, mein System zu optimieren. Dazu müsste ich folgendes wissen:

  1. Bekommt ein ILLDataProvider für eine Tabelle immer die gleichen Identifier gemeldet, die er abzuliefern hat? (ILLDataProvider:SetUsedIdentifiers)
  2. Beim ILLDataProvider:DefineRow wird ein rowMode mitgeschickt. Hier entscheidet sich, ob die Daten als Felder oder Variablen vermeldet werden sollen. (ROWMODE_FIELD) Kann sich dieses Bit während der Lebenszeit eines Jobs ändern oder bleibt er für eine Tabelle bei jedem Aufruf konstant?
    Beste Grüße
    MIchael Hoffmann

Hallo Michael,

folgende Informationen zu deinen Fragen habe ich aus unserer Entwicklungsabteilung erhalten:

zu 1.
Nein, ein ILLDataProvider bekommt nicht immer die gleichen Identifier gemeldet, sondern die UsedIdentifiers richten sich nach dem Use-Case. So wird im Designer für die Infoquery (welche Feldnamen und Typen sind überhaupt vorhanden) oder den Beispieldatensatz (für Beispieldaten im Formeleditor) über die volle Breite angefragt, während im Druck (Vorschau oder PrintOnly) die Breite auf die tatsächlich benötigten Felder limitiert wird. Die unterliegende Query sollte daher die gemeldeten UsedIdentifiers aus Performancegründen berücksichtigen. Theoretisch könnte man natürlich mehr anmelden, keinesfalls aber weniger.

zu 2.
Beim RowMode verhält es sich ähnlich in Hinblick auf die anderen Flags ROWMODE_OWN_COLUMNS, ROWMODE_1TO1_COLUMNS, ROWMODE_DATA_PRINT_SYNTAXPARSING, ROWMODE_DATA_DESIGN, ROWMODE_DATA_PRINT_REALDATA. Das ROWMODE_FIELD Flag aber sollte für eine Tabelle eigentlich nicht wechseln, entweder es sind Felder oder Variablen.

Hallo Onursal,
Vielen Dank für Deine Antworten.

zu 1. : Das passt nicht zur Doku. Da steht, dass :SetUsedIdentifiers() mir mitteilt, welche Identifier gebraucht werden. Von Mode-Abhängigkeit ist da nicht die Rede. Der Call kommt auch erst, wenn L&L schon mehrfach DefineRow mit den verschiedenstem Mode Bits aufgerufen hatte, um zu sehen, was ich zu bieten habe. Der Call kommt für einen Provider auch nur ein einziges Mal. Danach werden nach meinen Erkenntnissen nur noch „scharfe Daten“ (und zwar die reduzierten) angefordert.
Bei einer 1:N-Beziehung wird für jeden 1-Satz ein neuer Provider für die N-Seite angefordert. (:OpenChildtable(…)) Der neue Provider kriegt auch immer den :SetUsedIdentifiers() call.
Dass sich hier die verwendeten identifiers nicht ändern, ist ziemlich klar. Mir geht es um einen anderen Fall, der theoretisch denkbar wäre. Nehmen wir mal den Fall an, dass es eine Liste für den Auslieferungszustand eines Auftrags gäbe. Dafür würde die Liste erst alle bereits ausgelieferten Positionen aufzählen (Sektion 1) und dann alle Rückstandpositionen (Sektion
2). Dabei würde zweimal die gleiche N-Tabelle abgelaufen, aber die ausgegebenen Sätze hängen vom Lieferzustand ab. Wenn nun noch verschiedene Felder in den beiden Sektionen ausgegeben werden, könnte es sein, dass L&L verschiedene Meldungen an :SetUsedIdentifiers() macht. Es könnte aber auch sein, dass er immer die Vereinigungsmenge der benötigten Felder der Sektionen 1 und 2 vermeldet.
Es könnte auch andere Situationen geben, die ich jetzt noch gar nicht kenne, in der sich diese Frage nach „Vereinigungsmenge“ oder „ILLDataProvider-Instanz-Spezifisch“ stellt.

Zu 2. „Das ROWMODE_FIELD Flag aber sollte für eine Tabelle eigentlich nicht wechseln, entweder es sind Felder oder Variablen.“ Ich wollte statt dem „sollte“ eigentlich ein „wird“ haben. Normalerweise würde ich davon ausgehen, dass ein Identifier immer wieder so angefordert wird, wie er beim ersten mal abgeliefert wurde. Aber wozu gibt es dann überhaupt das ROWMODE_FIELD flag? Gibt es da etwas, was ich nicht kenne?

Vielen Dank und beste Grüße
Michael

Hallo Michael,

das war vielleicht etwas missverständlich ausgedrückt. SetUsedIdentifiers() sollte pro Instanz eigentlich nur einmal aufgerufen werden und dient dazu, die angeforderten Felder einer zu diesem Zeitpunkt noch zusammenzustellenden Query zu limitieren. Eine solche Query ändert sich über die Lebenszeit des ILLDataProviders nicht mehr. Es können und werden aber weitere Instanzen mit unterschiedlichen Queries erzeugt, verwendet und zerstört. So laufen die beschriebenen Fälle (Abfragen der verfügbaren Felder für Formeleditor sowie den einen Beispieldatensatz innerhalb des Designers und Formeleditors, Abfrage für den Druck) über unterschiedliche Instanzen mit unterschiedlichen UsedIdentifiers.

Sollte SetUsedIdentifiers() tatsächlich ein zweites Mal für die gleiche Instanz aufgerufen werden, wäre unsere Entwicklungsabteilung sehr daran interessiert, sich das über einen Support-Case noch einmal genauer anzusehen.

Zu 2. Das ROWMODE_FIELD ist relevant, wenn man 20 Tabellen hat und eine davon als MasterTabelle angemeldet wird (die Felder der Mastertabelle werden dann als Variablen angemeldet – ROWMODE_FIELD nicht gesetzt, während es für die anderen Tabellen gesetzt ist). So können z.B. Serienbriefe umgesetzt werden.

Hallo Onursal,

Vielen Dank für die Klarstellungen. Ich war im Urlaub, deswegen die späte Antwort.

Beste Grüße
Michael