Partager via


Étape 4 (facultative) : définir des associations

Les associations lient des entités connexes dans un système métier. Par exemple, un client est associé à un bon de commande dans le système AdventureWorks lorsqu'il passe une commande. La relation entre un client et un bon de commande est une relation un-à-plusieurs. Une association contient des pointeurs vers les entités parentes et enfants, ainsi qu'un pointeur vers la logique métier qui permet au client de récupérer l'entité enfant à partir de l'entité parente. Le parcours d'une association est simplement un appel à une méthode dans le système métier. Les associations facilitent la création des applications Maître/Détail. Pour plus d'informations sur les associations dans le catalogue de données métiers, voir Association.

Cette rubrique montre comment définir une association entre des clients et des bons de commande dans la base de données AdventureWorks2000. La recherche des bons de commande pour un client spécifique est une tâche courante. En définissant cette association dans le catalogue de données métiers, il est possible de retrouver facilement ces bons de commande sur la base d'un ID client. La définition d'associations est un processus qui se déroule en deux étapes. Vous devez tout d'abord définir la méthode dans l'entité Customer (Client) qui doit renvoyer les bons de commande, sur la base d'un ID client. Ensuite, vous devez définir une association entre les deux entités, Customer (Client) et SalesOrder (Bon de commande) en spécifiant la méthode définie dans l'entité Customer.

Notes

Il s'agit d'un exemple simple d'une entité du type une-source, une-destination. Si vous possédez plusieurs entités sources et une seule entité de destination, vous pouvez définir la logique de l'association dans l'entité de destination. Toutefois, le catalogue de données métiers permet de définir la logique de l'association dans n'importe quelle entité, dans la même instance de LobSystem.

Conditions préalables requises

Étape 2 : définir des entités, des méthodes et des filtres et si nécessaire, Étape 3 (facultatif) : définir les actions

