Programando en Infopath

Hasta ahora solo hemos visto de Infopath ha sido desde el diseñador, toca mojarse un poquito con el código. ¿Podemos escribir código en un formulario Infopath para que actúe de acuerdo a una lógica de negocio?, pues sí, para éllo Infopath utiliza las VSTA (Microsoft Visual Studio Tools for Applications). Con VSTA podremos programar en Visual Basic .NET o c# de forma integrada con el formulario que estemos diseñando. Todo lo que desarrollemos generará una dll que irá incrustada en nuestra plantilla xsn. Si utilizamos Infopath Forms Services al subir nuestra plantilla a Sharepoint se desplegará automáticamente una solución wsp de sharepoint con todos los elementos de nuestro formulario y lo mejor de todo es que además deplegará la dll necesaria para ejecutar nuestro código.

Empezando con las VSTA

Lo primero que necesitamos son las VSTA, aunque tengamos instalado Visual Studio las vamos a tener que instalar, si no lo hacemos nos encontraremos un mensaje de error del tipo: “Infopath no puede iniciar Microsoft Visual Studio Tools para aplicaciones”

VSTA1

Para instalarlo necesitaremos tener el Framework 2.0 y habilitar el paquete desde el setup de nuestro infopath u office seleccionando el elemento “Infopath > Compatibilidad con programación .net > Compatibilidad con programación .net para .net framework versión 2.0 > Visual Studio Tools para aplicaciones.

VSTA2

 

Una vez instalado antes de empezar a tirar líneas debemos pensar donde vamos a alojar el código generado. Desde herramientas > opciones del formulario > programación encontraremos una ventana con las opciones disponibles, en nuestro caso elegiremos el lenguaje .net en el que generaremos el proyecto y el path físico donde se alojará el proyecto de las VSTA.

Este paso es importante ya que por defecto viene en visual basic y en la carpeta “Mis documentos”. Además cuando publiquemos la plantilla se incrustará la dll ya compilada pero no el código del proyecto, por lo que si copiamos a otro equipo solo el xsn no estaremos copiando los fuentes pudiendo llegar a perderlos.

Manejar eventos en infopath

Aunque podemos definir reglas y condiciones desde el diseñador (“no se por qué”) siempre hay alguna condición que debemos escribir mediante código. Usaremos el manejo de eventos de infopath para validar las entradas del formulario.

Continuando con el anterior ejemplo [Infopath] Control de selección de usuario, incluiremos por ejemplo una validación en la caja de importes para controlar que no se introduzcan importes superiores a 1000€. Seleccionando con el botón derecho la caja Programación > Evento Validating

Al seleccionarlo se abrirá una ventana de visual studio con el siguiente aspecto:

image

Lo primero que debemos saber es que no un Visual Studio normal, si vamos a la ayuda y vemos la versión veremos que es un Visual studio 2005 especial.

Otra cosa a destacar es que en la ventana de exploración no disponemos de un elemento solución solo disponemos del proyecto dll con las referencias a las VSTA y a infopath. Si luego buscamos en el path indicado para los fuentes veremos que realmente hay un fichero .sln que nos será muy útil.

También destacamos el fichero .snk necesario para que la dll tenga un strongname y pueda registrarse con un publickey.

Vemos también que no disponemos de un evento “Onload” sino que disponemos del método “InternalStartup” desde el que registraremos todos los eventos que desearemos capturar en el formulario en tiempo de ejecución. Esto se debe a que nuestra clase hereda de Microsoft.Office.InfoPath.XmlFormHostItem.

Siguiendo con el ejemplo, vemos que el evento de validación generado recibe un parámetro XmlValidatingEventArgs con la referencia al elemento de nuestro origen de datos principal el cual a generado el evento. En mi caso el ejemplo quedaría:

        public void txtImporte_Validating(object sender, XmlValidatingEventArgs e)
        {
           if(!string.IsNullOrEmpty(e.NewValue))
               if (double.Parse(e.NewValue) > 1000)
               {
                   e.ReportError(e.Site, false, «El importe debe ser inferior a 1000€»);
               }
        }

Para probarlo podremos hacerlo desde la opción de ejecución de Visual Studio o desde la vista previa del diseñador del cliente Infopath.

 

Otro de los eventos que podemos controlar es el del envío de los datos al servidor al hacer Submit.

Desde el evento InternalStartup agregaremos una línea del tipo:

EventManager.FormEvents.Submit += new SubmitEventHandler(Form_Submit);

donde “Form_Submit” es el nombre de mi método para capturar el evento. En mi ejemplo voy validar que la suma de todos los importes no supere los 3000€ quedando un código similar al siguiente:

public void Form_Submit(object sender, SubmitEventArgs e)

{

    XPathNavigator navigator = MainDataSource.CreateNavigator();

    XPathNodeIterator importesSolicitados = navigator.Select(«/my:misCampos/my:grupo1/my:grupo2», this.NamespaceManager);

    double importeTotal = 0.0;

    foreach (XPathNavigator importeSolicitado in importesSolicitados)

    {

        string stImporte = importeSolicitado.GetAttribute(«txtImporte», «»);

        importeTotal += double.Parse(stImporte);

    }

    if (importeTotal > 3000.0)

    {

                e.CancelableArgs.Cancel = true;

                e.CancelableArgs.Message = «El importe total de los gastos no debe superar los 3000€»;

    }

}

 

Si quisiéramos manejar el evento de carga del formulario utilizaríamos en el InternalStartup algo similar a lo siguiente:

EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);

 

Manejar los orígenes de datos

Como vimos en el post [Infopath] Orígenes de datos disponemos de varios tipos de orígenes de datos en Infopath.

Para acceder al origen de datos principal utilizaremos la propiedad “MainDataSource”.

Para acceder a los orígenes externos utilizaremos la propiedad DataSources y accederemos a los orígenes mediante el nombre indicado en el diseñador, por ejemplo:

DataSources[“TiposDeGastos”]

Álvaro Arias nos muestra un ejemplo de como hacer un DrillDown de combos con infopath.

 

Depurar una plantilla infopath compleja

Cuando trabajemos con plantillas con orígenes externos nos será muy difícil depurar directamente desde el cliente infopath. Una alternativa consiste en abrir la solución generada por VSTA directamente desde Visual Studio en lugar desde Infopath, generar la dll en debug y sustituir el assembly, y depurarlo atacando al proceso w3wp.

El fichero sln de la solución lo encontraremos en la carpeta física establecida en la configuración de programación de la plantilla.

Para sustutir el assembly que depliega Infopath Form Services tenemos que buscar la feature instalada físicamente ya que no lo registra en el GAC. Un truco es buscar la característica de colección instalada, darle a desactivar y en la pantalla de confirmación en la url tendremos un parámetro FeatureId con el nombre de la carpeta que contiene nuestra dll a sustituir.

Publicado por

Mario Cortés

Mario Cortés Flores es MVP en Office 365, trabaja en Plain Concepts como Team Lead y escribe habitualmente en geeks.ms/blogs/mcortes y en Twitter @mariocortesf. Podréis encontrarlo colaborando activamente con la comunidad de MadPoint y SUGES

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *