Méthode publique · ORM_CSHX2 · Agrégats

mth_ValeurMinimale

Calcule en mémoire la valeur minimale 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_ValeurMinimale parcourt l'ensemble du tableau m_tabResults et retourne la plus petite valeur trouvée pour le membre numérique désigné par son nom. La méthode est l'équivalent en mémoire d'un MIN(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 minimum 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 minimale 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 inférieure d'un attribut pour cadrer un traitement en aval (par exemple : identifier le panier le plus petit pour ajuster un seuil de gratuité de livraison).

ℹ️ 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_ValeurMinimale(
  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 « min 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 MIN() reste la solution la plus simple.

✅ Comportement correct sur valeurs négatives

L'algorithme initialise la valeur de référence avec le premier tuple du tableau, pas avec une constante. Le résultat reste donc correct même quand toutes les valeurs sont négatives — pas de biais lié à un seuil zéro.

04

📤 Valeur de retour

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

CasRetour
Tableau peuplé, membre numérique valideValeur minimale 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_ValeurMaximale, 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 vMin <> Null ALORS avant utilisation est la pratique courante.

05

💡 Exemples

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

Mode 2 — détection d'une valeur plancher

Cas d'usage : on veut connaître la plus faible quantité commandée sur l'historique pour ajuster un seuil minimum de stock.

// ── Récupérer tout l'historique de commandes d'un produit ─────── clCommande:p_sClauseWhere = "commandes.ID_PRODUIT = 42" clCommande:mth_ChargerSelonClauseWhere() // ── Quelle est la plus faible quantité jamais commandée ? ─────── vQuantiteMin est un Variant = clCommande:mth_ValeurMinimale("m_QUANTITE") SI vQuantiteMin <> Null ALORS Info("Quantité minimale historique : " + vQuantiteMin) SINON Info("Aucun historique pour ce produit") FIN

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