Introducción
Estamos trabajando en AVANADE participando de un proyecto de desarrollo para una de las más importantes empresas cerveceras. Estamos utilizando un portal en SharePoint Online conocido como Office 365 o BPOS. Hemos implementado un formulario que nos permite realizar encuestas y guardar los resultados en una lista de SharePoint. Éste approach no funciona dentro de Office 365, ya que éste no permite la ejecución de código de InfoPath.
Necesidad
Necesitamos crear un formulario que funcione como una encuesta, tomando varias preguntas de una lista de SharePoint, dependiendo de si están habilitadas y la periodicidad, y guardando los datos que cargue el usuario en otra lista de SharePoint.
Solución
InfoPath es una aplicación incluida en el paquete Office. Esta vez crearemos un formulario desde cero.
1. En la pantalla de creación de nuevo formulario, seleccionamos un “Formulario en Blanco”.
2. Luego pasaremos a crear las conexiones de datos necesarias. Primero crearemos una conexión para recibir datos desde la lista de SharePoint de donde queremos obtener los elementos a mostrar para que el usuario complete el formulario (para crear este tipo de conexión, ver el primer News Letter de InfoPath aquí.).
3. El paso siguiente es agregar una tabla extensible para mostrar la información que obtendremos de la lista. Para hacer esto necesitamos mostrar los campos de las conexiones de datos. Nos aseguramos de que el Ribbon este desplegando el menú de “Datos”, y luego clickearemos en “Mostrar Campos”.
4. Se despliega la barra de Campos. En ella, seleccionamos nuestra conexión de datos recientemente creada en el DropDown debajo de “Campos:”, y seleccionamos “d:SharepointListItem_RW” luego de desplegar “dataFields”, como se indica en la imagen. Arrastramos la selección al área de trabajo y seleccionamos “Tabla Extensible” cuando nos lo pida.
5. El resultado será similar al de la imagen. Se pueden eliminar columnas de no ser necesario mostrarlas (click derecho en la columna -> Eliminar -> Columnas).
6. Ahora crearemos “Reglas” para filtrar las preguntas a mostrarse en la tabla extensible. Seleccionamos la tabla extensible, y desplegamos el Ribbon de “Herramientas de Controles”, para mostrar el botón de “Administrar Reglas”. Al clickearlo se abre la ventana de reglas del control.
7. Clickeamos en “Nuevo->Formato” para crear una nueva regla de tipo Formato. Tildamos la opción “Ocultar este control”, ya que ésta será la primera condición por la cual se ocultarán los elementos a mostrar. Clickeamos donde dice “Ninguno” debajo de “Condición” para agregar la condición. En este caso, queremos que se oculten los elementos cuando “Enable” sea igual a falso, las opciones de la condición nos permiten hacer esto. Clickeamos “Aceptar” y cambiamos el nombre de la regla.
8. Agregaremos un botón que nos permita enviar los datos una vez que hayamos agregado el código pertinente. Para hacerlo, en el Ribbon de “Inicio”, desplegamos los controles de entrada y seleccionamos un “Botón”.
9. Click derecho sobre el mismo, “Propiedades de Botón”. En la ventana que se abre, debajo de “Acción”, seleccionar “Reglas y código personalizado”. Esto generará un Id para el botón y habilitará una opción para “Editar código del formulario”. Hacer click en esta opción.
10. Se abrirá el Visual Studio Tools for Applications, donde podremos agregar el código que necesitamos al botón. Primero deberemos agregar dos referencias, “Microsoft.Sharepoint” y “Microsoft.Sharepoint.Security”. Habrá también que agregar estas dos librerías con el comando ‘using’.
11. Luego, dentro del método al que llama el botón, se deberá insertar un código como el que sigue a continuación.
//Esta sección del código crea un iterador de nodo xml señalando todos //los campos de los items de la lista de donde estamos sacando las //preguntas para la encuesta, luego iteraremos dentro de éste para //acceder a cada una de las preguntas
XPathNodeIterator questions = DataSources["KPI Question"].CreateNavigator().Select("/dfs:myFields/dfs:dataFields/d:SharePointListItem_RW", NamespaceManager);
//Necesitamos correr esta próxima parte con mayores privilegios
SPSecurity.RunWithElevatedPrivileges(delegate()
{
string url = //Url del sitio
using (SPSite rootsite = new SPSite(url))
{
string webSite = //Rootweb
using (SPWeb rootweb = rootsite.OpenWeb(webSite))
{
string listName = //Nombre de la lista
SPList list = rootweb.Lists[listName];
SPListItem item;
//Esta sección la corremos con cada una de las preguntas
while (questions.MoveNext())
{
//Creamos un navegador xml para iterar a través de las preguntas
XPathNavigator question = questions.Current.CreateNavigator();
//Agregamos el item vacío en la lista Database
item = list.Items.Add();
//A cada atributo de la pregunta lo metemos en el //item recién guardado en Database
item["Pillar"] = question.SelectSingleNode("d:Pillar", NamespaceManager).Value;
item["Measure"] = question.SelectSingleNode("d:Measure", NamespaceManager).Value;
item["Frequency"] = question.SelectSingleNode("d:Frequency", NamespaceManager).Value;
item["Source"] = question.SelectSingleNode("d:Source", NamespaceManager).Value;
item["Method of Calculation"] = question.SelectSingleNode("d:Method_x0020_of_x0020_Calculatio", NamespaceManager).Value;
item["KPI"] = question.SelectSingleNode("d:KPI", NamespaceManager).Value;
item["Actual"] = question.SelectSingleNode("d:Actual", NamespaceManager).Value;
item["Value"] = question.SelectSingleNode("d:Value", NamespaceManager).Value;
//Y finalmente hacemos el update al item
item.Update();
}
}
}
});
12. El resultado final puede apreciarse en la foto. Agregamos un par de filtros más de acuerdo al valor en el campo Frequencies y campos propios de mes y zona. Ahora resta publicarlo al sitio de SharePoint para permitir el uso a los usuarios.
13. Clickeamos en “Archivo->Publicar->Sharepoint Server”.
14. En la primera pantalla escribimos el sitio de SharePoint donde queremos publicar. Luego clickeamos “Siguiente” y en la próxima pantalla tildamos la opción “Habilitar este formulario para rellenarlo utilizando un explorador” y seleccionamos la opción “Biblioteca de Formularios”.
15. La siguiente ventana nos da la opción de crear una biblioteca de formularios nueva o elegir una existente. Luego nos dará el sumario del formulario y nos dará la opción de publicar. Una vez que hayamos clickeado ahí el formulario estará publicado en la ubicación seleccionada.
Conclusión
InfoPath es una herramienta poderosa, más aún si agregamos código a la ecuación. Sin embargo, este tipo de soluciones funcionan sólo si se hace un deploy dentro de nuestro dominio, limitando su utilidad. En nuestro caso, implementamos esta solución para hacer un deploy en Office 365, ambiente que restringe este tipo de soluciones con código, por lo que se tuvo que tomar la decisión de desarrollar una WebPart que implementara la funcionalidad que aquí logramos con InfoPath.
No hay comentarios:
Publicar un comentario