Compartir a través de


Búsquedas y relaciones entre listas

Última modificación: miércoles, 01 de diciembre de 2010

Hace referencia a: SharePoint Foundation 2010

En este artículo
Relaciones entre listas e integridad de los datos
Creación de una relación entre listas
Creación de consultas de varias columnas
Detección de relaciones entre listas
Detección de elementos relacionados

En Microsoft SharePoint Foundation, un campo de búsqueda es un campo que está configurado para obtener su valor de un campo de otra lista. Al agregar un campo de búsqueda a una lista, se crea una relación entre dicha lista y la lista que proporciona los datos.

La forma de referirse a las dos listas depende del punto de vista. Desde el punto de vista del campo de búsqueda, la lista que proporciona los datos es la lista de destino y el campo del que provienen los datos es el campo de destino. Desde el punto de vista de la lista de destino, la lista que contiene el campo de búsqueda es una lista relacionada. El campo de búsqueda en sí es un campo relacionado.

SugerenciaSugerencia

La clase SPList tiene un método GetRelatedFields que se puede usar para detectar los campos de búsqueda que apuntan a una lista.

Por motivos de simplicidad y para evitar confusiones, a veces se dice que las dos listas tienen una relación de elementos primarios y secundarios. La lista de elementos secundarios tiene el campo de búsqueda. La lista de elementos primarios tiene el origen de datos, que se trata del campo que es el destino del campo de búsqueda.

Relaciones entre listas e integridad de los datos

En Microsoft SharePoint Foundation 2010, puede configurar un campo de búsqueda en una lista secundaria para que aplique una restricción de eliminación a elementos de la lista primaria. Cuando se crea o edita una columna de búsqueda a través de la interfaz de usuario, tiene la opción Exigir comportamiento de relación. Si selecciona esta opción, después puede elegir Eliminación restringida o Eliminación en cascada. Eliminación restringida impide que un elemento de la lista primaria se elimine si uno o varios elementos de la lista secundaria hacen referencia a él. Con Eliminación en cascada, al eliminar un elemento de la lista primaria, se eliminan todos los elementos relacionados de la lista secundaria también.

Para habilitar el mismo comportamiento en el código, establezca la propiedad RelationshipDeleteBehavior de un objeto SPFieldLookup en un valor de la enumeración SPRelationshipDeleteBehavior, ya sea Restrict o Cascade.

Nota importanteImportante

Para que SharePoint Foundation realice una eliminación restringida o una eliminación en cascada, se debe indizar el campo de búsqueda. Establezca la propiedad Indexed del campo en true.

El propósito de una eliminación restringida es exigir la integridad referencial. La restricción se aplica cuando no se desea que un elemento que contiene un campo de búsqueda quede huérfano porque apunta a un elemento que no existe en la lista de destino.

Por ejemplo, suponga que tiene dos listas, Customers y Addresses. Decide relacionar las dos listas entre sí y, para ello, agrega un campo de búsqueda denominado Customer ID a la lista Addresses y apunta el campo de búsqueda al campo ID de la lista Customers. Después de configurar la búsqueda, aplica una restricción a la relación entre las dos listas especificando que las eliminaciones de la lista Customers deben actuar en cascada en la lista Addresses. Si elige la eliminación en cascada, exige integridad referencial al asegurar que la lista Addresses no recopile direcciones huérfanas. Cada vez que se elimina un elemento de la lista Customers, los elementos relacionados se eliminan automáticamente de la lista Addresses.

Suponga que tiene también una lista Pending Orders que, al igual que la lista Addresses, está vinculada a la lista Customers mediante un campo de búsqueda que apunta al campo ID de la lista Customers. Puede decidir que no desea que un registro de cliente se elimine de la lista Customers si el cliente tiene un pedido pendiente en la lista Pending Orders. En este caso, puede exigir la integridad referencial configurando el campo de búsqueda en la lista Pending Orders para que restrinja los elementos eliminados de la lista primaria, es decir, la lista de Customers.

Un efecto secundario de la eliminación en cascada o la eliminación restringida es que los valores de los campos de búsqueda se validan cuando se establecen. Cuando alguien crea un nuevo elemento a través de la interfaz de usuario, la columna de búsqueda se representa en el formulario mediante una lista desplegable si la lista de destino tiene menos de 20 elementos; en este caso, el usuario solo puede seleccionar valores válidos. Si el destino tiene más de 20 elementos, se usa otro control y el usuario debe escribir un valor; en este caso, si se escribe un valor no válido, aparece texto de validación en color rojo en el formulario. Se realiza una validación similar cuando se usa el modelo de objetos para establecer el valor de un campo de búsqueda. En este caso, si el valor especificado no apunta a un elemento existente en la lista de destino, SharePoint Foundation produce una excepción.

Tiene la opción de no aplicar ninguna restricción de eliminación a la lista de búsqueda. Por ejemplo, además de las listas Addresses y Pending Orders, puede tener una lista Complete Orders que, al igual que las listas relacionadas, apunte al campo ID de la lista de Customers. Podría decidir que desea mantener un registro de cualquier pedido completo, incluso cuando ya no mantiene un registro del cliente que hizo el pedido. La integridad referencial no es un problema, por lo que no se aplica ninguna restricción a los elementos eliminados de la lista de búsqueda. En este caso, la eliminación de un elemento de la lista Customers no afecta a la lista de pedidos completos.

Creación de una relación entre listas

Un campo de búsqueda se representa mediante una instancia de la clase SPFieldLookup. La clase incluye constructores, pero la forma más sencilla de crear un campo de búsqueda es llamar al método AddLookup de la clase SPFieldCollection. El método AddLookup tiene una sobrecarga que permite crear una búsqueda en una lista en un sitio web diferente del sitio donde se va a crear la búsqueda.

Nota

Puede crear una relación entre listas en sitios web diferentes, pero no puede establecer un comportamiento restrictivo sobre la relación. SharePoint Foundation no exige integridad referencial en las búsquedas web cruzadas.

Para agregar una columna de búsqueda a una lista

  1. Obtenga una referencia a la colección de campos de la lista mediante el acceso a su propiedad Fields.

  2. Llame al método AddLookup del objeto SPFieldCollection y pase el ID de la lista de búsqueda (el origen de datos) en el segundo parámetro.

    El método AddLookup devuelve una cadena con el nombre interno del nuevo campo.

  3. Obtenga una referencia al objeto SPFieldLookup que representa el nuevo campo mediante una llamada al método GetFieldByInternalName y pase la cadena que devuelve el método AddLookup como argumento.

    El método GetFieldByInternalName devuelve un objeto SPField, que se debe convertir al tipo SPFieldLookup.

  4. Establezca la propiedad LookupField en el nombre interno del campo en la lista de búsqueda que el objeto SPFieldLookup debe usar como origen de datos.

    El destino de la propiedad LookupField debe ser uno de los siguientes tipos de campo:

    Además, el destino puede ser de tipo SPFieldCalculated si el resultado es texto. Para obtener más información, vea la propiedad OutputType. El destino puede ser de tipo SPFieldComputed si las búsquedas están habilitadas para el campo. Para obtener más información, vea la propiedad EnableLookup.

  5. (Opcional) Si desea especificar un comportamiento de eliminación distinto de None (el comportamiento predeterminado), establezca la propiedad Indexed en true.

  6. (Opcional) Establezca la propiedad RelationshipDeleteBehavior con un valor de enumeración SPRelationshipDeleteBehavior.

    Nota importanteImportante

    El usuario debe tener permiso ManageLists en la lista de búsqueda a fin de especificar Cascade o Restrict. Para obtener más información, vea la enumeración SPBasePermissions.

    Además, la configuración de un comportamiento de relación produce un error si:

    • El campo de búsqueda permite varios valores.

      Antes de establecer la propiedad RelationshipDeleteBehavior, asegúrese de que la propiedad AllowMultipleValues devuelve false.

    • Los elementos de lista existentes contienen valores no válidos para el campo de búsqueda.

      Esto puede ocurrir si la propiedad RelationshipDeleteBehavior del campo de búsqueda se estableció previamente en None y alguien eliminó el elemento de la lista de destino al que apunta el campo de búsqueda. El campo de búsqueda, por lo tanto, queda huérfano, ya que contiene un valor no válido. No se puede exigir un comportamiento de relación si la lista contiene campos de búsqueda huérfanos.

    • El campo de búsqueda apunta a una lista en otro sitio web.

      Compruebe el valor de la propiedad LookupWebId del campo de búsqueda.

    • El número de elementos de la lista supera el máximo establecido para las listas de gran tamaño.

      Compare el valor que devuelve la propiedad ItemCount de la lista con el valor que devuelve la propiedad MaxItemsPerThrottledOperation de la aplicación web.

  7. Llame al método Update para confirmar los cambios en el objeto.

