Altova MapForce 2023 Professional Edition

Lorsqu'un mappage met à jour une base de données cible par le biais d'actions de table comme "Ignorer si", "Mettre à jour si", "Supprimer si", MapForce compare les données de source par rapport aux données cible et, en résultat, génère des requêtes de mise à jour de base de données internes. Ces requêtes internes sont disponibles à la consultation dans le volet Sortie de MapForce, voir Exécuter des mappages qui modifient des bases de données. Les requêtes générées reflètent les conditions de comparaison qui ont été définies depuis le dialogue "Actions de table de base de données"

mf_dbnull_enabling

Dialogue Actions de table de base de données

Si vos données de source ou de cible contiennent des champs nullables, vous disposez de deux options pour comparer les valeurs null depuis la source avec celles dans les données de cible :

 

1.traiter les valeurs null en tant qu'égal

2.traiter les valeurs null pas comme égal

 

Pour ce faire, le dialogue affiche une case à cocher NULL equal à côté de certains champs. Le résultat de mappage change si vous cochez cette case à cocher ou pas, cette option sera discutée dans cette rubrique. Veuillez noter que la case à cocher peut uniquement être sélectionnée pour les champs qui sont nullables, et si au moins une action de table possède une condition "equal" ou "equal (ignorer casse)".

 

Pour éviter tout résultat indésirable, vous devriez cocher la case NULL equal si toutes les conditions suivantes sont vraies :

 

1.Le dialogue "Actions de table de base de données" contient les actions "Ignorer si", "Mettre à jour si", "Supprimer si", et

2.si ces actions sont prises par rapport à des enregistrements qui peuvent contenir des valeurs null et

3.si votre mappage exige que des valeurs null dans la source doivent être traitées en tant qu'égal avec des valeurs null dans la cible.

 

Par défaut, la case à cocher NULL equal n'est pas cochée. Si les conditions ci-dessus sont vraies et que la case à cocher n'est pas cochée, la table de base de données cible peut ne pas être mise à jour comme prévu (par exemple, plus de lignes seraient insérées que nécessaire). Cela se produit parce que des valeurs null touchent la comparaison de données. Par exemple, supposons que dans l'image ci-dessus, un enregistrement a un email null aussi bien dans la source que dans la cible. Si vous cochez la case NULL equal, cet enregistrement satisfera la condition Ignorer si... et sera ignoré (sauté). Néanmoins, si vous ne cochez pas la case à cocher NULL equal, l'enregistrement ne satisfera plus la condition Ignorer si... et sera insérée dans la base de données.

 

 

Exemple

Afin de mieux comprendre la sensibilité null dans les mappages, analysons un exemple dans lequel se produit une comparaison de données null. Cet exemple prend une base de données Microsoft SQL Server ; néanmoins, il s'applique aussi à tout autre type de base de données. En option, si vous disposez d'un Microsoft SQL Server, vous pouvez créer les tables et les données utilisées dans cet exemple en exécutant le script de base de données suivant : <Documents>\Altova\MapForce2023\MapForceExamples\Tutorial\CreateNullableFields.sql.

 

Les tables de base de données sont affichées ci-dessous. Les deux tables stockent les données des personnes et ont les mêmes colonnes. De même la colonne email peut contenir des données null dans les deux tables.

 

+----+-----------+-----------+--------------------------+

| id | firstname | lastname  | email                    |

+----+-----------+-----------+--------------------------+

| 1  | Toby      | Hughey    | t.hughey@nanonull.com    |

| 2  | Mia       | Dahill    | NULL                     |

| 3  | Fred      | Weinstein | f.weinstein@nanonull.com |

+----+-----------+-----------+--------------------------+

La table SOURCE

 

+----+-----------+-----------+--------------------------+

| id | firstname | lastname  | email                    |

+----+-----------+-----------+--------------------------+

| 1  | Mia       | Dahill    | NULL                     |

| 2  | Fred      | Weinstein | f.weinstein@nanonull.com |

+----+-----------+-----------+--------------------------+

La table TARGET

Supposons que votre tâche n'est plus de fusionner des données depuis la table SOURCE dans la table TARGET. Seuls les nouveaux enregistrements doivent être insérés dans la table TARGET (dans cet exemple, "Tobie Hughey"). Les enregistrements qui existent dans les deux tables ("Mia Dahill" et "Fred Weinstein") doivent être ignorés.

 

La tâche peut être accomplie comme suit.

 

1.Dans le menu Insertion, choisir Base de données. Suivre les étapes de l'assistant pour se connecter à la base de données (voir aussi Connexion à une base de données). Lorsque vous serez invité à ajouter des objets de base de données, choisir la table SOURCE.

2.Dans le menu Insertion, choisir Base de données. Se connecter à nouveau à la base de données et ajouter la table TARGET au mappage.

3.Tirer les connexions de mappage entre les composants de source et de cible.

mf_dbnull_example1

4.Cliquer sur la touche Action:Insérer tbl-act-icon et configurer les actions de table de base de données comme suit :

mf_dbnull_example2

Comme illustré ci-dessus, une combinaison des actions "Ignorer si.. Insérer Rest" est définie. Cette configuration signifie que, pour chaque enregistrement, le mappage vérifie si :

 

firstname dans la source est égal à firstname dans la cible, ET

lastname dans la source est égal à lastname dans la cible, ET

email dans la source est égal à email dans la cible.

 

Si toutes les conditions ci-dessus sont vraies, l'enregistrement est ignoré (conformément aux exigences). Sinon, un nouvel enregistrement est inséré dans la table cible. L'id du nouvel enregistrement est généré par la base de données, alors que les autres champs (firstname, lastname, email) sont remplis avec des valeurs mappées depuis la source.

 

Attention: la case à cocher située à côté d'email active ou désactive la comparaison sensible à NULL pour ce champ. Il est nécessaire de choisir cette case à cocher parce que email peut contenir des valeurs null (concrètement, "Mia Dahill" a une adresse e-mail null). Pour voir le rôle joué par cette case à cocher, essayez de mettre à jour la base de données deux fois : la première fois en cochant la case et une deuxième fois en décochant la case.

 

Pour mettre à jour la base de données, cliquer sur l'onglet Sortie et exécuter la commande de menu Sortie | Exécuter script SQL.

 

Si la case à cocher est sélectionnée, MapForce est soumis à l'indication explicite que vous devez traiter les valeurs null en tant qu'égaux. C'est pourquoi, l'enregistrement "Mia Dahill" n'est pas inséré dans la table de cible, ce qui est le résultat escompté.

 

Si la case à cocher n'est pas sélectionnée, l'enregistrement "Mia Dahill" est inséré dans la table cible (malgré le fait qu'il existe déjà), ce qui n'est pas le résultat attendu. La raison est qu'aucune indication explicite n'a été donnée à MapForce que vous souhaitez traiter les valeurs null en tant qu'égales. Une condition semblable se produirait si vous exécutiez la requête suivante par rapport à la base de données (cette requête n'extrait aucun enregistrement parce que la valeur null est comparée à l'opérateur "=" de manière à ce qu'il ne soit pas sensible à NULL):

 

SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email = NULL;

 

Pour qu'elle soit sensible à NULL, la requête ci-dessus doit être réécrite comme suit :

 

SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email IS NULL;

 

Note :Les requêtes ci-dessus ont un but purement illustratif et ne reflètent pas la syntaxe réelle des requêtes internes générées par MapForce. MapForce adapte la syntaxe des requêtes générées conformément au type de base de données (puisque plusieurs fournisseurs de base de données on des approches différentes pour gérer des comparaisons de type null).

© 2017-2023 Altova GmbH