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:
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:
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():
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 |
Partager