Kürzlich stieß ich auf ein Problem: Die Daten, die ich in meine Anwendung importierte, wurden nicht aktualisiert, obwohl ich sicher war, dass mein Prozess genau wie erwartet aufgebaut war.
Lassen Sie mich zunächst ein wenig Hintergrundwissen zu diesem Thema vermitteln. Wie gesagt, ich habe Datensätze in meine Anwendung importiert, sagen wir etwa 10,000 Datensätze, die ich dann aktualisieren und als „verarbeitet“ markieren wollte.
Also habe ich meinen Import mithilfe von Webdiensten erstellt und meine Daten kamen problemlos an. Dann habe ich einen Prozess erstellt, der ein Limit von 1,000 Datensätzen gleichzeitig verwendet und diese aktualisiert. Ein Abruf mit einem Limit ermöglicht es Ihnen, eine Teilmenge der Daten in Ihrer Tabelle zu verarbeiten, wodurch sichergestellt wird, dass Sie nicht zu viele Datensätze in den Speicher legen und möglicherweise die Leistung Ihrer Anwendung beeinträchtigen.
Zusätzlich habe ich einen Offset verwendet. Mit einem Offset können Sie angeben, wo in Ihrer Tabelle Sie mit dem Abrufen beginnen möchten. Sobald Sie dies eingerichtet haben, können Sie Ihren Prozess iterieren und Ihr Limit erhöhen, um sicherzustellen, dass Sie alle Ihre Datensätze verarbeiten. Wie unten gezeigt:


Also, eine grundlegende Erklärung zum obigen Bild:
- Erstellen Sie eine Ganzzahl, die der Anzahl der Datensätze entspricht, auf die Sie Ihren Abruf „begrenzen“ möchten (in diesem Fall 1,000).
- Erstellen Sie eine Ganzzahl, die Ihrem Offset entspricht. Für dieses Beispiel muss ich bei 0 beginnen, was natürlich der erste Datensatz ist.
- Rufen Sie mit einem benutzerdefinierten Abruf eine Liste Ihrer Entität ab.
- Definieren Sie Ihr Limit als $Limit
- Definieren Sie Ihren Offset als $Offset

- Iterieren Sie über Ihre Liste und führen Sie den gewünschten Prozess aus
- Zählen Sie die Anzahl der Entitäten, die Sie in der Abrufaktion abgerufen haben
- Überprüfen Sie, ob die Anzahl der abgerufenen Entitäten dem von Ihnen definierten Grenzwert entspricht.
- Wenn ja (wahr), dann mach es noch einmal, es kann mehr geben
- Wenn nein (falsch), dann müssen Sie das Ende Ihrer Liste erreicht haben
Ziemlich einfach, oder? Leider habe ich das Wichtigste vergessen, nämlich eine Sortierung in meinen Abruf einzubinden.
Lassen Sie mich erklären, warum das wichtig ist. Unten sehen Sie das Ergebnis eines Abrufs von „kleinen Quadraten“, wie in meinem Mikrofluss oben definiert:

Nehmen wir einfach an, das obige Bild ist eine Tabelle mit 100 kleinen Quadraten. Ich rufe ein Limit von 10 mit einem Offset von 0 ab. Die hervorgehobenen Quadrate werden abgerufen und verarbeitet. Sobald dieser Vorgang abgeschlossen ist, führen wir einen weiteren Abruf in der Datenbank durch, nachdem wir den Offset auf die Nummer des vorherigen Abrufs (10) geändert haben.
Jetzt wird mein Datensatz abgerufen, aber da ich keine Sortierreihenfolge definiert habe, gibt der Abruf die Liste willkürlich in keiner bestimmten Reihenfolge zurück. Da mein Offset 10 ist, beginne ich mit Datensatz 10. Leider könnten es Datensätze sein, die bereits verarbeitet wurden. Das Bild unten zeigt die zweite abgerufene Liste und die hervorgehobenen Datensätze sind diejenigen, die wir dann verarbeiten werden:

Das folgende Bild zeigt nun den Abruf mit angewendeter Sortierung. Beim Anwenden der Sortierung möchten wir sicherstellen, dass wir das eindeutigste Attribut verwenden, das möglich ist. Dadurch können wir sicherstellen, dass die abgerufene Liste immer dieselbe ist und wir jeden einzelnen Datensatz in der Tabelle verarbeiten.

Manchmal ist es nicht ratsam, einen Offset zu implementieren. Stellen wir uns dieses Beispiel vor; die kleinen Quadrate sind entweder weiß (nicht verarbeitet) oder blau (verarbeitet). Ich möchte alle Datensätze abrufen, die nicht verarbeitet wurden, und sie verarbeiten. In meiner Abrufaktion wende ich eine XPath-Einschränkung von [Processed = false()] an.

Auch hier habe ich eine Tabelle mit 100 Datensätzen, die alle nicht verarbeitet wurden, wie Sie unten im Bild sehen. Ich verwende mein Limit von 10 und einen Offset von 0, sodass ich die ersten zehn Datensätze abrufen kann. Anschließend verarbeite ich jeden dieser Datensätze:

Ich habe die zehn Datensätze verarbeitet und jetzt sieht mein Datensatz wie im Bild unten aus. Wenn ich meinen geänderten Offset anwende, aber weiterhin meine XPath-Einschränkung verwende, überspringt mein Prozess die ersten 10 Datensätze des resultierenden Datensatzes, was nur zu einer teilweisen Aktualisierung führt.

Meiner Erfahrung nach sind die in diesem Beitrag bereitgestellten Beispiele die häufigsten Beispiele für das Abrufen und Verarbeiten von Grenzwerten und Offsets. Es gibt andere Situationen, in denen Daten basierend auf Attributwerten oder aus anderen Gründen verarbeitet werden können oder nicht. Verwenden Sie immer eine Sortierung, die die Liste so statisch wie möglich macht:

Zusammenfassend sollten Sie beim Abrufen großer Datensätze Folgendes beachten:
- Verwenden Sie Grenzwerte und Offsets
- Die Grenzwerte sollten auf nicht mehr als 3,000 festgelegt werden, um die Auswirkungen auf den Cache-Speicher und die Systemleistung zu minimieren.
- Der Offset sollte verwendet werden, wenn Ihre Abrufbeschränkung keine Änderung des Datensatzes bewirkt. Er sollte ebenfalls eine Variable sein und auf die Stelle in Ihrer Liste eingestellt werden, an der Sie mit der Verarbeitung beginnen möchten.
- Verwenden Sie die Sortierung nach dem eindeutigsten Attribut, um Ihren Abruf über Ihren iterativen Prozess hinweg statisch zu gestalten
Wie bei jedem Prozess, den Sie in Mendix, denken Sie immer daran, wie sich Ihre darin getroffenen Entscheidungen und Aktionen auf Ihre Daten auswirken. Ich hoffe, der vorangegangene Beitrag hat etwas Licht in dieses Thema gebracht und wünsche Ihnen allen viel Spaß beim Modellieren!