Contexto en funciones definidas por el usuario
Las funciones definidas por el usuario son funciones personalizadas incrustadas en la asignación, donde se definen los componentes de entrada y de salida, así como la lógica de procesamiento. Cada función definida por el usuario puede contener los mismos tipos de componentes que una asignación principal, incluidos servicios web y bases de datos.
Por defecto, si una función definida por el usuario contiene una BD o un componente de servicio web y si los datos de entrada a esa función son una secuencia de varios valores, entonces cada valor de entrada llamará a la función, lo que resultará en una llamada a la BD o al servicio web. |
Este comportamiento puede ser aceptable para asignaciones en las que realmente necesita que se llame a la función definida por el usuario tantas veces como valores de entrada haya, para las que no existe otra alternativa.
Si no quiere que ocurra eso, puede configurar la función definida por el usuario para que solo se la llame una vez, incluso aunque el componente de entrada sea una secuencia de valores. Tiene sentido usar esta opción en el caso de aquellas funciones definidas por el usuario que operan en un conjunto de valores antes de devolver un resultado (como las funciones que calculan valores medios o totales).
Se pueden configurar funciones definidas por el usuario para que acepten varios valores de entrada en la misma llamada a la función si esta es de tipo "regular" y no "inline". (Para más detalles, consulte Funciones definidas por el usuario). Para indicar en funciones regulares que el parámetro de entrada es una secuencia marque la casilla El parámetro de entrada es una secuencia. Esta casilla se hace visible en la configuración del componente después de hacer doble clic en la barra de título de un parámetro de entrada. La casilla afecta la cantidad de llamadas que se hacen a la función:
•Cuando los datos de entrada están conectados al parámetro sequence se llama solo una vez a la función definida por el usuario y se le pasa la secuencia completa.
•Cuando los datos de entrada están conectados a un parámetro non-sequence, se llama a la función definida por el usuario una vez por cada elemento de la secuencia.
Para ver un ejemplo abra esta asignación: <Documentos>\Altova\MapForce2025\MapForceExamples\InputIsSequence.mfd.
La asignación anterior ilustra un caso típico de una función definida por el usuario que opera en un conjunto de valores y, por tanto, necesita todos los valores de entrada en una sola llamada. Más concretamente, la función definida por el usuario Calculate devuelve las temperaturas mínima, máxima y media, y toma sus datos de entrada de un archivo XML de origen. El resultado esperado de esta asignación es:
<Temperatures> |
Como es habitual, la ejecución de la asignación empieza por el primer elemento del componente de destino (YearlyStats en este ejemplo). Para rellenar este nodo, la asignación intenta obtener datos de entrada de la función definida por el usuario, lo que a su vez desencadena el filtro. El papel del filtro en esta asignación es pasar a la función definida por el usuario solamente temperaturas del año 2008.
La casilla El parámetro de entrada es una secuencia se marcó para el parámetro de entrada de la función definida por el usuario (para ver esta casilla, haga clic en la barra del título de la función Calculate para introducir la asignación de la función y después haga doble clic en la barra del título del parámetro de entrada). Como hemos mencionado antes, marcar la casilla El parámetro de entrada es una secuencia hace que se suministre la secuencia completa de valores como parámetro de entrada de la función y que se llame a la función una sola vez.
Si la casilla El parámetro de entrada es una secuencia no se hubiera marcado, se habría llamado a la función definida por el usuario una vez por cada valor en el componente de origen. Como resultado, se habría calculado el valor máximo, mínimo y medio para cada valor individualmente y se habría producido un resultado incorrecto.
Al aplicar la misma lógica en funciones definidas por el usuario más complejas que incluyen llamadas a BD o a servicios web, es posible optimizar la ejecución y evitar llamadas innecesarias a la BD o al servicio web. Sin embargo, tenga en cuenta que la casilla El parámetro de entrada es una secuencia no controla qué le ocurre a la secuencia de valores después de que entre en la función. En otras palabras, nada le impide conectar la secuencia de valores de entrada al componente de entrada de un servicio web y llamarlo varias veces. Aquí puede ver un ejemplo:
La función definida por el usuario de la imagen anterior recibe una secuencia de valores de la asignación externa. Más concretamente, los datos suministrados al parámetro de origen provienen de una BD. Se ha marcado la casilla El parámetro de entrada es una secuencia para el parámetro de origen, por lo que se suministra a la función toda la secuencia en una sola llamada. La función debe sumar varios valores quantity y enviar el resultado en un servicio web. Se espera exactamente una llamada al servicio web. Sin embargo, cuando se ejecute la asignación se harán varias llamadas al servicio web. El motivo es que el componente de entrada Request del servicio web recibe una secuencia de valores y no un único valor.
Para solucionar este problema, conecte el componente de entrada Request del servicio web al resultado de la función sum. La función produce un solo valor, por lo que también se llama al servicio web una sola vez:
Normalmente, las funciones agregadas como sum, count, etc. producen un único valor. Sin embargo, si hay una conexión de nivel superior que lo permita, puede que también produzcan una secuencia de valores, como se describe en más detalle en el Ejemplo: cambiar el contexto primario. |