Porblème de jointure SQL

Résolu
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 24 avril 2012 à 08:36
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 25 avril 2012 à 11:53
Bonjour à tous,

Une de mes applis utilise une table des applications et une table des applis mises en production.

La 1ère contient entre autres un ID, le nom et un Flag indiquant sa mise en production ou non.
La 2nde contient l'ID de la 1ère table et le répertoire de destination entre autres.

J'affiche 2 datagrids, l'un des softs basés sur la 1ère table, recordset des plus basiques.
Le second m'afficher uniquement les softs ayant ce fameux flag de la 1ère table ainsi que le nom + le dossier stockés dans la 2ème table.

La mise à jour se fait par un double-clic sur le datagrid de gauche et par test du flag.

Si faux, je l'active et créé un nouvel enregistrement dans la 2nde table, si True je supprime l'enregistrement de la 2ème table et bascule le flag à faux.

Une mise à jour si le flag est à faux marche sans problème, par contre s'il existe déjà, il me supprime AUSSI l'enregistrement dans la 1ère table. Que je mette la MAJ du flag avant ou après la suppression dans la 2ème table.

Voici mon code VB6:
      
      If P_rstSoftwares.Fields("SOFT_INPROD").Value = True Then
         P_rstProduction.Delete
         P_rstSoftwares.Fields("SOFT_INPROD").Value = False:         P_rstSoftwares.Update
      Else
         P_rstSoftwares.Fields("SOFT_INPROD").Value = True:          P_rstSoftwares.Update
         P_rstProduction.AddNew
         P_rstProduction.Fields("PROD_OWNER").Value = P_rstSoftwares.Fields("SOFT_ID").Value
         P_rstProduction.Update:                                     P_rstProduction.Requery
      End If


où P_rstSoftwares est le recordset de toutes mes applis, DLL et OCX
et P_rstProduction celui des applis mises en production.

ci-dessous ma requête SQL
SELECT S.SOFT_ID, S.SOFT_EXENAME, P.PROD_OWNER, P.PROD_TARGETFOLDER
FROM T_Softwares AS S
LEFT JOIN T_ProductionStuff AS P ON P.PROD_OWNER = S.SOFT_ID
WHERE S.SOFT_INPROD = 1
ORDER BY S.SOFT_EXENAME


A priori je pencherais pour un problème de jointure (LEFT ou RIGHT) mais les deux essais donnent le même résultat.

Merci d'avance pour vos suggestions.
Calade

4 réponses

cs_gide_x Messages postés 37 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 20 mai 2016 1
25 avril 2012 à 11:29
Salut !

Je viens de trouver ceci, mais malheureusement pas de VB6 fonctionnel sous la main pour tester...

Petit indice de la MSDN:
If the Unique Table dynamic property is set, and the Recordset is the result of executing a JOIN operation on multiple tables, then the Delete method will only delete rows from the table named in the Unique Table property.


Donc, après ta connexion et ta requête SELECT, une fois ton recordset construit et connecté ajoutes une ligne:
P_rstProduction.Properties("Unique Table") = "T_Softwares" '(ou plus logiquement "S" ... mais ça c'est a tester !)


De ce fait, les commandes "DELETE" se feront théoriquement uniquement sur la table spécifiée.
D'après ce que j'ai vu, SELECT, INSERT et UPDATE ne sont pas touchés par cela

Courage!

JD.
3
cs_gide_x Messages postés 37 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 20 mai 2016 1
24 avril 2012 à 18:27
Salut !

Je ne suis pas spécialiste BD et recordset, mais à priori, cela me semble normal que quand tu supprimes un enregistrement, il le supprime dans les deux tables vu qu'ils sont "JOIN" !

Si je ne dit pas de bêtise, faire un "Delete" reviendrait à écrire DELETE FROM T_Softwares AS S
LEFT JOIN T_ProductionStuff AS P ON P.PROD_OWNER = S.SOFT_ID
WHERE S.SOFT_INPROD = 1
AND [liste de tout les champs = mes valeurs]
ORDER BY S.SOFT_EXENAME

Maintenant je suis sous .net et je travaille avec les bases de données en ODBC ou MYSL natif et j'envoie les requêtes directement... Mais perso, je balancerait une commande à la main à mon recordset du genre:

DELETE FROM T_ProductionStuff WHERE PROD_OWNER = " & P_rstSoftwares.Fields("SOFT_ID").Value & ";"

et après tout ça relancer la commande SELECT, puis ré afficher.

... assez bof, j'en conviens.

JD.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
25 avril 2012 à 08:23
Salut et merci de ta réponse,

C'est justement que je voulais éviter, une requête en dur dans le code.
J'aurais voulu employer une procédure stockée qui sont justement faite pour ça.

Je vas étudier ça de plus près.


Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
25 avril 2012 à 11:53
Salut et merci,

J'ignorais cette propriété et après des essais ça marche nickel.

Petit détail, l'alias ne va pas, il faut le nom complet de la table soit "T_ProductionStuff" dans ce cas car c'est elle la table dont il faut supprimer un enregistrement.

Si j'osais, peux-tu m'envoyer le lien de l'aide en ligne du MSDN.

Calade
0
Rejoignez-nous