Insertar una tarea de SharePoint desde InfoPath usando CAML

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:

image

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.

image

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.

image

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.

image

2. Buscamos el archivo de XML que habíamos creado y presionamos el botón Next.

image

3. Se deja marcada la opción de incluir los datos como archivo de recurso, y presionamos el botón Next.

image

4. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

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.

image

2. Escribimos la dirección del sitio donde esta la lista de tareas que vamos a consultar y presionamos el botón Next.

image

3. Seleccionamos la lista de Tareas y presionamos el botón Next.

image

4. Seleccionamos los campos que incluimos en nuestro CAML y presionamos el botón Next.

image

image

5. En este caso no voy a guardar una copia de los datos en el formulario así que presionamos el botón Next.

image

6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

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.

image

2. Expanda la sección de dataFields y haga clic derecho sobre el campo d:SharePointListItem_RW e inserte una Tabla repetitiva.

image

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.

image

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.

image

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:

image

Ahora procedemos a agregar esos nuevos campos, excepto el campo lista,  en el formulario y le damos un formato bonito.

image

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.

image

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.

image

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.

image

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.

image

3. Seleccionan el método GetUserInfo y presionamos el botón Next.

image

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

image

5. No vamos a guardar una copia de los datos en el formulario así que presionamos el botón Next.

image

6. Se deja marcada la opción obtener automáticamente los datos y presionamos el botón Finish.

image

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.

image

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.

image

3. Seleccionan el método UpdateListItems y presionamos el botón Next.

image

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.

image

5. Para el parámetro updates seleccionamos el Data Source secundario PlantillaTareas, que es el archivo XML que hicimos en Notepad.

image

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.

image

7. Desmarcamos la opción Set as the default submit connection y presionamos el botón Finish.

image

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.

image

Si prueban el formulario ya deben poder leer la lista de tareas de SharePoint cada vez que presionan el botón Refrescar.

image

 

 

 

Más información:

Anuncios

Nintex Form 2010: Botón para cancelar estado de la solicitud

En algunas ocasiones es necesario cancelar una solicitud después de que esta fue enviada y para esto es muy útil tener un botón que cambie el estado de la solicitud diferente a Guardar y Cerrar.

Nintex tiene una funcionalidad muy práctica para esto con el control tipo Botón y les enseñaré a conectar ese botón.

Los campos que debemos configurar son los siguientes:

  • Button action: Save and Submit para que guarde los cambios y cierre el formulario.
  • Button label: el nombre del nuevo botón.
  • Connected to: se conecta al campo que queremos actualizar. En mi caso era un campo tipo elección (choice).
  • Value returned: el valor con el que deseamos actualizar ese campo.
  • Confirmation message: útil si queremos desplegar una ventana de diálogo al usuario.

Y es así de sencillo, tenemos un botón que actualiza un campo en nuestro formulario

Algo fundamental es el orden de los campos, en la imagen de abajo el campo que estoy modificando esta después del botón que lo cambia, por lo que cuando se guarda el formulario el botón cambia el valor pero como el control que muestra el estado esta después del botón también está conectado al mismo campo de SharePoint, este último sobre escribe el valor que puso el botón.

Lo mejor es asegurarse que si estamos mostrando el valor que se desea modificar, este campo este ubicado antes del botón o no este del todo en el formulario.

Explorando spservices: ocultar columnas por grupo de SharePoint

