PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Ajouter information pour les lignes affichées d'une table
Ajouter information pour les lignes affichées d'une table
Débuté par Aziz Tnani, 14 déc. 2025 11:24 - 10 réponses
Membre enregistré
40 messages
Posté le 14 décembre 2025 - 11:24
Je sais que le sujet a dû être traité par ailleurs mais de toutes les réponses que je trouve, aucune ne répond vraiment.

J'exécute le code suivant dans l'évènement "Affichage d'une ligne de table"

HLitRechercheDernier(ActiviteBien, IDBien, COL_IDProduit)
SI HTrouve(ActiviteBien) ALORS
COL_DateActivité=ActiviteBien.DateActivite
COL_DerniereActivité=ActiviteBien.Observations
FIN


Mais quand j'affiche cette table, il semble que le code est lancé pour toutes les lignes de la table, même celles qui ne sont pas visibles, y a t-il un moyen de ne le faire que pour les lignes visibles seulement.
Membre enregistré
4 325 messages
Posté le 14 décembre 2025 - 14:59
Bonjour,
Il suffit de tester si la ligne est visible

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Membre enregistré
40 messages
Posté le 14 décembre 2025 - 22:37
Comment tu teste la ligne en cours ?
Tu fais ça avec ça ??
NomTable[NomTable]..visible
Membre enregistré
1 021 messages
Posté le 14 décembre 2025 - 23:37
Bonjour,
je ne suis pas certain que le ..visible donne le bon résultat.
Que se passe t'il si vous placez le code ci-dessous dans l'évènement "Affichage d'une ligne ..." ?

Trace(NomTable[IndiceEnCours])


Normalement, seul l'indice des lignes affichées devrait apparaitre (tant que vous ne manipulez pas l'ascenseur).
Cdlt
Posté le 15 décembre 2025 - 08:11
Le truc est de connaitre la condition qui rend la ligne visible ou pas dans la table.
Pourquoi certaine ligne ne s'affiche pas dans la table ?
ensuite, une fois qu'on a cette condition, alors on pourra rajouter du code pour eviter la lecture H pour chaque ligne
Mais peut-être est-il possible de résoudre le probleme en amont, et créer une requête éfficace qui gerera le processus complet en 1 seul fois.
Membre enregistré
40 messages
Posté le 22 décembre 2025 - 21:58
Merci à tous pour vos retours
Je crois que je me suis mal expliqué, je parle de table fichier ou requête qui affiche 22 lignes par exemple sur un total de 1000 et quelques lignes
Je veux exécuter une requête pour calculer et afficher des colonnes supplémentaires par programmation, mais je ne veux pas que le programme calcule pour toutes les lignes de la table mais seulement pour les 22 lignes affichées de la table.
Quand l'utilisateur monte ou descend avec l'ascenseur vertical, que les colonnes soient calculées et affichées pour les nouvelles lignes affichées..
J'espère que c'est plus clair
Membre enregistré
4 325 messages
Posté le 22 décembre 2025 - 22:38
Bonjour,
Une idée est d'utiliser une requête LIMIT/OFFSET (avec l'offset qui correspond au nombre d ligne de la table).
Le déplacement sera fait non pas avec un ascensent mais avec des bouton Haut/Bas

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Membre enregistré
40 messages
Posté le 25 décembre 2025 - 15:59
Ce que tu proposes c'est que je change la requête qui remplis la table (alors que ce n'est pas celle qui pose problème)
Par contre si je comprends bien ta solution c'est que je désactive l'ascenseur de la table et que je remplace ça par deux boutons haut / bas pour détecter quand on affiche plus de lignes, de calculer les colonnes qui vont bien, sans calculer pour l'ensemble des lignes de la table
En théorie ça devrait marcher, deux questions :
Comment savoir le nombre de lignes visibles? dans la table?
Comment faire de sorte que le fait de monter et descendre dans la table avec la molette de la souris fonctionne aussi?

Ce que je ne comprends pas c'est que je sois le seul à avoir ce genre de soucis...
Joyeux Noël
Membre enregistré
1 021 messages
Posté le 25 décembre 2025 - 16:14
bonjour,
Vous n'avez pas répondu, Que se passe t'il si vous placez le code ci-dessous dans l'évènement "Affichage d'une ligne ..." ?

Trace(IndiceEnCours)


Pour moi, seuls les indices affichés dans la table apparaissent dans le trace et donc, pour votre cas, la requête ne devrait être exécutée que pour ces lignes, puis exécutée lors de la manipulation de l'ascenseur .
Cdlt
Message modifié, 25 décembre 2025 - 16:15
Membre enregistré
4 325 messages
Posté le 26 décembre 2025 - 06:40
Aziz Tnani a écrit :
Ce que tu proposes c'est que je change la requête qui remplis la table

C'est cela
Par contre si je comprends bien ta solution c'est que je désactive l'ascenseur de la table et que je remplace ça par deux boutons haut / bas pour détecter quand on affiche plus de lignes, de calculer les colonnes qui vont bien, sans calculer pour l'ensemble des lignes de la table

En effet, d'autant plus que WINDEV propose des fonctions de calcul automatique (Somme, Moyenne, Compteur, Min, Max) pour les colonnes (propriété/Détail de la colonne) et la Programmation de calculs personnalisés dans les champs Table https://doc.pcsoft.fr/fr-FR/?1013331&name=programmation_calculs_personnalises_dans_les_champs_table
En théorie ça devrait marcher, deux questions :

En pratique aussi
Comment savoir le nombre de lignes visibles? dans la table?

TableOccurence(TABLE_MaTable,toVisible)

Comment faire de sorte que le fait de monter et descendre dans la table avec la molette de la souris fonctionne aussi?

Il suffit d'ajouter l'évènement Molette Souris (WM_MOUSEWHEEL) dans le code du champ table via Ajouter d'autres évènements au champ table (en bleu tout en bas du code,) et d'intercepter le sens d'utilisation via _EVE.wParam.
Si _EVE.wParam.est positif la molette est déplacée vers le haut, vers le bas sinon.

Cadeau de Noël :
J'utilise une table Individu classique (PK,Nom,Prénom,Naissance ...)
REQ_Individu_Paginé
SELECT
Individu.PK_Individu AS PK_Individu,
Individu.PrénomIndivide AS Prénom,
Individu.NDX_NomIndividu AS Nom,
DATEDIFF(yy,Individu.NDX_DateNaissance ,SYSDATE ) AS Age
FROM
Individu
--WHERE
--Condition
LIMIT {pOffset}, {pNbLignes} --SQL 92 donc fonctionne sous tous les SGBD

Si l'on veut une portabilité, on peut effectuer le calcul dans la requête via les fonctions d'agrégation.
On peut aussi créer l'ordre de tri dans la requête. Attention, dans ce cas, c'est l'ordre d'affichage du champ table qui prime
REQ_NbIndividus
SELECT
COUNT(Individu.PK_Individu) AS NbIndividus
FROM
Individu
--WHERE
--Condition


Code du champ table
Procedure FEN_Individu()
gnOffsetCourant est un entier

Fin d'initialisation
InitTable(0)

Changement de taille(WM_SIZE) à ajouter via "Ajouter d'autres évènements)
AfficheTable(gnOffsetCourant)


Code du champ table
Roulette souris
SELON _EVE.wParam>0
CAS >0
Précédent()
CAS<0
Suivant()
FIN


Code clic bouton Précédent
Précédent()


Code clic bouton Suivant
Suivant()


Fonctions et procédures annexes
Procedure PRIVÉE ActiverDéplacement()
<BLOC Traitement Bouton Précédent>
SI gnOffsetCourant=0 ALORS
BTN_Précédent..Etat=Grisé
SINON
BTN_Précédent..Etat=Actif
FIN
<FIN>

<BLOC Traitement Bouton Suivant>
SI gnOffsetCourant=CalculeOffsetMax() ALORS
BTN_Suivant..Etat=Grisé
SINON
BTN_Suivant..Etat=Actif
FIN
<FIN>

Procedure PRIVÉE AfficheTable(nOffset est entier)

REQ_Individu_Paginé.pOffset = nOffset
REQ_Individu_Paginé.pNbLignes = TableOccurrence(TABLE_Individu,toVisible)
TableAffiche(TABLE_Individu,taRéExécuteRequete)

FONCTION PRIVÉE CalculeOffsetMax() : entier
//Valeur Max de l'offset pour que toutes les lignes soient remplies sans lignes vide
//S'il y a 15 enregistrements et qu'on affiche 5 enregistrement, le dernier offset sera 10

HExécuteRequête(REQ_NbIndividu)
RENVOYER REQ_NbIndividu.NbIndividus-TableOccurrence(TABLE_Individu,toVisible)

Procedure InitTable(nOffset est entier)

AfficheTable(nOffset)
ActiverDéplacement()

Procedure Précédent()

gnOffsetCourant--
SI gnOffsetCourant>=0
InitTable(gnOffsetCourant)
SINON
gnOffsetCourant++
FIN

Procedure Suivant()

gnOffsetCourant++
SI gnVersionTable=CalculeOffsetMax() ALORS
gnOffsetCourant--
SINON
InitTable(gnOffsetCourant)
FIN


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Membre enregistré
40 messages
Posté le 26 décembre 2025 - 12:41
wow, merci pour le cadeau, j'essaie tout ça de suite
ça c'est du cadeau