Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 2016
-
24 avril 2012 à 08:36
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDerniè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.
cs_gide_x
Messages postés37Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention20 mai 20161 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
cs_gide_x
Messages postés37Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention20 mai 20161 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.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 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.