Behandlung von Nullwerten in Datenbankaktionen
Wenn in einem Mapping eine Zieldatenbank mit Hilfe von Tabellenaktionen wie "Ignorieren, wenn", "Aktualisieren, wenn", "Löschen, wenn", aktualisiert wird, so vergleicht MapForce die Quelldaten mit den Zieldaten und generiert als Ergebnis interne Datenbankaktualisierungsabfragen. (Eine Vorschau auf diese internen Abfragen steht im Ausgabefenster von MapForce zur Verfügung, siehe Ausführen von Mappings, die Datenbanken modifizieren). In den generierten Abfragen werden die Bedingungen, die im Dialogfeld "Datenbankaktionen" definiert wurden, berücksichtigt.

Dialogfeld "Datenbankaktionen"
Wenn Ihre Quell- oder Zieldaten Null-fähige Felder enthalten, haben Sie zwei Optionen, um Nullwerte aus der Quellkomponente mit denen in der Zielkomponente zu vergleichen:
1.Behandlung von Nullwerten als gleich
2.Behandlung von Nullwerte als nicht gleich
Zu diesem Zweck steht im oben gezeigten Dialogfeld neben einigen Feldern ein Kontrollkästchen NULL gleich zur Verfügung. Ob Sie dieses Kontrollkästchen aktivieren oder nicht aktivieren, kann sich auf das Mapping-Ergebnis auswirken und ist Thema dieses Kapitels. Beachten Sie, dass das Kontrollkästchen nur für nullfähige Felder und nur, wenn mindestens eine Tabellenaktion die Bedingung "gleich" oder "gleich (Groß/klein ignorieren)" aufweist.
Um unerwünschte Ergebnisse zu vermeiden, sollten Sie das Kontrollkästchen NULL gleich aktivieren, wenn alle der folgenden Bedingungen zutreffen:
1.Das Dialogfeld "Datenbankaktionen" enthält "Ignorieren, wenn", "Aktualisieren, wenn", "Löschen, wenn"-Aktionen und
2.Diese Aktionen werden an Datensätzen ausgeführt, die Nullwerte enthalten können und
3.Nullwerte in der Quellkomponente müssen in Ihrem Mapping als gleich Nullwerten in der Zielkomponente behandelt werden.
Standardmäßig ist das Kontrollkästchen NULL gleich deaktiviert. Wenn die obigen Bedingungen zutreffen und das Kontrollkästchen deaktiviert ist, wird die Datenbankzieltabelle eventuell nicht, wie erwartet, aktualisiert (z.B. werden mehr Zeilen eingefügt als nötig). Der Grund dafür ist, dass sich Nullwerte auf den Datenvergleich auswirken. Angenommen ein Datensatz in der Abbildung oben hat sowohl in der Datenquelle als auch im Datenziel eine null email. Wenn Sie das Kontrollkästchen NULL gleich aktivieren, erfüllt der Datensatz die Bedingung Ignorieren, wenn... und wird ignoriert (übersprungen). Wenn Sie das Kontrollkästchen NULL gleich aber nicht aktivieren, erfüllt der Datensatz die Bedingung Ignorieren, wenn... nicht mehr und wird in die Datenbank eingefügt.
Beispiel
Um die Nullfähigkeit in Mappings besser zu verstehen, werfen wir einen Blick auf ein Beispiel, in dem Nulldaten verglichen werden. In diesem Beispiel wird eine Microsoft SQL Server-Datenbank verwendet; es gilt jedoch auch für jeden anderen unterstützten Datenbanktyp. Wenn Sie Microsoft SQL Server installiert haben, haben Sie auch die Möglichkeit, die in diesem Beispiel verwendeten Tabellen und Daten durch Ausführung des folgenden Datenbankskripts zu erstellen: <Dokumente>\Altova\MapForce2023\MapForceExamples\CreateNullableFields.sql.
Unten sind die verwendeten Datenbanktabellen abgebildet. In beiden Tabellen sind Personendaten gespeichert. Beide Tabellen haben die gleichen Spalten. Außerdem kann die Spalte email in beiden Tabellen Nullwerte (also keine Daten) enthalten.
+----+-----------+-----------+--------------------------+ | id | firstname | lastname | email | +----+-----------+-----------+--------------------------+ | 1 | Toby | Hughey | t.hughey@nanonull.com | | 2 | Mia | Dahill | NULL | | 3 | Fred | Weinstein | f.weinstein@nanonull.com | +----+-----------+-----------+--------------------------+ |
Die Quelltabelle SOURCE
+----+-----------+-----------+--------------------------+ | id | firstname | lastname | email | +----+-----------+-----------+--------------------------+ | 1 | Mia | Dahill | NULL | | 2 | Fred | Weinstein | f.weinstein@nanonull.com | +----+-----------+-----------+--------------------------+ |
Die Zieltabelle TARGET
Angenommen Sie möchten Daten aus der Tabelle SOURCE in der Tabelle TARGET zusammenführen. Nur die neuen Datensätze (in diesem Beispiel "Tobie Hughey") dürfen in die Tabelle TARGET eingefügt werden. Datensätze, die in beiden Tabellen vorhanden sind ("Mia Dahill" und "Fred Weinstein") müssen ignoriert werden.
Gehen Sie dazu folgendermaßen vor:
1.Wählen Sie im Menü Einfügen den Befehl Datenbank. Befolgen Sie die Anweisungen des Assistenten, um die Datenbankverbindung herzustellen (siehe auch Herstellen einer Verbindung zu einer Datenbank). Wenn Sie aufgefordert werden, Datenbankobjekte hinzuzufügen, wählen Sie die Tabelle SOURCE aus.
2.Wählen Sie im Menü Einfügen den Befehl Datenbank. Stellen Sie erneut eine Verbindung zur Datenbank her und fügen Sie die Tabelle TARGET zum Mapping hinzu.
3.Ziehen Sie die Mapping-Verbindungen zwischen der Quell- und der Zielkomponente.

