IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Requête qui "tourne" indéfiniment [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Si tu exécutes seulement la partie SELECT de ta requête, cela donne quoi ?

    A+

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonsoir,

    J'ai tenté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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"


  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    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

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tbl_PrixNets T

    Ce serait pas plutôt :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tbl_PrixNets, T
    ?

    EDIT : Pourquoi tu n'utilises pas INNER JOIN au lieu de WHERE T1.MonChamp=T2.MonChamp ?

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Par contre, si je tente

    Code sql :Sélectionner tout - Visualiser dans une fenêtre à part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    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. :/

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Requête/SQL]Pb de "quote" avec un type memo
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/04/2007, 15h47
  2. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo