VBA /SQL => BASE ACCESS Comment supprimer des données ?

VBA /SQL => BASE ACCESS Comment supprimer des données ? - VB/VBA/VBS - Programmation

Marsh Posté le 19-06-2006 à 18:07:16    

Salut à tous...
 
Voila le soucis...
J'ai une base de données centrale ACCESS avec plein plein plein de tables liées
La table PERSONNE est la table principale => index clé primaire auto number.
     Elle contient nom, prenom et quelques index qui renvoient vers d'autres tables
La table SITUATION FAMILIALE
La table SERVICE
La table BUREAU
La table INDICE_PAIE
etc etc etc etc etc
 
Donc pour le moment j'ai ouvert une deuxième base de données ACCESS (vide celle-ci) qui accède via le réseau à la première pour mettre à jour les enregistrements... Ca marche
Exemple si PIERRE MARTIN qui a l'index 144 passe de marié avec 2 enfants à divorcé avec 2 enfants ça marche, les clés et les index se mettent à jour sans probleme...
 
Il y a des relations qui font des mises à jour en cascade vers et depuis la table PERSONNE et ça marche aussi.
 
PROBLEME:
Quand je crée une requete de suppression dans ma base de données centrale je lui demande de supprimer : DELETE FROM PERSONNE WHERE PERSONNE.Nom LIKE 'MARTIN' AND PERSONNE.Prenom LIKE 'MARCEL' .....
ACCESS me renvoit aussitot une question : suppression clé primaire, suppression enregistrements... je ne me souviens plus de la syntaxe exacte... Etes vous sur de vouloir executer ?
Je clique OUI puis re-question et je clique OUI.
==> Tous les enregistrements en rapport avec MARTIN MARCEL sont supprimés
 
en fait le problème vient maintenant :
Quand je lance un CN.Execute ("" ) requete de suppression en copie conforme dans le module de ma deuxième base de données et que je lance le mode debogage (pas à pas) rien ne se passe.  
L'instruction est executée, VBA passe dessus à l'aise et ne renvoit aucun message d'erreur, pas même de question.  
Alors j'ai testé :  
mettre une erreur dans le texte de la requete ==> VBA plante
mettre des doubles ou simples quotes ==> VBA passe par dessus et ne renvoit pas d'erreur, pas même de question.  
l'état de ma connexion : il est OK
mes privilèges : ils sont OK
L'appel à l'ingénieur qui evidemment ne bosse pas sous ACCESS ==> il est perplexe...
 
Donc maintenant je teste l'appel au FORUM...
 
Merci


---------------
http://www.ypikay.com
Reply

Marsh Posté le 19-06-2006 à 18:07:16   

Reply

Marsh Posté le 19-06-2006 à 18:33:05    

Je dirais que c'est normal !!
Tu as une base relationnelle !, donc quand tu supprimes une prersonne, il est normal que ça supprime tous ce qui la concerne !
Sinon tu risque d'avoir une base de donnée vraiment pas sstable !
 
Je ne vois pas ou est le problème ! Ou tout du moins je ne vois pas ce que tu veux supprimer et ne pas supprimer ?????

Reply

Marsh Posté le 19-06-2006 à 18:34:21    

je suis d'accord mais quand je lance cette requete en SQL depuis un module externe en VB, rien ne se passe...
OUPSSS


---------------
http://www.ypikay.com
Reply

Marsh Posté le 20-06-2006 à 15:48:29    

C'est quoi ta variable CN ?

Reply

Marsh Posté le 20-06-2006 à 18:51:03    

C'est la connection permanente à la base de données
CN.open....


---------------
http://www.ypikay.com
Reply

Marsh Posté le 21-06-2006 à 09:19:46    

Je ne comprends pas pourquoi tu utilises la notion de connexion dans un traitement impliquant 2 bases ACCESS.
Tu pourrais quand même donner la déclaration de ta variable CN et expliquer un peu mieux à quoi ton code ressemble.
Ton problème n'est pas un pb SQL, donc il faut plus d'infos sur le contexte.


Message édité par tegu le 21-06-2006 à 09:19:54
Reply

Marsh Posté le 21-06-2006 à 18:01:31    

Dim CN As ADODB.Connection :::: connexion permanente à la base de données.
ensuite je tape
CN.Execute (DELETE........)
Ce qui signifie que sur ma connection je fais un delete d'un champ complet de ma table mère. En principe il devrait effacer les enregistrements liés...
Quand je lance cette demmande en local sur la base de données il me pose la question "Etes vous sur de vouloir effacer......" et après 2 confirmations il efface tous les enregistrements liés.
 
MAIS PAR LE RESEAU en VB quand je lui dis
CN.Execute ... la même requete rien ne se passe...


---------------
http://www.ypikay.com
Reply

Marsh Posté le 22-06-2006 à 09:05:17    

Entre deux bases ACCESS j'ai plutôt tendance à passer par DAO plutôt que ADODB.
Je ne sais pas comment ADODB gère l'effacement en cascade pour les relations Access, qui plus est dans un contexte réseau. Toujours est-il que les symptômes que tu rencontres sont effectivement surprenants.
Désolé de ne pouvoir t'aider plus.

Reply

Marsh Posté le 22-06-2006 à 11:44:33    

merci tout de même


---------------
http://www.ypikay.com
Reply

Marsh Posté le 02-04-2008 à 09:38:18    

Bonjour,
 
Je développe durant un stage une application d'autoévaluation des connaissances sous Access et rencontre les mêmes problème. Concrètement, des utilisateurs se connectent pour répondre à des questionnaires ayant trait à leur fonction dans la société. Le problème vient que je ne peux conserver de questionnaire incomplet (ce qui se produit si l'utilisateur se déconnecte avec Alt F4 durant un questionnaire, les autres moyens de quitter l'application ayant été enrayés).
 
Je cherche donc à supprimer de ma base de données les enregistrements des questionnaires réalisés partiellement (et de réponses données correspondantes). Voici mes codes sql dont je demande l'exécution par VBA :
 
sql3 = "Delete Realiser.N°_Session, Realiser.N°_Questionnaire, Realiser.score, Realiser.date_debut, Realiser.date_fin "
sql3 = sql3 + "FROM Realiser "
sql3 = sql3 + "WHERE (((Realiser.N°_Session)= " & session_id2 & " ) AND ((Realiser.N°_Questionnaire)= " & questionnaire_id & " ) AND ((Realiser.Score)=-1) AND ((Realiser.date_debut)= #" & Date_Debut & "#));"
MsgBox (sql3)
CurrentDb.Execute (sql3)
 
sql3 = "DELETE Reponses_Donnees.N°_Session, Reponses_Donnees.N°_Question, Reponses_Donnees.N°_Questionnaire, Reponses_Donnees.Reponse_donnee, Reponses_Donnees.Date "
sql3 = sql3 + "FROM Reponses_Donnees "
sql3 = sql3 + "WHERE (((Reponses_Donnees.N°_Session)= " & session_id & " ) AND ((Reponses_Donnees.N°_Questionnaire)= " & questionnaire_id & " ) AND ((Reponses_Donnees.Date) > #" & Date_Debut & "#));"
MsgBox (sql3)
CurrentDb.Execute (sql3)
 
Explications des codes : pour le premier, je veux effacer le contenu de la table Realiser l'enregistrement correspondant à telle session ("session_id2" ), à ce questionnaire incomplet ("questionnaire_id" ) dont le score vaut "-1" (car n'ayant pas encore été calculé puisque ce calcul intervient à la fin du questionnaire) et qui a été commencé à telle date ("Date_Debut" ).
Pour le second, j'efface de la table Reponses_Donnees (où j'enregistre les réponses données pour tel questionnaire "questionnaire_id" réalisé dans telle session "session_id" )dont les réponses ont été données après la "Date_Debut" (afin d'être sûr de n'effacer que les enregistrements de cette réalisation du questionnaire).
 
Le problème est donc le suivant (il me semble identique au premier exposé) :
quand j'exécute ma requête directement sous Access, ça marche (il me demande confirmation avec : "attention, vous allez effacer x enregistrements...".
quand j'exécute ma requête dans VBA, il passe dessus (le msgbox s'affiche, il passe bien à l'instruction suivante) mais dans ma table de données, rien n'a été effacé (et aucun message de confirmation de suppression ou d'erreur).
 
Voilà, Merci d'avance à quiconque voudra bien m'aider...

Reply

Marsh Posté le 02-04-2008 à 09:38:18   

Reply

Marsh Posté le 02-04-2008 à 13:09:16    

Je n'ai jamais rencontré ce problème, mais au lieu d'utiliser Execute, je me sers de runSql.
Pour voir les messages éventuels, il faudrait qu'ils ne soient pas désactiver. Donc, au moins pour un test, peut-être pourriez vous remplacer un de vos CurrentDb.Execute par

Docmd.Setwarnings True
Docmd.runSQL sql3
Docmd.Setwarnings False

Par ailleurs, vos requêtes contiennent des dates, et les conversions occasionnent parfois des surprises. Pourriez-vous tenter un delete dans une table de test sans impliquer de champ date ?

Reply

Marsh Posté le 04-04-2008 à 14:24:51    

Les données sont-elles contenues dans CurrentDB directement ou dans une autre base à laquelle référence est faite via des tables liées ?

Reply

Marsh Posté le 04-04-2008 à 21:06:34    

Pour moi, ça marchait sur des tables locales, et aussi sur des tables distantes (Oracle ou Sybase)qui ont été "attachées" à des tables locales. Mais, je crois me souvenir qu'il fallait mettre des privilèges particuliers quelque part si on ne voulait pas faire que de la consultation, et donc pour modifier ou supprimer des lignes dans une table distante.

Reply

Marsh Posté le 04-04-2008 à 23:12:36    

merci à tous mais le probleme date de juin 2006, j'arrive plus à me souvenir de quel projet c'était :)
mais au moins ça aura ouvert le débat


---------------
http://www.ypikay.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed