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 :-)

miércoles, 11 de diciembre de 2013

Relaciones de Maestro Detalle en SharePoint 2007 con jQuery (simple y efectivo)

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 este artículo vamos a mostrar un ejemplo para WSS 3.0 que utiliza programación del lado del cliente.

Funcionalidades que necesitamos

En esta lista detallo lo que necesitamos. A lo largo del artículo veremos cómo implementaremos cada caso:

· ¿Cómo vincular en las listas al padre y al hijo?

· ¿Cómo mostrar los hijos de un padre?

· ¿Cómo tener un botón que dispare la creación un hijo para el padre seleccionado?

· ¿Cómo crear un hijo sin tener que completar manualmente los datos del padre?

· ¿Cómo ocultar los datos del padre en el momento de editar el hijo?

¿Cómo vincular en las listas el padre y al hijo?

Para vincular, yo prefiero usar el campo ID del padre como referencia en el hijo. No creo que ese campo necesite ser de tipo “búsqueda”, con lo cual, simplemente creamos en el hijo un campo con estas características:

· Nombre = Padre (o lo que se adapte mejor a nuestro caso)

· Tipo = Texto

· Obligatorio

¿Cómo mostrar los hijos de un padre?

Una forma sencilla para evitar programación es usar las conexiones entre elementos web. Con lo cual, simplemente creamos una página de elementos web en donde:

· Agregamos en la parte superior una lista del padre

· Agregamos en la parte inferior la lista con los hijos

· Conectamos los dos elementos web, vinculando el ID del elemento web de arriba con el Padre del elemento web de abajo.

¿Cómo tener un botón que dispare la creación un hijo para el padre seleccionado?

Para disparar la creación de un hijo, vamos a agregar un botón llamado “Nuevo” en cada fila de la lista padre. Este botón puede ser simplemente un enlace. En principio existen al menos tres enfoques para agregar este botón:

· Mediante un flujo de trabajo

· Mediante un manejador de eventos

· Mediante código JavaScript

En este caso vamos a trabajar con código JavaScript. ¿Por qué? Porque las dos primeras opciones son asincrónicas y puede generar la necesidad de que el usuario tenga que actualizar la pantalla luego del alta del padre, para poder ver el botón “Nuevo”. Esto es difícil de explicar al usuario final.

Nuestro enfoque consistirá en:

· Un elemento web de edición de contenido (CEWP) que ejecute código Java Script que reemplace la columna ID por el nuevo botón.

· Para ello trabajaremos con jQuery

· El contenido de la CEWP lo almacenaremos en un archivo en una librería, para facilitar futuros cambios: maestro_dedalle_boton_nuevo.html

A continuación vemos el código necesario.

 

<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;

// Nombre de la lista hija

var lista_hija = "Registros SP";

// Texto para el botón o imagen

var texto_boton = "<img style='border: none;' src='/_layouts/images/itann.gif'/ title='Agregar registro' >";

// Estilo del botón nuevo

var estilo_boton = "";

// Título columna

var titulo_columna = "Agregar";

// Fin de Parámetros importantes

// Id de ítem

var identificador;

// 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 > td:nth-child("+posicion_id+")").each(function( index ) {

// Obtengo el ID del elemento

identificador = $( this ).text();

// Cambio el ID por el botón nuevo

$( this ).html("<a style='" + estilo_boton + "' href='" + nuevo_hijo + identificador + "'>" + texto_boton + "</a>") ;

});

</script>

En la imagen, podemos ver cómo se ve la lista antes y cómo se ve luego:

clip_image002

¿Cómo crear un hijo sin tener que completar manualmente los datos del padre?

Dentro de la pantalla NewForm vamos a realizar lo siguiente:

· Completar el valor del campo Padre

· Ocultar el campo Padre (la fila completa)

A continuación el código necesario:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla NewForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID.";

// Fin de Parámetros importantes

// Completamos el valor del campo Padre

var valor_padre = url_param("padre");

$('input[title="' + campo_padre + '"]').attr("value",valor_padre);

$('input[title="' + campo_padre + '"]').parent().parent().parent().css("display","none");

// Función para leer un valor de parámetro de URL

function url_param ( name ){

name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

var regexS = "[\\?&]"+name+"=([^&#]*)";

var regex = new RegExp( regexS );

var results = regex.exec( window.location.href );

if( results == null )

return "";

else

return results[1];

}

</script>

¿Cómo ocultar los datos del padre en el momento de editar el hijo?

Esto aplica tanto a la pantalla de edición, como a la pantalla de display. A continuación el código requerido:

Para la pantalla DispForm:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla DispForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID_x002e_";

// Fin de Parámetros importantes

// Ocultar la fila

$('a[name="SPBookmark_' + campo_padre + '"]').parent().parent().parent().css("display","none");

</script>

 

Para la pantalla EditForm:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla EditForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID.";

// Fin de Parámetros importantes

// Ocultar la fila

$('input[title="' + campo_padre + '"]').parent().parent().parent().css("display","none");

</script>

Conclusión

Hemos visto un método bastante simple y efectivo para crear relaciones de maestro detalle en SharePoint 2007. No requiere programación del lado del servidor y soporta cambios futuros a las listas al no requerir la programación de pantallas a medida.

Espero les resulte útil. Hasta la próxima.

lunes, 18 de noviembre de 2013

La plantilla que ha elegido no es válida o no se encuentra

En el momento de intentar crear un sitio a partir de una plantilla obtenemos el siguiente error:

image

En inglés: The template you have chosen is invalid or cannot be found

Luego, analizando los logs, se observa un poco más de detalle:

  • Failed to mark site-scoped features active in site …
  • Failed to apply template "Template v_15.stp" to web at URL …
  • La plantilla que ha elegido no es válida o no se encuentra.

Una posible causa a este problema es que el sitio esté tratando de hacer uso de una característica inexistente. Esto puede darse cuando la plantilla se creó en un ambiente y luego se intenta crear el sitio en otro ambiente.

Utilizando el programa STP inspector, se puede analizar la plantilla y detectar que características generan el problema.

image

Un vez que detectan las características problemáticas pueden buscar un poco más de información. En mi caso busqué en este enlace: http://blogs.msdn.com/b/ketaanhs/archive/2009/06/29/sharepoint-2007-wss-3-0-feature-list-with-guid.aspx y detecté a través de los nombres, que se trataban de características del paquete de las 40 aplicaciones fabulosas de SharePoint. Con lo cual, en este caso puntual, el problema se resolvió instalando:

Si esto no soluciona el problema, pueden modificar el STP en forma manual, tal como se explica en este artículo: http://sharepointbox.blogspot.com.ar/2010/05/template-you-have-chosen-is-invalid-or.html (esta última solución no la he probado)

Espero les resulte útil, hasta la próxima!

miércoles, 9 de octubre de 2013

Trucos para vincular dos listas en SharePoint Designer

Les dejo un par de trucos para vistas sobre orígenes combinados de listas en SharePoint Designer. Si nunca armaron una de estas vistas, en este enlace pueden encontrar un paso a paso de cómo crearlas:

http://www.codeproject.com/Articles/194252/How-to-Link-Two-Lists-and-Create-a-Combined-Ciew-i

Truco 1: vincular dos listas a través de un campo de búsqueda

La forma más sencilla de hacerlo, sin meterse en XLST, es agregar el ID del elemento padre como columna a mostrar en el campo de búsqueda (nueva funcionalidad en SP 2010) y armar el join con ese campo. Este muy bien explicado en este enlace:

http://deannaschneider.wordpress.com/2011/11/11/joined-subviews-with-linked-datasources-in-sharepoint-2010/

Truco 2: vincular tareas creadas por un flujo de trabajo

¿Qué pasa si queremos mostrar las tareas asociadas a un ítem de lista creadas por un flujo de trabajo? En este caso se utiliza el campo WorkflowLink. ¿Pero cómo hacemos para desarmar este campo y que sólo me muestre el ID de la tarea? Con un poco de XLST, muy bien explicado en este artículo:

http://deannaschneider.wordpress.com/2012/07/25/joining-the-task-list-with-related-content-in-a-dvwp/

Espero les haya resultado útil. Hasta la próxima!

domingo, 6 de octubre de 2013

MVP SharePoint Server 2013


Por tercer año consecutivo recibo el premio MVP por parte de Microsoft, por mis aportes a la comunidad en relación a SharePoint, unas de mis tecnologías favoritas. Realmente me pone muy feliz y lo agradezco. No hay mucho más qué decir, tan sólo animar a los futuros MVPs en trabajar en recibir este premio, es un camino difícil, pero posible. Vale la pena.
Nos estamos viendo :-)
Más información en: mvp.microsoft.com

viernes, 27 de septiembre de 2013

Problemas con campos de búsqueda en un flujo de trabajo

Los campos de búsqueda en SharePoint a veces traen algunos problemas. ¿Por qué? Porque utilizan distintos componentes HTML (Input o Select) según si tienen más o menos de 20 elementos. Pero hay un pequeño detalle adicional. Esto sólo sucede en Internet Explorer, el comportamiento es distinto en Chrome o FireFox.

Un detalle como preguntarse por la condición vacía dentro de un flujo de trabajo para un campo de búsqueda, debe contemplar esto, comparando por vacío o por 0;#

Les dejo una imagen para clarificar:


miércoles, 25 de septiembre de 2013

No llega el mail de las notificaciones en la lista de tareas

Supongamos el escenario en que tenemos una lista de Tareas con la opción de enviar una notificación a la persona a la que se le asigna la tarea. Este correo no está funcionando, no llega a destino. Sin embargo otros correos, como los envíados por un flujo de trabajo, sí llegan. Una posible solución, que me ha funcionado es: configurar "No" en estas notificaciones, salvar, luego configurar "Si" y volver a salvar. Espero que les sea útil!

martes, 3 de septiembre de 2013

¿Cómo editar en hoja de datos en SharePoint 2010 si no tengo instalado Office?

En caso que requieran editar en "hoja de datos" los ítems de una lista en SharePoint 2010 y no posean instalado Office, recibirán un error.

Una solución sencilla es instalar los "2007 Office System Driver: Data Connectivity Components" que pueden descargar desde: http://www.microsoft.com/en-us/download/details.aspx?id=23734

Fuentes:

jueves, 29 de agosto de 2013

Error inesperado al agregar un usuario en SharePoint

En el momento de agregar un usuario en SharePoint 2010, seguimos estos pasos:
  1. Ir a la sección de permisos: /_layouts/user.aspx
  2. Usar la opción "Conceder permisos"
  3. Abrir la libreta de direcciones vía "examinar"
  4. Buscar un usuario y agregarlo.
En el momento de presionar "Aceptar", aparece un "Error desconocido".
En el log podemos ver la siguiente información la siguiente información:
System.InvalidOperationException: Namespace prefix 'xsd' is not defined.    at System.Xml.Serialization.XmlSerializationReader.ToXmlQualifiedName(String value, Boolean decodeName)     at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDictionaryEntryArray.Read1_Object(Boolean isNullable, Boolean checkType)     at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDictionaryEntryArray.Read2_DictionaryEntry(Boolean checkType)     at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDictionaryEntryArray.Read3_ArrayOfDictionaryEntry() c4460fbb-9ea1-4ac0-a344-cacc0c9d9456
Se trata de un problema de incompatibilidad entre SharePoint y las versiones 9 y 10 de Internet Explrorer. Las 2 soluciones:
  1. Usar F12 y pasar a IE8 (temporal)
  2. Modificar una página maestra según indico a continuación:
La página a modificar es "pickerdialog.master".
Se encuentra ubicada en "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS"
Agregar la siguiente línea de código (la resaltada en rojo) dentro del <head>
<head>
<meta name="GENERATOR" content="Microsoft SharePoint" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Expires" content="0" />

domingo, 25 de agosto de 2013

Diseño Gráfico en SharePoint Foundation 2010.

Resumen:
En este artículo se detalla un enfoque de desarrollo orientado a aplicar diseño creado por un diseñador gráfico en SharePoint Foundation 2010. Al final del camino, se busca un sitio como el siguiente:
image
Imagen 1 – Ejemplo de página de inicio con diseño gráfico
Dentro de los objetivos perseguidos, hay dos que se consideran los más importantes:
  • Separar dentro de lo posible el trabajo del diseñador gráfico del trabajo del desarrollador
  • Facilitar la mantenibilidad del sistema, evitando utilizar funciones menos conocidas por los desarrolladores, como crear una página maestra desde cero o utilizar código de servidor.
Principales lineamientos:
  • La plataforma es Foundation, no Server.
  • El diseño es de un ancho fijo, diferente al estándar de SharePoint que ocupa el ancho total de la pantalla.
  • Se busca preservar la ribbon porque posee funcionalidad muy importante, pero tratando de que no ocupe tanto el centro de atención.
  • Existen elementos de cabecera que se repiten en todas las páginas, lo que incluye una imagen, el usuario conectado y un menú horizontal. También un pie de página.
  • La imagen de cabecera es más alta que la ribbon de SharePoint.
  • Existen elementos que sólo se ven en la home page, como la efemérides, la fecha del día y el contenido en sí.
  • El contenido de la home page, posee un diseño gráfico, muy diferente al estándar de SharePoint.
Enfoque técnico
  • Se busca maximizar el uso de CSS
  • Se busca minimizar el uso de la Página Maestra
  • Se crea el contenido propio de la home con Cliente Object Model (Java Script) para poder formatearlo con mayor facilidad
Página Maestra
El primer paso consiste en crear nuestra propia página maestra. En muchos casos se parte desde un página maestra básica (starter), pero nosotros preferimos copiar la estándar. Para ello debemos completar los siguientes pasos:
  1. Abrimos nuestro sitio desde SharePoint Designer y nos ubicamos en la sección “Master Pages”
  2. Copiamos la página “v4.master” y le ponemos un nombre como “intranet.master”
  3. Luego elegimos la opción “Set as default master page
