| |
Miembro registrado 65 mensajes |
|
| Publicado el 26,marzo 2019 - 15:56 |
Bonjour, La Fonction TableAffiche mets 52 secondes à s'exécuter !!! La requête après contrôle mets moins de 1 secondes
Voici le code en question :
Procedure ActuListeClient(LOCAL Ch_CodeClientSelect est une chaîne, LOCAL Ent_IndiceLigne est un entier)
OuvreFille(Fen_OK,"Actualisation en cours..." + RC + RC + "Veuillez patienter...") ChronoDébut()
RqtSelectListeClients.ParamContient_CLFacNom = TxtNomClientContient RqtSelectListeClients.ParamContient_CodeClient = TxtCodeClientContient RqtSelectListeClients.ParamContient_Ville = TxtVilleContient RqtSelectListeClients.ParamEgal_CodePostal = TxtCodePostalEgal
HExécuteRequête(RqtSelectListeClients,hRequêteDéfaut)
Message("Exécution Requête a duré : " + DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL"))
ChronoDébut()
TableAffiche(TblClient,taDébut)
SI Ch_CodeClientSelect <> "" ALORS TableSelectPlus(TblClient,TableCherche(TblClient.CLCode,Ch_CodeClientSelect,rechercheIdentique,1)) SINON SELON Ent_IndiceLigne CAS <= 0 : TableSelectPlus(TblClient,1) CAS > TblClient..Occurrence : TableSelectPlus(TblClient,TblClient..Occurrence) AUTRES CAS : TableSelectPlus(TblClient,Ent_IndiceLigne) FIN FIN
Message("Actualisation de la table a duré : " + DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL"))
LblNbEnregistrements = "Il y a " + TableOccurrence(TblClient,toTotal) + " Enregistrements dans cette table"
Ferme(Fen_OK)
En image vous trouverez le résultat de l'analyse de performance :
https://drive.google.com/file/d/13AYQ9dDuwOxQHjOxXqwwpP69pLtzdMRQ/view…
La Table est une table fichier basée sur la requête
Si quelqu'un a une solution car ca devient plus que grave pour moi...
merci
-- Aurélien MACHABERT Développeur Chez GAUTHIER MenuiserieMensaje modificado, 26,marzo 2019 - 16:11 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.321 mensajes |
|
| Publicado el 26,marzo 2019 - 16:39 |
Bonjour,
Combien de colonnes ? de lignes ? Et un :
TableAffiche(TblClient,taRéExécuteRequete)
-- Bon dev, Jean-Pierre |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 26,marzo 2019 - 16:57 |
Bonjour Jean-Pierre,
22 Colonnes dans ma table, mais 63 dans ma requêtes et environ 49000 Lignes sas Filtres
En écrivant cela, je vais essayer de dupliquer ma requête en sélectionnant simplement les 22 Colonnes dont j'ai besoin et tester.
Merci
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 26,marzo 2019 - 17:05 |
Après test même en réduisant le nombre de colonnes dans la requête, les temps sont similaires
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
| Publicado el 26,marzo 2019 - 17:09 |
Bonjour, Affiché dans une table le résultat d'une requête qui ramène 49000 lignes c'est pas logique du tout et inexploitable. soit il faut utiliser un filtre en amont dans les clauses Where,pour limiter le nombre d'enregistrement, et si pas de critère et bien on exécute pas ou utiliser un Top xxx. soit utiliser une table fichier en accès direct sur le fichier qui aura alors un affichage instantané Pour moi le comportement est tout a fait normal.
vous pouvez essayer <table..affichageActif=faux> avant le tableaffiche et ensuite <table..affichageActif=vrai> dans la partie contenu de la description de la table , essayez "accèsdirect" et non en mémoire. cela peut aider un peu.
cdt. JYM |
| |
| |
| | | |
|
| | |
| |
| Publicado el 26,marzo 2019 - 17:12 |
Bonjour,
Il faut passer la table en 'Invisible' puis faire les traitements et ensuite la rendre à nouveau 'visible'.
Eric |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 281 mensajes |
|
| Publicado el 26,marzo 2019 - 17:40 |
Bonjour,
L’exécution d'une requête c'est une chose, l'affichage des résultats dans un champ "graphique" en est une autre !
Les éléments graphiques sont souvent ceux qui demande le plus de ressources et sont donc gourmand en temps de traitement. Donc attention, temps d’exécution d'une requête n'est pas égale au temps de remplissage du champ table ! |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.002 mensajes |
|
| Publicado el 26,marzo 2019 - 19:06 |
Bonjour,
Ta requête pointe où ? HF Classic local ? HF Classic Distant ? HF C/S ? base tierce ?
jordan |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 27,marzo 2019 - 08:21 |
Bonjour à tous,
Alors pour donner tous les éléments : - Je Suis en HF Classic et ne peut pas pour l'instant passé en CS - Mon ancienne table était en effet en table fichier basée sur le fichier et les temps d'accès étaient rapide - Mon besoin était d'avoir des recherches plus performantes en terme de résultats d'enregistrements. - Ma table en question est une table client, et le but dans la majorité des cas est de rechercher un client suivant plusieurs paramètres. --> L'intérêt de la requête est de permettre des critères plus poussé.
Là où je ne comprends pas c'est que basé sur le fichier les 49000 s'affichent direct, et pas depuis ma requête pourtant les éléments sont les mêmes virtuellement.
Au niveau affichage, j'ai tout essayé : MaTable..AffichageActif = faux MaTable..visible = faux
Les temps restent les mêmes....
Du coup pour l'instant je suis revenu à ma première fenêtre mais du coup j'ai perdu l'évolution annoncée auprès des utilisateurs...
Je vais plancher un peu dessus pour voir quelle solution je peux avoir...
Si vous avez des pistes, je suis preneur...
merci à Tous
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 27,marzo 2019 - 08:50 |
je viens de faire un test avec un Filtre activé en automatique à l'ouverture de la fenêtre
Pour afficher 1000 Lignes il mets 18 Secondes, cela reste énorme quand même pour 1000 Lignes ????
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 27,marzo 2019 - 09:07 |
Bonjour,
En HF Classic, n'aurais-tu pas intérêt à utiliser la fonction HFiltre() et à garder ta table en Table fichier basé sur le fichier HF ?
Le HFiltre devrait être rapide et tu conserves la rapidité de la table.
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 27,marzo 2019 - 09:31 |
à tester en effet...
mais ce qui me chagrine dans tout cela c'est que ce qui est long c'est l'affichage des données et non le calcul et pour moi que tu récupère les données dans le fichier ou dans la requête c'est la même chose , non ?
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.321 mensajes |
|
| Publicado el 27,marzo 2019 - 09:37 |
Bonjour,
Vérifie que tu respectes les critères de tri de ta requête dans ta table et que tu l'affiches bien "telle que". NB : En dehors de cela, focalise-toi sur la partie affichage de la table. Quelle différence entre l'affichage directe de ton fichier Clients et celui via la requête ? As-tu vérifié avec l'audit dynamique ?
-- Bon dev, Jean-PierreMensaje modificado, 27,marzo 2019 - 09:39 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 299 mensajes |
|
| Publicado el 27,marzo 2019 - 09:50 |
J'ai eu un cas semblable et j'ai défini des pages Si ma grille comprend 20 lignes la page 1 affiche les 20 premières lignes de la requete. En page 2 les lignes de 21 à 40 et ainsi de suite.
En dessous de la grille j'ai autant de boutons que de pages un peu comme sur certains sites internet. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 281 mensajes |
|
| Publicado el 27,marzo 2019 - 10:02 |
| En acces direct « fichier » Windev fait du fetch. Il ne charge que les lignes visibles et les suivantes au scroll. Donc l’effet de rapidité est justifié. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 27,marzo 2019 - 10:21 |
@Damien: J'aurais pas dit mieux... 
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 27,marzo 2019 - 11:32 |
Voici les temps avec HFILTRE
https://drive.google.com/file/d/1z4teFw5wk4qxEytinMmH8nVC-xML8IAZ/view…
Voici le code d'actualisation (La vue du trace vous permettra de définir la lenteur !!!
Procedure ActuListeClient(LOCAL Ch_CodeClientSelect est une chaîne, LOCAL Ent_IndiceLigne est un entier)
Ch_Filtre_CodeClient est une chaîne Ch_Filtre_NomClient est une chaîne Ch_Filtre_CPClient est une chaîne Ch_Filtre_VilleClient est une chaîne Ch_FiltreGlobal est une chaîne = "" Dur_TpsTraitement est une Durée
OuvreFille(Fen_OK,"Actualisation en cours..." + RC + RC + "Veuillez patienter...") ChronoDébut()
SI TxtCodeClientContient <> Null ALORS Ch_Filtre_CodeClient = WDClient.CLCode..Nom + " ~]'" + TxtCodeClientContient + "'" SI Ch_FiltreGlobal <> "" ALORS Ch_FiltreGlobal += " ET " FIN Ch_FiltreGlobal += Ch_Filtre_CodeClient FIN
SI TxtNomClientContient <> Null ALORS Ch_Filtre_NomClient = WDClient.CLFacNom..Nom + " ~]'" + TxtNomClientContient + "'" SI Ch_FiltreGlobal <> "" ALORS Ch_FiltreGlobal += " ET " FIN Ch_FiltreGlobal += Ch_Filtre_NomClient FIN
SI TxtCodePostalEgal <> Null ALORS Ch_Filtre_CPClient = WDClient.CLFacCdp..Nom + " ='" + TxtCodePostalEgal + "'" SI Ch_FiltreGlobal <> "" ALORS Ch_FiltreGlobal += " ET " FIN Ch_FiltreGlobal += Ch_Filtre_CPClient FIN
SI TxtVilleContient <> Null ALORS Ch_Filtre_VilleClient = WDClient.CLFacVille..Nom + " ~]'" + TxtVilleContient + "'" SI Ch_FiltreGlobal <> "" ALORS Ch_FiltreGlobal += " ET " FIN Ch_FiltreGlobal += Ch_Filtre_VilleClient FIN
SI Ch_FiltreGlobal = "" ALORS HDésactiveFiltre(WDClient) SINON HFiltre(WDClient, Ch_FiltreGlobal) FIN
Dur_TpsTraitement = DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL") Message("Exécution HFILTRE a durée : " + Dur_TpsTraitement) Trace("Exécution HFILTRE a durée : " + Dur_TpsTraitement)
ChronoDébut()
TblClient..AffichageActif = Faux
TableAffiche(TblClient,taDébut)
SI Ch_CodeClientSelect <> "" ALORS TableSelectPlus(TblClient,TableCherche(TblClient.CLCode,Ch_CodeClientSelect,rechercheIdentique,1)) SINON SELON Ent_IndiceLigne CAS <= 0 : TableSelectPlus(TblClient,1) CAS > TblClient..Occurrence : TableSelectPlus(TblClient,TblClient..Occurrence) AUTRES CAS : TableSelectPlus(TblClient,Ent_IndiceLigne) FIN FIN
TblClient..AffichageActif = Vrai
Dur_TpsTraitement = DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL") Message("Actualisation de la table a durée : " + Dur_TpsTraitement) Trace("Actualisation de la table a durée : " + Dur_TpsTraitement)
ChronoDébut()
LblNbEnregistrements = "Il y a " + TblClient..Occurrence + " Enregistrements dans cette table"
Dur_TpsTraitement = DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL") Message("Calcul Occurrence Table a durée : " + Dur_TpsTraitement) Trace("Calcul Occurrence Table a durée : " + Dur_TpsTraitement)
Ferme(Fen_OK)
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 27,marzo 2019 - 11:41 |
Je viens de tester les temps dans 2 cas : * SANS FILTRES * AVEC 1 FILTRE
Les temps restent super long
*************************************************** PAS DE FILTRES ACTIF Exécution HFILTRE a durée : 0000000018 Actualisation de la table a durée : 0000000033 Calcul Occurrence Table a durée : 0000006499 -------------------------------------- Au Final : 48 484 Enregistrements *************************************************** FILTRE ACTIF : CLCode ~]'P2' Exécution HFILTRE a durée : 0000000003 Actualisation de la table a durée : 0000000289 Calcul Occurrence Table a durée : 0000004650 -------------------------------------- Au Final : 1 029 Enregistrements
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.002 mensajes |
|
| Publicado el 27,marzo 2019 - 11:54 |
| pour faire ce genre de filtre, ne serait-il pas plus judicieux d'utiliser une recherche full text ? sur les colonnes que tu souhaite ? |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 194 mensajes |
|
| Publicado el 27,marzo 2019 - 12:30 |
Bonjour
Pour ma par part si souci de performance j'ajoute un champ Limite dans les critères disponibles pour la requête d'extraction initialisé à 50. Donc par défaut si l'utilisateur ne met aucun critère il voit les 50 premières lignes (selon le tri défini dans la requête). S'il met des critères plus précis les 50 lignes devraient suffire pour visualiser la client recherché. Et le jour où il veut faire par exemple une extraction complète de tous les clients et bien il enlève le critère limite et il attend le temps nécessaire. Pas eu de souci avec les utilisateurs de mes applications utilisant ce principe simple qui permet à l'utilisateur d'obtenir ce qu'il souhaite.
-- Côme, Clairinfo |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 27,marzo 2019 - 12:45 |
@Aurélien: Je ne suis pas d'accord avec toi, le chargement de la table a pris au plus 289 ms.
C'est l'appel à "..Occurrence" qui rend ton traitement long. Essaye d'utiliser TableOccurrence() pour voir si cela fait une différence..
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 72 mensajes |
|
| Publicado el 27,marzo 2019 - 14:08 |
Est-ce que tu as des traitement dans la partie : "Affichage d'une ligne de TABLE_xxx"
Ceci peur ralentir considérablement dépendant du traitement à exécuter |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 28,marzo 2019 - 08:04 |
Philippe SB a écrit :
@Aurélien: Je ne suis pas d'accord avec toi, le chargement de la table a pris au plus 289 ms.
C'est l'appel à "..Occurrence" qui rend ton traitement long. Essaye d'utiliser TableOccurrence() pour voir si cela fait une différence..
-- Cordialement,
Philippe SAINT-BERTIN
J'ai fais la même déduction que toi, or en enlevant la ligne Occurence, le temps de chargement reste le même.
En effet j'ai un code dans Affichage de ligne mais sur une table fichier std elle n'impacte le chargement c'est pour cela que pour moi le problème ne venait pas de là.
Ci-dessous mon code dans affichage d'une ligne
SELON TblClient.CCCode[TblClient] CAS "ART" : TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Art CAS "PAR" : TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Part CAS "CHA" : TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Chan AUTRES CAS : TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Aut FIN
SI TblClient.ClientInterdit[TblClient] = Vrai ALORS TblClient[TblClient]..CouleurFond = iNoir TblClient[TblClient]..Couleur = Blanc FIN
Je vais faire un test en enlevant ce code pour voir
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 28,marzo 2019 - 08:13 |
A priori en effet, le traitement affichage d'une ligne pénalise le traitement.
Après test, l'exécution et le chargement complet sans filtres dure 6 secondes..
Avec 1 Filtre quasi instantané... (1000 Enregistrements retournés
Mon problème maintenant va se situer dans le fait ou mes lignes colorés sont quasi indispensables a mon affichage...
JE vais creuser un peu mieux.
Par Contre pour la recherche FULL TEXT
qu'entends tu par là ???Jordan a écrit : > pour faire ce genre de filtre, ne serait-il pas plus judicieux d'utiliser une recherche full text ? sur les colonnes que tu souhaite ?
Pour l'affichage par 50 je suis pas très chaud mais c'est un éventualité en effet que je vais malgré tout étudier si pas d'autres recours Côme a écrit :
Bonjour
Pour ma par part si souci de performance j'ajoute un champ Limite dans les critères disponibles pour la requête d'extraction initialisé à 50. Donc par défaut si l'utilisateur ne met aucun critère il voit les 50 premières lignes (selon le tri défini dans la requête). S'il met des critères plus précis les 50 lignes devraient suffire pour visualiser la client recherché. Et le jour où il veut faire par exemple une extraction complète de tous les clients et bien il enlève le critère limite et il attend le temps nécessaire. Pas eu de souci avec les utilisateurs de mes applications utilisant ce principe simple qui permet à l'utilisateur d'obtenir ce qu'il souhaite.
-- Côme, Clairinfo
Merci à tous en tout cas
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 28,marzo 2019 - 08:51 |
Correction, Je n'avais pas fais les tests sur la bonne base.
En enlevant le traitement affichage d'une ligne avec 1 filtre, le temps d'affichage est de 43 secondes pour 1029 Lignes...
Du coup le problème ne vient pas de là même si cela représente un temps non négligeable..
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.002 mensajes |
|
| Publicado el 28,marzo 2019 - 09:09 |
Tu cherches des informations sur 4 colonne, au lieu d'aller regarder si un mot "commence par", la rubrique full text, va te permettre d'indexer tous les mots de ta base avec les colonne que tu souhaites.
Tu vas pouvoir filtrer ta base avec un temps de traitement non négligeable, car ta base aura un index qui va lui permettre d'aller plus vite dans la recherche.
regarde ici : https://doc.pcsoft.fr/?3044375&verdisp=190
Jordan |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 28,marzo 2019 - 09:41 |
Ta table est de type Fichier en "Accès direct" ou "Chargé en mémoire" ?
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 28,marzo 2019 - 13:47 |
Je suis en accès direct
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 72 mensajes |
|
| Publicado el 28,marzo 2019 - 15:30 |
Je sors un peu du sujet mais bon...
Personnellement, je ne travaille jamais avec des tables accès direct quand je met des couleurs, j'ai eu beaucoup de non rafraichissement de couleurs, soit la couleur n’apparaissait pas, ou soit la couleur était erroné (exemple la 3e ligne du table en affichage est rouge, même si la donner changeait, la ligne restait rouge). J'avais aussi remarqué quelque lenteur lors du défilement, car les données doivent être reloader et EN PLUS certain calcul doivent être fait en direct pour afficher des couleur.
C'est peut-être moi qui faisait quelque chose de pas correct mais bon, maintenant pour moi couleur = table mémoire ou par programmation. J'ai même pas vraiment refait de test depuis la version 19-20, alors ça fait un bout, et c'était dans mes débuts avec windev alors... je peux pas garantir que ça venait de windev non plus 
Si on est sur un wifi relativement lent, les tables devienne aussi saccader lors du défilement de celle-ci. Je passe toujours par requête a moins d'afficher qu'une dizaine de lignes.
Perso j'aime mieux attendre 1 secondes de plus que le tableau ce remplisse, mais que tout sois fluide par la suite. (je sais que dans ton cas c'est pas une seconde). Si la requête est un peu longue, je la passe via les tachesparallèle alors la requête est exécuter pendant que la fenêtre s'ouvre par exemple, ce qui permet de sauver à l'utilisateur quelque centième de secondes mais surtout de gagné en fluidité. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 28,marzo 2019 - 16:51 |
Pas bête, je vais essayer de regarder cela demain...
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 29,marzo 2019 - 16:00 |
Après test avec Table Liée à la requête --> 1 Filtre Saisi ramenant un peu plus de 1000 lignes
TABLE Avec Accès Direct : 27 secondes 681 TABLE Chargée en Mémoire : 23 Secondes 775
On gagne un peu en effet, mais pas assez pour être satisfaisant, mais une idée à utilisez pour d'autres choses....
Je pense que je vais contacter quand même PCSOFT car, j'ai d'autres applis ou des requêtes comme celles ci s'affiche très rapidement avec un volume équivalent...
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 29,marzo 2019 - 17:01 |
Après il reste une solution à tester, supprimer la table et la recréer.
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 65 mensajes |
|
| Publicado el 01,abril 2019 - 08:18 |
Philippe SB a écrit :
Après il reste une solution à tester, supprimer la table et la recréer.
-- Cordialement,
Philippe SAINT-BERTIN
A voir en effet en dernier recours
-- Aurélien MACHABERT Développeur Chez GAUTHIER Menuiserie |
| |
| |
| | | |
|
| | |