Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : Access 2013, Office 2013
Si vous utilisez un jeu d'enregistrements enfant de taille imposante, notamment par rapport à celle du jeu d'enregistrements parent, mais que vous n'avez besoin d'accéder qu'à un nombre réduit de chapitres enfant, nous vous conseillons d'utiliser une commande paramétrée.
Une commande non paramétrée extrait l'intégralité des jeux d'enregistrements enfant et parent, ajoute une colonne de chapitre au parent, puis affecte une référence au chapitre enfant associé de chaque ligne parent.
Une commande paramétrée extrait l'intégralité du jeu d'enregistrements parent, mais n'extrait le jeu d'enregistrements de chapitre que lorsque vous accédez à la colonne de chapitre. Cette différence dans la méthode d'extraction apporte des améliorations considérables en matière de performances.
Vous pouvez par exemple spécifier ce qui suit :
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
Les tables parent et enfant ont un nom de colonne en commun, cust_id*.* La commande enfant a un espace réservé « ? », auquel fait référence la clause RELATE (autrement dit, « ... PARAMÈTRE 0").
Notes
[!REMARQUE] La clause PARAMETER appartient uniquement à la syntaxe de commande de mise en forme. Elle n'est associée ni à l'objet Parameter, ni à la collection Parameters ADO.
Lors de l'exécution de la commande de mise en forme paramétrée, l'opération suivante se produit :
La commande-parent est exécutée et renvoie un jeu d'enregistrements parent de la table Customers.
Une colonne de chapitre est ajoutée au jeu d'enregistrements parent.
Lorsque vous accédez à cette colonne, la commande-enfant est exécutée avec la valeur du champ customer.cust_id comme valeur du paramètre.
Toutes les lignes du jeu de lignes du fournisseur de données créées à l’étape 3 sont utilisées pour renseigner le jeu d’enregistrements enfant. Dans cet exemple, il s’agit de toutes les lignes de la table Orders pour lesquelles le champ cust_id est égal à la valeur du champ customer.cust_id. Par défaut, les jeux d’enregistrements enfant sont mis en cache sur le client jusqu’à ce que toutes les références au jeu d’enregistrements parent soient extraites. Pour modifier ce comportement, définissez la propriété dynamiqueRecordsetCache Child Rows sur False.
Une référence aux lignes enfant extraites (c'est-à-dire le chapitre du jeu d'enregistrements enfant) est placée dans la colonne de chapitre de la ligne active du jeu d'enregistrements parent.
Les étapes 3 à 5 sont répétées lorsque vous accédez à la colonne de chapitre d'une autre ligne.
La propriété dynamique Cache Child Rows est définie sur True par défaut. Le comportement de mise en cache varie en fonction des valeurs de paramètre de la requête. Dans une requête à paramètre unique, le jeu d'enregistrements enfant d'une valeur de paramètre donnée est mis en cache entre les requêtes pour un enfant avec la même valeur. Ceci est illustré dans le code suivant :
...
SCmd = "SHAPE {select * from customer} " & _
"APPEND({select * from orders where cust_id = ?} " & _
"RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext ' Next cust_id passed to Param 0, & new rs fetched
' into RstChild.
Rst1.MovePrevious ' RstChild now holds cached rs, saving round trip.
...
Dans une requête avec deux paramètres ou plus, un enfant mis en cache est utilisé uniquement si toutes les valeurs de paramètre correspondent aux valeurs mises en cache.
Commandes paramétrables et relations parentes enfants complexes
Les commandes paramétrées permettent non seulement d'améliorer les performances en terme de hiérarchie de type équi-jointure, mais elles peuvent également être utilisées pour la prise en charge de relations parent-enfant plus complexes. Par exemple, considérez une base de données appelée Little League avec deux tables : une contenant les équipes (team_id, team_name) et l'autre les matchs (date, home_team, visiting_team).
Avec une hiérarchie non paramétrée, vous ne pouvez en aucun cas relier les deux tables de telle sorte que le jeu d'enregistrements enfant de chaque équipe contienne l'ensemble de son calendrier. Vous pouvez créer des chapitres contenant le calendrier à domicile ou le calendrier à l'extérieur, mais pas les deux. Ceci s'explique par le fait que la clause RELATE vous limite à des relations parent-enfant de type (pc1=cc1) AND (pc2=pc2). Ainsi, si votre commande inclut « RELATE team_id TO home_team, team_id TO visiting_team », vous n'obtiendrez que les matchs où une équipe joue contre elle-même. Ce qu'il vous faut, c'est la commande suivante : « (team_id=home_team) OR (team_id=visiting_team) », mais le fournisseur Shape ne prend pas en charge la clause OR.
Pour obtenir le résultat souhaité, vous pouvez utiliser une commande paramétrée. Par exemple :
SHAPE {SELECT * FROM teams}
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}
RELATE team_id TO PARAMETER 0,
team_id TO PARAMETER 1)
Cet exemple exploite la plus grande flexibilité de la clause SQL WHERE pour obtenir le résultat escompté.