Hace poco tuve el requerimiento de crear una minuta en InfoPath que creara tareas en una lista de SharePoint, hubiera esperado que fuera una tarea sencilla, dado lo integrado que están ambas tecnologías, pero no fue así. Por lo tanto les dejo un paso a paso de cómo insertar tareas en una lista de SharePoint usando InfoPath 2010 y nuestro viejo amigo CAML.
Vamos a trabajar en la lista de tareas que se crea en forma predeterminada en un subsitio de equipo:
Un paso fundamental para que este ejercicio funcione es identificar el nombre interno de las columnas de la lista, especialmente si usamos un sitio en un idioma diferente al inglés.
En la siguiente imagen pueden ver los nombre de las columnas que se muestran en la pantalla de Configuración de la lista.
A continuación haga clic en la columna Asignado a, lo cual los lleva a la página de Cambiar columna. Ahora quiero que naveguen al final del URL que muestra el explorador, y verán la etiqueta Field=AssignedTo, “AssignedTo” es el nombre interno de la columna y es el nombre que debemos usar en la creación de nuestra plantilla de CAML.
En la siguiente tabla pueden ver el nombre en español de los campos que vamos a modificar y su correspondiente nombre interno. La lista de tareas tiene más campos, pero este es el subgrupo que seleccioné para este ejemplo.
Nombre en español |
Nombre interno |
Título |
Title |
Descripción |
Body |
Asignado a |
AssignedTo |
Fecha de inicio |
StartDate |
Fecha de vencimiento |
DueDate |
% completado |
PercentComplete |
Estado |
Status |
ID |
ID |
Ahora vamos a crear el código CAML que nos permitirá actualizar la lista.
1. Abran Notepad o su editor de texto favorito.
2. Copien el siguiente fragmento de XML:
<?xml version="1.0" encoding="UTF-8"?>
<Batch OnError="Continue">
<Method ID="1" Cmd="New">
<Field Name="Title"></Field>
<Field Name="Body"></Field>
<Field Name="AssignedTo"></Field>
<Field Name="StartDate"></Field>
<Field Name="DueDate"></Field>
<Field Name='PercentComplete'></Field>
<Field Name='Status'></Field>
<Field Name='ID'></Field>
</Method>
</Batch>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
3. Guarden el archivo con el nombre PlantillaTareas.xml
Ahora procedemos a trabar el formulario de InfoPath, en este caso cree un formulario en blanco con InfoPath 2010.
Comenzamos agregando como un Data Source la conexión a nuestro XML.
1. En el menú de Data expandimos la opción From Other Sources y seleccionamos From XML File.
2. Buscamos el archivo de XML que habíamos creado y presionamos el botón Next.
3. Se deja marcada la opción de incluir los datos como archivo de recurso, y presionamos el botón Next.
4. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.
Ahora vamos a crear la conexión de datos a la lista de tareas de SharePoint.
1. En el menú de Data seleccionamos From SharePoint List.
2. Escribimos la dirección del sitio donde esta la lista de tareas que vamos a consultar y presionamos el botón Next.
3. Seleccionamos la lista de Tareas y presionamos el botón Next.
4. Seleccionamos los campos que incluimos en nuestro CAML y presionamos el botón Next.
5. En este caso no voy a guardar una copia de los datos en el formulario así que presionamos el botón Next.
6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.
En la primera sección del formulario vamos a agregar la consulta a las tareas existentes.
1. En la ventana de Campos seleccionen la fuente de datos Tareas.
2. Expanda la sección de dataFields y haga clic derecho sobre el campo d:SharePointListItem_RW e inserte una Tabla repetitiva.
3. La tabla se insertó con los campos sin títulos, procedemos darle el formato que deseamos, en mi caso, sólo voy a mostrar algunos campos.
4. Así se ve el formulario hasta ahora, cambie el campo de vencimiento por un campo de texto y marque todos los campos como Read Only. En el campo Asignado a inserte una sección repetitiva con controles y sólo deje el campo que muestra el Display Name. También agregué una columna a la derecha para poner un botón posteriormente.
Ahora regresamos al datasource principal y creamos los siguientes campos de InfoPath, para facilitar el código elegí no usar tildes ni espacios en blanco:
Nombre |
Tipo |
lista |
string |
id |
string |
titulo |
string |
descripcion |
string |
asignadoa |
People/Group picker |
estado |
string |
porcentaje |
decimal |
inicio |
date |
fin |
date |
Nuestro campos se ven asi:
Ahora procedemos a agregar esos nuevos campos, excepto el campo lista, en el formulario y le damos un formato bonito.
El campo ID lo marque como read only.
El campo descripción lo hice multi línea.
El campo estado lo hice de tipo DropDown y le escribí las mismas opciones que tiene la lista en SharePoint.
Para el formato de los campos de fecha seleccioné usar aaaa-mm-dd, de nuevo para facilitar la escritura del código, de forma que usa el mismo formato de SharePoint, pero si desea que se vea diferente, nada más debe recordar transformarlo antes de actualizar los datos.
Como vamos a asignar la persona responsable de la tarea, necesitamos conocer el UserID de ese usuario, es decir, el número que SharePoint le asigna al usuario la primera vez que que lo agregamos a un sitio, este dato no se obtiene del people picker, si no que consultamos el servicio Web UserGroup.asmx.
1. En la cejilla de Data seleccionan From Web Service y después From SOAP Web Service.
2. La dirección del servicio Web es la dirección del sitio o subsitio donde esta la lista de tareas más /_vti_bin/UserGroup.asmx y presionamos el botón Next.
3. Seleccionan el método GetUserInfo y presionamos el botón Next.
4. En la siguiente página, escriba un valor predeterminado para el login, por ejemplo su dominio y usuario, y presionamos el botón Next.
Normalmente el formato del usuario es dominio\usuario, por ejemplo contoso\vkrojas, pero si usa Office 365 debe usar el formato de cuenta interno, por ejemplo: i:0#.f|membership|vkrojas@contoso.com
5. No vamos a guardar una copia de los datos en el formulario así que presionamos el botón Next.
6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.
Ahora para poder actualizar la lista de SharePoint vamos a utilizar el servicio Web UpdateListItems, que también provee SharePoint.
1. En la cejilla de Data, en la sección de Submit Form seleccionan To Other Locations y después To Web Service.
2. La dirección del servicio Web es la dirección del sitio o subsitio donde esta la lista de tareas más /_vti_bin/lists.asmx y presionamos el botón Next.
3. Seleccionan el método UpdateListItems y presionamos el botón Next.
4. En la siguiente página para el parámetro listName seleccionamos el campo lista de nuestro formulario y marcamos la opción de Submit data as a string.
5. Para el parámetro updates seleccionamos el Data Source secundario PlantillaTareas, que es el archivo XML que hicimos en Notepad.
6. En el campo Include seleccionamos XML subtree, including selected element. Marcamos la opción de Submit data as a string. Presionamos el botón Next para continuar.
7. Desmarcamos la opción Set as the default submit connection y presionamos el botón Finish.
Ya tenemos el escenario preparado para comenzar a trabajar en el código. Iniciemos agregando un botón para leer las tareas que están publicadas en la lista de SharePoint. Le puse a la etiqueta del botón Refrescar. A ese botón le ponemos una regla que consulte la lista de tareas.
Si prueban el formulario ya deben poder leer la lista de tareas de SharePoint cada vez que presionan el botón Refrescar.
Más información: