PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → POO Afficher 100 000 enreg rapidement
POO Afficher 100 000 enreg rapidement
Débuté par TOURMEAU, 10 mar. 2025 14:13 - 9 réponses
Posté le 10 mars 2025 - 14:13
Bonjour,
je cherche a afficher le plus rapidment possible 100 000 enregistrements dans une table d'une fenêtre.

J'ai une classe avec MAPPING d'un fichier
J'ai une requete intégrée à la classe
j'ai une structure du fichier.
j'ai une table sans liaison. (Je ne veux pas de lien entre la table et le fichier de données.)

J'ai essayé plusieurs solutions, mais au mieux j'ai un temps de raffraichissement de 4s.

voici le code de la méthode :
// ------------------------------------------------------------------
sDataLigne est une chaîne = ""
:m_sNomTable = sNomTable
:m_sRubTri = sRubTri
:m_sCondWhere1 = sCondWhere1
nJft est un entier = 0

// ------------------------------------------------------------------
:M_Fich_Tri() // Requete sur le fichier de données
// ------------------------------------------------------------------
//ChronoDébut(2)
//ConstruitTableFichier(Fen_Tests_MT_Clients.TABLE_T_Clients2,m_sdReqTri,taRemplirTable)
//=> opération la plus rapide mais sature vite la mémoire
//duDureeChrono2 = ChronoValeur(2)
//Trace(duDureeChrono2..Seconde,DuréeVersChaîne(duDureeChrono2,duréeCentième))
//ChronoFin(2)
ChronoDébut(1)

POUR TOUT :m_sdReqTri
// => Opération légèrement plus rapide 3.9s
// stMonclient est un sttest1
// fichierversmemoire(stMonclient,:m_sdReqTri)
// gtabStMesClients.Ajoute(stMonclient)
// => Opération prenant 4s, mais sans aucun problème de mémoire
nJft++
sDataLigne = ""
POUR i = 1 _À_ :m_nNbEnregFich
sDataLigne += {":m_sdReqTri." + :m_tab_ListRub[i] ,indRubrique} + TAB
FIN
TableAjoute({:m_sNomTable,indChamp},sDataLigne)
SI nJft = 100 ALORS FenRepeint() // "Magouille" pour afficher rapidement les 100 premiers enr
FIN

duDureeChrono1 = ChronoValeur(1)
Trace(duDureeChrono1..Seconde,DuréeVersChaîne(duDureeChrono1,duréeCentième))
ChronoFin(1)
//Fen_Tests_MT_Clients.TABLE_TabStMesClients.Affiche()
HLibèreRequête(m_sdReqTri)
// ------------------------------------------------------------------

Affichageactif = faux puis vrai ne change rien

Est-ce que quelqu'un a une idée arrêtée sur la façon d'optimiser ?
Cdt.
JT
Membre enregistré
859 messages
Posté le 10 mars 2025 - 14:42
Bonjour,
Pas sûr mais l'essai ne coûte rien, allez voir sur le lien ci-dessous (A propos de "ascenseur proportionnel")
Il faut peut-être relancer Windev pour avoir le résultat.

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev.old/30680-wd20-lenteur-premier-usage-filtre-sur-uen-table/read.awp

Cdlt
Message modifié, 10 mars 2025 - 14:44
Posté le 10 mars 2025 - 14:50
Bonjour

Je vois votre problème, vous souhaitez afficher 100 000ligne en moins de temps, j'ai une solution pour vous

1. en premier lieu, votre code est déjà bon à ne pas utiliser une requête SQL, dans le cas d'une requête SQL saturé alors l'affichage est lente (plein de rubrique sature la relation je veux dire)
2. il ne faut pas coder une boucle dans une boucle, c'est le premier cas du lenteur, pour çà il faut affecter des conditions de résultat égale (utilisation de la condition IF je veux dire)

Voilà une exemple de code pour vous aidez
// EDD (03/25) : le parcours d'un fichier en version classe
TableSupprimeTout({:m_sNomTable, indChamp})
POUR TOUT :m_sFichier
IF (:m_sParamètre_A = {:m_sFichier + "." + Rubrique_A, indRubrique}) AND (:m_sParamètre_B = {:m_sFichier + "." + Rubrique_B, indRubrique}) AND (:m_sParamètre_C = {:m_sFichier + "." + Rubrique_B, indRubrique}) THEN
TableAjouteLigne({:m_sNomTable, indChamp}, {:m_sFichier + "." + Resultat_A, indRubrique}, {:m_sFichier + "." + Resultat_B, indRubrique})
END
FIN
TableSelectMoins({:m_sNomTable, indChamp})

NB : attention il faut limiter le nombre de ligne dans le boucle de parcours du fichier
NB : je suis sur que vous gagnez beaucoup de seconde sur ce code
NB : ajouter un jauge pour motiver l'utilisateur (Jauge.borne min | Jauge.borne max | Jauge.valeur | une variable d'indice) c'est suffisant

Cordialement
Mr.RATSIMANDRESY
Niry Aina Eddy
Membre enregistré
13 messages
Posté le 10 mars 2025 - 15:46
Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long.

