sábado, 12 de diciembre de 2009

Relaciones Maestro-Detalle en SharePoint – Algunas ideas

Uno de los temas que SP no resuelve bien, es el manejo de relaciones Padre-Hijo o Maestro-Detalle. En este breve artículo voy a a comentar algunas ideas a cerca de cómo resolver esta problemática. Espero que estas ideas les sean útiles, pero realmente también espero más ideas. Imagino que muchos de los lectores habrán probados diferentes soluciones, y ojalá podamos compartirlas!

Introducción

Para resolver una relación de este tipo, necesitamos encontrar soluciones para estos temas:

  1. Establecer la relación entre el padre y el hijo
  2. Filtrar los ítems del hijo en base al ID del padre
  3. Pre-seleccionar el campo del padre en el momento del alta.
  4. Ocultar el campo del padre en el momento del alta o la modificación
  5. Mostrar datos de la cabecera cuando estamos viendo a los hijos

1. Establecer la relación entre el padre y el hijo

Para establecer esta relación podemos usar la funcionalidad OOTB (Out of the box) que nos permite crear columnas en una lista de tipo “búsqueda”, es decir algo muy cercano a una clave foránea.

Esto ha sido particularmente mejorado en SP 2010 por dos motivos:

  • Existe algo de integridad referencial ya que se puede impedir que se elimine el padre si existen hijos.
  • Se pueden mostrar diferentes campos del padre, no sólo uno como en SP 2007

2. Filtrar los ítems del hijo en base al ID del padre

Cuando queremos mostrar el detalle de un maestro, necesitamos filtrar. Si bien podríamos usar las conexiones entre webparts OOTB, estas son algo limitadas. Una opción es utilizar los filtros por URL que describí en este artículo: http://surpoint.blogspot.com/2009/09/filtrando-desde-la-url-tips.html

Esto funciona bastante bien, en la siguiente imagen pueden ver cómo se ve:

image

3. Pre-seleccionar el campo del padre en el momento del alta.

Algo clave es poder preseleccionar la clave del padre al momento de dar un alta. Esto lo he podido solucionar con un viejo artículo de MSDN:

http://blogs.msdn.com/sharepointdesigner/archive/2007/06/13/using-javascript-to-manipulate-a-list-form-field.aspx

Sin embargo aún tengo problemas no resueltos y es que el usuario puede ver como el código JavaScript selecciona en el combo “delante de sus ojos”. Esto queda un poco feo.

4. Ocultar el campo del padre en el momento del alta o la modificación

Al momento de dar un alta, además de seleccionar la clave del padre, es necesario también ocultar el campo. Lo mismo sucede en el momento de editar el registro. Para esto he trabajado con una muy buena función en JavaScript para ocultar campos. Pueden verla aquí:

http://www.cleverworkarounds.com/ (sección SharePoint Branding Series 2)

Sin embargo, tiene el mismo problema que el paso 3, el usuario ver el campo y luego ve como desaparece. Supongo que debe poderse arreglar.

5. Mostrar datos de la cabecera cuando estamos viendo a los hijos

Bien, esto lo he resuelto modificando los datos del título de la página con JQuery tal como se ve en la imagen:

image

La idea es que en el título se vean los datos del padre, mientras que la lista muestra los hijos. De esta manera el usuario entiende mejor en que lugar de la aplicación se encuentra. Si alguien le interesa me avisa y pego el código.

Concluyendo

La relación Maestro-Detalle es un tema no resuelto, pero a la vez esencial para crear aplicaciones comerciales. En este artículo expuse algunas ideas que me han dado resultado, pero que también tienen algunas dificultades. Espero recibir feedback para mejorarlas. Desde ya les agradezco. Hasta la próxima!

17 comentarios:

Hola Juan Pablo, soy nuevo en esto de sharpoint pero encontre algo que resuelve el tema de las relaciones http://slam.codeplex.com/ dale un vistaso y me decis que te parece.
Gabriel

Interesante link Gabriel. Creo haberlo visto hace un tiempo. Entiendo que es una solución que apunta a facilitar las consultas relacionales (sincronizando las listas con tablas SQL). En mi caso no se me ha dado tanto esa problemática, pero estimo que a más de uno le podrá ser útil.

El tipo de problemas con los que me he encontrado, en relación a maestro-detalle, tienen que ver con armar pantallas medianamente inteligentes, es decir, que sepan que hay una relación maestro detalle, pero sin tener que invertir demasiado tiempo en desarrollo.

Lo que escribí en el artículo soluciona parte del problema, pero supongo que alguien más en este mundo habrá encontrado otras alternativas.

Gracias por el aporte!

Hola Juan Pablo, gracias por contestar, me gustaría que me orientes con respecto a como guardar la info en listas que tengan relacion (1-1,1-n etc.) como sería la forma correcta, utilizo
infopath, webparts u otra cosa?
Gabriel

Hola Gabriel.
Mira, desde mi punto de vista, la forma de relacionar listas en SharePoint es a través de campos lookup.
De todas maneras debes tener en cuenta que las listas en SharePoint no son un modelo relacional y tendrás limitaciones.
Si usas SP 2010, tienes mejoras interesantes al respecto.

Hola Juan Pablo, Justamente estoy con este problema. Necesito una vista que me muestre Maestro Detalle pero es solo de consulta, no necesito dar de alta ni modificar desde aquí porque a eso lo hago desde un formulario que tengo en un user control metido en una webpart. Qué es lo mas fácil que me recomiendas aplicar para mostrar los datos?
Gracias, Saludos
Marcos

Marcos:
No sé si es lo más fácil, pero una buena combinación es:
1) Crear una webpart en C# para mostrar los datos de la cabecera
2) Mostrar los hijos con una vista estándar de SharePoint aplicando fitro por ID por URL.
Saludos!

Juan Pablo me puedes ayudar?
he creado un sitio, donde tengo una primera lista que contiene proyectos (nombre, descripción, fecha inicio) a realizar, luego tengo una segunda lista donde mantiene compromisos a cumplir en cada proyecto, en esta lista la columna principal es el titulo del compromiso(linea de texto), luego tengo una descripción (multilinea), una columna de búsqueda para asignarla a un proyecto, y por ultimo un estado, que es verdadero o falso (cumplido o no cumplido)...

mi problema consiste en lo siguiente:

necesito contar cuantos compromisos y cuantos compromisos cumplido están vinculados a cada proyecto, luego pasar esos valores a nuevas columna (totales, cumplidos) en la primera lista de proyecto o en su defecto crear una tercera lista que tenga tres columnas (proyecto, totales, cumplidas).

como lo puedo hacer

PD: disculpa si la pregunta no va aca.

Podrías crear un manejador de eventos en la lista de compromisos que se dispare cada vez que se cree o modifique un compromiso para que actualice los totales en el proyecto.

También puedes crear un proceso batch para que se ejecute periódicamente y actualize la información.

Otras alternativas son crear una vista de los compromisos agrupadas por proyecto y por estado y agregar los totales que requieras. También puedes crear una página a medida que calcule los totales o un reporte en Reporting Services.

Como ves hay muchas opciones.
Espero que te sirva.
Saludos!

gracias por tu respuesta,

Los manejadores de evento se realizan con visual estudio, no lo tengo disponible..

creo que probare con eso de las vistas, aunque no se como agregar los totales.

valla que me ha salido dificil...

ninguna de las opciones que me has dado me sirve, creo que por lo restringuido de estas cosas de licencia, no puedo hacer mucho...

lo de las vistas estuvo bien, pero no era realmente lo que buscaba.

La mayoria de las cosas que he podido realizar ha sido con jquery. creo que buscare por ese lado crear la lista resumen.

¿Estás usando SharePoint 2007 o 2010?

Con 2007 y sin posibilidad de instalar componentes en el servidor estás más limitado. Tal vez debas ir por el lado de WebServices. Por supuesto que con jQuery siempre puedes manipular un poco los datos.

Te consultaba porque en 2010 tienes el Cliente Object Model para acceder a datos del servidor y lo puedes ejecutar desde JavaScript.

Después cuéntame cómo te ha ido. Saludos!

Buenas tardes a todos
Como podria hacer un formulario Tipo factura.
por ejemplo
por cada factura se puede incluir varios detalles
y por cada detalle tres Items
Descripcion - Cantidad - Precio

Gracias y
Saludos

Lo ideal es hacerlo con programación, a través de una webpart que te maneje la relación maestro-detalle. Y dejar el estándar para las pantallas de datos básicos o de listas de ítems por ejemplo.

Este comentario ha sido eliminado por el autor.

Paola, esto puede ayudarte http://surpoint.blogspot.com.ar/2013/12/relaciones-de-maestro-detalle-en.html

Publicar un comentario en la entrada