SSD: el síndrome de la Sharepoint dependencia

Sharepoint me proporciona seguridad y me hace sentir más fuerte. Las 10 cosas que más me gustan de Sharepoint.

10 puntos para entender a Project Server 2010

Microsoft Project es quizá la herramienta de gestión de proyectos más conocida y utilizada por los líderes de proyectos...

Diseño Gráfico en SharePoint

Serie de artìculos que nos ayudan a incorporar diseño gráfico en las implementaciones de SharePoint...

Revista CompartiMOSS

Artículos publicados en la revista especializada en SharePoint: CompartiMOSS.

Contacto

Enviame un correo :-)

jueves, 18 de septiembre de 2014

Listar en SharePoint ítems con versiones en formato XML y conectar a Excel

Requerimiento

Exportar a Excel los datos de una lista en MOSS 2007:
  • Incluyendo la información de versiones
  • Sólo registros en donde cambie el estado

Enfoque de desarrollo
  • Utilización de SPListItemVersion para leer la información de versiones
  • Generación de los datos en XML para poder conectar fácilmente Excel

Resultado


Forma de uso









El código

<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Page Language="C#" 
         Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase" EnableViewStateMac="false" EnableViewState="true" MaintainScrollPositionOnPostback="true"%>

<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>

<script runat="server">

protected override void OnLoad(EventArgs e) {

string resultado;
string estado;
string estado_anterior;

using ( SPWeb mi_web = SPContext.Current.Web ) {
SPList mi_lista = mi_web.GetList("/sites/sitio1/lista1");

SPQuery mi_consulta = new SPQuery();

mi_consulta.ViewFields = "<FieldRef Name='ID'/>";
mi_consulta.ViewFields = "<FieldRef Name='Estado_x0020_del_x0020_requerimi'/>";

mi_consulta.ViewFields += "<FieldRef Name='PermMask'/>"; 

DataTable tabla = new DataTable();

tabla.TableName = "Requerimientos";
tabla.Columns.Add("ID", typeof(int));
tabla.Columns.Add("Version", typeof(string));
tabla.Columns.Add("Estado", typeof(string));
tabla.Columns.Add("Modificada", typeof(string));

SPListItemCollection mis_items = mi_lista.GetItems(mi_consulta);

foreach (SPListItem mi_item in mis_items) {

estado_anterior = "";

for ( int i =  mi_item.Versions.Count - 1 ; i >= 0; i-- ) {

SPListItemVersion mi_version = mi_item.Versions[i];

if ( mi_version["Estado_x0020_del_x0020_requerimi"] == null ) {
estado = "";
}
else {
string lkp_estado = mi_version["Estado_x0020_del_x0020_requerimi"].ToString();
      SPFieldLookupValue lkp_estado_valor = new SPFieldLookupValue(lkp_estado);
estado = lkp_estado_valor.LookupValue;
}
if ( estado != estado_anterior ) {
tabla.Rows.Add( mi_version["ID"], mi_version.VersionLabel, estado, mi_version.Created.Date.ToString("d") );
estado_anterior = estado;
}

}

}

using (StringWriter sw = new StringWriter()) {
tabla.WriteXml(sw);
resultado = sw.ToString();
}

}

Response.ContentType = "application/xml";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Write(resultado);

}

</script>


Hasta la próxima!

miércoles, 2 de julio de 2014

Relaciones de Maestro Detalle en SharePoint 2007 con jQuery (simple y efectivo) [Parte 2]

Introducción
Un requerimiento que siempre surge en SharePoint tiene que ver con manejar relaciones de maestro-detalle. He visto y utilizado diferentes formas, con ventajas y desventajas que siempre dependen del escenario en que nos encontremos. En el artículo original mostramos un ejemplo para WSS 3.0 que utiliza programación del lado del cliente.

Si no leíste ese artículo, te recomiendo su lectura en: Relaciones de maestro detalle en SharePoint 2007.

Segunda parte
En esta segunda parte vamos a modificar uno de los 4 scripts, el del padre, para que soporte diferentes tipos de contenido en el hijo. A continuación el código (cambios resaltados):

<script type="text/javascript">

// Agregar esta CEWP debajo de la vista de la lista Padre


// Parámetros importantes

// Posición en que se encuentra la columna ID
var posicion_id = 3;
// Posición en que se encuentra la columna Tipo de Contenido
var posicion_tc = 4;
// Nombre de la lista hija
var lista_hija = "blabla";
// Texto para el botón o imagen
var texto_boton = "<img style='border: none;' src='/_layouts/images/itann.gif'/ title='Agregar ...' >";
// Estilo del botón nuevo
var estilo_boton = "";
// Título columna
var titulo_columna = "Agregar";
// Tipos de Contenido
var tipos_de_contenido = {
Proyecto:"0x010039837982075D1E4490A428B24D078C36", 
Programa:"0x01004B51B7C49BE3CE459ECEE01CACD0CF2F00C53AA5923F258A41A1C1A8354004CF68", 
Producto:"0x01004B51B7C49BE3CE459ECEE01CACD0CF2F00C53AA5923F258A41A1C1A8354004CF68"
};

// Fin de Parámetros importantes



// Id de ítem
var identificador;

// Tipo de Contenido
var tipo_contenido;

// URL del sitio
var sitio= window.location.href;
var origen = encodeURIComponent(sitio);
var posicion_listas = sitio.indexOf("Lists/");
sitio = sitio.substring(0, posicion_listas); 


// URL de nuevo elemento en el hijo
var nuevo_hijo = sitio + "Lists/" + lista_hija + "/NewForm.aspx?source=" + origen + "&padre=";


// Cambiar Título de columna
$(".ms-listviewtable > tbody > tr > th #diidSortID").text(titulo_columna);


// Cambiar columna
// Asumo que la lista usa la vista standar que posee la clase .ms-listviewtable
$(".ms-listviewtable > tbody > tr").each(function( index ) {  

// Obtengo el ID del elemento
identificador = $(this).find("td:nth-child("+posicion_id+")").text();

// Obtengo el Tipo de Contenido
tipo_contenido = $(this).find("td:nth-child("+posicion_tc+")").text();

// Cambio el ID por el botón nuevo
$( this ).find("td:nth-child("+posicion_id+")").html("<a style='" + estilo_boton + "' href='" + nuevo_hijo + identificador + "&ContentTypeId=" + tipos_de_contenido[tipo_contenido] + "'>" + texto_boton + "</a>") ;

}); 

</script>

viernes, 30 de mayo de 2014

SharePoint 2010 Search - No se encuentran documentos luego de mover un sitio

Introducción

Hace un tiempo explicamos cómo mover un sitio de sharepoint sin perder la historia: http://surpoint.blogspot.com.ar/2014/03/como-mover-un-sitio-sin-perder-la.html

Hoy me quiero centrar en comentar que este movimiento puede generar algún problema en nuestros índices de búsqueda, así que en este artículo comentaré cómo volver a indexar nuestro contenido.

Paso 1: Index Reset

Ingresamos a Central Administration / Manage services on server:



Luego SharePoint Server Search:

 
Luego Search Service Application




Luego Index Reset / Reset all crawled content / Reset Now. Verificar que la opción "Desactivate search alerts during reset" esté seleccionada:



Luego Content Sources / Local SharePoint sites / Start Full Crawl:


Este proceso puede demorar horas, incluso días. En un ambiente de prueba que utilicé, demoró 16 horas. Podemos monitorear o pausar el proceso, utilizando la botonera:




Una vez finalizado el proceso, la búsqueda debería funcionar sin problemas.

Hasta la próxima.

miércoles, 21 de mayo de 2014

Tipos de contenidos externos en SharePoint 2010 sobre SQL Server

Les dejos tes artículos muy buenos acerca de cómo crear un tipo de contenido externo sobre datos en SQL Server con credenciales SQL Server:

¿Cómo autenticar con credenciales de SQL Server?

http://blogs.msdn.com/b/mvpawardprogram/archive/2012/04/12/sharepoint-2010-external-content-type-to-read-data-from-sql-server-using-sql-authentication-and-secure-store-service.aspx


Espero les resulte útil!

image


miércoles, 7 de mayo de 2014

HTML con campos calculados en SharePoint 2010 (Traffic Lights)

Supongamos que queremos incluir HTML dentro de un campo de una lista en SharePoint 2010 y hacer que el mismo se muestre correctamente de esta forma:



El ejemplo es el de luces de semáforos. Para implementarlo seguimos tres simples pasos.

Paso 1

Agregamos un prefijo a nuestro campo de estado:



Paso 2

Creamos el campo calculado:



Fórmula:

="<DIV style='font-weight:bold; font-size:24px; color:"&CHOOSE(RIGHT(LEFT(Estado;2);1);"red";"orange";"green")&";'>•</DIV>"

Veremos que la vista nos muestra lo siguiente:



Paso 3

Modificamos la vista con SharePoint Designer:

Luego editamos la etiqueta:



Agregamos: disable-output-escaping="yes"

<xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes">

Y listo!



Espero les haya servido.


Hasta la próxima!

miércoles, 23 de abril de 2014

Cálculo inesperado del estado de la tarea en MS Project

Detalle del incidente:

  • Tarea: hito, al 0% con fecha de fin 16/4
  • Estado: debería aparecer como retrasada
  • Código de tarea: 111
  • Fecha de estado: 21/4/14
¿Por qué puede ser que la 111 no la muestre Retrasada?



Análisis del incidente:


  • La tarea 112 depende de la 111.
  • La tarea 112 tiene fecha de inicio 21/4. 
  • Si se evalúa al 21/4 aún no retrasa el proyecto:


  • Si se evalúa al 22/4, retrasa el proyecto. 


  • Si se cambia la fecha de inicio de la 112, automáticamente pone en "late" a la 111:


miércoles, 19 de marzo de 2014

Problemas con agrupamientos en SharePoint 2010

Me he encontrado con un problema al configurar las opciones de agrupamiento en una vista de SharePoint 2010. No se muestran los elementos y aparece la leyenda "Cargando" tal como muestro en esta imagen:



La solución en mi caso ha pasado por descargar e instalar el siguiente hotfix: http://support.microsoft.com/kb/2553117/en-us

Nota: aparentemente el problema se da sólo en instalaciones con paquetes de idioma.

Luego de aplicar el hotfix, este es el resultado:



Espero les haya resultado útil, hasta la próxima!

martes, 4 de marzo de 2014

¿Cómo mover un sitio sin perder la historia?

Introducción

El objetivo de esta prueba es identificar y validar un método para mover un sitio dentro de la estructura de sitios sin perder datos de la historia.

Escenario:

  • Tenemos una colección de sitios de nivel superior llamada “PADRE”
  • Tenemos un sitio hijo llamado “HIJO” y un sitio hijo de este hijo llamado “NIETO”.

image

El objetivo es subir un nivel en la estructura a NIETO sin que se pierda la historia:

image

No perder la historia incluye:

  • Historial de modificación de documentos (fechas y usuarios)
  • Flujos de trabajo y su historial de aprobaciones
  • Permisos (asumiendo que se heredan, aunque pueden existir permisos exclusivos)


Ambiente

Para realizar esta prueba, creamos un ambiente con las siguientes características:

  • Windows Server 2008 R2
  • SQL Server 2008 R2
  • SharePoint Server 2010 Enterprise

 

Paso 1 - Creación de sitios

A partir de una colección de sitios existentes, creamos primero el sitio HIJO, heredando permisos del padre:

image

Luego creamos un sitio NIETO, heredando los permisos de HIJO. Obtenemos una estructura como la siguiente:

image

 

Paso 2 - Creación de Información

En este segundo paso, vamos a crear la historia del sitio NIETO:

  • Listas
  • Flujo de trabajo
  • Carga de datos y ejecución del flujo de trabajo

 

Creación de Listas

Creamos una biblioteca de documentos y una lista de tareas.

image

A estas dos listas, les activamos el control de versiones:

image

image

 

Creación de Flujos de Trabajo

Creamos un flujo de trabajo para la biblioteca de documentos. Es un flujo sencillo que tienes los siguientes pasos al momento de subir un documento:

  1. Asigna una tarea a un usuario
  2. Registra un evento en el historial

image

Definimos las opciones del flujo de trabajo para que se dispare automáticamente al momento de subir un documento:

image

 

Carga de datos y ejecución del flujo de trabajo

Trabajamos primero con el Documento 1:

  • Subimos el documento
  • Completamos la tarea asignada por el flujo de trabajo
  • Más tarde hacemos una modificación al documento

La historia del flujo de trabajo muestra:

image

La historia del documento muestra la creación y una modificación posterior:

image

La historia de la tarea muestra la creación y la modificación cuando se ejecutó el flujo de trabajo:

image

 

Paso 3 - Ajustes de la seguridad

Ajustamos la seguridad utilizando el siguiente criterio:

  • El sitio hereda permisos
  • La lista de documentos hereda permisos
  • La lista de tareas posee permisos exclusivos, según se muestra en la siguiente imagen:

image

 

Movimiento del sitio

Introducción

Para realizar el movimiento del sitio, vamos a trabajar con la opción Contenido y Estructura dentro de la Configuración del Sitio:

image

Dentro de esta opción, utilizaremos el comando Mover.

 

Pasos para mover el sitio

Una vez dentro de la estructura, veremos reflejada la actual jerarquía:

image

Abrimos la lista desplegable de NIETO y elegimos la opción MOVER:

image

Aparecerá un cuadro de diálogo para elegir el sitio destino, elegimos PADRE:

image

Presionamos aceptar y esperamos... Luego veremos reflejada la nueva estructura:

image

 

Verificaciones

Movimiento dentro de la estructura

Lo primero que se observa es que NIETO ya no es hijo de HIJO:

image

Seguridad

Se observa que se mantuvieron las configuraciones de seguridad:

  • Permisos heredados en el sitio y la lista de documentos
  • Permisos exclusivos en la lista de tareas

Historial de Versiones

Al verificar el historial de versiones del Documento 1 se observan los mismos valores que antes:

image

Lo mismo sucede den el historial de versiones de la tarea:

image

Historial de Versiones en el Flujo de Trabajo

En la siguiente pantalla se ven los detalles de la historia del flujo de trabajo con los mismos usuarios y fechas:

image

Movimiento del Flujo de Trabajo

Abrimos SharePoint Designer y vemos que el flujo de trabajo existe:

image

El segundo paso es subir un segundo documento al sitio, para verificar que el flujo de trabajo funcione correctamente. Para ello luego de subirlo, completamos la tarea asignada. El resultado es el siguiente:

image

Por último, volvemos a abrir SharePoint Designer y modificamos el flujo de trabajo agregando un tercer paso. Publicamos y vemos que todo funciona sin problemas:

image

Subimos un tercer documento y verificamos que el flujo de trabajo se ejecuta sin problemas:

image

 

Conclusión

En esta prueba se observa que SharePoint 2010 permite mover sitios dentro de la estructura manteniendo la historia de la información. Es una prueba de laboratorio sencilla sin estructuras complejas.

Antes de avanzar con este método en un ambiente productivo, es conveniente revisar las particularidades de cada caso, hacer las pruebas en un ambiente de QA y tomar los recaudos necesarios de copias de seguridad.

lunes, 24 de febrero de 2014

¿Cómo darle estilo a la primera línea de un DIV?

Tenemos una vista en SharePoint 2007 que nos muestra varias columnas. La columna 4 es un campo de varias líneas de texto. Cuando vemos su contenido HTML, vemos que es un DIV con varias líneas separadas por BR.

¿Cómo hacemos para darle estilo a la primer línea?

La respuesta es con un poco de jquery, usando algunos trucos:
  • Por un lado usamos el atributo summary para identificar la vista.
  • Luego agregamos span a cada línea
  • Y luego le damos estilo al primer span

Aquí el código:

$('table [summary=Preguntas frecuentes] tr td:nth-child(4) div')
  .contents()
    .filter(function() {
      return this.nodeType === 3;
    })
      .wrap( "<span></span>" )
      .end()
    .filter( "br" )
//    .remove()
    ;
$('table [summary=Preguntas frecuentes] tr td:nth-child(4) div span:nth-child(1)').css('font-weight','bold');

Y aquí el resultado:


Espero les sea útil!

lunes, 17 de febrero de 2014