Página de inicio con diferente diseño
Supongamos que necesitamos una página de inicio con tres o cuatro columnas. Si bien, desde SharePoint 2010, es posible elegir cualquier página como home page, vamos a optar por un método que nos dé mayor flexibilidad, siguiendo estos pasos:
  1. Crear una librería de documentos llamada “Internal”
  2. Creamos una archivo llamado “Intranet_Home.htm”
  3. Agregar una CEWP en la home que llame a ese archivo
Ese archivo contendrá scripts y estilos que sólo se apliquen en la home page. Puro HTML, JavaScript, jQuery y CSS.
Hoja de estilos
Creamos un archivo llamado “Intranet.css” para definir los estilos que sobre-escriban los de SharePoint. Este archivo podemos almacenarlo en la librería “Internal”.
Luego modificamos la página maestra (en SharePoint Server no sería necesario modificar la página maestra), agregando el siguiente código antes del “</head>”:
<SharePoint:CssRegistration name="/sites/TUSITIO/Internal/Intranet.css" After="corev4.css" runat="server"/>
Así queda nuestra nueva librería Internal y la librería de páginas maestras:
image
Imagen 2 – Librerías Internal y Master Pages
También modificamos la página maestra para agregar el pie de página, siendo esta nuestra última modificación, ubicada luego de SharePoint:DeveloperDashboard:
<div id="intranet_footer">LA EMPRESA - RECURSOS HUMANOS - PROYECTOS - NOTICIAS</div>
Lo importante, teniendo en cuenta uno de los objetivos, es que apenas hicimos dos simples cambios en la página maestra.
Estilos generales
En el siguiente código, se muestran los estilos generales que buscan:
  • Crear una cabecera con diseño
  • Preservar la ribbon
Este estilo se ubica dentro de Intranet.css:
/* -------------------------------------------------
Ocultamiento de secciones
------------------------------------------------- */
/* Oculto Acciones del Sitio */
.ms-siteactionsmenu { display: none; }
/* Ocultar Icono de navegación hacia arriba */
.s4-breadcrumb-anchor { display: none; }
/* -------------------------------------------------
Ajustes estéticos
------------------------------------------------- */
/* Seteo el color de fondo */
body { background-color: #828282; }
/* Aplico un ancho fijo, no 100% */
#s4-ribbonrow, #s4-workspace
{
max-width: 1100px;
margin: 0 auto;
padding: 0px;
background-color: white;
}
/* -------------------------------------------------
Imagen de cabecera
------------------------------------------------- */
/* Agrando la Ribbon porque la imagen es más alta */
#s4-ribbonrow { padding-top:37px; min-height: 133px !important; }
/* Oculto la fila de título y navegación */
#s4-titlerow { margin-top: -88px; }
/* Subo las solapas de la Ribbon para que no molesten a la imagen, especialmente si hay un logo a la izquierda */
.ms-cui-topBar2 { margin-top: -37px; }
.ms-cui-tabContainer { border-top: #B8BABD 1px solid; background-color: white; padding-top: 20px; }
.ms-cui-tabBody { padding-bottom: 17px; background-image: none; }
/* Elimino el fondo del título y del top navigator */
.s4-title { background: none; }
/* Seteo mi imagen de cabecera en la ribbon row */
#s4-ribbonrow { background-image: url('/sites/TUSITIO/Internal/header.png'); }
/* Saco el fondo de la ribbon que molesta a la imagen */
#s4-ribboncont { background: none !important; }
/* Posiciono en forma fija al top navigation */
.menu-horizontal { position: fixed !important; top: 134px !important; }
/* Subo el menú de usuario */
#RibbonContainer-TabRowRight { margin-top: -10px; }
/* Elimino el borde superior de la ribbon */
.ms-cui-topBar2 { border: 0px; }
/* Ajustes de algunos bordes */
#s4-topheader2 { border-top: 0px !important; background: white !important; }
/* Borde derecho a la izquierda de la scrollbar molesta */
#s4-titlerow { border-right: 0px; }
/* -------------------------------------------------
Estilos en barra superior
------------------------------------------------- */
/* Menú de bienvenida*/
.ms-welcomeMenu A:link {
color: #8F8F8F;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
}
/* Colores de solapas de la ribbon, tratando de que no sean tan visibles */
.ms-cui-tt-a, .ms-cui-cg-t { color: #B8BABD !important; }
.ms-cui-cg-t, .ms-cui-ct-ul { background: none !important; }
.ms-cui-ct-ul, .ms-cui-cg-i, .ms-cui-cg, .ms-cui-tt-a {border-color: #F4F3F9 !important; }
.ms-cui-cg-i {border-color: transparent !important; }
.ms-cui-cg {border-color: transparent !important; }
/* -------------------------------------------------
Estilos en Top Navigation
------------------------------------------------- */
/* Efecto de margen izquierdo */
.s4-tn .menu-horizontal {
margin-left: 200px;
}
/* Estilo de los links */
.s4-tn .menu-item-text {
color: #FCFCFC;
font-size: 11px;
border-right: #FCFCFC solid 1px;
padding-right: 25px;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
}
/* Estilo del link seleccionado */
.s4-tn .selected {
font-weight: bold;
}
.s4-tn .selected .menu-item {
background: none !important;
border: none !important;
}
/* Estilo del link hover */
.s4-tn .menu-item:hover {
text-decoration: none !important;
}
/* -------------------------------------------------
Footer
------------------------------------------------- */
#intranet_footer {
background-color: #ACACAD;
margin-top: 15px;
font-family: Arial, Helvetica, sans-serif;
font-size: 9px;
color: white;
text-align: center;
padding: 4px;
clear: both;
border-top: white solid 40px;
}
En la siguiente imagen, puede observarse la forma que adquiere la Ribbon:
image
Imagen 3 – Ejemplo de ribbon con el diseño gráfico aplicado
Sobre la imagen de cabecera
La imagen de cabecera posee algunas características importantes:
  • Ocupa todo el ancho fijo: 1100px
  • Debe ser de la altura 170px (si se cambia, hay que ajustar la CSS)
  • Posee un sombreado en la parte superior (como parte de la imagen)
  • Posee el logo a la izquierda, dejando algo de espacio en blanco para la botonera (solapas) de la ribbon
  • La zona de abajo es el fondo de los links de la Top Navigation
La imagen de cabecera ejemplo es:
image
Imagen 4 – Ejemplo de imagen para la cabecera
La home page
En la home page, trabajamos sobre estos aspectos principales:
  • Nombre de usuario
  • Efeméride
  • Botón de subsitio
  • Contenido de la home
Buscamos algo como lo siguiente:
image
Imagen 5 – Particularidades de la página de inicio
Nombre de usuario
El nombre de usuario se ve a la izquierda con el agregado del “Bienvenido” y “> > >”. Para ello trabajamos con una técnica jQuery que nos permite insertar HTML:
$('#zz15_Menu span').prepend('Bienvenido&nbsp;');
$('#zz15_Menu span').append(' > > > ');

Efeméride

A la derecha, arriba, agregamos:
  • La fecha actual obtenida con JavaScript
  • La efeméride obtenida con Cliente Object Model
Para obtener la fecha actual, usamos código javascript.

Para obtener la Efeméride, consultamos los datos de una lista usando Cliente Object Model, tal como lo expliqué en un artículo previo, que pueden encontrar en: http://surpoint.blogspot.com.ar/2011/10/introduccion-al-modelo-de-objetos-de.html

Para insertar la efeméride (ítem extraído de una lista), usamos:

ExecuteOrDelayUntilScriptLoaded(cargar_efemeride, "sp.js");
$('.ms-cui-ribbonTopBars').append($('#efemeride'));

Dentro del código que lee la efeméride (cargar_efemeride), se cargó previamente un div de la siguiente forma:

document.getElementById("efemeride").innerHTML = strHtml;

El div debe existir en Intranet_Home.htm:

<div id="efemeride"></div>


Botón de subsitio

Este es un simple botón que agregamos en nuestro HTML de la siguiente forma:

<table id="subsitio_contenedor">
 <tr>
 <td width="990px"></td>
 <td width="100px">
 <a id="subsitio" href="/sites/blablabla.aspx">Subsitio</a>
 </td>
 </tr>
</table>

Resultado

image
Imagen 6 – Botón de acceso a un subsitio


El contenido de la home

Siguiendo el enfoque de las efemérides, cargamos todo el contenido de la home. Lo primero que hacemos es crear una tabla para nuestro contenido, con el diseño que más nos guste. Este es un ejemplo:

<table id="super_contenedor">
 <tr>
 <td>
 <table class="cumples-tabla">
 <thead>
 <tr>
 <th>Para compartir</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td><div id="cumples"></div></td>
 </tr>
 </tbody>
 </table>
 </td>
 <td><strong>Zona reservada para noticias</strong>: Lorem ipsum ad ... </td>
 </tr>
 <tr>
 <td><strong>Zona reservada para anuncios</strong>: Lorem ipsum ad ... </td>
 <td><strong>Zona reservada para noticias en las sedes</strong>: Lorem ipsum ad his scripta blandit partiendo... </td>
 </tr>
</table>

Ocultamos la zona de webparts de la derecha:

$('#ctl00_MSO_ContentDiv table table td:first').width("100%");

Y luego insertamos con client object model los datos que consultamos desde listas de SharePoint, asociando las clases para aplicar  los estilos que nos proporcionó el diseñador gráfico.

Obtenemos algo como lo siguiente:


image

Imagen 7 – Ejemplo de información obtenida con Client Object Model

Los estilos de la home

Habrán notado que algunas cosas son distintas en la home, como el ocultamiento de la ribbon o la ubicación del nombre de usuario. Para ello aplicamos estilos propios:

<style>
/* -------------------------------------------------
 Ajustes generales
 ------------------------------------------------- */
/* Ocultar Inicio Rápido */
#s4-leftpanel { display: none; }
.s4-ca { margin-left: 0px; }
/* Ocultar solapas de Ribbon*/
.ms-cui-tts { display: none; }
/* Y el borde de la top navigation */
#s4-topheader2 { border-bottom: 0px !important; }
/* Nombre de usuario a la izquierda */
#RibbonContainer-TabRowRight { float: left; }
/* Efeméride a la derehca */
#efemeride {
 color: #03935F;
 font-weight: bold;
 text-transform: uppercase;
 font-size: 11px;
 font-family: Arial, Helvetica, sans-serif;
 float: right;
 margin-top: -39px;
 margin-right: 10px;
}
/* Fecha actual a la derecha*/
#fecha {
 font-size: 11px;
 font-family: Arial, Helvetica, sans-serif;
 color: #8F8F8F;
 font-weight: normal;
 text-transform: none;
}
/* Botón de llamada a un subsitio */
#subsitio {
 font-size: 18px;
 font-family: Arial, Helvetica, sans-serif;
 color: white;
 background-color: #F9B10F;
 border: solid 4px white;
 border-right: none;
 padding: 5px 10px;
 text-align: center;
}
#subsitio_contenedor {
 position: fixed;
 top: 91px;
}
/* -------------------------------------------------
 Contenedor de partes
 ------------------------------------------------- */
/* Estilo de la Tabla que contiene cada una de las partes (contenido) */
#super_contenedor {
 width: 100%;
}
#super_contenedor td {
 padding: 10px;
 vertical-align: top;
}
/* -------------------------------------------------
 Para compartir (estilos para mostrar cumpleaños)
 ------------------------------------------------- */
.cumples-tabla th {
 background-color: #288BCE;
 color: white;
 font-family: Arial, Helvetica, sans-serif;
 font-size: 13px;
 font-weight: bold;
}
.cumples-tabla td {
 background-color: #CBE9F6;
}
</style>

Conclusión

En este artículo explicamos un camino para incorporar diseño gráfico a SharePoint. Existen diferentes formas de encarar esta tarea. En este caso buscamos una que no requiera demasiados conocimientos específicos de SharePoint, que no “desarme” funcionalidades como la ribbon, pero que a la vez permita personalizar el diseño haciendo que no se parezca a “SharePoint”.

Hasta la próxima!

Bibliografía

Real World Branding with SharePoint 2010 Publishing Sites
SharePoint Branding 101: Branding Master Pages
SharePoint 2010 branding. A beginners guide
10 Worst Mistakes in SharePoint Branding
SharePoint Ribbon CSS Tips and Tricks
SharePoint 2010 CSS Reference Chart

Juan Pablo Pussacq Laborde
SharePoint MVP
Blog: http://surpoint.blogspot.com/
Facebook: http://facebook.com/surpointblog/
Twitter: http://twitter.com/jpussacq/

lunes, 29 de julio de 2013

Error al insertar o modificar un campo de búsqueda

En caso que resivan el siguiente error:

The list item could not be inserted or updated because invalid lookup values were found for the following field(s) in the list...

o

No se pudo insertar ni actualizar el elemento de lista porque se encontraron valores de búsqueda no válidos para el siguiente campo o campos en la lista:...

Una posible solución es quitar las opciones de integridad referencial del campo en la lista. Funciona bien.

En caso que esto no sea una solución para ustedes, existe un parche (que no he probado) disponible en: http://support.microsoft.com/kb/2687375

Más información en: http://answers.flyppdevportal.com/categories/sharepoint2010/sharepoint2010general.aspx?ID=fc14a846-403c-4abb-85c6-af27a1dee159

miércoles, 10 de julio de 2013

¿Cómo mostrar el campo ID en EditForm y DispForm en SharePoint 2007?

Insertando una CEWP que contenga el siguiente código:

<script type="text/javascript">

function MostrarIdItem() {

// Obtengo el ID de las URL
var regex = new RegExp("[\\?&]"+"ID"+"=([^&#]*)","i");
var query_string = regex.exec(window.location.href);
var item_id = query_string[1];

// Armo el HTML del campo ID
var TD1 = document.createElement("TD");
TD1.className = "ms-formlabel";
TD1.innerHTML = "<h3 class='ms-standardheader'>ID</h3>";
var TD2 = document.createElement("TD");
TD2.className = "ms-formbody";
TD2.innerHTML = item_id;
var fila_elemento = document.createElement("TR");
fila_elemento.appendChild(TD1);
fila_elemento.appendChild(TD2);

// Inserto el HTML
var item_tbody = GetSelectedElement(document.getElementById("idAttachmentsRow"),"TABLE").getElementsByTagName("TBODY")[0];
item_tbody.insertBefore(fila_elemento,item_tbody.firstChild);
}

_spBodyOnLoadFunctionNames.push("MostrarIdItem");

</script>

Fuente: http://blog.pathtosharepoint.com/2009/01/18/item-id-in-display-and-edit-forms/

lunes, 27 de mayo de 2013

Lecciones aprendidas de un proyecto de Workflow en Project Server 2010

En este breve artículo voy a resumir algunas lecciones aprendidas en un proyecto de implementación de flujo de trabajo en Project Server 2010. A pesar de que estos proyectos deben desarrollarse en Visual Studio (excepto que usen Nintex), no voy a centrar el artículo en cuestiones técnicas, sino en aspectos funcionales y de arquitectura. Esto se debe a que muchas veces no sabemos cuál es el mejor enfoque para resolver un problema en esta tecnología, debido fundamentalmente a la falta de información. A continuación, mis experiencias en casos reales, que intentan poner un granito más de arena a este mundo, en donde una búsqueda en Google arroja tan pocos resultados que nos hace sentir cierto temor...

clip_image001

 

Introducción

La funcionalidad de flujos de trabajo en Project Server se utiliza muchas veces para manejar el proceso de aprobación de los proyectos antes de su ejecución. Si bien la arquitectura de flujos de trabajo de Project Server está montada sobre la de SharePoint, posee muchos aspectos propietarios que nos dirigen con mucha fuerza hacia un formato de solución. Estos lineamientos principales se pueden resumir en los siguientes puntos:

1) A través de configuración se define un conjunto de fases y etapas que constituyen los pasos de nuestro flujo de trabajo. Las etapas son importantes porque pueden definir detalles como la obligatoriedad de los campos de empresa o la posibilidad de definirlos como sólo lectura. También pueden definir qué páginas de empresa pueden estar visibles. Y por último no debe olvidarse que servirán de filtros en nuestras vistas de Project Server.

2) La arquitectura de las PDPs nos permite crear páginas de SharePoint que se muestran dentro del contexto de uno o varias etapas de nuestro flujo de trabajo. Al ser páginas de SharePoint, nos permiten agregar cualquier tipo de elemento web, no es necesario usar elementos web exclusivos de Project Server. Esto nos brinda una posibilidad enorme de extender nuestros flujos de trabajo, con configuración y/o desarrollo.

3) Por último, los campos de empresa clásicos de Project Server, forman parte del corazón del flujo de trabajo. Constituyen la manera más sencilla de capturar información en cada uno de los pasos. Pero no es la única forma y tiene algunas limitaciones.

 

Lección 1) Maestro detalle

Es casi imposible escaparle a este requerimiento. En algún momento vamos a necesitar que en alguno de los pasos se cargue o visualice información de detalle. Ejemplos: productos, documentos, notas, etc. La forma más sencilla que se puede utilizar es creando una PDP que contenga varios elementos web: un elemento de la lista de SharePoint en donde guardaremos el detalle; un elemento de formulario InfoPath que sirva para crear elementos de detalle asociados al maestro (el proyecto); y un elemento de filtro de URL para pasar el dato de ID del Proyecto a los otros elementos web. Este esquema no requiere programación y es muy potente. Y puede ser mejorado con Client Object Model.

Más información en: http://surpoint.blogspot.com/2012/12/workflow-en-project-server-2010-como.html

 

Lección 2) Valores predeterminados en campos de empresa

Con el uso de las pdps y toda su estructura para manejo de campos de empresa, seguramente necesitarás completar valores predeterminados en los campos e incluso ocultarlos. Esta característica no funciona como se espera con las opciones fuera de la caja, en particular con la configuración del valor predeterminado del campo en la configuración de Project Server. Sin embargo, siempre es posible usar algo de código jQuery para ayudar. La siguiente porción de código, que pueden incluir en una CEWP muestra cómo resolver esta problemática:

$('input[title="'+id_campo+'"]').attr("value",texto_valor);

$('input[title="'+id_campo+'"]').attr("LTValue",guid_valor);

$('input[title="'+id_campo+'"]').parent().parent().parent().parent().parent().parent().css("display","none");

Más información en: http://surpoint.blogspot.com/2013/01/workflow-en-project-server-2010-valores.html

 

Lección 3) Manejo de rechazos en un paso del flujo de trabajo

Manejar vuelta a pasos anteriores siempre es algo complicado en un flujo de trabajo. Un requerimiento muy común, es que ante un rechazo, se pueda modificar la información y relanzar el proceso. Una forma sencilla de resolver esto en Project Server es:

• Asignar tareas a los distintos aprobadores, en la que puedan elegir entre Aprobar o Rechazar

• Ante una aprobación, pasar a la siguiente etapa

• Ante un rechazo terminar el flujo de trabajo

• Si el iniciador quiere volver a iniciar el proceso, deberá hacer uso de la opción Restar Workflow, para lo cual habrá que haberle asignado el permiso correspondiente.

• Lo bueno es que la información de campos de empresa no se pierde, así que sólo debe modificar lo que cambió

• Una posible mejora es crear una lista en SharePoint que muestre un log de aprobaciones y rechazos histórico, para que el usuario pueda conocer en cada caso las razones de los rechazos.

clip_image002

 

Lección 4) Asignación de tareas basada en roles

Un requerimiento típico es que las tareas de aprobación de cada paso deban ser asignadas a diferentes personas, dependiendo de una condición, basada en algún campo completado en algún paso. Una forma de resolver esto es crear una lista en SharePoint que maneje las reglas de asignación. El usuario configura en esta lista la regla, por ejemplo: "cuando el país es Argentina y el sector es Marketing, entonces el grupo de asignación es Gerentes de Marketing de Argentina."

Internamente, el flujo de trabajo consulta la lista con el fin de obtener el grupo de asignación para cierta condición. Ese grupo, no es más que un grupo de SharePoint que puede incluir uno o varios miembros. Cuando el flujo de trabajo asigna la tarea al grupo, SharePoint envía el mail en forma automática. Este tipo de reglas le dan enorme flexibilidad al flujo de trabajo.

 

Lección 5) Visibilidad de PDPs

Project Server nos permite definir qué PDP puede estar visible en cada etapa del flujo de trabajo. Esto nos da mucho poder con poco esfuerzo. A continuación enumero sólo algunos ejemplos, como para entender el alcance funcional:

• Diferentes campos de empresa en cada etapa

• Habilitar la PDP de Schedule sólo a partir de una determinada etapa

• Mostrar información de una lista de SharePoint de forma distinta en diferentes etapas. Por ejemplo con opciones de creación y edición en una etapa, y con opciones de sólo lectura en otras etapas

• Diferentes páginas de estado en diferentes etapas

clip_image004

Estos fueron sólo algunos ejemplos y nunca debemos olvidar la innumerable cantidad de opciones que tenemos al poder personalizarlas con diferentes elementos:

• Varios elementos web de Project Fields, que nos permiten agrupar la información.

• Infopath

• Reporting Services

• Listas de SharePoint

• CEWP con código JavaScript y con Client Object Model

• Librearías de documentos

• Estado visual del flujo de trabajo

• Elementos de filtro por URL

• Etc.

Más información en:

• Fases y etapas: http://surpoint.blogspot.com/2012/11/workflow-en-project-server-2010-como_3147.html

• PDPs: http://surpoint.blogspot.com/2012/11/workflow-en-project-server-2010-como.html

• PDP de estado: http://surpoint.blogspot.com/2012/11/workflow-en-project-server-2010-como_30.html

 

Lección 6) Sobre el uso de campos de empresa

Los campos de empresa constituyen la alternativa natural para capturar información en un flujo de trabajo.

clip_image006

Esto está muy bien y es recomendable, pero conviene tener en cuenta algunas cuestiones:

• La cantidad de campos puede afectar el rendimiento de Project Server. De hecho es una de las variables para realizar un dimensionamiento de la arquitectura.

• Los campos aparecen en Project Pro y la única forma de no mostrarlos es usando la funcionalidad de departamentos.

• Modificar un campo desde un flujo de trabajo implica operaciones costosas como la desprotección y la protección del proyecto. Y lo más importante es que nadie verá los cambios hasta que no se publique el proyecto.

• Los campos de empresa no manejan información repetitiva como las relaciones maestro detalle.

• Los campos de empresa no tiene flexibilidad en el manejo de tipos de datos, ni permiten validaciones sofisticadas.

Es por ello que en algunos casos, la alternativa de usar listas de SharePoint nos permite soluciones más livianas y flexibles. Es absolutamente recomendable usar esta alternativa en muchas situaciones, no en todas por supuesto.

 

Lección 7) Seguridad

A diferencia de la mayoría de las implementaciones de Project Server, en donde la configuración estándar suele cubrir muchos requerimientos, cuando implementamos un flujo de trabajo, aparecen algunas necesidades que a continuación enumero:

• La necesidad de crear un grupo y una categoría para los iniciadores de flujos de trabajo. Este grupo no suele coincidir con los líderes de proyecto y puede necesitar permisos especiales, por ejemplo para reiniciar un flujo de trabajo.

• La necesidad de crear un grupo para los que aprueban pasos del flujo de trabajo.

• La necesidad de crear grupos en SharePoint para poder acceder a listas como la de tareas, pero también a listas especiales que hayamos creado para capturar información durante el proceso.

• Por último, es posible que necesitemos crear un grupo de administración de la configuración del flujo de trabajo.

Más información en: http://surpoint.blogspot.com/2013/01/Workflow-ProjectServer-Seguridad.html

 

Conclusiones

En este breve artículo he intentado presentar algunas lecciones aprendidas en proyectos de gestión de la demanda en Project Server 2010. Lamentablemente es complicado encontrar suficiente información sobre este tema y a veces no es sencillo saber si estamos tomando la decisión correcta. Por ello este artículo: para compartir mi experiencia.

¿¿Y cuál ha sido tu experiencia???

Hasta la próxima!

 

Juan Pablo Pussacq Laborde
SharePoint MVP
Blog: http://surpoint.blogspot.com/
Facebook: http://facebook.com/surpointblog/
Twitter: http://twitter.com/jpussacq/

viernes, 17 de mayo de 2013

Flujos de trabajo en SharePoint 2007 asociados a tipos de contenido


Requerimiento
Poder asociar flujos de trabajo a tipos de contenido.
  • Esto permitiría por ejemplo que el mismo flujo de trabajo se aplique en un conjunto de sitios.
  • Eso también permite que los cambios al flujo de trabajo sean centralizados, facilitando el mantenimiento.
¿Puedo asociar un flujo de trabajo a un tipo de contenido con SharePoint Designer 2007?
No, no es posible. En SharePoint Designer 2007, sólo se puede asociar el flujo de trabajo a librerías o listas. Esta definición puede encontrarse en: http://msdn.microsoft.com/es-es/library/ms414204(v=office.12).aspx
En SharePoint 2010, el enfoque cambia, porque se pueden crear flujos de trabajo re-usables y luego asociarlos a un tipo de contenido.
La solución con Visual Studio
Si creamos un flujo de trabajo con Visual Studio, tenemos tres posibles métodos de asociación:
  • A una lista o librería
  • A un tipo de contenido. Imaginemos por ejemplo asociarlo al tipo de contenido “documento” lo que haría que el flujo de trabajo se ejecute cada vez que se crea un documento en cualquier librería de documentos, de cualquier sitio de la colección de sitios
  • A un tipo de contenido, dentro de una lista: lo que nos permite que un flujo de trabajo se ejecute sólo para algunos tipos de contenido dentro de una lista.
La solución mediante Visual Studio es más costosa porque se hace a través de código, pero definitivamente más flexible cuando necesitamos que un flujo de trabajo se utilice en muchos sitios a la vez.

martes, 7 de mayo de 2013

The Enterprise global already contains a group named 'No Group'

Síntomas del problema

Existen dos síntomas para este problema, los cuales se dan bajo las siguientes condiciones:

  • El proyecto es creado desde PWA
  • El proyecto usa un EPT sin flujo de trabajo
  • El proyecto se abre luego desde Project Pro
Síntoma 1:

El proyecto se crea con un plantilla de plan sencilla con sólo dos tareas desde PWA.
Al abrir el proyecto desde Project Pro aparece el siguiente mensaje:

"The Enterprise global already contains a group named 'No Group'"

Este grupo no puede ser luego eliminado desde el Organizador.

Síntoma 2:

El proyecto se crea con o sin plantilla de plan desde PWA.
Luego de utilizar la funcionalidad de Build Team, los recursos no aparecen para ser seleccionados en las tareas, exceptuando que se salve el proyecto luego de haber creado el equipo.

Causa del problema

La causa es un posible error luego de la migración desde Project Server 2007 a Project Server 2010. Aparentemente no habría terminado en forma correcta la desactivación del modo de compatibilidad hacia atrás: BCM - Project 2007 Compatibility Mode.

¿Cómo se puede visualizar la causa?
  1. La opción de BCM se encuentra desactivada e inhabilitada en Adittional Server Settings
  2. Se crear un proyecto desde PWA usando el EPT default
  3. Se abre el proyecto desde Project Pro
