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

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

domingo, 9 de febrero de 2014

Ejemplos de CAML en Client Object Model (JavaScript)

Introducción

El modelo de objetos de cliente de SharePoint ha sido una gran incorporación en SharePoint 2010. Nos permite consultar información de listas, utilizando sólo un poco de código JavaScript. No se requiere desarrollo a nivel de servidor, ni permisos especiales en la granja de SharePoint.

Uno de los usos más comunes, que al menos yo le he dado, es consultar información de listas, para luego desplegarla  utilizando diferentes formas de presentación gráfica. Para ello, suelo utilizar consultas en lenguaje CAML. CAML tiene sus particularidades. En este breve artículo voy a presentar algunos ejemplos que me han resultado útiles.

En caso que nunca hayan utilizado Client Objetc Model, quizá sea conveniente que lean una introducción: http://surpoint.blogspot.com/2011/10/introduccion-al-modelo-de-objetos-de.html

 

Caso 1: empezando…

En el primer ejemplo, vamos a mostrar un caso completo. En los siguientes mostraremos sólo las variaciones. Imaginemos que necesitamos hacer una consulta simple, en donde veremos:

·         Cómo ordenar elementos

·         Cómo indicar qué columnas mostrar

·         Cómo indicar que queremos traer sólo una fila

 

function cargar_noticia_destacada() {

 contexto = new SP.ClientContext.get_current();

 var lista = contexto.get_site().get_rootWeb().get_lists().getByTitle('Noticias');

 var query = new SP.CamlQuery();

 var consulta =

  '<View>' +

  // Ordenada por fecha de cración (ID) descendente

  '<Query><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>' +

  // Una sóla noticia

  '<RowLimit>1</RowLimit>' +

  '<ViewFields>' + 

  '<FieldRef Name="ID"/><FieldRef Name="Title"/><FieldRef Name="Resumen"/><FieldRef Name="Imagen_x0020_destacada"/>' +

  '</ViewFields>' +

  '</View>';

 query.set_viewXml(consulta);

 this.items = lista.getItems(query);

 contexto.load(items);

 contexto.executeQueryAsync(Function.createDelegate(this, this.cargaok_noticia_destacada), Function.createDelegate(this, this.cargamal));

}

 

En la siguiente función vemos  cómo procesar los ítems leídos. Esto por supuesto depende de nuestra página, pero lo muestro para que tengan un ejemplo de cómo se haría.

 

function cargaok_noticia_destacada(sender, args) {

var itemslista = this.items.getEnumerator();

while (itemslista.moveNext()) {

 var elitem = itemslista.get_current();

 var strHtmlImg  = elitem.get_item('Imagen_x0020_destacada').get_url();  

 var strHtmlTxt  ='<span class="h1">&gt; ' + elitem.get_item('Title') + '</span><br /><br />' + elitem.get_item('Resumen');

 var strHtmlBtn2 ='<a target="_self" href="javascript: AbrirVentanaModal(\'' + window.location.href.replace("/default.aspx","") + '/lists/Noticias/DispForm.aspx?ID=' + elitem.get_item('ID') + '&source=' + window.location.href + '\');"/>';  

 var strHtmlBtn1 ="<a href='" + window.location.href.replace("/default.aspx","") + '/lists/Noticias/' + "'/>";  

 }

// Imagen

$("#general_modulo1_img img").attr("src",strHtmlImg);

// Título y resumen

document.getElementById("general_modulo1_txt").innerHTML = strHtmlTxt  ;

// Noticia completa

$('#general_modulo1_btn td:nth-child(2) img').each(function() {

$(this).wrap(strHtmlBtn2);

       });

// Más noticias

$('#general_modulo1_btn td:nth-child(1) img').each(function() {

    $(this).wrap(strHtmlBtn1 );

});

$('#general_modulo1_btn td:nth-child(1) img').css("border","none");

}

 

Y finalmente nuestra rutina de error:

function cargamal(sender, args) {

alert('ERROR: ' + args.get_message() + '\n' + args.get_stackTrace());

}

 

Caso 2: agregando una condición

En este segundo ejemplo, vamos a ver cómo agregar una condición de igual sobre un campo de tipo texto:

'<Query><Where><Eq><FieldRef Name="Mostrar_x0020_en_x0020_p_x00e1_g"/><Value Type="Text">Si</Value></Eq></Where><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>'

 

Caso 3: filtro por fecha actual

Supongamos ahora que queremos filtrar un campo fecha, comparándolo con la fecha del sistema. Veremos que necesitamos indicar el tipo de campo, e indicarle que no compare usando la hora:

'<Query><Where><Eq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today /></Value></Eq></Where></Query>'

 

Caso 4: filtrando entre fechas

Nuevamente compararemos con la fecha de sistema, pero esta vez, una comparación entre dos fechas:

'<Query><Where><And><Leq><FieldRef Name="Desde"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today/></Value></Leq><Geq><FieldRef Name="Hasta"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today/></Value></Geq></And></Where><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>'

 

Caso 5: filtro por campo calculado

En el siguiente ejemplo, mostraremos cómo filtrar cuando nuestra columna es un campo calculado:

'<Query><Where><Eq><FieldRef Name="Apellido_x0020_y_x0020_nombre" /><Value Type="Computed">' + persona_seleccionada + '</Value></Eq></Where></Query>'

                              

Caso 6: filtro por campo de búsqueda

En este otro caso, vemos como filtrar en campos de búsqueda:

'<Query><Where><Eq><FieldRef Name="Usuario" LookupId="TRUE"/><Value Type="Lookup">' + usuario_conectado + '</Value></Eq></Where></Query>'

 

Caso 7: fecha ingresada por pantalla

Finalmente veremos un caso en donde necesitamos comparar contra una fecha ingresada por pantalla. El truco aquí es el formato de la fecha, el cual debemos formatear así:

var desde = ISODateString(Pdesde);

var hasta = ISODateString(Phasta);

 

La función utilizada es:

function ISODateString(d){

  function pad(n){return n<10 ? '0'+n : n}

  return d.getUTCFullYear()+'-'

      + pad(d.getUTCMonth()+1)+'-'

      + pad(d.getUTCDate())+'T'

      + pad(d.getUTCHours())+':'

      + pad(d.getUTCMinutes())+':'

      + pad(d.getUTCSeconds())+'Z'

}

Por último, el CAML para comparar las fechas ingresadas con las registradas en la lista:

'<Query><Where><And><Leq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="TRUE">' + hasta + '</Value></Leq><Geq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="FALSE">' + desde + '</Value></Geq></And></Where></Query>'

 

Conclusión

La utilización de Client Object Model de JavaScript nos brinda una forma muy sencilla de consultar información y mostrarla en una página de diferentes formas. En este breve artículo hemos mostrado algunas variantes del lenguaje de consulta CAML para entender cómo se aplican diferentes condiciones. Espero que les haya resultado útil. 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/

 

Artículo publicado originalmente en: http://www.compartimoss.com/revistas/numero-17/ejemplos-caml-client-object-model-javascript

lunes, 3 de febrero de 2014

Modificar los enlaces de navegación en SharePoint 2007 vía programación

Supongamos que tenemos que modificar en forma masiva los enlaces de navegación de nuestro sitio. Por ejemplo, para corregir un error típico como puede ser la eliminación de direcciones absolutas.



Este es un requerimiento que puede resolverse con facilidad vía programación, a través de una página o una aplicación de consola. En este ejemplo, les muestro cómo hacerlo en una página ASPX para todos los sitios de la colección activa.

Espero les resulte útil !

<%@ 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="Microsoft.SharePoint.Navigation" %>

<script runat="server">

