Reglas y estrategias de asignación de datos

www.altova.com Imprimir este apartado Página anterior Subir un nivel Página siguiente

Inicio >  Diseño de asignaciones >

Reglas y estrategias de asignación de datos

Por lo general MapForce crea asignaciones de datos de forma intuitiva pero en algunas ocasiones puede que los resultados tengan demasiados elementos o muy pocos. En este tema ofrecemos consejos para evitar este tipo de problemas.

 

Regla general

Por lo general, cada conexión entre un elemento de origen y uno de destino significa que, por cada elemento de origen, se creará un elemento de destino. Si el nodo de origen incluye contenido simple (p. ej. una cadena o un entero) y el nodo de destino acepta contenido simple, MapForce copia el contenido en el nodo de destino y, si hace falta, convierte el tipo de datos.

 

Esta es la regla general para todas las conexiones excepto en estos casos:

 

El elemento raíz XML de destino se crea una sola vez. Si conecta una secuencia con el elemento raíz XML de destino, solo se repetirá el contenido del elemento pero no el elemento raíz propiamente dicho y puede que el resultado no sea válido según el esquema. Si también se conectan los atributos del elemento raíz, la serialización XML fallará en tiempo de ejecución, así que debe evitarse conectar una secuencia con el elemento raíz. Si lo que desea es crear varios archivos de salida, conecte la secuencia con el nodo Archivo, por medio de algún tipo de función que genere nombres de archivo.
Algunos nodos aceptan un solo valor y no una secuencia (p. ej. los atributos XML y los componentes de destino de las funciones definidas por el usuario.

 

Los elementos "context" y "current"

MapForce muestra la estructura de un archivo de esquema en el componente como una jerarquía con elementos que se pueden asignar. Cada uno de estos nodos puede tener varias instancias (o ninguna) en el archivo de instancia o de la base de datos.

 

Ejemplo: en el componente de origen de la asignación PersonListByBranchOffice.mfd solo hay un nodo first (dentro de Contact). En el archivo de instancia BranchOffices.xml, hay varios nodos first y Contact con contenido distinto (dentro de los nodos primarios Office).

 

Dependiendo de cuál sea el nodo de contexto actual (del nodo de destino), se seleccionarán unos nodos de origen u otros y sus datos se copiarán, por medio del conector, en el componente/elemento de destino.

mfeg-personListBranchOff

PersonListByBranchOffice.mfd

Este contexto viene definido por el nodo de destino actual y por las conexiones con sus antecesores:

 

Al principio el contexto solo contiene los componentes de origen, pero ningún nodo concreto. Cuando evalúa la asignación MapForce procesa primero el nodo raíz de destino (PersonList) y después sigue recorriendo la jerarquía.
El conector que está unido al nodo de destino se sigue hasta todos los elementos de origen a los que está conectado (directa o indirectamente, incluso a través de funciones). Los elementos de origen y los resultados de las funciones se añaden al contexto para este nodo.
Por cada nodo de destino nuevo se establece un contexto nuevo, que inicialmente contiene todos los elementos del contexto del nodo primario. Los nodos de destino del mismo nivel, por tanto, son independientes entre sí pero tienen acceso a todos los datos de origen de sus nodos primarios.

 

Por ejemplo, en el caso de la asignación (PersonListByBranchOffice.mfd):

 

La conexión que une a Office con PersonList a través del filtro (Office) define una sola oficina como contexto para todo el documento de destino (porque PersonList es el elemento raíz del componente de destino). El nombre de la oficina viene dado por el componente de entrada, que tiene el valor predeterminado "Nanonull, Inc."
Todos los datos/todas las conexiones de los descendientes del elemento raíz PersonList se ven afectados automáticamente por la condición de filtrado porque la oficina seleccionada está en el contexto.
La conexión que une a Contact con Person crea un Person de destino por cada elemento Contact del XML de origen (la regla general se aplica). Por cada Person se añade un Contact concreto al contexto, a partir del cual se crearán los secundarios de Person.
El conector que une a first con First selecciona el nombre del Contact actual y lo escribe en el elemento First de destino.

 

Si se obvia el conector que une Contact con Person, se crearía solo un Person con varios nodos First, Last y Detail, pero eso no es lo que queremos en este caso. Así que cuando eso ocurre MapForce emite una advertencia y una sugerencia para solucionar el problema: "Puede intentar conectar Contact con Person para resolverlo.":

mfeg-personListBranchOff-Msg

 

Secuencias

MapForce muestra la estructura de un archivo de esquema en el componente como una jerarquía de elementos que se pueden asignar.

 

Dependiendo de cuál sea el contexto (de destino), cada elemento asignable de un componente de origen puede representar:

 

un solo nodo de instancia del archivo de entrada asignado
una secuencia de cero a varios nodos de instancia del archivo de entrada

 

Si hay una secuencia conectada a un nodo de destino, se crea un bucle para crear tantos nodos de destino como nodos de origen existan.

 

Si se coloca un filtro entre la secuencia y el nodo de destino, se verifica la condición binaria por cada nodo de entrada (es decir, por cada elemento de la secuencia). Más concretamente se comprueba si en cada secuencia hay como mínimo un booleano que dé true como resultado. La configuración de contexto prioritario puede influir en el orden de evaluación (ver más abajo).

 

Como se dijo anteriormente, las condiciones de filtrado afectan automáticamente a todos los nodos descendientes.

 

Nota:si el esquema de origen especifica que determinado nodo aparece una sola vez, MapForce puede eliminar el bucle y tomar solo el primer elemento, que sabe que existe. Esta optimización se puede deshabilitar en el cuadro de diálogo "Configuración del componente" (casilla Optimización de procesamiento de datos de entrada basada en min/maxOccurs").

 

Las entradas de las funciones (normales, no secuenciales) funcionan de forma similar: si una secuencia está conectada a una entrada de función, se crea un bucle alrededor de la llamada a función para que produzca tantos resultados como elementos hay en la secuencia.

 

Si una secuencia está conectada a más de una entrada de función, MapForce crea bucles anidados que procesarán el producto cartesiano de todas las entradas. Esto no suele ser lo más indicado, así que no conecte más de una secuencia formada por varios elementos a una función.

 

Nota:si hay una secuencia vacía conectada a una función (p. ej. concat), recibirá como resultado una secuencia vacía, que no producirá ningún nodo de destino. Si no hay resultados en los documentos de salida porque no hay datos de entrada, puede usar la función substitute-missing para insertar valores sustitutos.

 

Las funciones con entradas secuenciales son las únicas funciones que pueden producir un resultado si la secuencia de entrada está vacía:

 

exists, not-exists y substitute-missing (también, is-not-null, is-null y substitute-null, que son los alias para las tres primeras)
funciones de agregado (sum, count, etc.)
funciones definidas por el usuario que acepten secuencias (es decir, funciones no insertadas).

 

La entrada secuencia de dichas funciones siempre se evalúa independientemente del nodo de destino actual en el contexto de sus antecesores. Esto también significa que cualquier componente de filtrado que esté conectado a dichas funciones no tendrán efecto alguno en las demás conexiones.

 

Contexto prioritario

Por lo general los parámetros de función se evalúan de arriba a abajo, pero también se puede definir que un parámetro se evalúe antes que los demás. Esto se hace estableciendo un contexto prioritario.

 

En las funciones que están conectadas a la entrada bool de condiciones de filtrado, el contexto prioritario no solo afecta a la función de comparación sino a la evaluación del filtro, así que se pueden unir dos secuencias de origen (véase CompletePO.mfd: CustomerNo y Number).

context-switch-prof

En este ejemplo, el contexto prioritario fuerza a evaluar ShortPO/CustomerNr antes de recorrer y de filtrar los nodos de Customer del componente Customers. Consulte el apartado Nodo de contexto prioritario para obtener más información.

 

Reemplazar el contexto

Algunas funciones de agregado tienen una entrada opcional llamada “parent-context”. Si esta entrada se deja sin conectar, no tiene efecto alguno y la función se evalúa en el contexto normal de para entradas secuencias (es decir, en el contexto del primario del nodo de destino).

agg-func2

Si por el contrario se conecta la entrada parent-context a un nodo de origen, la función se evalúa por cada nodo parent-context y producirá un resultado distinto por cada instancia. Consulte el apartado Reemplazar el contexto de la asignación para obtener más información.

 

Traer varios nodos del mismo componente de origen al contexto

Esto puede ser necesario en algunos casos y se puede hacer con ayuda de variables intermedias.

 


© 2019 Altova GmbH