Gestionar valores null en acciones de tabla de BD
Cuando una asignación actualiza una BD de destino con acciones de tabla como Omitir si..., Actualizar si... o Eliminar si..., MapForce compara los datos de origen con los de destino y genera consultas internas de actualización de BD como resultado. Estas consultas internas se pueden previsualizar en el panel Resultados de MapForce, véase Ejecutar asignaciones que modifican BD. Las consultas generadas reflejan las condiciones de comparación que se definieron en el cuadro de diálogo "Acciones de tabla de BD".
Cuadro de diálogo Acciones de tabla de BD
Si los datos de origen o de destino contienen campos que aceptan valores null, tiene dos opciones para comparar los valores null de los datos de origen con los de destino:
1.tratar los valores null como iguales
2.tratar los valores null como no iguales
En el cuadro de diálogo anterior aparece una casilla Null equal junto a algunos de los campos. El que marque o no esta casilla puede afectar al resultado de la asignación. Tenga en cuenta que solo se puede marcar la casilla en los campos que admiten valores null y si al menos una acción de la tabla tiene una condición "es igual" o "es igual (omitir may/min)".
Para evitar obtener resultados no deseados debe marcar la casilla Null equal si se cumplen todas estas condiciones:
1.El cuadro de diálogo "Acciones de tabla de BD" contiene acciones Omitir si, Actualizar si o Eliminar si, y
2.Estas acciones se van a ejecutar en registros que puede que contengan valores null y
3.Los valores null de la tabla de origen se deben tratar como iguales a los de la tabla de destino.
La configuración predeterminada es no tener en cuenta los valores null. Si se cumplen los requisitos antes mencionados y no está habilitada la opción de tener en cuenta los valores null, puede haber casos en los que la tabla de BD no se actualice correctamente (por ejemplo, se insertan o actualizan más filas de las necesarias). Esto ocurre porque los valores null afectan a la comparación de datos y podrían interferir con los resultados. Por ejemplo, en la imagen anterior, imaginemos que un registro tiene un valor null en el campo email tanto en los datos de origen como en los de destino. Si marca la casilla Null equal ese registro cumplirá la condición de la acción Omitir si... y no se tendrá en cuenta. Sin embargo, si no marca la casilla Null equal el registro ya no cumplirá esa condición y se insertará en la BD.
Ejemplo
Para entender mejor la gestión de los valores null en asignaciones de datos vamos a analizar un ejemplo en el que encontraremos comparaciones de valores null. En este ejemplo usamos una BD de Microsoft SQL Server, pero se podría aplicar a cualquier otro tipo de base de datos compatible. O, si tiene Microsoft SQL Server, puede crear las tablas y los datos de este ejemplo ejecutando el siguiente script de BD: <Documentos>\Altova\MapForce2023\MapForceExamples\Tutorial\CreateNullableFields.sql.
Por comodidad reproducimos a continuación las tablas de la BD. Ambas tablas contienen datos de personas y tienen las mismas columnas. Además, la columna email puede contener valores null en ambas tablas.
+----+-----------+-----------+--------------------------+ | id | firstname | lastname | email | +----+-----------+-----------+--------------------------+ | 1 | Toby | Hughey | t.hughey@nanonull.com | | 2 | Mia | Dahill | NULL | | 3 | Fred | Weinstein | f.weinstein@nanonull.com | +----+-----------+-----------+--------------------------+ |
La tabla SOURCE
+----+-----------+-----------+--------------------------+ | id | firstname | lastname | email | +----+-----------+-----------+--------------------------+ | 1 | Mia | Dahill | NULL | | 2 | Fred | Weinstein | f.weinstein@nanonull.com | +----+-----------+-----------+--------------------------+ |
La tabla TARGET
Imaginemos que quiere combinar datos de la tabla SOURCE con la tabla TARGET. En la tabla TARGET se insertan únicamente los registros nuevos (en este ejmplo "Tobie Hughey"). Los registros que existen en las dos tablas ("Mia Dahill" y "Fred Weinstein") se ignoran.
Para llevar a cabo esta tarea seguiremos los pasos que se describen a continuación:
1.En el menú Insertar, seleccione Base de datos. Siga las instrucciones del asistente para conectarse a la base de datos (véase también Conectarse a una base de datos). Cuando deba añadir objetos de BD, seleccione la tabla SOURCE.
2.En el menú Insertar, seleccione Base de datos. Vuelva a conectarse a la BD y añada la tabla TARGET a la asignación.
3.Dibuje las conexiones de la asignación entre los componentes de origen y de destino.
4.Haga clic en el botón Acción: Insertar y configure las acciones de la tabla de BD como sigue:
La configuración combina las acciones Omitir si e Insertar restantes, lo que significa que por cada registro la asignación comprueba si:
•firstname es en el origen igual que firstname en destino, y
•lastname es en el origen igual que lastname en destino, y
•email es en el origen igual que email en el destino.
Si se cumplen todas estas condiciones, se ignora el registro. De lo contrario se inserta un nuevo registro en la tabla de destino. El id del nuevo registro lo genera la BD, mientras que el resto de campos (firstname, lastname, email) se rellenan con valores asignados desde el origen.
La casilla junto al campo email habilita o deshabilita la función de comparar teniendo en cuenta los valores null para este campo. En este ejemplo debemos marcar esta casilla porque el campo email puede contener valores null (concretamente, "Mia Dahill" tiene una dirección de correo electrónico null). Para ver cómo afecta a la comparación esta casilla, pruebe a actualizar la base de datos dos veces: en la primera, marque la casilla pero en la segunda no.
Para actualizar la base de datos, haga clic en la pestaña Resultados y ejecute el comando de menú Resultados | Ejecutar script SQL.
Si la casilla está marcada estamos indicando a MapForce explícitamente que trate los valores null como iguales. Por lo tanto, el registro "Mia Dahill" no se inserta en la tabla de destino, que es lo que buscamos.
Si la casilla no está marcada, el registro "Mia Dahill" se inserta en la tabla de destino (a pesar de que ya existe), que no es lo que pretendemos. Esto ocurre porque no le hemos dado a MapForce una indicación explícita de que queremos que trate los valores null como iguales. Ocurre algo parecido si ejecutamos la siguiente consulta en la base de datos (esta consulta no obtiene registros porque el valor null se compara con el operador "=", por lo que no tiene en cuenta los valores null).
SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email = NULL; |
Para que tenga en cuenta los valores null, deberíamos reescribir la consulta anterior así:
SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email IS NULL; |
Nota: | las consultas anteriores tienen propósitos únicamente ilustrativos y no reflejan la sintaxis real de las consultas internas que genera MapForce. MapForce adapta la sintaxis de las consultas que genera según el tipo de base de datos (ya que cada proveedor de bases de datos enfoca la comparación de valores null de forma distinta). |