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
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
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
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
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 DLookupet 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
Ok merci, je vais lire ton tuto et je reviens si besoin
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
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:
A noter que si tu te trouves dans le code, utilises la virgule (,) comme séparateur d'arguments, sinon, utilises le point-virgule (
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)")comme séparateur.
Alors pour le cas exposé, j'utilise la fonction DLookUp (ou RechDom en français).
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=DLookUp("[CHP1]","TBL","Critère sur CHP3")-DLookUp("[CHP2]","TBL","Critère sur CHP3")
Et voila, pas besoin de RecordSet car c'est encore un objet!
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)
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:
Encore, je réitère que si c'est pas ce que tu voulais, alors encore toutes mes excuses.
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
Bon courage et @+
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
Alors, l'utilisation de la fonction de regroupement de domaine DSum peut faire ton affaire!
Je ne peux pas utiliser cette fonction car la requête sql sert de source à un autre formulaire, elle ne peut-être 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
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 ... WHERE Libellé ='xxx' ...
Et tu fais pareil pour Débit et le tour est joué!
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)
En espérant que tu arrives à me comprendre,
Bon courage et @+
Oui je te comprends mais j'ai 2 critères sur ma requête :
Je ne te dis pas la syntaxe qu'il faudrait pour DSum...
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))
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?
@+
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; "
Envoyé par alainGL
Pour obtenir la somme des crédits et débits.
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)
Je te remercie pour ton code, je vais le tester
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager