|
FORUMS PROFESSIONNELS WINDEV, WEBDEV 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 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 RTFMMessage 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 , 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.
nNumSemaineEnCours = rDates.DAT_NUMSEMDSANNEE SI nNumSemaineEnCours <> nNumSemainePrecedente ALORS Trace("Numéro de semaine différente, réinitialisation des variables") nNumSemainePrecedente = nNumSemaineEnCours mnMontantMinCA = 99999999 mnMontantMaxCA = -99999999 FIN
SI rCA < mnMontantMinCA ALORS mnMontantMinCA = rCA FIN
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  |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|