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 :

Requête de sélection en VBA


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut Requête de sélection en VBA
    Bonjour

    Je désirerai faire des calculs sur le résultat d'une requête de sélection mais sans la créer en tant qu'objet dans la base.
    Pouvez-vous m'am'indiquer le code

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Pourrais-tu être un peu plus précis.

    Si j'ai bien compris, tu veux faire une requête de sélection, et faire des calculs sur les enregistrements, sans créer la requête dans Access.

    Si c'est le cas, je pense que l'utilisation de DAO pourrait t'aider, voici un lien vers le tuto sur DAO : http://warin.developpez.com/access/dao/

    Si je fais fausse piste, essaye de détailler un peu plus.

    Starec

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Merci pour ta réponse

    je voudrais créer, en VBA uniquement et non en tant qu'objet, une requête de sélection avec plusieurs critères et procéder à des calculs sur certains champs : total A - total B par exemple et récupérer ce résultant dans une zone de texte d'un formulaire. Il s'agit en fait de lancer une action sur le double clic.
    Pour des requêtes actions, je n'ai pas de soucis, j'utilise runsql mais je ne connais pas le code pour une requête de sélection.
    J'espère ne pas avoir été trop nébuleux...
    merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re

    Je garde ma réponse DAO, va voir du coté des Recordset dans le tuto dont je t'ai donné le lien.

    Tu peux récupérer pour chaque enregistrement respectant les critéres les données individuelle de chaque champ et en faire ce que tu veux.

    Sinon il y'a une autre solution avec la fonction de domaine DLookup et des recherches sur le forum pour des exemples.

    En gros, tu récupéres la donnée que tu veux dans la table avec cette fonction, tu peux la stocker dans une varaible et en faire ce que tu veux.
    Cependant cette fonction ne te renverra qu'une seule valeur.

    Si tes tables sont grosses je te la déconseille, car elle moins rapide que du SQL.

    Starec

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Ok merci, je vais lire ton tuto et je reviens si besoin

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Je viens de parcourir le tuto sur les RecordSet mais je n'ai pas trouver la syntaxe qui me permettra de faire des sommes et des soustractions sur des champs de la requête sql.
    Mon problème est, d'une part, créer un recordset avec des critères de sélection, c'est fait, puis d'aditionner et soustraire les montants de 2 champs de cette requête SQL.
    Avez-vous une idée ?
    Merci

  7. #7
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bonjour,
    Je ne crois pas avoir bien compris ce que tu veux en venir mais je vais te proposer ce qui suit:
    Supposons que tu as une table TBL contenant entre autres les champs CHP1, CHP2 et CHP3. le critère se pose sur le champ CHP3.
    Si l'objectif est de retrouver le résultat de la soustraction de CHP2 à CHP1 et si et seulement si l'enregistrement résultant en fonction du critère retourne un seul enregistrement, alors la prmeière sloution consiste à utiliser les fonctions de regroupement de domaine. Pour ce cas, il s'agit de retrouver les valeurs de CHP1 et CHP2 en fonction du critère posé.
    La syntaxe d'utilisation d'une fonction de regroupement de domaine est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable=NomFonction("[Champ à retrouver]","Nom Table ou Requête sélection","Critère (condition WHERE sans WHERE)")
    A noter que si tu te trouves dans le code, utilises la virgule (,) comme séparateur d'arguments, sinon, utilises le point-virgule ( comme séparateur.
    Alors pour le cas exposé, j'utilise la fonction DLookUp (ou RechDom en français).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable=DLookUp("[CHP1]","TBL","Critère sur CHP3")-DLookUp("[CHP2]","TBL","Critère sur CHP3")
    Dans le cas où la focntion retournerait une valeur nulle, il faut penser à l'utilisation de la fonction nz.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable=nz(DLookUp("[CHP1]","TBL","Critère sur CHP3"),0)-nz(DLookUp("[CHP2]","TBL","Critère sur CHP3"),0)
    Et voila, pas besoin de RecordSet car c'est encore un objet!
    Mais voyons plus loin, si tu veux parcourir le résultat de la requête et faire des calculs (comme soustraction) sur les champs de chaque enregistrement parcouru, il te faut procéder comme suit:
    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
     
    Dim rs as DAO.Recordset, var as Variant
    Set rs=CurrentDb("SELECT TBL.CHP1, TBL.CHP2 FROM TBL WHERE TBL.CHP3=ce que tu veux;",dbOpenDynaset)
    With rs
      If .RecordCount<>0 Then 'Si l'objet recordset retourne au moins un enregistrement
        .MoveFirst 'PAsse au premier enregistrement du jeu
        Do While Not .EOF 'Tant que la fin du jeu n'est pas atteint
          var=.Fields(0)-.Fields(1) 'accueillir dans var le résultat de la soustraction du premier champ et du second
          .MoveNext 'Passe à l'enregistrement suivant
          DoEvents 'Traite les tâches en cours 
        Loop
      End If
      .Close
    End With
    Set rs=Nothing
    Encore, je réitère que si c'est pas ce que tu voulais, alors encore toutes mes excuses.
    Bon courage et @+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    merci Mahefasoa pour ta réponse, mon problème est plus simple que ca en fait,
    J'ai placé dans mon code une requête sql de sélection avec : un champ "Libelle" sur lequel j'ai mis un critère issu d'une zone de texte de mon fomulaire principal F1 , un champ Date, un champ Debit et un champ Credit. Cette requête doit me restituer un ensemble d'enregistrements correspondant à mes critères.
    Le but de ce code est d'une part, d'ouvrir un formulaire F2 avec la requête en RecordSource, cela fonctionne bien, mais également de récupérer le résultat du calcul suivant : Somme du champ "Débit" - Somme du champ "Crédit" pour mettre à jour une autre zone de texte de mon formulaire F1.
    J'y suis presque arrivé...
    Merci pour ton avis

  9. #9
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Alors, l'utilisation de la fonction de regroupement de domaine DSum peut faire ton affaire!

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Je ne peux pas utiliser cette fonction car la requête sql sert de source à un autre formulaire, elle ne peut-être de regroupement...

  11. #11
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut Une Fonction de regroupement ne veut pas dire Requête de regroupement
    Non, c'est que tu ne m'as pas compris!
    Les fonctions de regroupement de domaine sont des fonctions qui ne regroupent pas les requêtes mais scrutent les tables ou requêtes existantes en cherchant des valeurs isolées ou regroupées (somme ou autres fonctions statistique de regroupement) et renvoient la valeur ainsi trouvée.
    L'utilisation de la fonction DSum ne t'obliges en rien de regrouper ta requête!
    Par contre tu peux utiliser le critère placé dans la requête pour devenir le critère de la fonction comme cela le résultat obtenu sera à l'image de ta requête. J'utilise un métaphore ici.
    Si par exemple dans ta requête, tu as utilisé un critère comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... WHERE Libellé ='xxx' ...
    Alors pour la fonction de regroupement, tu peux réutiliser ce critère comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'Pour obtenir la somme des Crédits
    variable=nz(DSum("[Crédit]","Table","[Libellé]='xxx'"),0)
    Et tu fais pareil pour Débit et le tour est joué!
    En espérant que tu arrives à me comprendre,
    Bon courage et @+

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Oui je te comprends mais j'ai 2 critères sur ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((T_Ecritures.Libelle) Like "*CA*") AND ((Val(Mid(Right([Libelle],3),1,2)))= Variable))
    Je ne te dis pas la syntaxe qu'il faudrait pour DSum...

  13. #13
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Alors tu n'as qu'à placer ton critère dans la condition WHERE de la fonction.
    Mais peux-tu fournir ici l'instruction sql complète?
    @+

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Voici ma requête sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sql = "SELECT T_Ecritures.Date, T_Ecritures.Libelle, T_Ecritures.MontantD, T_Ecritures.MontantC "
    sql = sql & "FROM T_Ecritures "
    sql = sql & "WHERE (((T_Ecritures.Libelle) Like ""*CA*"") And ((Val(Mid(Right([Libelle], 3), 1, 2))) = " & Periode & ")) "
    sql = sql & "ORDER BY T_Ecritures.Date; "

  15. #15
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par alainGL
    Code :
    ---------
    sql = "SELECT T_Ecritures.Date, T_Ecritures.Libelle, T_Ecritures.MontantD, T_Ecritures.MontantC "
    sql = sql & "FROM T_Ecritures "
    sql = sql & "WHERE (((T_Ecritures.Libelle) Like ""*C Affaire*"") And ((Val(Mid(Right([Libelle], 3), 1, 2))) = " & Periode & ")) "
    sql = sql & "ORDER BY T_Ecritures.Date; "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'Calcul somme Crédit basée sur cette requête
    Crédit=nz(DSum("[MontantC]","T_Ecritures","[Libelle] Like '*C Affaire*' AND Val(Mid(Right([Libelle],3),1,2))=" & Periode),0)
    'Calcul somme Débit
    Débit=nz(DSum("[MontantD]","T_Ecritures","[Libelle] Like '*C Affaire*' AND Val(Mid(Right([Libelle]3),1,2))=" & Periode),0)
    Pour obtenir la somme des crédits et débits.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Je te remercie pour ton code, je vais le tester

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 195
    Points : 87
    Points
    87
    Par défaut
    Ca marche !
    Merci beaucoup

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

Discussions similaires

  1. 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
  2. [AC-2002] Exécuter une requête de sélection paramétrée depuis VBA
    Par ChrisP dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/10/2011, 15h56
  3. Réponses: 6
    Dernier message: 23/08/2007, 09h49
  4. Réponses: 2
    Dernier message: 15/08/2007, 19h54
  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