4.Klicken Sie auf die Schaltfläche Aktion:Einfügen und konfigurieren Sie die Datenbankaktionen wie folgt:

Wie in der Abbildung gezeigt, ist eine Kombination aus "Ignorieren, wenn.. Rest einfügen"-Aktionen definiert. Dies bedeutet, dass im Mapping für jeden Datensatz überprüft wird, ob:
•firstname in der Quellkomponente gleich firstname in der Zielkomponente ist UND
•lastname in der Quellkomponente gleich lastname in der Zielkomponente ist UND
•email in der Quellkomponente gleich email in der Zielkomponente ist.
Wenn alle oben definierten Bedingungen zutreffen, so wird der Datensatz (wie erforderlich) ignoriert. Andernfalls wird ein neuer Datensatz in die Zieltabelle eingefügt. Die id des neuen Datensatzes wird von der Datenbank generiert, während die anderen Felder (firstname, lastname, email) mit den aus der Quellkomponente gemappten Werten befüllt werden.
Beachten Sie, dass das Kontrollkästchen neben email dazu dient, den NULL-fähigen Vergleich für dieses Feld zu aktivieren bzw. zu deaktivieren. Dieses Kontrollkästchen muss aktiviert sein, da email Nullwerte enthalten kann ("Mia Dahill" hat eine Null-E-Mail-Adresse). Um zu sehen, wie sich dieses Kontrollkästchen auf das Ergebnis auswirkt, versuchen Sie, die Datenbank zwei Mal zu aktualisieren: das erste Mal bei aktiviertem Kontrollkästchen und ein zweites Mal bei deaktiviertem Kontrollkästchen.
Um die Datenbank zu aktualisieren, klicken Sie auf das Fenster Ausgabe und führen Sie den Menübefehl Ausgabe | SQL-Script ausführen aus.
Wenn das Kontrollkästchen aktiviert ist, wurde MapForce explizit darüber informiert, dass die Nullwerte als identisch zu behandeln sind. Daher wird der Datensatz "Mia Dahill", wie gewünscht, nicht in die Zieltabelle eingefügt.
Wenn das Kontrollkästchen nicht aktiviert ist, wird der Datensatz "Mia Dahill" in die Zieltabelle eingefügt (obwohl er dort bereits vorhanden ist), was nicht das beabsichtigte Ergebnis ist. Der Grund dafür ist, dass keine explizite Angabe darüber gemacht wurde, dass Nullwerte als gleich zu behandeln sind. Eine ähnliche Situation würde auftreten, wenn Sie die folgende Abfrage an der Datenbank ausführen würden (mit dieser Abfrage werden keine Datensätze abgerufen, da der Nullwerte mit dem "=" Operator verglichen wird, daher ist sie nicht NULL-fähig):
SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email = NULL; |
Damit NULL-Werte berücksichtigt werden, müsste die Abfrage folgendermaßen lauten:
SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email IS NULL; |
Anmerkung: | Die oben gezeigten Abfragen dienen nur als Beispiel und zeigen nicht die tatsächliche Syntax von internen, von MapForce generierten Abfragen. MapForce passt die Syntax der generierten Abfragen an den Datenbanktyp an (da verschiedene Datenbankanbieter unterschiedliche Methoden zur Behandlung von Null-Vergleichen verwenden). |