PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Lenteur Extême TABLEAFFICHE
Lenteur Extême TABLEAFFICHE
Iniciado por aurelien.machabert, 26,mar. 2019 15:56 - 32 respuestas
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)
//** Ouverture de la fenêtre d'attente **
OuvreFille(Fen_OK,"Actualisation en cours..." + RC + RC + "Veuillez patienter...")
ChronoDébut()
//** Paramétrage des critères **
RqtSelectListeClients.ParamContient_CLFacNom = TxtNomClientContient
RqtSelectListeClients.ParamContient_CodeClient = TxtCodeClientContient
RqtSelectListeClients.ParamContient_Ville = TxtVilleContient
RqtSelectListeClients.ParamEgal_CodePostal = TxtCodePostalEgal
//** Exécution de la requête **
HExécuteRequête(RqtSelectListeClients,hRequêteDéfaut)
//** Info de la durée de calcul de la requête **
Message("Exécution Requête a duré : " + DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL"))
//** Début chrono pour tps affichage **
ChronoDébut()
//** Actualisation de la table **
TableAffiche(TblClient,taDébut)
//** On se positionne sur la bonne ligne **
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
//** Affichage durée tps affichage **
Message("Actualisation de la table a duré : " + DuréeVersChaîne(ChronoFin(),"HH:MM:SS:LLL"))
//** Mise en place du renseignements du nombre de dossiers **
LblNbEnregistrements = "Il y a " + TableOccurrence(TblClient,toTotal) + " Enregistrements dans cette table"
//** Fermeture de la fenêtre d'attente **
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 Menuiserie
Mensaje 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-Pierre
Mensaje 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)
//** Déclaration des Variables **
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
//** Ouverture de la fenêtre d'attente **
OuvreFille(Fen_OK,"Actualisation en cours..." + RC + RC + "Veuillez patienter...")
ChronoDébut()
//*****************************
//** Paramétrage des Filtres **
//*****************************
//** Code Client **
SI TxtCodeClientContient <> Null ALORS
//** Filtre Spécifique **
Ch_Filtre_CodeClient = WDClient.CLCode..Nom + " ~]'" + TxtCodeClientContient + "'"
//** Filtre Global test si 1ier filtre **
SI Ch_FiltreGlobal <> "" ALORS
Ch_FiltreGlobal += " ET "
FIN
//** Filtre Global **
Ch_FiltreGlobal += Ch_Filtre_CodeClient
FIN
//** Nom Client **
SI TxtNomClientContient <> Null ALORS
Ch_Filtre_NomClient = WDClient.CLFacNom..Nom + " ~]'" + TxtNomClientContient + "'"
//** Filtre Global test si 1ier filtre **
SI Ch_FiltreGlobal <> "" ALORS
Ch_FiltreGlobal += " ET "
FIN
//** Filtre Global **
Ch_FiltreGlobal += Ch_Filtre_NomClient
FIN
//** Code Postal Client **
SI TxtCodePostalEgal <> Null ALORS
Ch_Filtre_CPClient = WDClient.CLFacCdp..Nom + " ='" + TxtCodePostalEgal + "'"
//** Filtre Global test si 1ier filtre **
SI Ch_FiltreGlobal <> "" ALORS
Ch_FiltreGlobal += " ET "
FIN
//** Filtre Global **
Ch_FiltreGlobal += Ch_Filtre_CPClient
FIN
//** Ville Client **
SI TxtVilleContient <> Null ALORS
Ch_Filtre_VilleClient = WDClient.CLFacVille..Nom + " ~]'" + TxtVilleContient + "'"
//** Filtre Global test si 1ier filtre **
SI Ch_FiltreGlobal <> "" ALORS
Ch_FiltreGlobal += " ET "
FIN
//** Filtre Global **
Ch_FiltreGlobal += Ch_Filtre_VilleClient
FIN
//** Mise en place du Filtre éventuellement **
SI Ch_FiltreGlobal = "" ALORS
HDésactiveFiltre(WDClient)
SINON
HFiltre(WDClient, Ch_FiltreGlobal)
FIN
//** Info de la durée de calcul de la requête **
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)
//** Début chrono pour tps affichage **
ChronoDébut()
//** On enlève les affichages superflus **
TblClient..AffichageActif = Faux
//** Actualisation de la table **
TableAffiche(TblClient,taDébut)
//** On se positionne sur la bonne ligne **
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
//** On Remets les affichages superflus **
TblClient..AffichageActif = Vrai
//** Affichage durée tps affichage **
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)
//** Début chrono pour tps Calcul Occurence **
ChronoDébut()
//** Mise en place du renseignements du nombre de dossiers **
LblNbEnregistrements = "Il y a " + TblClient..Occurrence + " Enregistrements dans cette table"
//** Info de la durée de calcul de la requête **
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)
//** Fermeture de la fenêtre d'attente **
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

//** Gestion de la couleur d'affichage des lignes **
SELON TblClient.CCCode[TblClient]
//** Pour l'artisan **
CAS "ART" :
TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Art
//** Pour le Particulier **
CAS "PAR" :
TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Part
//** Pour le Chantier **
CAS "CHA" :
TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Chan
//** Pour tout les autres cas **
AUTRES CAS :
TblClient[TblClient]..CouleurFond = Gp_Ent_CoulClient_Aut
FIN
//** On gère la couleur de fond de la ligne concernant les clients interdit **
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 :P

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