Partager via


Recherches et relations de liste

Dernière modification : mercredi 1 décembre 2010

S’applique à : SharePoint Foundation 2010

Dans cet article
Relations de liste et intégrité des données
Création d’une relation de liste
Création de recherches sur plusieurs colonnes
Découverte des relations de liste
Découverte des éléments associés

Dans Microsoft SharePoint Foundation, un champ de recherche est un champ qui est configuré pour obtenir sa valeur dans un champ d’une autre liste. L’ajout d’un champ de recherche à une liste a pour effet de créer une relation entre cette liste et la liste qui fournit les données.

La façon de désigner les deux listes dépend de la façon dont vous vous placez. Vue du champ de recherche, la liste qui fournit les données est la liste cible, et le champ d’où sont issues les données est le champ cible. Vue de la liste cible, la liste qui contient la liste de recherche est une liste associée. Le champ de recherche proprement dit est un champ associé.

ConseilConseil

La classe SPList propose une méthode GetRelatedFields que vous pouvez utiliser pour découvrir les champs de recherche qui pointent vers une liste.

Dans un souci de simplification et pour éviter toute confusion, on dit parfois que les deux listes ont une relation parent-enfant. La liste enfant contient le champ de recherche. La liste parente contient la source de données, c’est-à-dire le champ qui est la cible du champ de recherche.

Relations de liste et intégrité des données

Dans Microsoft SharePoint Foundation 2010, vous pouvez configurer un champ de recherche dans une liste enfant afin qu’il place une contrainte de suppression au niveau des éléments de la liste parente. Lorsque vous créez ou modifiez une colonne de recherche via l’interface utilisateur, vous disposez de l’option Appliquer le comportement des relations. Si vous la sélectionnez, vous pouvez choisir Suppression limitée ou Suppression en cascade. L’option Suppression limitée empêche la suppression d’un élément de la liste parente s’il est référencé par un ou plusieurs éléments associés de la liste enfant. Avec l’option Suppression en cascade, la suppression d’un élément de la liste parente entraîne également celle de tous les éléments associés de la liste enfant.

Pour autoriser le même comportement dans le code, attribuez à la propriété RelationshipDeleteBehavior d’un objet SPFieldLookup une valeur de l’énumération SPRelationshipDeleteBehavior : Restrict ou Cascade.

Important

Pour permettre les suppressions limitées ou en cascade dans SharePoint Foundation, le champ de recherche doit être indexé. Affectez à la propriété Indexed du champ la valeur true.

Une contrainte de suppression vise à mettre en œuvre l’intégrité référentielle. Vous appliquez la contrainte lorsque vous ne voulez pas qu’un élément qui contient un champ de recherche devienne orphelin en pointant vers un élément qui n’existe pas dans la liste cible.

Prenons pour exemple deux listes, Customers (Clients) et Addresses (Adresses). Vous décidez de lier les deux listes en ajoutant un champ de recherche nommé Customer ID (ID Client) à la liste Addresses, et vous faites pointer le champ de recherche vers le champ ID dans la liste Customers. Après avoir configuré la recherche, vous placez une contrainte au niveau de la relation entre les deux listes en précisant que les suppressions dans la liste Customers doivent être répercutées en cascade dans la liste Addresses. En optant pour les suppressions en cascade, l’intégrité référentielle est mise en œuvre et de ce fait, la liste Addresses ne collecte pas les adresses orphelines. Chaque fois qu’un élément est supprimé dans la liste Customers, les éléments associés sont automatiquement supprimés dans la liste Addresses.

Supposons qu’il existe également une liste Pending Orders (Commandes en attente) qui, comme la liste Addresses, est liée à la liste Customers par un champ de recherche qui pointe vers le champ ID de la liste Customers. Vous pouvez décider d’empêcher la suppression d’un enregistrement client dans la liste Customers s’il existe une commande en attente dans la liste Pending Orders pour ce client. Dans ce cas, vous pouvez mettre en œuvre l’intégrité référentielle en configurant le champ de recherche dans la liste Pending Orders pour limiter les suppressions dans la liste parente, Customers.

Opter pour les suppressions limitées ou en cascade a un effet secondaire : les valeurs de champs de recherche sont validées au moment où elles sont définies. Lorsqu’un utilisateur crée un élément via l’interface utilisateur, la colonne de recherche est représentée dans le formulaire par une liste déroulante si la liste cible contient moins de 20 éléments ; dans ce cas, l’utilisateur est contraint d’effectuer un sélection parmi les seules valeurs valides. Si la cible contient plus de 20 éléments, un autre contrôle est utilisé et l’utilisateur doit taper une valeur ; dans ce cas, si la valeur tapée n’est pas valide, un texte de validation s’affiche en rouge dans le formulaire. Une validation similaire se produit lorsque vous utilisez le modèle objet pour définir la valeur d’un champ de recherche. Dans ce cas, si la valeur spécifiée ne pointe pas vers un élément existant de la liste cible, SharePoint Foundation lève une exception.

Vous pouvez ne pas placer de contrainte de suppression au niveau de la liste de recherche. Par exemple, outre les listes Addresses et Pending Orders, une liste Complete Orders (Commandes finalisées) peut, comme les autres listes associées, pointer vers le champ ID de la liste Customers. Vous pouvez souhaiter garder la trace d’une commande finalisée même si vous décidez de ne pas conserver l’enregistrement du client qui a passé la commande. L’intégrité référentielle ne pose pas de problème, si bien que vous pouvez ne pas spécifier de contrainte de suppression au niveau de la liste de recherche. Dans ce cas, la suppression d’un élément dans la liste Customers n’affecte pas la liste Complete Orders.

Création d’une relation de liste

Un champ de recherche est représenté par une instance de la classe SPFieldLookup. Bien que cette classe contienne des constructeurs, le moyen le plus simple de créer un champ de recherche est d’appeler la méthode AddLookup de la classe SPFieldCollection. La méthode AddLookup est assortie d’une surcharge qui vous permet de créer une recherche dans une liste d’un site Web différent du site où vous créez la recherche.

Notes

Vous pouvez créer une relation entre des listes de sites Web différents, mais vous ne pouvez pas définir de comportement restrictif au niveau de la relation. SharePoint Foundation ne met pas en œuvre l’intégrité référentielle pour les recherches Web croisées.

Pour ajouter une colonne de recherche à une liste

  1. Obtenez une référence à la collection de champs de la liste en accédant à sa propriété Fields.

  2. Appelez la méthode AddLookup de l’objet SPFieldCollection, en passant la propriété ID de la liste de recherche (source de données) au deuxième paramètre.

    La méthode AddLookup renvoie une chaîne avec le nom interne du nouveau champ.

  3. Obtenez une référence à l’objet SPFieldLookup qui représente le nouveau champ en appelant la méthode GetFieldByInternalName, la chaîne renvoyée par la méthode AddLookup devant être transmise en tant qu’argument.

    La méthode GetFieldByInternalName renvoie un objet SPField, que vous devez convertir dans le type SPFieldLookup.

  4. Attribuez à la propriété LookupField le nom interne du champ de la liste de recherche que l’objet SPFieldLookup doit utiliser comme source de données.

    La cible de la propriété LookupField doit être l’un des types de champ suivants :

    En outre, la cible peut être de type SPFieldCalculated si la sortie est du texte. Pour plus d’informations, voir la propriété OutputType. La cible peut être de type SPFieldComputed si les recherches sont activées pour le champ. Pour plus d’informations, voir la propriété EnableLookup.

  5. (Facultatif) Si vous avez l’intention de spécifier un autre comportement de suppression que celui par défaut (None), attribuez à la propriété Indexed la valeur true.

  6. (Facultatif) Attribuez à la propriété RelationshipDeleteBehavior une valeur de l’énumération SPRelationshipDeleteBehavior.

    Important

    L’utilisateur doit disposer d’une autorisation ManageLists sur la liste de recherche pour spécifier Cascade ou Restrict. Pour plus d’informations, voir l’énumération SPBasePermissions.

    Par ailleurs, la définition d’un comportement de relation échoue dans les cas suivants :

    • Le champ de recherche autorise les valeurs multiples.

      Avant de définir la propriété RelationshipDeleteBehavior, assurez-vous que la propriété AllowMultipleValues renvoie la valeur false.

    • Les éléments de liste existants contiennent des valeurs non valides pour le champ de recherche.

      Cela peut se produire si la propriété RelationshipDeleteBehavior du champ de recherche a la valeur None avant qu’un utilisateur ne supprime l’élément dans la liste cible vers laquelle le champ de recherche pointe. Le champ de recherche est donc orphelin (il contient une valeur non valide). Un comportement de relation ne peut pas être mis en œuvre si la liste contient des champs de recherche orphelins.

    • Le champ de recherche pointe vers une liste d’un autre site Web.

      Vérifiez la valeur de la propriété LookupWebId du champ de recherche.

    • Le nombre d’éléments de la liste dépasse le nombre maximal défini pour les grandes listes.

      Comparez la valeur renvoyée par la propriété ItemCount de la liste à la valeur renvoyée par la propriété MaxItemsPerThrottledOperation de l’application Web.

  7. Appelez la méthode Update pour valider les modifications apportées à l’objet.

Exemple

L’exemple suivant est une application console qui crée une relation entre la liste Customers et la liste Pending Orders. L’application appelle la méthode AddLookup pour ajouter un champ de recherche nommé Customer ID (ID Client) à la liste Pending Orders et fait pointer le champ vers le champ ID de la liste Customers. Le nouveau champ Customer ID est indexé et défini pour limiter les suppressions dans la liste de recherche.

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

Création de recherches sur plusieurs colonnes