protected override void OnLoad(EventArgs e) {

string reemplazar = "http://misitio.com.ar";
string modificado;
string resultado = "<table><tr><td>It</td><td>Nombre</td><td>Url</td></tr>";

SPSite SI = SPContext.Current.Site;
SPWebCollection WEBS = SI.AllWebs;

foreach (SPWeb WE in WEBS) {

WE.AllowUnsafeUpdates = true;

resultado += "<tr><td><strong>" +  WE.Url + "</strong></td></tr>";

foreach (SPNavigationNode NODO in WE.Navigation.TopNavigationBar) {

resultado += "<tr><td>" +  NODO.Id + "</td><td>" +  NODO.Title + "</td><td>" +  NODO.Url + "</td></tr>";

if (NODO.Url.IndexOf(reemplazar) != -1) {
modificado = NODO.Url.Replace(reemplazar,"");

NODO.Url = modificado;
NODO.Update();

resultado += "<tr><td style='color:red;'>" +  modificado + "</td></tr>";
}

}

WE.Update();
WE.AllowUnsafeUpdates = false;

}


Response.ContentType = "text/plain";
Response.Write(resultado);


}

</script>

Leer y almacenar propiedades de perfiles de usuario en SharePoint 2007 vía programación

En este breve articulo explicaremos cómo resolver un requerimiento en donde nos piden mover las propiedades de los perfiles de usuario de SharePoint 2007, de un servidor a otro. El enfoque que seguiremos es el siguiente:

  • Creamos una página ASPX que lea el contenido
  • Copiamos el contenido y lo pegamos dentro de un Excel
  • Copiamos el contenido y lo pegamos en una Lista
  • Creamos una página ASPX que lea el contenido de la lista y lo almacene en el servidor destino
Utilizamos una línea intermedia, porque por un tema de seguridad, los servidores no se ven entre sí.


Creamos una página ASPX que lea el contenido

<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Assembly Name="Microsoft.Office.Server, 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="Microsoft.Office.Server" %>
<%@ Import Namespace="Microsoft.Office.Server.UserProfiles" %>

<script runat="server">

protected override void OnLoad(EventArgs e) {


// Acceso al Sitio
ServerContext CTX = ServerContext.GetContext(this.Site);

// Loop Usuarios
UserProfileManager UPM = new UserProfileManager(CTX);

string resultado = "<table><tr><td>Cuenta</td><td>Foto</td><td>Web</td></tr>";

foreach (UserProfile UP in UPM) {

resultado += "<tr><td>" + UP["Accountname"].Value + "</td><td>" + UP["PictureUrl"].Value + "</td><td>" +  UP["PersonalSpace"].Value + "</td></tr>";

        }

resultado += "</table>";

// Impresión de Resultado
        
Response.ContentType = "text/plain";
Response.Write(resultado);

}

</script>


Copiamos el contenido y lo pegamos dentro de un Excel
Esta acción es un simple copiar y pegar. Pero es un buen momento para arreglar contenido o direcciones absolutas en caso que lo necesitemos.


Copiamos el contenido y lo pegamos en una Lista
Creamos una lista llamada UP con los campos que necesitemos, en nuestro caso: Título (para el nombre de cuenta), Foto y Web. Todos campos de texto simple.

Creamos una página ASPX que lea el contenido de la lista y lo almacene en el servidor destino

<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Assembly Name="Microsoft.Office.Server, 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="Microsoft.Office.Server" %>
<%@ Import Namespace="Microsoft.Office.Server.UserProfiles" %>

<script runat="server">