Recientemente he estado trabajando mucho con la librería de spservices (http://spservices.codeplex.com) así que voy a iniciar una serie de artículos con ejemplos de su uso.

Me gusta realizar modificaciones con JavaScript porque si se debe cambiar la versión de SharePoint, el código es más sencillo de modificar, no hay que recompilarlo!, y también funciona con SharePoint Online.

A continuación les voy a mostrar como ocultar columnas del formulario de creación de nuevos elementos. En este caso estoy usando SharePoint 2010, pero debería funcionarles para 2013 sin muchos problemas.

Tengo una lista con cuatro campos y dos grupos de SharePoint en mi sitio, deseo que el grupo IT Owners pueda ver todos los campos del formulario, y el grupo IT Infrastructure Members no pueda ver la columna “Nivel 2”, ni la columna “comentarios”.

Este es el formulario original.

hidefields1

 

Y en esta vista pueden ver los grupos de SharePoint que vamos a utilizar.

hidefields2

 

Veamos el script

En un editor de texto comenzamos a redactar el script. Primero agregamos las referencias a JavaScript y SPServices. Mi recomendación es utilizar una biblioteca en el mismo sitio donde van a usar el script. Por ejemplo, una carpeta llamada Scripts dentro de la biblioteca Site Assets o Activos del Sitio.

<script src=”/url al script/jquery-1.8.2.js” type=”text/javascript”></script>
<script src=”/url al script/jquery.SPServices-2014.01.js” type=”text/javascript”></script>

//Después agregarmos las funciones para ocultar los campos

<script type=”text/javascript”>

// Esta función oculta todo el reglón de la tabla. No es necesario modificarla. 
function hideColumn(c) {

$(“.ms-formlabel h3 nobr”).filter(function() {

var thisText = $.trim($(this).clone().children().remove().end().text());

return thisText.indexOf(c) === 0 && thisText.length === c.length;

}).closest(“tr”).hide();

}

// Esta función usa SPServices para saber si el usuario que esta viendo la página (logged in)

// pertenece al grupo que se envió en la variable groupName. No es necesario modificarla. 

function isGroupMember(groupName, callback)
{

$().SPServices({

operation: “GetGroupCollectionFromUser”,

userLoginName: $().SPServices.SPGetCurrentUser(),

async: true,

completefunc: function(xData, Status) {

callback( !!($(xData.responseXML).find(“Group[Name='” + groupName + “‘]”).length) );

}

});
};

// Esta función si deben cambiarla de acuerdo a sus necesidades.

// Cambien IT Infrastructure Members por el nombre del grupo que ustedes desean revisar.

// Cambien Nivel 2 y Comentarios por el nombre de las columnas que ustedes desean ocultar. 

isGroupMember(“IT Infrastructure Members”, function(result){

if(result){

hideColumn(“Nivel 2”);

hideColumn(“Comentarios”);

}

});
</script>

En mi caso, este script se llama ocultar columnas.js y lo subí a la biblioteca de Site Assets junto con los otros scripts que estoy utilizando.

hidefields4

Para insertar el script en la pagina NewForm.aspx vamos a utilizar un Elemento Web Editor de Contenido, así que para trabajar más fácilmente, primero vamos a deshabilitar la opción de abrir los formularios en cuadros de diálogo, para que se abran totalmente en la página Web.

Después de agregar el script puede volver a habilitar esta opción y que se muestren los formularios en cuadros de diálogo.

  • Primero hacen clic en Lista, después en Configuración de la lista.
  • Luego hacen clic en Configuración avanzada (1).
  • En la página de configuración avanzada, bajan hasta el final de la página, y en la preguna sobre si se deben abrir los formularios dentro de ventanas de diálogos marcan la opción No (2).

hidefields3

  • Después hacemos clic en Agregar elemento, y una vez en la página de agregar elemento, vamos al menú de Acciones de sitio y hacemos clic en Editar Página.

hidefields5

Esto nos va a permitir agregar elementos Web a la página NewForms.aspx. Este procedimiento también se puede realizar con SharePoint Designer.

  • Hagan clic en Add a Web Part, o Agregar Elementos Web.

hidefields6

  • Busquen el elemento Content Editor o Editor de Contenido Web dentro de la categoría de Medios y Contenido.
  • Presionan el botón Agregar.

hidefields7

  • Una vez que agregaron el elemento Web, hagan clic en Editar elemento Web para agregar la dirección al script que usamos.

hidefields8

  •  En la primera sección del Editor de contenido, deben agregar la dirección del script (3).
  • En la sección de Apariencia, seleccionen el Chrome Type a Ninguno (4), para que no se vea el título del mismo en nuestro formulario. Y presionan el botón Ok.

hidefields9

  • Después guardan los cambios de la página presionando el botón Stop Editing o Detener Edición.

hidefields11

Como pueden ver, ahora si el usuario que ve el formulario pertenece al equipo IT Infrastructure Members, no va a poder ver todos los campos.

hidefields12

Algo muy importante que deben tener en cuenta, es que por la lógica que estoy usando, si el usuario pertenece a ambos grupos igual no va a poder ver los campos, aunque pertenezca a IT Owners; porque sólo estoy preguntando si pertenece a IT Infrastructure Members.

Loobpack Check Fix

Muchas veces estos artículos que escribo son un recordatorio personal porque una y otra vez debo realizar el mismo trabajo.

Hoy tenía este error en un SharePoint 2013 y después de leerlo dije: ¡claro, no le he dado permisos al usuario spcontent!

Access is denied. Verify that either the Default Content Access Account has access to this repository, or add a crawl rule to crawl this repository. If the repository being crawled is a SharePoint repository, verify that the account you are using has “Full Read” permissions on the SharePoint Web Application being crawled. (0x80041205)

 

Así que procedí a agregar darle permisos de lectura total al usuario que realiza las indexaciones.

disableloopback2

Pero incluso después de agregar el usuario me salía exactamente el mismo error en el visor de eventos. Así que esa no era la solución.

Investigando en internet posibles causas de errores recordé que no había deshabilitado la famosa característica de seguridad “LoopbakCheck”. Aquí pueden encontrar la información oficial de Microsoft: http://support.microsoft.com/kb/896861

Si es un servidor de pruebas, pueden deshabilitarlo por completo con este comando de PowerShell:

New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name “DisableLoopbackCheck” -Value “1” -PropertyType dword

Si es un servidor en producción lo mejor es que agreguen cada una de las direcciones de su sitio de SharePoint y que no lo deshabiliten del todo. En PowerShell el comando es:

New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa\MSV1_0 -Name “BackConnectionHostNames” -Value “intranet.contoso.com”,”personal.contoso.com” -PropertyType multistring

¿Qué significa i:0#.w| en las cuentas de usuario?

Para quienes hemos realizado algún tipo de desarrollo en SharePoint, ya sea .NET o JavaScript, hemos notado que al consultar los usuarios en algunas ocasiones aparece el usuario aparece de esta forma i:0#.w|contoso\vielka, lo que nos obliga a estar recortando el texto para eliminar esta parte i:0#.w|

¿Pero qué significan esos símbolos? Significa que SharePoint está usando autenticación tipo Claims (antiguo Forms) en lugar de autenticación clásica o NTLM para esa aplicación Web, y para SharePoint 2013, el tipo de autenticación recomendada para todos los sitios es Claims, aunque el AD organizacional no use Kerberos.

A continuación les presente unos ejemplos y el detalle completo lo pueden consultar en SharePoint 2013: Claims Encoding – Also Valuable for SharePoint 2010.

Tipo de reclamo

Código

Explicación

Usuario de windows i:0#.w|contoso\Vielka   i significa   que es del tipo “identity claim”  # indica   que contiene un login

  . tiene un   texto (string)

  w es autenticación   tipo Windows

  contoso\vielka  es el valor de la identidad   (la cuenta del usuario)

Tipo Forms i:0#.f|mymembershipprovider|Vielka   i significa   que es del tipo “identity claim”  # indica   que contiene un login

  . tiene   un texto (string)

  f es autenticación tipo Forms.

  mymembershipprovider    identifica quien emite la autenticación

  vielka   es el login del usuario

Valores de los estados de los flujos de trabajo

 

Si deseamos crear vistas en una lista de acuerdo al estado de un flujo de trabajo, lo primero es tomar una vista normal y filtrarla por el estado que deseamos.

image

 

El siguiente paso es fijarse en el URL de la página para ver el nombre del filtro (campo FilterField1) y el valor correspondiente (campo FilterValue1).

image

Cuando crean la vista, debe usar el número del estado para filtrar, no el texto, como en el siguiente ejemplo:

image

 

Aquí esta el resumen de todos los estados, con el nombre en español e inglés:

Estado Valor
No iniciado  – Not started 0
Fallo al iniciar – Failed on Start 1
En curso – In Progress 2
Error – Error Occurred 3
Completado – Completed 5
Fallo al iniciar (reintentando) – Failed on Start (retrying) 6
Error (reintentando) – Error Occurred (retrying) 7
Cancelado – Canceled 15
Aprobado – Approved 16
Rechazado – Rejected 17

Anexos obligatorios en listas de SharePoint

Hoy hice una lista sencilla para automatizar la aprobación de solicitudes de crédito, pero ocupaba que los usuarios anexaran al menos un archivo, lo cual no es muy sencillo en SharePoint.

1) El primer paso fue crear un archivo de texto (requiredAttachment.txt) con el siguiente script:

<script type=”text/javascript” language=”javascript”>
function PreSaveAction() {

            var elm = document.getElementById(“idAttachmentsTable”);
            if (elm == null || elm.rows.length == 0)
{
                document.getElementById(“idAttachmentsRow”).style.display=’none’;

alert(“Por favor agregue el archivo usando el botón Attach File”);
return false ;
}
else { return true ;}
}
</script>

2) Después lo subí a la biblioteca de activos del sitio

image

3) En la lista donde voy a realizar la personalización desactivé la opción de abrir los formularios en cuadros de diálogo.

image

4) En la lista que desea hacer obligatorios los anexos, presione el botón Nuevo elemento, y agregue en el URL Toolpaneview=2

image

5) En la nueva pantalla, presione el botón Add a Web Part.

image

6) Agregue el Web Part de Editor de Contenido.

image

7) Edite las propiedades del Editor de Contenido.

image

8) Cambie el tipo de borde a Ninguno.

image

9) En el campo de vínculo al contenido, escriba el URL del archivo que contiene el código javascript (paso 2 de este post).

image

10) Presione el botón OK para guardar los cambios.

image

 

11) Debe repetir estos pasos para el formulario de editar elementos, como se muestra en la siguiente imagen:

image

12) Cuando terminó de agregar los scripts, puede volver a marcar que los formularios se abran como cuadros de diálogo.

image

Anteriores Entradas antiguas

A %d blogueros les gusta esto: