PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Comment afficher le montant min ou max d'une colonne d'un champ table dans une rupture ?
Comment afficher le montant min ou max d'une colonne d'un champ table dans une rupture ?
Débuté par OLI, 10 fév. 2026 17:46 - 4 réponses
Membre enregistré
30 messages
Posté le 10 février 2026 - 17:46
Bonjour,
(Ma configuration : WD 2024, PC portable ThinkPad, Windows 11 Enterprise, 16 Go RAM, OS 64bits)

J'affiche dans un champ table des KPI que je remplie par programmation.
Ce champ table contient entre autres les colonnes suivantes :
- Date
- Numéro de semaine dans l'année de la date (colonne cachée)
- Chiffres d'affaires (CA)
J'ai ajouté une rupture haut et bas sur le numéro de semaine.
Dans la rupture bas, un libellé me permettant d'avoir la somme de la colonne CA.
Pour se faire, comme vous le savez, vous allez dans la partie "UI" et dans la section "Dans une rupture" j'ai choisit comme calcul automatique la somme de la colonne CA.





Dans cette fenêtre vous pouvez donc définir la somme, la moyenne, le nombre de, MAIS pas le minimum ou le maximum :(
J'ai bien cherché mais je ne trouve pas le moyen de le faire, excepté peut être en faisant une boucle et en repérant le numéro de semaine et le montant minimum, mais ça ralentit très fort l'affichage.
J'ai tenté aussi avec la fonction TableFormuleAjoute, je n'y arrive pas non plus :(
Quelqu'un aurait-il déjà faire ce genre de chose ou pourrait me donner une piste à creuser ?
Ce que je trouve dingue c'est qu'on peut faire des calculs automatiques sur des colonnes,





mais les mêmes fonctionnalités ne sont pas présentes dans la liste citée plus haut :o ou alors je passe complètement à côté ?

Merci d'avance pour votre aide ;)
Membre enregistré
6 messages
Posté le 10 février 2026 - 19:39
Est-ce que ceci pourrait vous aider et correspond à votre besoin OLI ?


Calculer un Minimum (ou Maximum) dans un bas de rupture d'une Table remplie par programmation, sans tuer les performances.

C'est effectivement une limitation agaçante de l'interface de WINDEV : la somme et la moyenne sont automatiques, mais pas le Min/Max.

Voici 3 solutions, de la plus performante à la plus simple.

Solution 1 : La méthode "Accumulateur" (La plus performante)
Puisque vous dites que la boucle "ralentit très fort", c'est probablement parce que vous reparcourez la table à chaque affichage de rupture. L'astuce consiste à calculer le Min/Max au fil de l'eau, pendant que WINDEV affiche les lignes.

C'est la méthode la plus rapide (complexité O(N)) car elle ne nécessite aucun parcours supplémentaire.

Déclarez une variable pour stocker le min temporaire (dans le code de la fenêtre ou de la table).

Extrait de code
gmMontantMin est un monétaire
Dans l'événement "Haut de rupture" (Header) de votre rupture (Semaine) :

Réinitialisez la variable à une valeur très haute (pour que le premier comparatif fonctionne).

Extrait de code
// Code Haut de rupture sur COL_Semaine
gmMontantMin = 999999999 // Une valeur impossible à atteindre
Dans l'événement "Affichage d'une ligne" de votre Table :

Comparez la valeur de la ligne en cours avec votre variable.

Extrait de code
// Code Affichage d'une ligne de TABLE_KPI
SI COL_CA < gmMontantMin ALORS
gmMontantMin = COL_CA
FIN
Dans l'événement "Bas de rupture" (Footer) de votre rupture :

Affectez simplement la variable à votre champ libellé situé dans le bas de rupture.

Extrait de code
// Code Bas de rupture sur COL_Semaine
LIB_TotalMin = gmMontantMin
Solution 2 : La pré-calculation SQL (Si source SQL)
Si vos données proviennent d'une requête SQL (avant d'être mises dans la table par programmation), le plus optimisé est de laisser le serveur de base de données faire le travail via une "Fonction de fenêtrage" (Window Function).

Dans votre requête SQL (HFSQL, SQL Server, etc.) :

SQL
SELECT
Date,
Semaine,
CA,
MIN(CA) OVER (PARTITION BY Semaine) AS Min_Semaine
FROM
MesVentes
Vous récupérez ainsi une colonne Min_Semaine qui contient déjà la bonne valeur pour chaque ligne.

Ajoutez une colonne cachée COL_Min_Calculé dans votre champ Table.

Mappez le résultat de la requête dedans.

Dans le bas de rupture, contentez-vous d'afficher la valeur de cette colonne cachée (puisqu'elle est identique pour toute la rupture, prenez celle de la ligne en cours).

Solution 3 : TableFormuleAjoute (Pourquoi ça a échoué ?)
Vous avez mentionné TableFormuleAjoute. Cette fonction fonctionne généralement pour le total général du tableau. Pour qu'elle s'applique aux ruptures, il faut souvent ruser ou utiliser les dernières versions.

Cependant, il existe une syntaxe spécifique pour les colonnes calculées mais elle est souvent capricieuse sur les champs "Libellé" manuels posés dans les ruptures.
Membre enregistré
4 338 messages
Posté le 10 février 2026 - 23:38
Bonjour,
Un chiffre d'affaire ne peut pas être négatif, à la place d'une grande valeur, on peut affecter -1 à gnMontantMin, ce qui permet d'appliquer le même raisonnement si l'on veut le montant maxi.
Cela permet aussi de réutiliser le code tel quel pour toute les entrprises, quel que soit leur CA.
Le code d'affichage d'une ligne devient
SI gnMontanMin=-1 ALORS
gnMontantMin=COL_CA
SINON
SI gnMontantMin>COL_CA ALORS
gnMontantMin=COL_CA
FIN
FIN


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modifié, 10 février 2026 - 23:40
Membre enregistré
30 messages
Posté le 11 février 2026 - 17:05
Bonjour Olivier ;)
quel beau prénom :D, merci pour votre réponse.
J'ai trouvé une solution en m'inspirant de ta solution 1.
Lorsque je parcours mon recordset, tant que je suis sûr le même numéro de semaine, je compare ma variable mnMontantMinCA avec la valeur renvoyée. Si elle est plus petite, j'affecte alors la valeur de mon champ à ma variable et dans l'évènement de rupture bas pour afficher la ligne, j'affecte à mon libellé sa valeur.

// Numéro de semaine parcouru
nNumSemaineEnCours = rDates.DAT_NUMSEMDSANNEE
SI nNumSemaineEnCours <> nNumSemainePrecedente ALORS
Trace("Numéro de semaine différente, réinitialisation des variables")
// On change de semaine !
nNumSemainePrecedente = nNumSemaineEnCours
// On réinitialise mnMontantMinCA
mnMontantMinCA = 99999999
mnMontantMaxCA = -99999999
FIN
// Montant CA minimum
SI rCA < mnMontantMinCA ALORS
mnMontantMinCA = rCA
FIN
// Montant CA maximum
SI rCA > mnMontantMaxCA ALORS
mnMontantMaxCA = rCA
FIN


dans l'évènement d'affichage de la ligne pour la rupture basse :

IndiceLigneLectureEnCours est un entier = IndiceEnCours
mnIndiceRupture = TableIndiceRupture(RUPT_BasNumSemaine, IndiceLigneLectureEnCours)
SI mnIndiceRupture > 0 ALORS
Trace("------------------------------------------")
Trace("Evènement RUP_BasNumSemaine, semaine " + COL_NUM_SEM[IndiceLigneLectureEnCours])
Trace("Indice ligne lue : " + IndiceLigneLectureEnCours)
Trace("Indice de la rupture : " + mnIndiceRupture)
Trace("CA minimum vaut : " + mnMontantMinCA)
Trace("CA maximum vaut : " + mnMontantMinCA)
TABLE_ListePrctActivitesParJour[mnIndiceRupture].RUPT_BasNumSemaine.LIB_MIN_SEM_CA = mnMontantMinCA
TABLE_ListePrctActivitesParJour[mnIndiceRupture].RUPT_BasNumSemaine.LIB_MAX_SEM_CA = mnMontantMaxCA
Trace("LIB_MIN_SEM_CA vaut : " + TABLE_ListePrctActivitesParJour[mnIndiceRupture].RUPT_BasNumSemaine.LIB_MIN_SEM_CA)
Trace("LIB_MAX_SEM_CA vaut : " + TABLE_ListePrctActivitesParJour[mnIndiceRupture].RUPT_BasNumSemaine.LIB_MAX_SEM_CA)
Trace("--- Fin ----------------------------------")
FIN

Je ne l'avais pas spécifié tout à l'heure, mais je remplis mon champ table sur un ordre decroissant sur le numéro de semaine.
Je ne charge les données que jusque la veille, donc le 10.
Nous sommes le 11 février, je commence donc à la semaine 7, puis 6, 5, ...
Quand je change de numéro de semaine, je réinitialise ma variable et je recommence la comparaison, comme vous avez pu le voir dans le code.

En fait cette solution 1 que vous m'avez proposé ne fonctionne pas et je suis étonné car quand j'ai lu, je me suis dit, ça c'est le bon truc ! ;-)
En fait, je pensais que ma table se remplirait comme suit :
Ligne de rupture haut, semaine 7
Ligne 1
Ligne 2
Ligne "n" ...
Ligne de rupture bas, semaine 7
Ligne de rupture haut, semaine 6
Ligne 3
Ligne 4
Ligne "n" ...
Ligne de rupture bas, semaine 6

mais pas du tout !
Si vous regardez les traces, l'ordre des semaines en rapport avec mon SQL est correct MAIS les èvènements à partir de la semaine 4, donc en janvier, n'ont plus la même logique si je puis dire, je n'ai aucune idée de pourquoi ;(

------------------------------------------
Evènement RUP_HautNumSemaine, semaine 7
LIB_NumSemaine vaut maintenant : 7
Ligne 1 ajoutée
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 7
Indice ligne lue : 1
Indice de la rupture : 1
LIB_MIN_SEM_CA vaut : 1692.51
LIB_MAX_SEM_CA vaut : 1692.51
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_HautNumSemaine, semaine 6
LIB_NumSemaine vaut maintenant : 6
Ligne 2 ajoutée
Numéro de semaine différente, réinitialisation des variables
Ligne 3 ajoutée
Ligne 4 ajoutée
Ligne 5 ajoutée
Ligne 6 ajoutée
Ligne 7 ajoutée
Ligne 8 ajoutée
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 6
Indice ligne lue : 8
Indice de la rupture : 8
LIB_MIN_SEM_CA vaut : 228.75
LIB_MAX_SEM_CA vaut : 2525.04
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_HautNumSemaine, semaine 5
LIB_NumSemaine vaut maintenant : 5
Ligne 9 ajoutée
Numéro de semaine différente, semaine 5 à 4, réinitialisation des variables
Ligne 10 ajoutée
Ligne 11 ajoutée
Ligne 12 ajoutée
Ligne 13 ajoutée
Ligne 14 ajoutée
Ligne 15 ajoutée
Ligne 16 ajoutée
Numéro de semaine différente, semaine 4 à 3, réinitialisation des variables
Ligne 17 ajoutée
Ligne 18 ajoutée
Ligne 19 ajoutée
Ligne 20 ajoutée
Ligne 21 ajoutée
Ligne 22 ajoutée
Ligne 23 ajoutée
Numéro de semaine différente, semaine 3 à 2, réinitialisation des variables
Ligne 24 ajoutée
Ligne 25 ajoutée
Ligne 26 ajoutée
Ligne 27 ajoutée
Ligne 28 ajoutée
Ligne 29 ajoutée
Ligne 30 ajoutée
Numéro de semaine différente, réinitialisation des variables
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 5
Indice ligne lue : 9
Indice de la rupture : 15
LIB_MIN_SEM_CA vaut : 142.25
LIB_MAX_SEM_CA vaut : 2489.75
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 4
Indice ligne lue : 16
Indice de la rupture : 22
LIB_MIN_SEM_CA vaut : 78.85
LIB_MAX_SEM_CA vaut : 21422.65
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_HautNumSemaine, semaine 4
LIB_NumSemaine vaut maintenant : 4
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 3
Indice ligne lue : 23
Indice de la rupture : 29
LIB_MIN_SEM_CA vaut : 145.00
LIB_MAX_SEM_CA vaut : 13777.30
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_HautNumSemaine, semaine 3
LIB_NumSemaine vaut maintenant : 3
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 2
Indice ligne lue : 30
Indice de la rupture : 30
LIB_MIN_SEM_CA vaut : 414.65
LIB_MAX_SEM_CA vaut : 18.10
--- Fin ----------------------------------
------------------------------------------
Evènement RUP_HautNumSemaine, semaine 2
LIB_NumSemaine vaut maintenant : 2
------------------------------------------
Evènement RUP_BasNumSemaine, semaine 2
Indice ligne lue : 30
Indice de la rupture : 30
CA minimum vaut : 0
CA maximum vaut : 0
LIB_MIN_SEM_CA vaut : 333.00
LIB_MAX_SEM_CA vaut : 27424.50
--- Fin ----------------------------------
Membre enregistré
30 messages
Posté le 11 février 2026 - 17:06
@Voroltinquo Merci pour votre réponse ;)