Ejemplo

El ejemplo siguiente es una aplicación de consola que crea una relación entre la lista Customers y la lista de Pending Orders. La aplicación llama al método AddLookup para agregar un campo de búsqueda llamado Customer ID a la lista Pending Orders y apunta el campo al campo ID de la lista Customers. El nuevo campo Customer ID se indiza y se establece para que restrinja los elementos eliminados de la lista de búsqueda.

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList lookupList = site.Lists.TryGetList("Customers");
                    SPList relatedList = site.Lists.TryGetList("Pending Orders");

                    if (lookupList != null && relatedList != null)
                    {
                        string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
                        SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);

                        primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
                        primaryCol.Indexed = true;
                        primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
                        primaryCol.Update();
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim lookupList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")

                If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then
                    Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
                    Dim primaryCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)

                    primaryCol.LookupField = lookupList.Fields("ID").InternalName
                    primaryCol.Indexed = True
                    primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
                    primaryCol.Update()
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

Creación de consultas de varias columnas

En SharePoint Foundation 2010 se pueden crear búsquedas de varias columnas en la misma lista de búsqueda. Por ejemplo, suponga que tiene dos listas: Customers y Pending Orders. Para crear una relación entre las listas, agrega una columna Customer ID a la lista Pending Orders y apunta la columna al campo ID de la lista Customers. Cuando ve elementos en la lista Pending Orders, desea ver información importante acerca del cliente que hizo el pedido, así como información que describa el pedido. Para resolver este problema, decide que además de la columna de búsqueda primaria, Customer ID, agregará tres columnas de búsqueda secundarias para mostrar el nombre, apellidos y número de teléfono del cliente.

La relación de las columnas secundarias de una búsqueda de varias columnas con la lista de búsqueda depende de la columna principal. No se puede aplicar una restricción de eliminación a una columna de búsqueda secundaria. La restricción aplicada a la columna principal es la única que se aplica a la lista de búsqueda.

El procedimiento para crear una columna de búsqueda secundaria es casi idéntico al procedimiento para la creación de una columna de búsqueda principal. La principal diferencia es que el campo se crea mediante una llamada al método AddDependentLookup de la clase SPFieldCollection en lugar del método AddLookup. El método AddDependentLookup tiene dos parámetros: el nombre para mostrar que se usa para el campo secundario y el identificador del campo principal.

Ejemplo

El ejemplo siguiente es una aplicación de consola que crea una relación entre la lista Customers y la lista Pending Orders. La aplicación llama al método AddLookup para agregar un campo de búsqueda principal llamado Customer ID a la lista Pending Orders y apunta el campo al campo ID de la lista Customers. El nuevo campo Customer ID se indiza y se establece para que restrinja los elementos eliminados de la lista de búsqueda.

