Bonjour,

Si vous connaissez la programmation avec Access, il est probable que vous ayez déjà utilisé la fonction CpteDom() (ou en anglais DCount()).

Cette fonction permet très simplement de compter les enregistrements (ou les valeurs) qui respectent certaines conditions.
C'est donc l'équivalent des instruction SQL:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT COUNT(*)
SELECT COUNT(<rubrique>)
SELECT COUNT(DISTINCT <rubrique>)
Même si, selon les circonstances, son utilisation n'est pas toujours optimale, elle a l'avantage d'être facile à mettre en oeuvre, et d'être flexible vis à vis de la source de données.

Je vous propose une fonction codée en WLangage qui permet de désigner tout type de source de données comme domaine des valeurs à dénombrer:
_ une chaîne de caractères représentant le nom logique d'un fichier HF,
_ _ d'une requête définie dans l'éditeur, d'une requête SQL, d'une vue HF;
_ le nom symbolique (sans guillemet) d'un fichier HF ou d'une requête définie dans l'éditeur;
_ une variable de type source de données.

Syntaxe:
HCompte(<rubrique>,<domaine>[,<critères>[,<distinct>]])
Paramètres:
<rubrique> est une chaîne de caractères qui correspond soit à un nom de rubrique du domaine, soit à "*".
___ Dans le cas de "*", tous les enregistrements sont dénombrés.
___ Si une rubrique est précisée, alors seules les valeurs non nulles de la rubrique sont dénombrées.
<domaine> est la source de données des valeurs du domaine.
<critères> est une chaîne de caractères facultatives (par défaut, elle est égale à la chaîne de vide)
___ Sert à limiter la plage de données sur laquelle porte la fonction HCompte(), sous la forme d'une expression
___ conditionnelle comparable à celle de la clause WHERE d'une requête SQL.
<distinct> est un booléen facultatif (par défaut, il est égal à Faux), on le renseigne avec la valeur Vrai pour
___ que la fonction HCompte() ne dénombre que les valeurs différentes et non nulles de la rubrique.

Exemples:
Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
nCompte est un entier
 
nCompte = HCompte("*", FACTURES)
nCompte = HCompte("*", "FACTURES")
nCompte = HCompte("ID_LIGNE", REQ_FACTURES_DETAILS, "ID_FACTURE=123")
nCompte = HCompte("CODE_POSTAL", "T_CLIENTS", "PAYS='FRANCE'", Vrai)
nCompte = HCompte("CODE_POSTAL", "T_CLIENTS", *, Vrai)
nCompte = HCompte("CODE_POSTAL", "T_CLIENTS", "", Vrai)    // "" donne le même résultat que *
Particularités de cette fonction:
_ Fonction générique vis à vis des sources de données du domaine de valeurs.
_ Si la source de données est une requête définie dans l'éditeur qui n'est pas encore déclarée
_ _ au moteur HyperFile (HExécuteRequête()), la fonction utilise directement son code SQL.
_ Pour utiliser une requête paramétrée, il faut d'abord la déclarer au moteur HyperFile.
_ En cas d'erreur, la fonction retourne 0 ou Null.
_ _ Le n° d'erreur et le message d'erreur sont disponibles via la fonction ErreurInfo().

Code source de la fonction HCompte():
Code WLangage : 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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
 
FONCTION HCompte(sRubrique est une chaîne, xDomaine, sCondition est une chaîne="", bDistinct est un booléen=Faux)
 
sCodeSQL, SQL, sDistinct, sDomaine est une chaîne 
bExiste est un booléen
nErr est une entier
sMsg est une chaîne
 
sdDomaine, sdCompte est une Source de Données
 
sdDomaine += DonneIdentifiant()
sdCompte += DonneIdentifiant()
 
 
QUAND EXCEPTION DANS
	bExiste = HFichierExiste(xDomaine)
FAIRE
	// Code erreur: 1066
	bExiste = Faux
FIN
 
SI bExiste ALORS
	sDomaine = {xDomaine}..Nom
SINON
 
	QUAND EXCEPTION DANS
		// est-ce une requête ?
		sCodeSQL = {xDomaine}..CodeSQL
 
	FAIRE
		// Code erreur: 1059, sur propriété CodeSQL
 
		sMsg = "Le domaine ne correspond ni à une table, ni à une requête."
		nErr = 5
		RENVOYER Null
	FIN
 
	SI sCodeSQL = "" ALORS
		sMsg = "Le domaine est un fichier qui n'existe pas (HCréation ???)."
		nErr = 4
		RENVOYER Null
	FIN
FIN
 
// Cas où le domaine est une requête non déclarée/exécutée
// Crée une source de domaine basée sur le code SQL de la requête
SI sCodeSQL<>"" ALORS
	SI HExécuteRequêteSQL(sdDomaine,hRequêteDéfaut,sCodeSQL) ALORS
		sDomaine = sdDomaine..Nom
	SINON
		sMsg = "Erreur d'exécution de la requête du domaine."
		nErr = 3
		RENVOYER Null
	FIN
FIN
 
SI bDistinct _ET_ sRubrique <> "*" ALORS sDistinct = "DISTINCT "
 
SI sCondition ~= "" ALORS
	SQL = "SELECT COUNT(%1%2) AS N_COUNT FROM [%3]"
SINON
	SQL = "SELECT COUNT(%1%2) AS N_COUNT FROM [%3] WHERE %4"
FIN
 
SQL=ChaîneConstruit(SQL,sDistinct,sRubrique,sDomaine,sCondition)
 
SI HExécuteRequêteSQL(sdCompte,hRequêteDéfaut,SQL) ALORS
	HLitPremier(sdCompte)
 
	SI HEnDehors(sdCompte) ALORS
		sMsg = "Aucun enregistrement"
		nErr = 2
		RENVOYER 0
	SINON
		RENVOYER sdCompte.N_COUNT
	FIN
 
SINON
	sMsg = "Erreur d'exécution de la requête du domaine." + RC + RC + ErreurInfo(errMessage) + RC + RC + SQL
	nErr = 1
	RENVOYER Null
FIN
 
FIN:
SI nErr > 0 ALORS
	SI EnModeTest() ALORS Erreur("Erreur n° " + nErr, sMsg)
	ErreurDéclenche(nErr,sMsg)
FIN