Dans SharePoint Foundation 2010, vous pouvez créer des recherches sur plusieurs colonnes dans une même liste de recherche. Prenons pour exemple deux listes, Customers et Pending Orders. Vous créez une relation entre ces listes en ajoutant une colonne Customer ID à la liste Pending Orders et faites pointer la colonne vers le champ ID de la liste Customers. Lorsque vous examinez les éléments de la liste Pending Orders, vous souhaitez voir les informations importantes sur le client qui a passé la commande, ainsi que les informations qui décrivent la commande proprement dite. Pour résoudre la problématique, en plus de la colonne de recherche principale, Customer ID, vous devez ajouter trois colonnes de recherche secondaires pour afficher le prénom, le nom et le numéro de téléphone du client.

Dans le cadre d’une recherche sur plusieurs colonnes, la relation des colonnes secondaires vis-à-vis de la liste de recherche dépend de la colonne principale. Vous ne pouvez pas établir de contrainte de suppression au niveau d’une colonne de recherche secondaire. La seule contrainte appliquée à la liste de recherche est celle définie pour la colonne principale.

La procédure à suivre pour créer une colonne de recherche secondaire est pratiquement identique à celle utilisée pour créer une colonne de recherche principale. La principale différence tient au fait que vous créez le champ en appelant la méthode AddDependentLookup de la classe SPFieldCollection au lieu de la méthode AddLookup. La méthode AddDependentLookup comporte deux paramètres : le nom d’affichage à utiliser pour le champ secondaire et l’ID du champ principal.

Exemple

L’exemple suivant est une application console qui crée une relation entre la liste Customers et la liste Pending Orders. L’application appelle la méthode AddLookup pour ajouter un champ de recherche principal nommé Customer ID à la liste Pending Orders et fait pointer le champ vers le champ ID de la liste Customers. Le nouveau champ Customer ID est indexé et défini pour limiter les suppressions dans la liste de recherche.

Après avoir créé le champ de recherche principal, l’application crée les trois champs secondaires nommés First Name (Prénom), Last Name (Nom) et Phone (Téléphone). L’application crée ces champs en appelant la méthode AddDependentLookup de l’objet qui représente la collection de champs de la liste 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

Découverte des relations de liste

Vous pouvez identifier les champs de listes associées qui dépendent d’informations contenues dans une liste de recherche en appelant la méthode GetRelatedFields sur un objet SPList qui représente la liste de recherche. La méthode renvoie une collection d’objets SPRelatedField avec les propriétés suivantes :

  • FieldId. Obtient l’Id du champ de recherche de la liste associée.

  • ListId. Obtient l’ID de la liste associée.

  • WebId. Obtient l’ID du site Web où se situe la liste associée.

  • RelationshipDeleteBehavior. Obtient la contrainte de suppression définie pour la relation.

La méthode GetRelatedFields est assortie d’une surcharge qui vous permet d’obtenir des informations uniquement sur les champs qui spécifient une contrainte de suppression particulière.

Des informations sont renvoyées uniquement pour les champs associés qui représentent la colonne principale d’une recherche sur plusieurs colonnes. Pour obtenir des informations sur les colonnes secondaires, appelez la méthode GetDependentLookupInternalNames de l’objet SPFieldLookup qui représente la colonne principale.

Exemple

L’exemple suivant est une application console qui communique des informations sur les champs de la liste Customers qui fournissent les données aux champs de recherche d’autres listes. Pour chaque champ associé qui représente une colonne principale, l’application appelle la méthode GetDependentLookupInternalNames pour obtenir la liste des champs qui représentent des colonnes secondaires.

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

L’application console imprime une sortie comparable à l’exemple suivant.

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

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

Découverte des éléments associés

L’interface utilisateur de SharePoint Foundation 2010 comporte un bouton Insérer une liste associée au niveau du Ruban qui permet aux utilisateurs de modifier la page qui présente une liste en ajoutant un composant WebPart de liste associée. Ce composant WebPart affiche les éléments des autres listes associées à l’élément sélectionné dans la liste active. Par exemple, vous pouvez ajouter un composant WebPart de liste associée à la liste Customers de sorte que les utilisateurs puissent sélectionner un enregistrement client et examiner les éléments de la liste associée Pending Orders qui se rapportent au client sélectionné.

Vous pouvez obtenir les mêmes informations sur les éléments associés par le biais du modèle objet en utilisant les propriétés des objets SPRelatedField renvoyés par un appel à la méthode GetRelatedFields de l’objet SPList qui représente la liste de recherche.

Exemple

L’exemple suivant est une application console qui obtient un élément de la liste Customers et recherche les éléments associés dans les autres listes de la collection de sites. Le gros du travail est accompli par la méthode PrintRelatedItems de l’application, qui utilise un élément de la liste de recherche et les informations d’un objet SPRelatedField pour construire une requête sur la liste associée.

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

Voir aussi

Tâches

Procédure : créer une recherche à plusieurs colonnes

Référence

SPFieldLookup

SPRelatedField

Autres ressources

Procédure : définir par programme le comportement de suppression dans un champ de recherche (éventuellement en anglais)