Question

Maintenant, j'ai vu cette question dans un autre forum mais il n’a pas eu de réponse acceptable.

Supposons que j'ai deux tables, la table Groups et la table Elements. Les tables n'ont pas de relations définies. La table Elements comporte un champ IdGroup qui fait référence au champ IdGroup (PK) de la table Groups.

J'utilise la requête suivante via un jeu d'enregistrements ADO pour renseigner les valeurs des tables dans une grille de données:

SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup

À partir de cette grille, je souhaite appuyer sur Supprimer pour supprimer un élément. Voici mon problème. Lorsque j’utilisais DAO, la fonction DAO Delete () supprimait uniquement l’enregistrement du groupe Éléments. C'était le comportement attendu.

Lorsque j'ai changé pour ADO, la fonction Delete () supprimait les enregistrements des deux tables, l'enregistrement d'élément et le groupe auquel l'élément appartenait!

Y a-t-il un moyen de reproduire le comportement DAO dans ADO sans avoir à définir des relations dans les tables?

Remarque: je sais qu'il existe des alternatives (exécuter des requêtes DELETE pourrait faire l'affaire). Montrez-moi simplement un moyen de faire cela dans ADO ou dites que cela ne peut être fait.

Était-ce utile?

La solution

Réécrivez votre requête en:

  • remplacez INNER JOIN par une clause WHERE consistant en un EXISTS;
  • utilisez une sous-requête dans la clause SELECT pour renvoyer la valeur de Groups.GroupName.

Exemple:

SELECT Elements.*, 
       (
        SELECT Groups.GroupName
          FROM Groups 
         WHERE Elements.IdGroup = Groups.IdGroup
       )
  FROM Elements
 WHERE EXISTS (
               SELECT * 
                 FROM Groups 
                WHERE Elements.IdGroup = Groups.IdGroup
              );

J'ai testé cela avec SQL Server 2008 avec un jeu d'enregistrements ADO défini en tant que propriété DataSource d'un contrôle Microsoft OLEDB Datagrid (MSDATGRD.OCX), puis en supprimant la ligne via le gird (je suppose que vous faites quelque chose de similaire) et le la ligne est en effet supprimée de la table uniquement (c’est-à-dire que la ligne dans les groupes reste non supprimée).

Notez que la requête modifiée peut avoir un impact négatif sur les performances lors de l'extraction de lignes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top