Définir une association

  1. Ouvrez le fichier AdventureWorks2000.xml de l'étape 2 ou 3.

  2. Ajoutez le code XML suivant dans la section <Entities>, après la définition de l'entité Product (Produit). Ce XML permet de définir les entités SalesOrder (Bon de commande) et Customer (Client). Notez que l'entité Customer contient également une définition pour une méthode nommée GetSalesOrdersForCustomer(), laquelle renvoie les bons de commande, sur la base de l'ID client. Il s'agit de la méthode d'association.

    <Entity EstimatedInstanceCount="10000" Name="SalesOrder">
          <LocalizedDisplayNames>
            <LocalizedDisplayName LCID="1033">Sales Order</LocalizedDisplayName>
          </LocalizedDisplayNames>
          <Identifiers>
            <Identifier Name="SalesOrderID" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <Method Name="GetSalesOrders">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">
                  SELECT SalesOrderID, OrderDate, SubTotal, IndividualID
                  FROM SalesOrderHeader, Individual WHERE (SalesOrderID &gt;= @MinSalesOrderID)
                  AND (SalesOrderID &lt;= @MaxSalesOrderID) AND (SalesOrderNumber LIKE @SalesOrderNumber)
                  AND SalesOrderHeader.CustomerID = Individual.CustomerID
                </Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <FilterDescriptors>
                <FilterDescriptor Type="Comparison" Name="ID" >
                  <Properties>
                    <Property Name="Comparator" Type="System.String">Equals</Property>
                  </Properties>
                </FilterDescriptor>
                <FilterDescriptor Type="Wildcard" Name="SalesOrderNumber" />
              </FilterDescriptors>
              <Parameters>
                <Parameter Direction="In"  Name="@MinSalesOrderID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" 
                                  AssociatedFilter="ID" Name="MinSalesOrderID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.Int32">0</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@MaxSalesOrderID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" AssociatedFilter="ID" Name="MaxSalesOrderID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.Int32">99999999</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@SalesOrderNumber">
                  <TypeDescriptor TypeName="System.String" AssociatedFilter="SalesOrderNumber" Name="SalesOrderNumber">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.String">%</DefaultValue>
                      <DefaultValue MethodInstanceName="SalesOrderSpecificFinderInstance" Type="System.String">%</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="Return"  Name="SalesOrders">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="SalesOrderDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="SalesOrderDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" Name="SalesOrderID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.DateTime" Name="OrderDate">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">Order Date</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Int32" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">IndividualID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Decimal" Name="SubTotal">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">SubTotal</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="SalesOrderFinderInstance" Type="Finder" ReturnParameterName="SalesOrders" />
                <MethodInstance Name="SalesOrderSpecificFinderInstance" Type="SpecificFinder" ReturnParameterName="SalesOrders" />
              </MethodInstances>
            </Method>
          </Methods>
        </Entity>
        <Entity EstimatedInstanceCount="10000" Name="Customer">
          <Properties>
            <Property Name="Title" Type="System.String">FirstName</Property>
          </Properties>
          <Identifiers>
            <Identifier Name="IndividualID" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <Method Name="GetCustomers">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">SELECT * FROM Individual WHERE (IndividualID &gt;= @MinIndividualID) AND (IndividualID &lt;= @MaxIndividualID) AND ((FirstName+' '+LastName) LIKE @Name)</Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <FilterDescriptors>
                <FilterDescriptor Type="Comparison" Name="ID" >
                  <Properties>
                    <Property Name="Comparator" Type="System.String">Equals</Property>
                  </Properties>
                </FilterDescriptor>
                <FilterDescriptor Type="Wildcard" Name="Name" />
              </FilterDescriptors>
              <Parameters>
                <Parameter Direction="In"  Name="@MinIndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" AssociatedFilter="ID" Name="MinIndividualID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.Int32">0</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@MaxIndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" AssociatedFilter="ID" Name="MaxIndividualID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.Int32">99999999</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@Name">
                  <TypeDescriptor TypeName="System.String" AssociatedFilter="Name" Name="Name">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.String">%</DefaultValue>
                      <DefaultValue MethodInstanceName="CustomerSpecificFinderInstance" Type="System.String">%</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="Return"  Name="Customers">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="CustomerDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="CustomerDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.String" Name="FirstName">
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.String" Name="LastName">
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="CustomerFinderInstance" Type="Finder" ReturnParameterName="Customers" />
                <MethodInstance Name="CustomerSpecificFinderInstance" Type="SpecificFinder" ReturnParameterName="Customers" />
              </MethodInstances>
            </Method>
            <Method Name="GetSalesOrdersForCustomer">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">SELECT SalesOrderID, OrderDate, SubTotal,Individual.IndividualID FROM SalesOrderHeader,Individual WHERE SalesOrderHeader.CustomerID=Individual.CustomerID and Individual.IndividualID=@IndividualID</Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <Parameters>
                <Parameter Direction="In"  Name="@IndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" Name="IndividualID" />
                </Parameter>
                <Parameter Direction="Return"  Name="SalesOrders">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="SalesOrderDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="SalesOrderDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierEntityName="SalesOrder" IdentifierName="SalesOrderID" Name="SalesOrderID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.DateTime" Name="OrderDate">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">Order Date</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Int32" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">IndividualID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Decimal" Name="SubTotal">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">SubTotal</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
            </Method>
          </Methods>
          <Actions>
            <Action Name="Send Email" Position="1" IsOpenedInNewWindow="true" Url="mailto:{0}.msn.com" ImageUrl="">
              <ActionParameters>
                <ActionParameter Name="FirstName" Index="0" />
              </ActionParameters>
            </Action>
          </Actions>
        </Entity>
    
  3. Ajoutez le code XML suivant après la section <Entities> pour définir l'association entre les entités Customer et SalesOrder :

      <Associations>
        <Association AssociationMethodEntityName="Customer" AssociationMethodName="GetSalesOrdersForCustomer" AssociationMethodReturnParameterName="SalesOrders" Name="CustomerToSalesOrder" IsCached="true">
          <!-- Associations are just subclasses of MethodInstances. 
          They can also take ReturnTypeDescriptorName optionally. For 
          details, see SampleWebServiceMetadata.-->
          <SourceEntity Name="Customer" />
          <DestinationEntity Name="SalesOrder" />
          <!-- The source and destination entities can be the same. 
          For more information, see the SampleWebService example.-->
        </Association>
      </Associations>
    
  4. Enregistrez le fichier XML.

  5. Avant d'ajouter à nouveau la définition de l'application, vous devez supprimer du catalogue de données métiers l'application AdventureWorksSample créée à l'étape 1. Pour supprimer AdventureWorksSample, suivez les étapes ci-dessous :

    1. Ouvrez SharePoint 3.0 Central Administration.

    2. Dans le volet de navigation gauche, sélectionnez le nom de votre Fournisseur de services partagés.

    3. Dans la section Business Data Catalog , cliquez sur View Applications pour afficher les applications inscrites.

    4. Cliquez sur AdventureWorksSample pour ouvrir la page Afficher l'application : AdventureWorksSample.

    5. Enfin, cliquez sur Delete Application dans la section Application Settings.

  6. Maintenant, ajoutez la définition de l'application dans le catalogue de données métiers. Pour plus d'informations, voir Procédure : ajouter une définition d'application au catalogue de données métiers.

  7. Pour tester les métadonnées, créez une liste de données métiers et un composant Web Part Association. Pour plus d'informations, voir Procédure : tester une association de données métiers.

Étapes suivantes

Étape 5 (facultatif) : définir des méthodes IDEnumerator et activer la recherche de données métiers

Voir aussi

Autres ressources

Catalogue de données métiers : modèle de métadonnées
Exemple SQL Server 2000 AdventureWorks