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

Requêtes et SQL. Discussion :

Transformer requête sélection en requête suppression en VBA


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut Transformer requête sélection en requête suppression en VBA
    Bonjour

    Je souhaite exécuter une requête suppression suite à un test en Msgbox.

    Ce test est conditionné par la présence d’une ligne dans cette requête. En mode requête sélection, cela fonctionne, mais dès que je la transforme en requête suppression j’ai le message « Une requête action ne peut pas être utilisé comme source ».
    Existe-t-il un moyen de modifier la requête sélection en requête suppression après le test ?

    Ou bien avez-vous une autre idée.
    La seule qui me vient à l’esprit serait de créer une autre requête (l’une teste, l’autre supprime), mais bof.

    Sous Access 2000 !
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Supprimer_fiche_Click()
     
            ' Teste la présence de facture liée au client
     
            If DCount("*", "Suppression Client") = 0 Then
                 MsgBox "Le client que vous souhaitez supprimer apparait dans des factures.  " & Chr(13) & "           Vous ne pouvez donc pas le supprimer", vbExclamation, ""
            Else
                If MsgBox("ATTENTION !" & Chr(13) & Chr(13) & "Cette suppression est possible car il n'existe pas de facture au nom de ce client.   " & Chr(13) & "  Voulez vous définitivement supprimer ce client de votre liste ?", vbYesNoCancel + vbQuestion + vbDefaultButton2, "Confirmez svp !") = vbYes Then
     
            ' Supprime le client
                DoCmd.OpenQuery "Suppression Client"
     
                 Else
                  End If
            End If
     
                  Exit Sub
     
     
    End Sub
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Clientèle.*, Clientèle.RéfClient, Facture.[Réf Facture]
    FROM Clientèle LEFT JOIN Facture ON Clientèle.RéfClient = Facture.[Réf Client]
    WHERE (((Clientèle.RéfClient)=[Formulaires]![Modification fiches clients]![RéfClient]) AND ((Facture.[Réf Facture]) Is Null));
    Merci pour votre aide
    Franck

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 346
    Points : 23 809
    Points
    23 809
    Par défaut
    le plus simple est de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenQuery "Suppression Client"
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.querydefs("Suppression Client").execute
    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut
    Bonjour Maitre Marot

    Le refus est dans la première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If DCount("*", "Suppression Client") = 0 Then
    Cà fonctionne très bien en laissant en requête sélection.
    C'est dès que je modifie la requête en requête action qu' il ne veut plus effectuer le test. C'est pour cela que je pensais laisser la requête en requête sélection et la passer en requête suppression après le test.

    Si j'ai bien compris (et là je suis pas sûr) tu me proposes de modifier la méthode d'exécution de la requête, mais pas d'en modifier le type. Et dans ce cas, le plantage au test sera toujours présent. Non ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    p'tit aviateur, si j'ai bien compris tu fais le DCount sur la requête de suppression; en comptant récupérer le nombre d'enregistrements susceptibles d'être affectés sans que la requête bien qu'ayant renvoyé un nombre d'enregistrement, n'aie effectué la suppression.

    Essaie plutôt :
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     'Nombre de clients sans factures
     Dcount("RéfClient","Clientèle","réfClient NOT IN (SELECT [Réf client] FROM Facture)")
     
      'Nombre de factures du client X (ici j'appelle RéfFacture le n° de facture)
      DCount("RéfFacture","Facture","[Réf Client]=" & [Formulaires]![Modification fiches clients]![RéfClient])

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut
    Merci Ilank

    C'est presque çà
    Je ne souhaite pas compter, mais juste vérifier qu'il n'y a pas de facture accrochée à ce client. :
    Si non (=0 >>> pas de facture), j'autorise la suppression après confirmation (msgbox oui/non)
    Si oui (<>0 >>>il y a au moins une facture), j'averti l'impossibilité de supprimer la fiche client.

    J'essaye de broder autour, mais pour l'instant, le test est toujours "=0", il m'annonce donc "pas de facture accrochée" quelque soit le cas. Je continue

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Utilises les codes que je t'ai donné. Et tu comptes bien le nombre de factures du client si le client n'a pas de facture, son RéfClient n'est pas présent dans la colonne [Réf Client] de la table Facture. Un décompte ou même un dlookup suffit.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'Si le client a au moins une facture
    If DCount("*","Facture","[Réf client]=" & [Formulaires]![Modification fiches clients]![RéfClient])>0 Then
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'Si le client est présent dans la table facture
     If Not Isnull(Dlookup("[Réf Client]","Facture","[Réf Client]=" & [Formulaires]![Modification fiches clients]![RéfClient])) Then

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut
    Je sens qu'on se rapproche, mais maintenant il me met un message d'erreur "impossible de retrouver le champ de votre expression..." Dans les 2 cas.
    Pourtant la syntaxe a l'air correcte

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut
    Bon çà avance.

    Le code de Ilank fonctionne avec une t'ite modif sur [Formulaire] remplacé par Forms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If DCount("*", "Facture", "[Réf client]=" & Forms![Modification fiches clients]![RéfClient]) > 0 Then
    Le test s'effectue bien

    Mais les pb continuent plus bas avec le message "Impossible de supprimer dans les tables spécifiées" c'est donc ma requête suppression qu'il me va falloir revoir......ou écrire en VBA...

  9. #9
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 634
    Points : 34 343
    Points
    34 343
    Par défaut
    Salut,
    si tu veux vider la table Clientèle, il faut refaire ta requête comme ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Clientèle.*
    FROM Clientèle LEFT JOIN Facture ON Clientèle.RéfClient = Facture.[Réf Client]
    WHERE (((Clientèle.RéfClient)=[Formulaires]![Modification fiches clients]![RéfClient]) AND ((Facture.[Réf Facture]) Is Null));

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut


    Toujours le même message "Impossible de supprimer dans les tables spécifiées"

    Ca doit provenir de la jointure, je creuse...J'ai déjà eu un Pb similaire

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut


    Pour ceux que cela interressent voici le code de la requète suppression qui fonctionne, après test ci dessus comme souhaité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Clientèle.*
    FROM Clientèle
    WHERE (((Clientèle.RéfClient) Not In (select [facture].[réf client] from [facture]) And (Clientèle.RéfClient)=[Formulaires]![Modification fiches clients]![RéfClient]));
    Un grand merci à vous trois pour l'aide et les pistes que vous m'avez apporté

    Franck

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/10/2014, 14h51
  2. peut on exécuter une requête sélection avec vba
    Par kergamenan dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/05/2014, 22h06
  3. [AC-2010] Problème à l'exécution d'une requête suppression basée sur une requête sélection
    Par Philippe1975 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 14/06/2013, 22h21
  4. [AC-2003] Traduction en VBA d'une requête Sélection SQL sur plusieurs tables
    Par Pucho Faritas dans le forum VBA Access
    Réponses: 9
    Dernier message: 29/10/2009, 10h32
  5. Requête sélection en VBA ?
    Par hannii dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 31/08/2006, 15h37

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