Utilisation fonction DCount
Résoluyg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
Je dispose d'une requête (RGRPAH_NUM) basée sur une autre requête (RGRAPH).
La requête RGRAPH_NUM est composé comme suit : Semaine (affichant les semaines) et CULTURE_NUM (affichant le numéroauto d'une table CULTURE)
J'aimerai insérer une troisième colonne N, affichant un numéroAuto qui redémarre à 1 dès que le CULTURE_NUM change.
Voici le code SQL que j'ai réalisé,
SELECT RGRAPH.Semaine, RGRAPH.CULTURE_NUM, DCount("*","RGRAPH","RGRAPH.Semaine=""" & [RGRAPH.Semaine] & """ and RGRAPH.CULTURE_NUM<=" & [RGRAPH.CULTURE_NUM]) AS N
FROM RGRAPH;
et voici le résultat obtenu

Voici le résultat voulu :

Comme vous le constatez, ma fonction DCOUNT est à revoir...
Quelqu'un aurait-il l'amabilité de pouvoir m'aider ?
Je vous souhaite une bonne journée,
Cordialement,
7 réponses
Le souci porte sur l’ajout d’une colonne N dans une requête RGRAPH_NUM qui réinitialise le compteur à 1 à chaque changement de CULTURE_NUM, selon la valeur de Semaine. Des solutions évoquées incluent l’usage de DCount avec des critères sur CULTURE_NUM et Semaine, des tests de types et des alternatives via une fonction personnalisée ou via SQL. Plusieurs réponses discutent aussi des liens entre les tables CULTURE et PRODUCTION et des limites rencontrées, notamment des erreurs de type et la nécessité d’adapter le code au mode SQL ou VBA. En dernier, la discussion suggère qu’il faut soit réécrire la logique dans une fonction dédiée, soit partager le fichier ou les résultats pour clarifier les liens entre Semaine et CULTURE_NUM.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
il me semble que, dans le critère du DCOUNT, tu dois employer une inégalité à la place de l'égalité, et vice-versa. -
Bonjour,
Je vous remercie,
Je n'y avait pas pensé;
Cependant les résultats ne s'affichent toujours pas de la façon souhaitée...
Le numéro 1 change en un autre chiffre maintenu quand le numéro de culture est le même.
J'ignore quel est le problème
Voici un exemple de résultats :
Auriez-vous une autre solution ou conseils ? -
Bonjour,
Je vous remercie;
Voici la requête en mode SQL :
SELECT RGRAPH.Semaine, RGRAPH.CULTURE_NUM, DCount("*","RGRAPH","RGRAPH.Semaine<>""" & [RGRAPH.Semaine] & """ and RGRAPH.CULTURE_NUM<>" & [RGRAPH.CULTURE_NUM]) AS N
FROM RGRAPH
j'ai essayé toute les combinaisons avec (>/<>/<= et >=)
La requête RGRAPH est basée sur deux tables CULTURE et PRODUCTION;
La table CULTURE est composée des champs CROP (espèce cultivée), VARIETY (la variété)
Une culture se définie par CULTURE_NUM, le numéroAuto de la table. La table PRODUCTION renvoie à la production d'une culture. Il y a ainsi plusieurs lignes de productions par numéro de culture.
La table PRODUCTION contient des dates de ventes [DATES] et le nombre de kg vendus KGS_SOLD
Voici le mode SQL de la requête RGRAPH :
SELECT CULTURE.CROP, CULTURE.VARIETY, CULTURE.CULTURE_NUM, AnSem([DATES]) AS Semaine, Sum(PRODUCTION.KGS_SOLD) AS SommeDeKGS_SOLD
FROM CULTURE INNER JOIN PRODUCTION ON CULTURE.CULTURE_NUM = PRODUCTION.CULTURE_NUM
GROUP BY CULTURE.CROP, CULTURE.VARIETY, CULTURE.CULTURE_NUM, AnSem([DATES])
HAVING (((CULTURE.CROP)=[Formulaires]![GRAPH]![LISTE]) AND ((CULTURE.VARIETY)=[Formulaires]![GRAPH]![ListeVariety]))
ORDER BY CULTURE.CULTURE_NUM, AnSem([DATES]);
AnSemaine est une fonction permettant de convertir les dates en numéro de semaines,
le formulaire GRAPH contient deux listes de choix (CROP et VARIETY) permettant de mettre en place la requête RGRAPH,

Dites moi si vous voulez que je précise d'autres points,
En vous remerciant,-
le but du DCOUNT n'est-il pas d'obtenir, pour chaque enregistrement de RGRAPH, le nombre d'enregistrements de la même culture, dont la date est antérieure où égale à cet enregistrement?
peux-tu préciser, quand tu montres des résultats, s'il s'agit du résultat complet, ou seulement d'une partie du résultat? -
J'obtiens bien le résultat souhaité avec cet écrit :
DCount("*","RGRAPH","CULTURE_NUM=" & [CULTURE_NUM] & " and Semaine<=""" & [Semaine] & """") AS Expr2 .
J'ai également rajouté le champs CROP.
J'aimerais faire une autre requête permettant d'associer les champs CROP et NUMERO de la précédente requête, avec une table FORECAST composé comme suit :
Simplement je n'arrive pas à lancer la requête; un message d'erreur s'affiche,
Voici le code SQL
SELECT RGRAPHnum.CROP, RGRAPHnum.CULTURE_NUM, RGRAPHnum.NUMERO
FROM FORECAST INNER JOIN RGRAPHnum ON (FORECAST.SemNum = RGRAPHnum.NUMERO) AND (FORECAST.CROP_NUM = RGRAPHnum.CROP)
GROUP BY RGRAPHnum.CROP, RGRAPHnum.CULTURE_NUM, RGRAPHnum.NUMERO;
J'ai essayé également en RIGHT et LEFT JOIN,
La relation entre NUMERO et SeNum pose problème
Je ne comprends pas pourquoi cela ne fonctionne pas.
Pourriez-vous m'éclairez ?
Cordialement, -
Je suppose que c'est soit
(FORECAST.SemNum = RGRAPHnum.NUMERO)
, soit(FORECAST.CROP_NUM = RGRAPHnum.CROP)
qui pose problème.
Tu peux facilement le déterminer en testant.
Je suspecte que c'est CROP qui crée le problème, ne serait-il pas défini comme un champ dont la valeur est à choisir dans une liste? -
En testant, j'observe que si je ne fais que la liaison (FORECAST.CROP_NUM = RGRAPHnum.CROP), la requête s'affiche,
Mais lorsque je ne fais que la liaison (FORECAST.SemNum = RGRAPHnum.NUMERO), il est écrit "incohérence de type dans une expression;
Concernant la table Forecast, oui, CROP est défini dans un champs dont la valeur est à choisir dans une liste.
Mais je ne pense pas que CROP pose problème ici car il m'est possible de faire la relation. -
Je pense que au lieu de passer par DCount("*","RGRAPH","CULTURE_NUM=" & [CULTURE_NUM] & " and Semaine<=""" & [Semaine] & """") AS N,
Il faut que je passe par une fonction dans un module pour créer la relation.
Mais je n'arrive pas à transformer ce code SQL en fonction.
J'ai essayé de cette façon mais ça ne fonctionne pas :
Public Function Num(N1 As String, N2 As String) As Integer
Num = DCount("*", "RGRAPH", "CULTURE_NUM='" & N1 & " and Semaine<='""" & N2 & """")
End Function
Savez-vous comment puis-je transformer cette fonction pour qu'elle fonctionne ?
-
-
J'ai l'impression que cela fonctionne si je procède de cette façon (inverser culture et semaine) :
DCount("*","RGRAPH","CULTURE_NUM=" & [CULTURE_NUM] & " and Semaine<=""" & [Semaine] & """") AS Expr2 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
Tu as en fait trois types d'information que tu veux rassembler:
- des informations "permanentes", qui ne varient pas dans le temps
- des informations variables liées à la production, liées à des dates
- des informations variables liées aux prévisions, liées à des dates
Tes requêtes mélangent cela dans tous les sens, sont inutilement compliquées et embrouillées.
La requête RGRAPHnum me semble aller dans la bonne direction, elle fournit des informations de production, avec le minimum d'informations permanentes nécessaires.
Je suggère de construire une requête similaire, qui fournira des informations de prévision, avec les informations permanentes nécessaires. Appelons la FORECAST_perminfo.
La requête de base pour les graphes sera FROM FORECAST_perminfo LEFT JOIN RGRAPHnum. -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
En ce qui concerne les noms de semaine qui manquent dans les données de prévision, je suggère, d'abord, d'utiliser une date (celle du lundi) pour représenter les semaines. Cela sera beaucoup plus rapide et également plus simple pour associer une semaine aux prévisions. Ce qui n'empeche pas, si souhaité, d'utiliser la représentation "2021 s5" dans les graphes (en utilisant AnSem() dans une dernière requête).
Donc, de remplacer, dans la requête RGRAPHAnSem([DATES])
parint(dates) - weekday(dates,2) +1
Ensuite, créer une requête similaire à WeekMin, qui fournit le premier lundi de chaque culture.
Pour obtenir finalement la date associée à chaque semaine de prévision, il suffit de calculerpremierlundi + 7*(numerosemaine-1)
.
Cela permettra aussi d'éliminer wnum() et le dcount(), qui ralentissent le travail. -
Bonjour,
Je vous remercie de tout coeur pour votre aide,
J'essaie de mettre cela en place,
Je vous tiendrais au courant et si vous le permettez, vous demanderais de nouveau conseils,
Cordialement,