Wie die meisten Middlewares assoziieren wir SAP CI (auch bekannt als SAP Cloud Integration = früher CPI) mit ETL-Operationen - Daten extrahieren, transformieren und laden. Dies erweckt den Eindruck, dass die Daten nur durch SAP CI laufen und nicht darauf gespeichert werden. Während dies in den meisten Fällen zutreffen mag, kann es Situationen geben, in denen wir einige Daten auch in SAP CI aufbewahren möchten.
Wir möchten zum Beispiel das Datum der letzten erfolgreichen Ausführung eines bestimmten IFlow (Integrationsfluss) speichern. Dies könnte erforderlich sein, weil wir dieses Datum in einem anderen IFlow oder einer anderen Ausführung desselben IFlow verwenden, z. B. beim Abrufen von Daten auf der Grundlage dieses Datums. Manch einer mag argumentieren, dass wir das letzte Ausführungsdatum einfach in den Message Processing-Protokollen des Mandanten nachsehen können, oder? Und wenn das der Fall ist, warum müssen wir diese Daten dann überhaupt speichern? Aber es ist nicht notwendig, dass jede Ausführung erfolgreich ist, und daher kann das Datum der letzten erfolgreichen Ausführung nicht direkt aus den Nachrichtenverarbeitungsprotokollen abgerufen werden.
Ein weiteres Beispiel: Es gibt mehrere Ausführungspfade innerhalb eines IFlow, und der gewählte Pfad wird auf der Grundlage der Eingabedaten bestimmt.

Wir möchten den Zeitstempel nur dann speichern, wenn Pfad 1 als letzter genommen wird. Für Pfad 2 und Pfad 3 brauchen wir diese Information nicht zu speichern. Ein Blick in die Meldungsprotokolle wird uns nicht mehr viel helfen. In solchen Fällen (und vielen anderen) benötigen wir einen Mechanismus zur Speicherung von Daten auf CI.
Glücklicherweise bietet SAP CI bereits Funktionen für die Persistenz von Daten. In der Betriebsansicht Ihres CI-Mandanten finden Sie einen Abschnitt mit dem Titel "Manage Stores". Hier finden Sie die verschiedenen Möglichkeiten der Datenpersistenz, die SAP CI bietet. Schauen wir uns diese nacheinander an.

Variablen
Kehren wir zu dem Szenario zurück, das wir zuvor beschrieben hatten: Wir möchten das Datum des letzten erfolgreichen Laufs eines bestimmten IFlow speichern. Zu diesem Zweck können wir eine Variable verwenden.
Erstellung einer Variablen
In unserem IFlow müssen wir dazu eine Form "Write Variables" einfügen. Mit einem einfachen Camel-Ausdruck, wie unten gezeigt, können wir Werte in Variablen speichern. Bitte beachten Sie, dass wir nicht erst eine Variable erstellen müssen, indem wir in die Ansicht "Operationen" gehen.

Wie wir bereits erörtert haben, möchten wir diesen Wert vielleicht nur für einen bestimmten Ausführungspfad unter vielen anderen speichern. In diesem Fall können wir diese Form nur in diesem Pfad platzieren.
Lesen Variabler Wert
Um die in den Variablen gespeicherten Werte zu lesen, müssen wir nur auf die Variablen verweisen (siehe unten). Dies kann auch in den Eigenschaften des Nachrichtenaustauschs erfolgen.

Prüfen von Variablen in der Vorgangsansicht
Um den Wert dieser Variable zu sehen, gehen Sie in der Ansicht "Vorgang" unter "Speicher verwalten" auf "Variablen". Sie können die Variable anhand ihres Namens und der ID des Integrationsflusses, zu dem sie gehört, identifizieren. Wir können diese Variable in demselben IFlow lesen und einen anderen Wert zurückschreiben. Das liegt daran, dass der Geltungsbereich dieser Variable auf diesen bestimmten IFlow beschränkt ist.
So sieht der Bildschirm "Variablen verwalten" aus. Sie können eine Liste aller Variablen unter diesem Mandanten sehen, zusammen mit ihrer Sichtbarkeit, dem Namen des Integrationsflusses, mit dem sie verbunden sind (im Falle von lokalen Variablen), den zugehörigen Daten und den verfügbaren Optionen.

Umfang/Sichtbarkeit der Variablen
Variablen haben standardmäßig einen lokalen Geltungsbereich. Das bedeutet, dass sie nur für einen IFlow sichtbar und zugänglich sind.
Was aber, wenn wir diesen Wert aus einem anderen IFlow auslesen oder möglicherweise sogar ändern wollen? In diesem Fall müssen wir eine globale Variable verwenden. Wie der Name schon sagt, ist der Geltungsbereich dieser Variablen nicht auf einen IFlow beschränkt. Diese Variable kann von iFLow gelesen und geändert werden.
Wann kann so etwas nützlich sein? Nehmen wir zum Beispiel an, dass der von einem IFlow geschriebene Wert von einem anderen für dessen Verarbeitung verwendet werden soll.
Da globale Variablen nicht auf einen IFlow beschränkt sind, wird bei der Betrachtung dieser Variablen unter Manage Stores kein Wert für IFlow Ids angegeben.
Können wir mehrere Variablen mit demselben Namen haben?
Zu beachten ist auch, dass Sie mehrere . Variablen mit demselben Namen. Dies ist möglich, weil sie durch ihre IFlow Ids unterschieden werden können. Für globale Variablen ist dies jedoch nicht möglich.
Können wir lokale Variablen mit demselben Namen wie eine globale Variable haben?
Ja, wir können mehrere lokale Variablen mit demselben Namen haben. Dieser Name kann der gleiche sein wie der einer globalen Variable.
Wenn wir einen Variablenwert lesen, geben wir an, ob wir den Wert einer lokalen oder einer globalen Variablen abrufen wollen. Es ist also kein Problem, doppelte Namen zu haben.
Was passiert, wenn wir versuchen, auf Variablen zu verweisen, die nicht existieren?
Wenn wir versuchen, auf eine Variable zu verweisen, die nicht existiert/einen falschen Namen hat. Es wird kein Wert extrahiert und die Kopfzeile/Eigenschaft wird effektiv auf Null gesetzt.
Alternativ können wir auch Standardwerte angeben, die in solchen Fällen verwendet werden, wenn wir auf Variablen verweisen. Wenn die Variable nicht existiert, wird sie als Ersatz verwendet und als String-Objekt behandelt.

Löschen einer Variable
Variablen können auf dem Bildschirm "Variablen verwalten" in der Ansicht "Operationen" Ihres CI-Mandanten gelöscht werden, indem Sie auf das Löschsymbol auf der rechten Seite der Variablenkachel klicken.
Aufbewahrungszeitraum einer Variablen
Der Zeitraum, für den der Wert einer Variablen gespeichert wird, beträgt 400 Tage ab dem Datum der letzten Änderung dieser Variablen.
Nummernkreise
Wir werden nun zum nächsten Thema übergehen: Nummernkreise. Wir wissen bereits, dass es sich dabei um eine Form der Datenpersistenz handelt, aber was genau tut sie und was macht sie aus?
Nummernkreise fungieren als Sequenzen, die u. a. zur Kennzeichnung von Nachrichten verwendet werden können. Nehmen wir an, dass in einem bestimmten Integrationsszenario alle Messages an das Zielsystem eine eindeutige Sequenznummer haben müssen. In diesem Fall kann ein Nummernkreis von Nutzen sein.
Erstellen von Nummernkreisen
Vor der Verwendung müssen Nummernkreise erstellt werden, indem Folgendes angegeben wird:
- Name: Geben Sie einen eindeutigen Namen an, der als Referenz für diesen Nummernkreis verwendet werden soll.
- Beschreibung: Nicht obligatorisch, aber im Allgemeinen eine gute Praxis, diese Informationen anzugeben, um spätere Verwechslungen zu vermeiden.
- Mindestwert: Ein nicht negativer ganzzahliger Wert mit maximal 14 Zeichen. Hier können keine Zeichenfolgen/Zeichen eingegeben werden.
- Mindestwert: Ein nicht negativer ganzzahliger Wert mit maximal 14 Zeichen. Hier können keine Zeichenfolgen/Zeichen eingegeben werden.
- Feldlänge: Die Länge der von diesem Nummernkreis zurückgegebenen Sequenznummer.
- Drehen: Wenn der Maximalwert erreicht ist, wird der erste Wert als nächste Zahl in der Reihenfolge gewählt.

Verwendung von Nummernkreisen
Nummernkreise können verwendet werden, indem man sie in den Eigenschaften von Nachrichtenköpfen/Austauschen referenziert.

Nummernkreise können je nach Bedarf verwendet werden. Wenn sie nur unter bestimmten Bedingungen und nicht bei jeder Ausführung verwendet werden sollen, kann innerhalb des Pfades, der diesen Bedingungen entspricht, auf sie verwiesen werden, um eine unnötige Verschwendung von Nummern in der Reihenfolge zu vermeiden. Dies kann z. B. mit Hilfe von Routern erreicht werden.
Kann derselbe Zahlenbereich in mehreren IFlows referenziert werden?
Ja, aber bedenken Sie, dass bei jeder Referenzierung während einer Ausführung der Wert um 1 erhöht wird. Wenn Sie denselben Nummernkreis für mehrere Integrationsflüsse verwenden, kann dies zu Verwirrung über scheinbar übersprungene Werte führen. Außerdem ist es problematisch, denselben Nummernkreis in mehreren Integrationsflüssen zu verwenden, wenn die Zielsysteme eine kontinuierliche Folge erwarten.
Kann derselbe Zahlenbereich an mehreren Stellen im selben IFlow referenziert werden?
Ja, auch das kann man machen. Es ist jedoch zu erwarten, dass dabei Werte übersprungen werden. Wenn zum Beispiel ein Zahlenbereich während einer Ausführung zweimal referenziert wird, wird der Wert dieses Zahlenbereichs um 2 erhöht. Unter Berücksichtigung dieser Tatsache kann derselbe Zahlenbereich mehrfach referenziert und sogar verwendet werden, um Inkremente/Schritte von n statt nur 1 zu erzeugen.
Kann der nächste Wert eines Zahlenbereichs geändert werden?
Wir können den nächsten Wert eines Zahlenbereichs manuell auf einen bestimmten Wert setzen. Obwohl dies normalerweise nicht empfohlen wird, kann es in seltenen Fällen gerechtfertigt sein. Dies kann durch Bearbeiten des Nummernkreises unter Ansicht Operationen->Nummernkreise erreicht werden.

Was passiert, wenn wir versuchen, auf einen Zahlenbereich zu verweisen, der nicht existiert?
Wenn versucht wird, auf einen Nummernbereich zu verweisen, der nicht existiert oder einen falschen Namen hat, wird eine Ausnahme des Formats ausgelöst:
com.sap.it.rt.adapter.http.api.exception.HttpResponseException: Ein interner Serverfehler ist aufgetreten: Fehler beim Holen des nächsten Wertes für den Nummernkreis: NumberRangeName.
Dies ist etwas ganz anderes als im Falle fehlender Variablen, die einfach Nullwerte zurückgeben.
Löschen eines Nummernkreises
Nummernkreise können gelöscht werden, indem Sie auf dem Bildschirm 'Nummernkreise verwalten' in der Betriebsansicht Ihres CI-Mandanten auf die Schaltfläche 'Aufheben' klicken.
Zeitraum eines Nummernkreises beibehalten
Nummernkreise haben keine feste Aufbewahrungsfrist. Sie werden aufbewahrt, bis sie nicht mehr eingesetzt werden.
Verwendung von Variablen anstelle von Zahlenbereichen
Wenn Sie darüber nachdenken, können Variablen verwendet werden, um Zahlenbereiche zu ersetzen. In einem Integrationsfluss können wir Message Headers/Properties so einstellen, dass sie Werte von Variablen abrufen (und einen Standardwert festlegen, falls dieser nicht vorhanden ist). Nach der Verwendung kann der Wert je nach Bedarf erhöht/verringert werden, und dieser Wert kann in die Variable zurückgeschrieben werden.
Vorteile:
- Die Werte können auch verringert werden, anstatt nur zu steigen. Als Beispiel können wir einen Countdown mit dieser Logik implementieren.
- Wir können unsere eigene Logik für komplexere Szenarien implementieren. Beispiel: Wir können Werte auf der Grundlage bestimmter Bedingungen sowohl erhöhen als auch verringern.
- Wir können die Verwendung einer Sequenz einschränken, indem wir lokale Variablen verwenden. Auf diese Weise hat nur ein bestimmter IFlow Zugriff auf eine Sequenz.
- Wir können die Sequenzwerte nach Bedarf ändern, indem wir eine in unserem IFlow implementierte Logik verwenden.
- Wir können Standardwerte zuweisen, die verwendet werden, wenn die angegebene Variable nicht vorhanden ist.
Nachteile:
- Die Verantwortung für das Erhöhen/Verringern von Werten liegt beim CI-Entwickler. Er muss sich um alle Möglichkeiten kümmern, um sicherzustellen, dass die richtige Reihenfolge eingehalten wird.
- Wir können den Wert von Variablen nicht manuell festlegen, wie es bei Zahlenbereichen möglich ist.
Ob man dies tun sollte oder nicht, ist umstritten und wird am besten dem Ermessen des Lesers überlassen. In diesem Blogbeitrag haben wir zwei Arten der Datenpersistenz in SAP Cloud Integration und die Unterschiede zwischen ihnen kennengelernt. Dies sind alle Informationen, die man braucht, um mit Variablen und Nummernkreisen in SAP Cloud Integration zu arbeiten. Im nächsten Beitrag werden wir den dritten Modus der Datenpersistenz - Data Stores - und einige weitere interessante Szenarien besprechen.