Ce qu'il faut faire:
- Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable)

Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Posté le 17 mars 2025 - 09:36
Romuald a écrit :
Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long.

Ce qu'il faut faire:
- Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable)

Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Posté le 17 mars 2025 - 09:50
Romuald a écrit :
Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long.

Ce qu'il faut faire:
- Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable)

Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.


Bonjour Romuald,
Merci pour ta réponse. J'hésitais entre plusieurs possibilités (tableAffiche, tableAjoute, une variable, les données d'une requete, ...)
Comme tu as pu le voir je me lance dans la POO., et je ne suis pas encore au top.
Je cherche a faire une classe "mappée" sur un fichier ou requete (100 000 enreg triés), avec le CRUD et l'affichage dans une table.
Cette classe est générique et permet de prendre en compte les données d'un fichier *.fic dont le nom est déterminé par une variable de la classe.
Ca fonctionne mais l'affichage était trop lent (100 000 enreg = 3") .
Encore merci je vais poursuivre dans l'option que tu m'as donnée.
Posté le 17 mars 2025 - 09:50
Cédric_34 a écrit :
Bonjour,
Pas sûr mais l'essai ne coûte rien, allez voir sur le lien ci-dessous (A propos de "ascenseur proportionnel")
Il faut peut-être relancer Windev pour avoir le résultat.

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev.old/30680-wd20-lenteur-premier-usage-filtre-sur-uen-table/read.awp

Cdlt


Merci Cédric,
je regarde.
Posté le 17 mars 2025 - 09:52
RATSIMANDRESY Niry Aina Eddy a écrit :
Bonjour

Je vois votre problème, vous souhaitez afficher 100 000ligne en moins de temps, j'ai une solution pour vous

1. en premier lieu, votre code est déjà bon à ne pas utiliser une requête SQL, dans le cas d'une requête SQL saturé alors l'affichage est lente (plein de rubrique sature la relation je veux dire)
2. il ne faut pas coder une boucle dans une boucle, c'est le premier cas du lenteur, pour çà il faut affecter des conditions de résultat égale (utilisation de la condition IF je veux dire)

Voilà une exemple de code pour vous aidez
// EDD (03/25) : le parcours d'un fichier en version classe
TableSupprimeTout({:m_sNomTable, indChamp})
POUR TOUT :m_sFichier
IF (:m_sParamètre_A = {:m_sFichier + "." + Rubrique_A, indRubrique}) AND (:m_sParamètre_B = {:m_sFichier + "." + Rubrique_B, indRubrique}) AND (:m_sParamètre_C = {:m_sFichier + "." + Rubrique_B, indRubrique}) THEN
TableAjouteLigne({:m_sNomTable, indChamp}, {:m_sFichier + "." + Resultat_A, indRubrique}, {:m_sFichier + "." + Resultat_B, indRubrique})
END
FIN
TableSelectMoins({:m_sNomTable, indChamp})

NB : attention il faut limiter le nombre de ligne dans le boucle de parcours du fichier
NB : je suis sur que vous gagnez beaucoup de seconde sur ce code
NB : ajouter un jauge pour motiver l'utilisateur (Jauge.borne min | Jauge.borne max | Jauge.valeur | une variable d'indice) c'est suffisant

Cordialement
Mr.RATSIMANDRESY
Niry Aina Eddy


Bonjour Mr.RATSIMANDRESY,
Merci.
Je vais tester votre code.
Cordialement.
Membre enregistré
186 messages
Posté le 17 mars 2025 - 12:45
Bonjour à tous

il n'y a pas de soucis, je vous en prie ...

Cordialement
Mr.RATSIMANDRESY
Niry Ania Eddy
Posté le 25 mars 2025 - 12:10
JT a écrit :
Romuald a écrit :
Salut JT, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long.

Ce qu'il faut faire:
- Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable)

Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.

Bonjour Romuald,
Merci pour ta réponse. J'hésitais entre plusieurs possibilités (tableAffiche, tableAjoute, une variable, les données d'une requete, ...)
Comme tu as pu le voir je me lance dans la POO., et je ne suis pas encore au top.
Je cherche a faire une classe "mappée" sur un fichier ou requete (100 000 enreg triés), avec le CRUD et l'affichage dans une table.
Cette classe est générique et permet de prendre en compte les données d'un fichier *.fic dont le nom est déterminé par une variable de la classe.
Ca fonctionne mais l'affichage était trop lent (100 000 enreg = 3") .
Encore merci je vais poursuivre dans l'option que tu m'as donnée.


Bonjour Romuald,

J'ai gagné 1" de raffraichissement en passant par des objets, c'est deja bien, mais ce n'est pas satisfaisant.
J'ai donc pris le parti de diviser en 2 l'acquisition des données.
Je charge 10 000 objets dans mon tableau d'objets => tableaffiche() (environ 100 ms d'affichage, ça me va !)
Puis je charge mes 90 000 autres objets dans mon tableau => tableaffiche() (environ 2", c'est beaucoup mais transparent)
Un grand merci de m'avoir conforté sur cette piste.
Cdt.