protected override void OnLoad(EventArgs e) {

string resultado = "<table><tr><td>Cuenta</td><td>Foto</td><td>Web</td></tr>";
string foto;
string web;
string cuenta;
int ok = 0;
int nook = 0;

// Acceso al Sitio
ServerContext CTX = ServerContext.GetContext(this.Site);

// Leer y almacenar los datos de perfiles de usuario

SPWeb WE = SPContext.Current.Web;
SPList LI = WE.Lists["UP"];

WE.AllowUnsafeUpdates = true;

UserProfileManager UPM = new UserProfileManager(CTX);

foreach (SPListItem IT in LI.Items){

if (IT["Foto"] != null) { foto = IT["Foto"].ToString(); } else { foto = "" ; }
if (IT["Web"] != null) { web = IT["Web"].ToString(); } else { web = "" ; }

cuenta = IT["Title"].ToString();
if ( UPM.UserExists (cuenta) ) {

UserProfile UP = UPM.GetUserProfile(cuenta);

                if (UP["PictureUrl"] != null)
                {
UP["PictureUrl"].Value = foto;
               }

                UP["PersonalSpace"].Value = web;

UP.Commit();

ok += 1;
}
else {
nook += 1;
}

resultado += "<tr><td>" + IT["Title"].ToString() + "</td><td>" + foto + "</td><td>" +  web + "</td></tr>";

        } 

WE.AllowUnsafeUpdates = false;

resultado += "</table>";
resultado += "<strong>Perfiles encontrados: " + ok.ToString() + "</strong>";
resultado += "<br/><strong>Perfiles NO encontrados: " + nook.ToString() + "</strong>";

        
Response.ContentType = "text/plain";
Response.Write(resultado);

}


</script>

Finalmente, podemos revisar los resultados dentro del SSP:



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

lunes, 27 de enero de 2014

¿Cómo retornar los usuarios de todos los grupos de un sitio con Client Object Model en SharePoint 2010?

Les dejo este script que permite retornar todos los usuarios de todos los grupos de un sitio. Incluye algunos detalles como:
  • Máximo de grupos
  • Grupos que comienzan con un prefijo
  • Formato HTML
Está basado en el siguiente artículo de MSDN que les recomiendo: http://msdn.microsoft.com/en-us/library/office/hh185012(v=office.14).aspx
 
Código:
 
<script type="text/javascript">
ExecuteOrDelayUntilScriptLoaded(retrieveAllUsersAllGroups, "sp.js");
function retrieveAllUsersAllGroups() {
    var clientContext = new SP.ClientContext.get_current();
    this.collGroup = clientContext.get_web().get_siteGroups();
    clientContext.load(collGroup, 'Include(Title,Id,Users.Include(Title,LoginName))');

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded() {
    this.userInfo = '<style>.mitabla td {border: solid blue 1px;}</style><table class="mitabla"><tr><td>Grupo<td>Usuario</td><td>Cuenta</td></tr>';
    // Top de Grupos
    var primeros = 500;
    var i = 1;
    var groupEnumerator = collGroup.getEnumerator();
    while (groupEnumerator.moveNext() && i <= primeros ) {
 i += 1;
        var oGroup = groupEnumerator.get_current();
        var collUser = oGroup.get_users();
        var userEnumerator = collUser.getEnumerator();
        while (userEnumerator.moveNext()) {
            var oUser = userEnumerator.get_current();
    
     // Condición de prefijo de nombre de grupo
     if ( oGroup.get_title().substr(0,2) == "AF" ) {
             this.userInfo += '<tr><td>' + oGroup.get_title() + '</td><td>' + oUser.get_title() + '</td><td>' + oUser.get_loginName() + '</td></tr>';
  }

        }
    }
       
    this.userInfo += '</table>';
    document.write(this.userInfo);
}
function onQueryFailed(sender, args) {
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
</script>

jueves, 9 de enero de 2014

Diseñador CAML para SharePoint 2013

Les dejo este interesante enlace para los que necesiten trabajar com CAML:

http://feedproxy.google.com/~r/SharepointKings/~3/2qe_xL7xN5c/caml-designer-for-sharepoint-2013.html

martes, 7 de enero de 2014

Herramienta para dimensionar SharePoint 2010

Les dejo esta interesante herramienta que les puede resultar útil para dimensionar SharePoint 2010:


Se llama HP Sizer for Microsoft SharePoint. 


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.