Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/09/2011, 11h36   #1
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Par défaut Requête qui "tourne" indéfiniment

Bonjour le forum,

Dans mon application, j'utilise ce code depuis plusieurs mois pour lancer une requête de suppression dont j'ai besoin pour mettre à jour ma table "tbl_PrixNets".

Code :
1
2
3
4
5
6
7
8
9
 
With DoCmd
    .SetWarnings False
    strSQL = " DELETE * From tbl_PrixNets WHERE EXISTS " _
            & "(SELECT * FROM tbl_PrixNets T WHERE T.CodeClientEtat = tbl_PrixNets.CodeClientEtat AND T.BrancheClientEtat= tbl_PrixNets.BrancheClientEtat " _
            & "AND T.SKU= tbl_PrixNets.SKU AND T.QteMini= tbl_PrixNets.QteMini AND T.Debut > tbl_PrixNets.Debut);"
    .RunSQL strSQL, True
    .SetWarnings True
End With
Je n'ai jamais eu aucun problème avec ce code, mais depuis hier, quand je lance ce code, la requête se lance, mais la barre de progression "Exécution de la requête" que je vois en bas à droite reste bloquée au début indéfiniment. Access ne plante pas, mais rien ne se passe. Si je stoppe le code en faisant Ctrl+Pause, j'ai un message d'erreur n°2501 "l'action RunSQL a été annulée".

Je précise que ma table se trouve sur une dorsale sur un serveur, mais que je n'ai rien changé à la structure de la table tbl_PrixNets.

Des idées, des recommandations pour moi?
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 17h45   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Si tu exécutes seulement la partie SELECT de ta requête, cela donne quoi ?

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 18h00   #3
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonsoir,

J'ai tenté ceci:

Code :
1
2
3
4
5
6
7
8
9
 
Dim strSQL As String
With DoCmd
    .SetWarnings False
    strSQL = "SELECT * FROM tbl_PrixNets T WHERE T.CodeClientEtat = tbl_PrixNets.CodeClientEtat AND T.BrancheClientEtat= tbl_PrixNets.BrancheClientEtat " _
            & "AND T.SKU= tbl_PrixNets.SKU AND T.QteMini= tbl_PrixNets.QteMini AND T.Debut > tbl_PrixNets.Debut;"
    .RunSQL strSQL, True
    .SetWarnings True
End With
Et j'ai eu "Erreur d'exécution 2342: Une action ExécuterSQL nécessite un argument consistant en une instruction SQL"

neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 11h31   #4
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour,
Il me semble que la méthode RunSQL de l'objet DoCmd ne peut exécuter que des requêtes ACTION
Pour tester, crées une requête avec l'assistant plutôt
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h12   #5
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour,

Si je tente ma première requête avec l'assistant, Access ne répond plus au bout de quelques minutes, mais il n'y a pas d'erreur visible.
Code sql :
 DELETE * FROM tbl_PrixNets WHERE EXISTS(SELECT * FROM tbl_PrixNets T WHERE T.CodeClientEtat = tbl_PrixNets.CodeClientEtat AND T.BrancheClientEtat= tbl_PrixNets.BrancheClientEtat AND T.SKU= tbl_PrixNets.SKU AND T.QteMini= tbl_PrixNets.QteMini AND T.Debut > tbl_PrixNets.Debut);

Par contre, si je tente
Code sql :
SELECT * FROM tbl_PrixNets T WHERE T.CodeClientEtat = tbl_PrixNets.CodeClientEtat AND T.BrancheClientEtat= tbl_PrixNets.BrancheClientEtat AND T.SKU= tbl_PrixNets.SKU AND T.QteMini= tbl_PrixNets.QteMini AND T.Debut > tbl_PrixNets.Debut;

l'assistante me demande des paramètres pour tous les champs concernés de ma table tbl_PrixNets...
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h17   #6
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Code sql :
SELECT * FROM tbl_PrixNets T

Ce serait pas plutôt :
Code sql :
SELECT * FROM tbl_PrixNets, T
?

EDIT : Pourquoi tu n'utilises pas INNER JOIN au lieu de WHERE T1.MonChamp=T2.MonChamp ?
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 19h30   #7
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Citation:
Par contre, si je tente

Code sql :Sélectionner tout - Visualiser dans une fenêtre à part
Code :
SELECT * FROM tbl_PrixNets T WHERE T.CodeClientEtat = tbl_PrixNets.CodeClientEtat AND T.BrancheClientEtat= tbl_PrixNets.BrancheClientEtat AND T.SKU= tbl_PrixNets.SKU AND T.QteMini= tbl_PrixNets.QteMini AND T.Debut > tbl_PrixNets.Debut;
l'assistante me demande des paramètres pour tous les champs concernés de ma table tbl_PrixNets...
Et une fois que tu as fournis un jeu d'éléments nécessaires est-ce qu'elle s'exécute ?

La remarque de paidge sur les Inner Join est aussi à considérer. Je suppose que tu as écrit le SQL à la main et Access tend à avoir une syntaxe un peu particulière. La solution la plus efficace pour écrire du SQL Access c'est de faire ta requête avec l'éditeur puis à basculer l'affichage en mode 'SQL' pour voir comment Access l'a traduit.

Dans ton cas je mettrai la partie SELECT au point en comencant par ne pas mettre de clause WHERE. Une fois que tu obtiens un resultat satifaisant tu introduit une clause WHERE avec des sélections sur des constantes puis enfin tu intègre cela à ta requête de suppression.

Accessoirement combien d'enr ont tes tables ?

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 21h23   #8
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 256
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 256
Points : 1 872
Points : 1 872
Bonsoir,

3 remarques :
- si un enregistrement à supprimer est en cours d'édition (sur une autre cession) sa suppression attend patiemment qu'il se libère
- tu peux enlever "set warnings false" pour voir quel est le problème
- mieux encore la syntaxe "set warnings ..." serait avantageusement remplacée par celle-ci qui a l'avantage de ne pas bloquer l'exécution et de permettre un traitement d'erreur différencié développeur/utilisateur :

Code :
1
2
3
4
5
6
7
8
9
10
Public Sub MonExemple
dim Sr as string
If Not Mode_debug Then On Error GoTo err:
....
110   Sr = "DELETE ... ;"
112   CurrentDb.Execute Sr, dbFailOnError
....
    Exit Sub
err: msgbox "Erreur " & err.Number & "/" & Erl & " dans MonExemple : " & err.description
End Sub
- le mode debug est réservé au développeur
- la numérotation des lignes fait basic des années 20, elle n'est pas indispensable mais permet de renseigner la ligne où s'est produit le problème dans le message d'erreur (variable Erl) ce qui à l'usage est très précieux.
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h39   #9
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour le forum,

Ah, je n'ai pas encore eu le temps d'essayer vos suggestions, mais je m'y mets dès que je peux.

J'ai une question sur la numérotation des lignes qui me vient tout de suite. Est-ce que vous connaissez un autre moyen simple que MZ-Tools? Je ne peux rien installer sur mon PC de travail. :/
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 11h30   #10
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour,

Finalement, en repensant mes routines, j'ai réussi à utiliser une solution avec des index que je n'avais pas comprise quand on me l'avait suggérée...
J'ai donc pu éliminer cette requête de suppression qui tournait indéfiniment. Mais je n'ai toujours pas compris pourquoi. :/

Je vais cependant réfléchir à vos réflexions. Merci.
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h17.


 
 
 
 
Partenaires

Hébergement Web