Adobe Campaign permite al usuario definir sus propias funciones que pueden acceder a las funciones SQL, tanto las que ofrece la base de datos como las que no están disponibles en la consola. Esto resulta útil para las funciones de agregado (promedio, máximo, suma), por ejemplo, que solo se pueden calcular en el servidor o cuando la base de datos proporciona una manera más fácil de implementar determinadas funciones, en lugar de escribir "manualmente" la expresión en la consola (por ejemplo, gestión de fechas).
Este mecanismo también se puede utilizar si desea utilizar una función SQL de motor de base de datos reciente o poco común, que la consola de Adobe Campaign aún no ofrece.
Una vez agregadas estas funciones, aparecerán en el editor de expresiones como otras funciones predefinidas.
Las llamadas a funciones SQL en la consola ya no se envían de forma natural al servidor. Por lo tanto, el mecanismo descrito aquí se convierte en la única forma de llamar a en el servidor de funciones SQL no planificado.
Las funciones que se agregan se encuentran en una archivo "package" en formato XML, cuya estructura se detalla en el párrafo siguiente.
Para instalarlo desde la consola, seleccione la opción Paquete Herramientas/Avanzado/Importar del menú y, a continuación, la Install from file y siga las instrucciones del asistente de importación.
Advertencia: incluso si la lista de funciones importadas aparece en el editor de funciones inmediatamente, no se pueden utilizar hasta que se haya reiniciado Adobe Campaign.
Las funciones que se agregan se encuentran en la archivo "package" en formato XML. Este es un ejemplo.
<?xml version="1.0" encoding='ISO-8859-1' ?>
<!-- ===========================================================================
Additional SQL functions for Adobe Campaign
========================================================================== -->
<package
namespace = "nms"
name = "package-additional-funclist"
label = "Additional functions"
buildVersion= "6.1"
buildNumber = "10000">
<entities schema="xtk:funcList">
<funcList name="myList" namespace="cus">
<group name="date" label="Personalized date">
<function name="relativeMaturity" type="long" args="(<Âge>)" help="Returns the difference between a date and 18 years"
minArgs="1" maxArgs="1" display="Relative maturity of the person born on the date $1">
<providerPart provider="MSSQL,Sybase,PostgreSQL" body="extract(year from age($1))-18"/>
</function>
</group>
</funcList>
</entities>
</package>
La variable name, namespace y label son únicamente con fines informativos. Permiten ver un resumen del paquete en la lista de paquetes instalados (Explorer/Administration/Package management/Installed packages).
La variable buildVersion y buildNumber los campos son obligatorios. Deben corresponder al número de servidor al que está conectada la consola. Esta información se encuentra en el cuadro "Ayuda/Acerca de".
Los siguientes bloques, entities y funclista son obligatorios. En funcList, los campos "nombre" y "área de nombres" son obligatorios, pero su nombre depende del usuario para decidir y ellos designan de forma exclusiva la lista de funciones.
Esto significa que si se importa otra lista de funciones con el mismo espacio de nombres/par de nombres (aquí "cus::myList"), se eliminarán las funciones importadas anteriormente. Por el contrario, si cambia este par de área de nombres/nombre, la nueva serie de funciones importadas se agregará a la anterior.
La variable grupo element permite especificar el grupo de funciones en el que aparecerán las funciones importadas en el editor de funciones. El atributo @name puede ser un nombre que ya exista (en cuyo caso las funciones se añadirán al grupo considerado) o un nombre nuevo (en cuyo caso aparecerá en un grupo nuevo).
Recordatorio: valores posibles del atributo @name en la variable <group>
son:
name="aggregate" ( label="Aggregates" )
name="string" ( label="String" )
name="date" ( label="Date" )
name="numeric" ( label="Numeric" )
name="geomarketing" ( label="Geomarketing" )
name="other" ( label="Others" )
name="window" ( label="Windowing functions" )
Asegúrese de completar el atributo @label: este es el nombre que se mostrará en la lista de funciones disponibles. Si no introduce nada, el grupo no tendrá un nombre. Sin embargo, si introduce un nombre que no sea el existente, cambiará el nombre de todo el grupo.
Si desea agregar funciones a varios grupos diferentes, puede realizar varias <group>
los elementos se rastrean en la misma lista.
Por último, una <group>
puede contener la definición de una o varias funciones, que es el propósito del archivo del paquete. La variable <function>
se detalla en el párrafo siguiente.
El caso presentado aquí es un caso general en el que deseamos proporcionar la implementación de funciones.
A continuación se muestra un ejemplo de una función de "madurez relativa" que, utilizando una edad, indica durante cuántos años se ha considerado madura a la persona.
<function name="relativeMaturity" type="long" args="(<Âge>)" help="Returns the difference between a date and 18 years"
minArgs="1" maxArgs="1" display="Relative maturity of the person born on the date $1">
<providerPart provider="PostgreSQL" body="extract(year from age($1))-18"/>
<providerPart provider="MSSQL,Sybase,Teradata" body="[Other implementation]"/>
</function>
La variable @name field hace referencia al nombre de la función y "args" es la lista de parámetros que se mostrarán en la descripción. En este caso, la función aparecerá como "relativoVencimiento ( <age>
)" en la ventana de selección de funciones.
help es el campo mostrado en la parte inferior de la ventana del editor de expresiones.
@display es un mensaje informativo.
En los atributos @help y @display , la cadena "$1" representa el nombre que se dio en el primer parámetro de función (aquí, "Age"). $2, $3… representaría los siguientes parámetros. En el atributo @body detallado a continuación, $1 designa el valor del argumento pasado a la función durante la llamada.
La descripción debe ser una cadena de caracteres XML válidos: tenga en cuenta el uso de '<' y '>' en lugar de < y >.
@type es el tipo de devolución de función y es un valor estándar (long, string, byte, datetime…). Si se omite, el servidor determina el mejor tipo entre los tipos disponibles dentro de la expresión que implementa la función.
@minArgs y maxArgs designa el número de parámetros (mínimo y máximo) de un parámetro. Por ejemplo, para una función con 2 parámetros, minArgs y maxArgs serán 2 y 2. Para 3 parámetros, más 1 opcional, serán 3 y 4 respectivamente.
Por último, la variable providerPart proporciona la implementación de la función .
Si es probable que solo una o dos bases de datos sean consultadas por la función definida, siempre se pueden proporcionar solamente las definiciones correspondientes a estas bases de datos.
Un descriptor de función especial es "paso a través" con un sistema de base de datos "proveedor" no especificado. En este caso, la implementación "body" solo puede contener una llamada a una sola función con una sintaxis que no dependa de la base de datos utilizada. Mientras tanto, el bloque "ProviderPart" es único.
<function name="CountAll" args="()" help="Counts the values returned (all fields together)"
type="long" minArgs="0" maxArgs="0">
<providerPart body="Count(*)"/>
</function>
En este caso, la adición de una función solo sirve para hacer que una función de base de datos que no hubiera estado disponible de forma predeterminada, ahora sea visible para el cliente.
Se pueden encontrar más ejemplos de funciones en el paquete predefinido "xtkdatakitfuncList.xml".