Después de crear el campo de búsqueda principal, la aplicación crea tres campos secundarios denominados First Name, Last Name y Phone. La aplicación crea estos campos llamando al método AddDependentLookup del objeto que representa la colección de campos de la lista Pending Orders.

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList lookupList = site.Lists.TryGetList("Customers");
                    SPList relatedList = site.Lists.TryGetList("Pending Orders");

                    if (lookupList != null && relatedList != null)
                    {

                        // Create the primary column.
                        string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
                        SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);

                        primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
                        primaryCol.Indexed = true;
                        primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
                        primaryCol.Update();


                        // Create the secondary columns.

                        string strFirstNameCol = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id);
                        SPFieldLookup firstNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strFirstNameCol);
                        firstNameCol.LookupField = lookupList.Fields["First Name"].InternalName;
                        firstNameCol.Update();

                        string strLastNameCol = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id);
                        SPFieldLookup lastNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strLastNameCol);
                        lastNameCol.LookupField = lookupList.Fields["Last Name"].InternalName;
                        lastNameCol.Update();

                        string strPhoneCol = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id);
                        SPFieldLookup phoneCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPhoneCol);
                        phoneCol.LookupField = lookupList.Fields["Phone"].InternalName;
                        phoneCol.Update();
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim lookupList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")

                If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then

                    ' Create the primary column.
                    Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
                    Dim primaryCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)

                    primaryCol.LookupField = lookupList.Fields("ID").InternalName
                    primaryCol.Indexed = True
                    primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
                    primaryCol.Update()


                    ' Create the secondary columns.

                    Dim strFirstNameCol As String = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id)
                    Dim firstNameCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strFirstNameCol), SPFieldLookup)
                    firstNameCol.LookupField = lookupList.Fields("First Name").InternalName
                    firstNameCol.Update()

                    Dim strLastNameCol As String = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id)
                    Dim lastNameCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strLastNameCol), SPFieldLookup)
                    lastNameCol.LookupField = lookupList.Fields("Last Name").InternalName
                    lastNameCol.Update()

                    Dim strPhoneCol As String = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id)
                    Dim phoneCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPhoneCol), SPFieldLookup)
                    phoneCol.LookupField = lookupList.Fields("Phone").InternalName
                    phoneCol.Update()
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

Detección de relaciones entre listas

Es posible detectar qué campos de las listas relacionadas dependen de la información de una lista de búsqueda mediante una llamada al método GetRelatedFields en un objeto SPList que represente la lista de búsqueda. El método devuelve una colección de objetos SPRelatedField con las siguientes propiedades:

  • FieldId. Obtiene el Id del campo de búsqueda de la lista relacionada.

  • ListId. Obtiene el ID de la lista relacionada.

  • WebId. Obtiene el ID del sitio web donde se encuentra la lista relacionada.

  • RelationshipDeleteBehavior. Obtiene la restricción de eliminación definida para la relación.

El método GetRelatedFields tiene una sobrecarga que permite obtener información solo acerca de aquellos campos que especifican una restricción de eliminación determinada.

Se devuelve información únicamente para los campos relacionados que representan la columna principal de una búsqueda de varias columnas. Para obtener información acerca de las columnas secundarias, llame al método GetDependentLookupInternalNames del objeto SPFieldLookup que representa la columna principal.

Ejemplo

El ejemplo siguiente es una aplicación de consola que muestra información acerca de los campos en la lista Customers que proporcionan datos a los campos de búsqueda de otras listas. Para cada campo relacionado que representa una columna principal, la aplicación llama al método GetDependentLookupInternalNames para obtener una lista de campos que representan las columnas secundarias.

using System;
using System.Collections.Generic;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList targetList = site.Lists.TryGetList("Customers");
                    SPRelatedFieldCollection relatedFields = targetList.GetRelatedFields();

                    string strSeparator = new String('=', 70);
                    string strUnderline = new String('-', 20);
                    string strFormat = "Target Field: {0} | Related Field: {1}";

                    Console.WriteLine(strSeparator);
                    foreach (SPRelatedField fieldInfo in relatedFields)
                    {
                        using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                        {
                            SPList relatedList = relatedSite.Lists.GetList(fieldInfo.ListId, false);
                            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
                            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

                            Console.WriteLine("\nTarget List: {0} ({1}) | Related List: {2} ({3})", targetList.Title, site.Title, relatedList.Title, relatedSite.Title);

                            Console.WriteLine("\nPrimary Column");
                            Console.WriteLine(strUnderline);
                            Console.WriteLine(strFormat, targetField.Title, relatedField.Title);
                            Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior);

                            Console.WriteLine("\nSecondary Columns");
                            Console.WriteLine(strUnderline);

                            List<string> dependents = relatedField.GetDependentLookupInternalNames();
                            for (int i = 0; i < dependents.Count; i++)
                            {
                                SPFieldLookup lookup = relatedList.Fields.GetFieldByInternalName(dependents[i]) as SPFieldLookup;
                                SPField field = targetList.Fields.GetFieldByInternalName(lookup.LookupField);

                                Console.WriteLine(strFormat, field.Title, lookup.Title);
                            }
                            Console.WriteLine();
                            Console.WriteLine(strSeparator);
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim targetList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedFields As SPRelatedFieldCollection = targetList.GetRelatedFields()

                Dim strSeparator As String = New [String]("="c, 70)
                Dim strUnderline As String = New [String]("-"c, 20)
                Dim strFormat As String = "Target Field: {0} | Related Field: {1}"

                Console.WriteLine(strSeparator)
                For Each fieldInfo As SPRelatedField In relatedFields
                    Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                        Dim relatedList As SPList = relatedSite.Lists.GetList(fieldInfo.ListId, False)
                        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
                        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

                        Console.WriteLine(vbLf & "Target List: {0} ({1}) | Related List: {2} ({3})", _
                                          targetList.Title, site.Title, relatedList.Title, relatedSite.Title)

                        Console.WriteLine(vbLf & "Primary Column")
                        Console.WriteLine(strUnderline)
                        Console.WriteLine(strFormat, targetField.Title, relatedField.Title)
                        Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior)

                        Console.WriteLine(vbLf & "Secondary Columns")
                        Console.WriteLine(strUnderline)

                        Dim dependents As List(Of String) = relatedField.GetDependentLookupInternalNames()
                        Dim i As Integer = 0
                        While i < dependents.Count
                            Dim lookup As SPFieldLookup = _
                                TryCast(relatedList.Fields.GetFieldByInternalName(dependents(i)), SPFieldLookup)
                            Dim field As SPField = targetList.Fields.GetFieldByInternalName(lookup.LookupField)

                            Console.WriteLine(strFormat, field.Title, lookup.Title)
                            i = i + 1
                        End While
                        Console.WriteLine()
                        Console.WriteLine(strSeparator)
                    End Using
                Next
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

La aplicación de consola imprime resultados similares a los del ejemplo siguiente.

======================================================================

Target List: Customers (Team Site) | Related List: Complete Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: None

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Customer

======================================================================

Target List: Customers (Team Site) | Related List: Addresses (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Cascade

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Last Name
Target Field: First Name | Related Field: First Name

======================================================================

Target List: Customers (Team Site) | Related List: Pending Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Restrict

Secondary Columns
--------------------
Target Field: First Name | Related Field: First Name
Target Field: Last Name | Related Field: Last Name
Target Field: Phone | Related Field: Phone

======================================================================

Press ENTER to continue...

Detección de elementos relacionados

La interfaz de usuario de SharePoint Foundation 2010 tiene el botón Insertar lista relacionada en la cinta de opciones que permite a los usuarios editar la página que muestra una lista agregando un elemento web de lista relacionada. El elemento web de lista relacionada muestra elementos de otras listas que están relacionados con el elemento seleccionado en la lista actual. Por ejemplo, puede agregar un elemento web de lista relacionada a la lista Customers para que los usuarios puedan seleccionar un registro de cliente y ver los elementos de la lista Pending Orders relacionada que están vinculados con el cliente seleccionado.

Puede obtener la misma información acerca de elementos relacionados con el modelo de objetos mediante las propiedades de los objetos SPRelatedField que devuelve una llamada al método GetRelatedFields del objeto SPList que representa la lista de búsqueda.

Ejemplo

El ejemplo siguiente es una aplicación de consola que obtiene un elemento de la lista Customers y busca elementos relacionados en otras listas de la colección de sitios. El trabajo pesado se realiza mediante el método PrintRelatedItems de la aplicación, que usa un elemento de la lista de búsqueda y la información de un objeto SPRelatedField para crear una consulta en relación con la lista relacionada.

using System;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    int customerID = 1;

                    SPList list = site.Lists.TryGetList("Customers");
                    if (list != null)
                    {

                        // Get a customer record.
                        SPListItem customerRecord = null;
                        try
                        {
                            customerRecord = list.GetItemById(customerID);
                        }
                        catch (ArgumentException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }

                        // Print related items.
                        if (customerRecord != null)
                        {
                            Console.WriteLine("Customer: {0} {1}", 
                            customerRecord[SPBuiltInFieldId.FirstName], customerRecord[SPBuiltInFieldId.Title]);

                            // Get related list items.
                            SPRelatedFieldCollection relatedFields = list.GetRelatedFields();
                            foreach (SPRelatedField fieldInfo in relatedFields)
                            {
                                using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                                {
                                    PrintRelatedItems(customerRecord, relatedSite, fieldInfo);
                                }
                            }
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }

        static void PrintRelatedItems(SPListItem match, SPwebsite, SPRelatedField fieldInfo)
        {
            SPList targetList = fieldInfo.LookupList;
            SPList relatedList = site.Lists[fieldInfo.ListId];

            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

            object value = match[targetField.Id];

            SPQuery q = new SPQuery();
            q.Query = string.Format(@"<Where>
                                            <Eq>
                                                <FieldRef Name=""{0}""/>
                                                <Value Type=""{1}"">{2}</Value>
                                            </Eq>
                                        </Where>", relatedField.InternalName, value.GetType(), value);

            SPListItemCollection items = relatedList.GetItems(q);

            if (items.Count > 0)
            {
                Console.WriteLine("\n{0} has {1} related items:", relatedList.Title, items.Count);
                foreach (SPListItem item in items)
                    Console.WriteLine(item.DisplayName);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim customerID As Integer = 1

                Dim list As SPList = site.Lists.TryGetList("Customers")
                If list IsNot Nothing Then

                    ' Get a customer record.
                    Dim customerRecord As SPListItem = Nothing
                    Try
                        customerRecord = list.GetItemById(customerID)
                    Catch ex As ArgumentException
                        Console.WriteLine(ex.Message)
                    End Try

                    ' Print related items.
                    If customerRecord IsNot Nothing Then
                        Console.WriteLine("Customer: {0} {1}", _
                        customerRecord(SPBuiltInFieldId.FirstName), customerRecord(SPBuiltInFieldId.Title))

                        ' Get related list items.
                        Dim relatedFields As SPRelatedFieldCollection = list.GetRelatedFields()
                        For Each fieldInfo As SPRelatedField In relatedFields
                            Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                                PrintRelatedItems(customerRecord, relatedSite, fieldInfo)
                            End Using
                        Next
                    End If
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub

    Sub PrintRelatedItems(ByVal match As SPListItem, ByVal site As SPWeb, ByVal fieldInfo As SPRelatedField)
        Dim targetList As SPList = fieldInfo.LookupList
        Dim relatedList As SPList = site.Lists(fieldInfo.ListId)

        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

        Dim value As Object = match(targetField.Id)

        Dim q As New SPQuery()
        q.Query = String.Format( _
        "<Where><Eq><FieldRef Name=""{0}""/><Value Type=""{1}"">{2}</Value></Eq></Where>", _
        relatedField.InternalName, value.GetType(), value)

        Dim items As SPListItemCollection = relatedList.GetItems(q)

        If items.Count > 0 Then
            Console.WriteLine(vbLf & "{0} has {1} related items:", relatedList.Title, items.Count)
            For Each item As SPListItem In items
                Console.WriteLine(item.DisplayName)
            Next
        End If
    End Sub

End Module

Vea también

Tareas

Procedimiento para crear una búsqueda de varias columnas

Referencia

SPFieldLookup

SPRelatedField

Otros recursos

Procedimiento para establecer mediante programación el comportamiento de eliminación en un campo de búsqueda