Méthode publique · ORM_CSHX2 · Agrégats

mth_ValeurMaximale

Calcule en mémoire la valeur maximale 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_ValeurMaximale parcourt l'ensemble du tableau m_tabResults et retourne la plus grande valeur trouvée pour le membre numérique désigné par son nom. La méthode est l'équivalent en mémoire d'un MAX(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 le maximum d'un attribut numérique (montant, quantité, durée…) sans relancer une requête SQL d'agrégation.

2. Statistiques métier rapides en IHM. Afficher la valeur maximale d'une colonne dans une zone répétée, un tableau, ou un tableau de bord — sans round-trip réseau.

3. Pré-calcul avant traitement. Récupérer la borne supérieure d'un attribut pour cadrer un traitement en aval (par exemple : déterminer le plus haut numéro déjà attribué pour générer le suivant en interne).

ℹ️ 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_ValeurMaximale(
  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 un agrégat sur des chaînes (par exemple le « max alphabétique » d'un libellé) ou sur des dates / heures, cette méthode renverra Null. Pour ces besoins, parcourir manuellement m_tabResults ou utiliser une requête SQL avec MAX() 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 valideValeur maximale trouvée parmi 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_ValeurMoyenne, 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 vMax <> Null ALORS avant utilisation est la pratique courante.

05

💡 Exemples

Mode 1 — montant max 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 plus gros panier du mois ? ────────────────────── vMontantMax est un Variant = clCommande:mth_ValeurMaximale("m_MONTANT_TTC") SI vMontantMax <> Null ALORS Info("Plus gros panier du mois : " + vMontantMax + " €") SINON Info("Aucune commande sur la période") FIN

Mode 2 — détermination d'une borne avant traitement

Cas d'usage : dans un référentiel partiellement géré côté applicatif, on veut générer un nouveau numéro d'ordre supérieur au plus grand existant.

// ── Récupérer tous les enregistrements existants ──────────────── clProduit:mth_ChargerSelonClauseWhere() // ── Quel est le numéro d'ordre le plus haut ? ─────────────────── vRangMax est un Variant = clProduit:mth_ValeurMaximale("m_nORDRE_AFFICHAGE") nProchainRang est un entier SI vRangMax <> Null ALORS nProchainRang = vRangMax + 1 SINON nProchainRang = 1 // Aucun produit existant : premier rang FIN

Mode 3 — affichage d'agrégat 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_VenteMax = clVente:mth_ValeurMaximale("m_MONTANT") LIB_QuantiteMax = clVente:mth_ValeurMaximale("m_QUANTITE") // ✅ Aucune requête supplémentaire — tout en mémoire