miércoles, 3 de julio de 2013

Infopath 2010 y SharePoint 2010 Recorriendo Repeating Tables anidadas. (nested repeating tables infopath 2010)

Trabajar con Infopath es tarea de todos los días para muchos desarrolladores esta vez me encontré con un pequeño problema en el cual tenia una tabla repetida pero dentro de ella existían otras tablas repetidas que contenían información basándose en la primera, el asunto parecía sencillo de resolver, sin embargo algunos detalles de infopath dificultaban ciertos métodos para recorrer las tablas, a continuación explicare un método eficaz para recorrer una tabla repetida de infopath que contiene otras tablas anidadas.


1. Tenemos nuestras tablas en Infopath de la siguiente manera.


si se dan cuenta mi tabla principal es  "Equipo" y debajo de ella existen muchas mas, sin embargo yo necesito datos de la que se llama "Detalle_Activo".

Necesito obtener la información de los siguientes campos para armar una DataTable y después enviar dicha información.


  • Marca
  • Subclasificación
  • Numero de serie equipo
  • Usuario unidad
recordemos que Marca y Subclasificación están en la tabla superior llamada "Equipo" y Numero de serie equipo y Usuario unidad, se encuentran en la ultima tabla que esta anidada en la primera.

2. Pues comenzamos con el código, primero creando nuestro objeto DataTable.


3. Creamos Columnas y les agregamos información que nos servirán como cabeceras.

4. Creamos nuestro XPathNavigator y XPathNodeIterator para poder recorre nuestras Tablas.



5. Y aquí viene la parte medular, donde recorremos las tablas y agregamos los valores a nuestro DataTable. 


Explicación del codigo:

  • Comenzamos con un While que recorre la tabla principal
  •  En este caso obtener los valores de Marca y SubClasificacion no es el problema estos los almacenamos en las variables.(Marca y Modelo).
  • en la fila que revisamos verificamos si tiene hijos usando HasChildren si esta es verdadera entonces nos movemos a la fila hijo usando MoveToFirstChild.
  • Usamos la variable LocalName para obtener el nombre de la fila hijo en la que estamos posicionados.
  • mediante un If verificamos que la fila hijo en la que estamos sea "Detalle_Activo" que es la tabla repetida anidada al final.
  • si entra dentro de nuestro If vamos a almacenar el Current.OuterXml que es un xml que contiene los campos Numero de serie equipo y Usuario unidad, creamos un XmlDocument, luego lo cargamos y buscamos los nodos "my:Usuario_Unidad" y "my:Numero_Serie_Equipo" que contienen los datos que necesitamos, usando InnerText obtenemos los valores  de estos nodos en el actual registro, los guardamos en variables y por ultimo agregamos un row a nuestro Table.

De esta manera podemos recorrer tablas repetidas anidadas.

Saludos.
Oscar Miguel Dominguez Acevedo.

No hay comentarios:

Publicar un comentario