Méthode publique · ORM_CSHX2 · Agrégats

mth_ValeurMoyenne

Calcule en mémoire la moyenne arithmétique d'un membre numérique sur tous les tuples présents dans m_tabResults. Recherche en mémoire — aucune requête SQL n'est émise.

PUBLIQUE AGRÉGAT MySQL · MariaDB · PostgreSQL
01

📋 Description

mth_ValeurMoyenne parcourt l'ensemble du tableau m_tabResults et retourne la moyenne arithmétique du membre numérique désigné par son nom (somme des valeurs divisée par le nombre d'éléments). La méthode est l'équivalent en mémoire d'un AVG(colonne) SQL, mais appliqué au jeu d'objets déjà chargé.

🎯 Quand utiliser cette méthode

1. Calcul d'agrégat sur un jeu déjà chargé. Après un mth_ChargerSelonClauseWhere, on veut la moyenne d'un attribut numérique (montant, quantité, durée…) sans relancer une requête SQL d'agrégation.

2. Indicateurs métier rapides en IHM. Afficher le panier moyen, la quantité moyenne par commande, ou tout autre indicateur calculé à la volée dans une zone répétée, un tableau ou un tableau de bord — sans round-trip réseau.

3. Comparaison à une référence. Comparer une valeur individuelle à la moyenne du jeu (par exemple : signaler les commandes nettement supérieures ou inférieures à la moyenne).

ℹ️ Recherche en mémoire — pas de SQL

La méthode opère uniquement sur le tableau m_tabResults déjà chargé en mémoire. Aucune requête SQL n'est émise, aucun aller-retour réseau, pas d'impact sur la base. C'est une opération en O(n) sur la taille du tableau.

02

🔑 Signature

Déclaration
PROCÉDURE mth_ValeurMoyenne(
  LOCAL sMembreClasse est une chaîne
) : Variant
ÉlémentValeur
VisibilitéPUBLIQUE

Paramètres

ParamètreTypeRôle
sMembreClassechaîneNom du membre WLangage à analyser, sous la forme du nom du membre dans la classe (ex : "m_nMontant", "m_QUANTITE", "m_DUREE"). Le membre désigné doit être de type numérique — voir §03.
03

🧭 Types numériques supportés

La méthode n'opère que sur des membres dont le type SQL est numérique. Tout autre type (chaîne, date, booléen, mémo…) provoque un retour Null.

CatégorieTypes acceptés
Entiers signés1, 2, 4 et 8 octets
Entiers non signés1, 2, 4 et 8 octets
Réels4 et 8 octets, réel turbo
NumériqueType numérique précis (compatibilité grand format)
MonétaireType dédié aux valeurs financières
DuréeType dédié aux durées
Identifiant automatiqueIDAuto, IDAuto4
⚠️ Types non supportés

Pour calculer une moyenne, le membre désigné doit être numérique. Les types non numériques (chaînes, dates, heures, booléens, mémo…) provoquent un retour Null. Pour des besoins atypiques, parcourir manuellement m_tabResults ou utiliser une requête SQL avec AVG() reste la solution la plus simple.

04

📤 Valeur de retour

La méthode retourne un Variant. Selon les cas :

CasRetour
Tableau peuplé, membre numérique valideMoyenne arithmétique calculée sur tous les tuples
Membre désigné inconnu de la classeNull
Membre désigné de type non numériqueNull
Tuples marqués supprimés logiquement (p_bRecordDeleted = Vrai)Exclus du calcul (voir l'encadré ci-dessous)
m_tabResults est videNull
🏷️ Filtrage des tuples marqués supprimés

Les tuples dont la propriété p_bRecordDeleted (alias français : p_bEnregistrementSupprimé) vaut Vrai sont automatiquement exclus du calcul. Cela couvre deux scénarios usuels :

1. Suppression en lot via mth_EnregistrerTableau : un élément du tableau interne dont la PK est passée à une valeur négative est supprimé en base, et le drapeau p_bRecordDeleted est posé à Vrai. L'élément reste dans le tableau en mémoire mais n'est plus pris en compte par les méthodes d'agrégat.

2. Marquage logique applicatif : le code applicatif peut poser p_bRecordDeleted = Vrai sur certains tuples pour les exclure des calculs sans les supprimer en base. Pratique pour des calculs conditionnels sur un sous-ensemble.

La même logique s'applique à mth_SommeValeurs, mth_ValeurMaximale, mth_ValeurMinimale, mth_ValeursDistinctes et mth_Regroupement.

ℹ️ Tester avec <> Null

Le retour Null couvre indifféremment les trois cas d'absence (membre inconnu, type non numérique, tableau vide). Tester SI vMoyenne <> Null ALORS avant utilisation est la pratique courante.

05

💡 Exemples

Mode 1 — panier moyen sur un jeu de commandes

// ── Charger toutes les commandes du mois ──────────────────────── clCommande:p_sClauseWhere = "MOIS(commandes.DATE_CMD) = MOIS(NOW())" clCommande:mth_ChargerSelonClauseWhere() // ── Quel est le panier moyen du mois ? ────────────────────────── vPanierMoyen est un Variant = clCommande:mth_ValeurMoyenne("m_MONTANT_TTC") SI vPanierMoyen <> Null ALORS Info("Panier moyen du mois : " + vPanierMoyen + " €") SINON Info("Aucune commande sur la période") FIN

Mode 2 — comparaison à la moyenne

Cas d'usage : signaler les commandes dont le montant est nettement supérieur à la moyenne du jeu en cours.

// ── Charger les commandes du mois ─────────────────────────────── clCommande:mth_ChargerSelonClauseWhere() // ── Calculer le panier moyen une seule fois ───────────────────── vMoyenne est un Variant = clCommande:mth_ValeurMoyenne("m_MONTANT_TTC") SI vMoyenne <> Null ALORS nSeuil est un numérique = vMoyenne * 1.5 // 150 % de la moyenne // Itérer sur les commandes pour repérer celles au-dessus du seuil POUR i = 1 _À_ TableauOccurrence(clCommande:m_tabResults, indVariable) SI clCommande:m_tabResults[i]:m_MONTANT_TTC > nSeuil ALORS Trace("Commande au-dessus de la moyenne : ID=" + clCommande:m_tabResults[i]:m_ID_COMMANDE) FIN FIN FIN

Mode 3 — affichage d'indicateurs dans un tableau de bord

// ── Charger les ventes du jour ────────────────────────────────── clVente:p_sClauseWhere = "ventes.DATE_VENTE = DateSys()" clVente:mth_ChargerSelonClauseWhere() // ── Mettre à jour les libellés du dashboard ───────────────────── LIB_NbVentes = TableauOccurrence(clVente:m_tabResults, indVariable) LIB_PanierMoyen = clVente:mth_ValeurMoyenne("m_MONTANT") LIB_QuantiteMoyenne = clVente:mth_ValeurMoyenne("m_QUANTITE") // ✅ Aucune requête supplémentaire — tout en mémoire