En la parte superior de la pantalla se observa el mensaje "Compatibility Mode". Este mensaje no debería aparecer, porque el servidor no está corriendo en modo de compatibilidad.

Solución al problema

La solución consiste en abrir la Enterprise Global (que estaría corrupta) y hacer un cambio menor, para que Project Server note que hay un cambio y decida almacenar una nueva versión de la misma. Un cambio menor puede ser simplemente cambiar el ancho de una columna.

Luego de realizar el cambio, grabar la Enterprise Global.

A partir de ahí sucede lo siguiente:
  • Los proyectos nuevos ya no experimentan el problema
  • En los proyectos que posean el problema, se puede utilizar la opción "Replace" en el momento en que aparece el mensaje "The Enterprise global already contains a group named 'No Group'" y luego salvar el proyecto.
Los proyectos no deberían presentar ahora la leyenda "Compatibility Mode"

Tener en cuenta que en algunos casos puede ser necesario limpiar el caché para que se tome la nueva versión de la Enterprise Global. Esto no aplica a los creados desde PWA porque no usan caché.

lunes, 6 de mayo de 2013

Sharepoint Messenger

Les dejo este interesante proyecto para implementar chat o messenger en SharePoint 2010:

viernes, 19 de abril de 2013

Búsqueda en una lista en SharePoint Foundation 2010 (sin código)

En este video nos explican como implementar una búsqueda sencilla dentro de una lista con SharePoint Designer.

jueves, 18 de abril de 2013

IGNITE de Project 2013

Transcribo desde El Faro de Project Server:


Buenas,
En este post quería haceros llegar la información acerca las sesiones IGNITE de Project 2013 (sobre todo) y de Visio 2013 que nuestro colega y MVP, Vicente Rubio, ha estado impartiendo, en Madrid, Barcelona y Miami, para la comunidad hispano parlante de estas dos tecnologías. Dicha formación fue realizada en 9 sesiones, y vamos a tener la oportunidad de verlas en los vídeos que se van a ir publicando en esta Comunidad.
El vídeo de introducción se puede localizar en este enlace:
http://www.youtube.com/watch?v=iwSmIN2Pq9w&list=PLtn_9iuPsL0_W12yZuk7TjlfWWnZemGSt&index=1La agenda es la siguiente:
  • Introducción
  • Sesión 1 “Trabajando con Project Online”
  • Sesión 2 “Trabajando con Project 2013”
  • Sesión 3 “Trabajando con Visio 2013”
  • Sesión 4 “Arquitectura de Project Server 2013”
  • Sesión 5 “Seguridad en Project server 2013”
  • Sesión 6 “Administración de Project Server 2013”
  • Sesión 7 “Gestión de la demanda en Project 2013”
  • Sesión 8 “Business Intelligence en Project 2013”
  • Sesión 9 “Integración de Project y Visio en Office 365”
La serie estará compuesta de 18 videos (9 presentaciones y 9 videos)

Esperamos os resulte de interés, un saludo

lunes, 1 de abril de 2013

10 puntos para enamorarse de Project Server 2013

Este es un breve de resumen de las novedades de Project Server 2013. La lista incluye los 10 puntos que personalmente me resultaron más interesantes. Hay mucho más para profundizar, pero esta pequeña lista inicial, servirá para tentarse, para interesarse en la nueva versión y para comenzar a imaginar migraciones o nuevas instalaciones. ¡Qué lo disfruten!

Cada vez que Microsoft libera una nueva versión de Project Server, supera mis expectativas. La versión 2010 me había parecido el cambio más significativo de su historia. Y cuando pensaba que una versión 2013 no podría innovar demasiado, otra vez quedo sorprendido. De repente, aparece ahí todo lo que necesitábamos. ¡Bienvenidos a Project Server 2013!

1. Project Server online

No, no, no. No esperaba tener Project Server en la nube, pero ahí está. Y esto es más que importante. Para empezar, PS sigue en la carrera de los productos más consagrados de Microsoft, lo que es muy importante, porque lo hace alinearse a las tendencias y adaptarse a los estándares. Pero claro que lo más importante creo yo, es haber bajado la barrera de entrada. Montar una infraestructura de Project Server nunca es sencillo para una organización, hasta ahora, que tenemos una opción de entrada realmente viable. Bien por este cambio. Seguimos en las ligas mayores.

2. Los avances de la edición web

Desde la versión 2010 comenzamos a disfrutar de la posibilidad de crear y editar proyectos vía web, sí, desde PWA. Esto sigue avanzando con varias mejoras en la versión 2013, entre la que destaco:

-La vista de timeline, una de las hermosas novedades de Project 2010 ahora en Project Server 2013. Cool!

-No más necesidad de presionar calcular.

-Ahora podemos grabar líneas base.

-Campos de costos y materiales, deadlines, más tipos de tareas, cálculo automático de fórmulas y más!

3. SharePoint Designer para los flujos de trabajo

Sí, leyeron bien, los difíciles flujos de trabajo para gestionar la demanda que debían hacerse en Visual Studio, ahora se pueden hacer en SharePoint 2013, con limitaciones por supuesto. Tremendo cambio!Fundamental y necesario. No resolverá todos los problemas, pero simplifica la creación de flujos de trabajo poco complejos. Bienvenido sea. Esperemos que el próximo sea que Microsoft compre o desarrolle una súper potente herramienta de workflow. Marcaría la diferencia.

4. Arquitectura

Varios cambios en la arquitectura. Odata Service nos permite generar reportes en Project Server on line, donde no podemos acceder a la base de datos directamente. Las famosas 4 bases de datos fueron consolidadas en 1 para achicar costos a la hora de montar la infraestructura de Project Server. Hay muchos más, muchos de ellos relacionados con la nueva variante de PS on line.

5. Opciones pre Project Server

Podemos tener sitios de proyecto sin necesidad de usar Project Server. No manejan la conexión con PS, sí con Project. Si queremos comenzar con un proyecto de menor peso, SharePoint nos permite crear una lista de tareas de proyecto. Hasta ahí, algo normal, pero qué dirían si esa lista se puede integrar en la lista de proyectos de Project Server y sus asignaciones pudiesen ser tenidas en cuenta para el cálculo de la disponibilidad. Sí, en la versión 2013 se puede hacer, lo que supone un interesante camino para ir desde proyectos más livianos a más pesados. Punto a favor.

6. Acceso desde dispositivos móviles

Fundamentalmente para la funcionalidad de SharePoint, podremos acceder desde Windows Phone, Apple o Android con capacidades de touchscreen. Si utilizamos el cliente de Exchange, también será posible actualizar el estado de nuestras tareas. Suma!

7. Consolidación de Mis Tareas

Ahora es posible en un sólo lugar consultar tu tareas de Project Server, de SharePoint y de Outlook. Otro gran paso hacia la usabilidad, especialmente para los miembros de equipo, quienes creo apreciarán mucho este cambio. Este tipo de acciones pueden hacer a Project Server más popular.

8. Administración

Muchas de las configuraciones que anteriormente encontrábamos en Server Settings fueron movidas a la administración de SharePoint. Esto también era algo necesario, que antes lo resolvíamos con configuraciones a medida de seguridad. Apunta a separar las configuraciones más funcionales, propias de una PMO de las que corresponden más a una área de infraestructura. Administración de cola, backup, OLAP y algunas configuraciones de flujo de trabajo y políticas operacionales, ahora están en Central Administration.

9. Nuevo modelo de Seguridad

Ahora disponemos de dos modelos de seguridad, el clásico, complejo y conocido de Project Server y uno nuevo basado en SharePoint, más sencillo con ventajas y desventajas. Este nuevo modelo no maneja RBS ni categorías. A favor, está integrado con la seguridad de SharePoint y permite manejar mejor la herencia de permisos. Una mejora necesaria, que dependerá de cada caso y de acuerdos entre distintas áreas, la opción a elegir.

10. Otras cositas

Cuando configuren el fuera de oficina en Outlook, Project lo notará y lo tendrá en cuenta, así no es necesario duplicar los calendarios de vacaciones. También existe Project Pro para 365. En los sitios de proyecto, podemos ver las tareas del proyecto y abrir desde allí Project Pro. Y mucho más, pero escapa al alcance de este artículo.

Esto fue sólo una lista inicial para tentarlos y empezar a pensar en migraciones y nuevas instalaciones. Hasta la próxima!

Juan Pablo Pussacq Laborde
MVP SharePoint
jpussacq@gmail.com
@jpussacq
http://surpoint.blogspot.com/

Publicado originalmente en CompartiMOSS: http://www.compartimoss.com/revistas/numero-14/10-puntos-para-enamorarse-de-project-server-2013

Me entrevistaron para CompartiMOSS

He tenido el honor de que me entrevisten para la revista especializada en SharePoint: CompartiMOSS. Les dejo el enlace para leer la entrevista:

http://www.compartimoss.com/revistas/numero-15/entrevista-a-juan-pablo-pussacq

Hasta la próxima!

cm

lunes, 18 de marzo de 2013

Workflow en Project Server 2010 ¿Cómo crear información de maestro detalle en una PDP? Enfoque 2

Las PDPs nos permiten capturar información que se almacenan en campos personalizados de Project Server. Sin embargo, un requerimiento muy común es que se necesiten cargar datos repetitivos asociados a un proyecto, como por ejemplo:

  • Productos afectados
  • Lista de stakeholders
  • Documentos
  • Etc…
En un artículo previo, explicamos como generar información de tipo maestro-detalle en Project Server utilizando InfoPath. Este enfoque funciona bien, exceptuando en los ambientes en donde el separador entre el apellido y el nombre del usuario es un ";". En esto caso, se produce un error al editar el formulario en InfoPath. Para resolverlo hay que utilizar otro separador, lo cual puede ser complicado en entornos que utilicen sincronización con AD.

Es por ello que estuve trabajando en una alternativa que no utilize InfoPath. Descarté también el uso de Client Object Model para armar una pantalla de alta, principalmente porque me obligaría a cambiar ese desarrollo cada vez que se haga un cambio en las columnas de las litas

El enfoque propuesto
  • Usar las pantallas estándar de SharePoint.
  • Alta
    • Crear un link para llamar a la pantalla de alta en forma modal
    • Pasarle como parámetro el ID del proyecto
    • Completar el campo de ID con el dato recibido en la URL
    • Ocultar el campo
    • Refrescar la pantalla en caso de alta
  • Modificación / Baja
    • Usar la pantalla de Display para arrancar estas operaciones. Porque si se arranca del Edit, al eliminar el registro, no se vuelve a la PDP original
    • Código para ocultar la clave del maestro
  • Código
    • Formado por cuatro CEWP, una para la PDP y las otras tres para las pantallas dispForm, EditForm y NewForm
A continuación, trasncribo el código utilizado:

El código para la PDP

<script src="/PWA/Internal/jquery-1.4.2.min.js" type="text/javascript"></script>

<script type="text/javascript">

 $("td:contains('There are no items to show in this view of the'):last").empty();

 function Callback (result, target) {
     if (result == SP.UI.DialogResult.OK) {
         window.location.reload();
     }

 }

 function AbrirVentanaModal( pUrl ) {  
   SP.UI.ModalDialog.showModalDialog(   
     {  
       url: pUrl,
       //width: 700,  
       //height: 600,
       dialogReturnValueCallback: Callback  
       //title: pTitulo  
     }  
   );  
 }

 function url_param ( name ){  
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
  var regexS = "[\\?&]"+name+"=([^&#]*)"; 
  var regex = new RegExp( regexS ); 
  var results = regex.exec( window.location.href ); 
  if( results == null ) 
    return "";
   else 
    return results[1];
 }

</script>

 <table><tr><td class="ms-addnew" style="padding-bottom: 3px"><span style="height:10px;width:10px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"><img src="/_layouts/images/fgimg.png" alt="" style="left:-0px !important;top:-128px !important;position:absolute;" /></span>&nbsp;<a class="ms-addnew" id="NewFinancialData" href="javascript: var PU=url_param('projuid'); AbrirVentanaModal('/PWA/Lists/Financial%20Data/NewForm.aspx?ProjUid='+PU)" target="_self">Add financial data</a></td></tr><tr><td><img src="/_layouts/images/blank.gif" width="1" height="5" alt="" /></td></tr></table>

El código para NewForm.aspx


<script src="/PWA/Internal/jquery-1.4.2.min.js" type="text/javascript"></script>

<script type="text/javascript">

 // Esto lo hago porque el Editar estándar desde la PDP vuelve a cualquier lado luego de eliminar, incluso cambiando el source
 $('input[title="Title"]').attr("value","Edit");
 $('input[title="Title"]').parent().parent().parent().css("display","none");
 
// Cargo el dato de clave del Maestro
 PU = url_param ('ProjUid');
 $('input[title="ProjUID"]').attr("value",PU);
 $('input[title="ProjUID"]').parent().parent().parent().css("display","none");

 function url_param ( name ){  
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
  var regexS = "[\\?&]"+name+"=([^&#]*)"; 
  var regex = new RegExp( regexS ); 
  var results = regex.exec( window.location.href ); 
  if( results == null ) 
    return "";
   else 
    return results[1];
 }

</script>

El código para EditForm.aspx
<script src="/PWA/Internal/jquery-1.4.2.min.js" type="text/javascript"></script>

<script type="text/javascript">

 $('input[title="Title"]').parent().parent().parent().css("display","none");
 $('input[title="ProjUID"]').parent().parent().parent().css("display","none");

</script>

El código para DispForm.aspx

<script src="/PWA/Internal/jquery-1.4.2.min.js" type="text/javascript"></script>

<script type="text/javascript">

 $('a[name="SPBookmark_Title"]').parent().parent().parent().css("display","none");
 $('a[name="SPBookmark_ProjUID"]').parent().parent().parent().css("display","none");

</script>

Enlaces relacionados



Hasta la próxima!