Sie werden wahrscheinlich mit Nachrichten arbeiten, die Wiederholungsfelder mit einer unbekannten Anzahl an Wiederholungen enthalten. Dies ist der Fall beim Feld Item (Artikel) in der Beispielnachricht des Abschnitts Beispielnachricht.
Wenn Sie einen Filter schreiben möchten, der alle Instanzen des Felds Item berücksichtigt, müssen Sie ein Konstrukt verwenden, das über alle Instanzen eines Wiederholungsfelds iterieren kann. Die Vergleichsfunktion ermöglicht die Ausführung eines Vergleichselements für alle Instanzen eines Wiederholungsfelds und die Sortierung der Ergebnisse.
Angenommen, Sie möchten sicherstellen, dass die Menge keines der bestellten Artikel über 50 liegt. Hierfür können Sie folgenden Code schreiben:
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
Im Hinblick auf Vergleichsfunktion soll zunächst auf die eckigen Klammern [] am Ende der Feldreferenz nach FOR ALL aufmerksam gemacht werden. Diese bedeuten, dass Sie über alle Instanzen des Felds Item iterieren.
In einigen Fällen scheint diese Syntax unnötig, da diese Informationen aus dem Kontext ersichtlich sind; sie wird jedoch aus Gründen der Konsistenz mit anderen Syntaxbereichen dennoch verwendet.
Die AS-Klausel ordnet den Namen I der aktuellen Instanz des Wiederholungsfelds zu. Dieses Konzept entspricht ungefähr dem Konzept der Iteratorklassen, das in einigen objektorientierten Sprachen wie C++ verwendet wird. Der Ausdruck in runden Klammern ist ein Vergleichselement, das für jedes Instanz des Felds Item ausgewertet wird.
Die Beschreibung dieses Beispiels lautet wie folgt:
Die obige Beschreibung gilt für die Art der Auswertung eines Vergleichselements, wenn Sie das Schlüsselwort ALL verwenden. Alternativ hierzu kann SOME oder ANY (funktionale Entsprechung) angegeben werden. In diesem Fall gibt die Vergleichsfunktion TRUE zurück, wenn das untergeordnete Vergleichselement für eine Instanz des Wiederholungsfelds TRUE zurückgibt. Nur wenn das untergeordnete Vergleichselement für alle Instanzen des Wiederholungsfelds FALSE zurückgibt, gibt die Vergleichsfunktion FALSE zurück. Wenn vom untergeordneten Vergleichselement eine Kombination aus FALSE und UNKNOWN zurückgegeben wird, wird der Gesamtwert UNKNOWN zurückgegeben.
Im Filterausdruck
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'The XML Companion')
ergibt das untergeordnete Vergleichselement TRUE. Der nächste Ausdruck ergibt jedoch FALSE:
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'C Primer')
Der Grund hierfür ist, dass C Primer in dieser Rechnung nicht enthalten ist. Wenn einige der Artikel (Item) in der Rechnung (invoice) kein Feld für den Buchtitel enthalten, gibt das untergeordnete Vergleichselement UNKNOWN zurück, und die Vergleichsfunktion gibt den Wert UNKNOWN zurück.
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')
Das Vergleichselement IS NOT NULL stellt sicher, dass vom untergeordneten Vergleichselement ein FALSE-Wert zurückgegeben wird, wenn ein Artikelfeld (Item) kein Buch (Book) enthält.
Mit Hilfe eines SELECT-Ausdrucks können Sie auch beliebige Wiederholungen von Feldern innerhalb einer Nachricht bearbeiten. Dieser Vorgang ist im Abschnitt Auf Spalten in einer Datenbank verweisen beschrieben.
Sie können mit Hilfe der Feldgruppenindizes [>] und [<] auf die ersten und letzten Instanzen eines Wiederholungsfelds verweisen, sowie auf die Instanzen, die relativ zur ersten und letzten sind. Dies gilt auch, wenn Sie die Anzahl der vorhandenen Instanzen nicht kennen. Diese Indizes werden im Abschnitt Zugriff auf bekannte Mehrfachvorkommen eines Elements beschrieben.
Alternativ dazu können Sie mit der Funktion CARDINALITY ermitteln, wie viele Instanzen eines Wiederholungsfelds vorhanden sind. Beispiel:
DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])