|
| Iniciado por rmasclef, 08,oct. 2020 17:48 - 1 respuesta |
| |
| | | |
|
| |
| Publicado el 08,octubre 2020 - 17:48 |
Bonjour à vous,
Je me permets de venir vers vous car, la... j'y perd mon latin.
J'ai une petite applis qui permets de gérer les infos perso de nos intermittents.
Jusque la, tout va bien... 
J'y ai ajouté une requête afin d'afficher les différents postes qu'ils ont occupé chez nous.
Malheureusement, dés que j'intègre cette requête, l'ouverture de la base prend plus de 3mn....
Pour info, mon appli s'ouvre surt une fenetre avec une table mémoire, basé sur mon fichier "employe"....
La requete est prévue pour remplir une colonne de cette table avec la concaténation des différents postes occupé...
et la, c'est le drame.... 
Ci-dessous, la requete en question :
HLitRecherche(contrat,idemploye,COL_IDEmploye,hIdentique) TANTQUE HTrouve(contrat) HLitRecherche(poste,idposte,contrat.idposte,hIdentique) SI HTrouve(poste) ALORS SI COL_Poste <> "" ALORS SI Contient(COL_Poste,poste.intituleposte) = Faux ALORS COL_Poste = COL_Poste + " ; " + poste.intituleposte FIN SINON COL_Poste = poste.intituleposte FIN FIN HLitSuivant(contrat,idemploye) FIN
NB : ma table comporte à peine 1000 lignes....
Merci de votre aide.... |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 194 mensajes |
|
| Publicado el 08,octubre 2020 - 19:50 |
Bonjour
Vous parlez de requête alors que vous balayez là des fichiers par code. Ce n'est pas la même chose. On ne sait pas très non plus comment vous appelez ce bout de code, sur quel événement si c'est lié à un événement.
Pour essayer de vous aider je vous conseille de décomposer votre problème et donc par exemple de commencer par essayer d'écrire une vraie requête vous permettant de récupérer pour chaque employé la liste de ses postes.
Une telle requête SQL sur HFSQL pourrait ressembler à cela (non testé) et devrait théoriquement être le plus performant pour cette tâche:
SELECT employe.idemploye,STRING_AGG(poste.intituleposte,';') AS libposte FROM employe JOIN contrat ON (empoye.idemploye = contrat.idemploye) JOIN poste ON (poste.idposte = contrat.idposte) GROUP BY employe.idemploye Une fois cette bonne requête trouvée et fonctionnelle vous pourriez charger son résultat dans un tableau associatif par exemple taPoste conservant la correspondance idemploye => libellé des postes occupés. Vous pourriez alors libérer votre requête (afin de libérer la mémoire) qui n'est donc exécutée qu'une seule fois à l'ouverture de votre fenêtre .
Enfin dans votre table appelez pour chaque ligne la valeur taPoste[COL_IdEmploye] pour remplir la colonne.
Comme toujours il y a de nombreuses façon de procéder (par exemple par code ou par requête) et si vous êtes dans une logique d'optimisation il faudra en fait tester les 2 pour retenir la meilleure dans votre environnement. Il y a peut-être même moyen de tout faire en une seule requête mais ce n'est pas forcément une bonne idée car en décomposant ainsi votre code vous pourriez par exemple conserver dans une petite routine GetPostesEmploye cette fonctionnalité pour qui sait la réutiliser plus tard ailleurs. Vous auriez également une maintenance simplifiée.
Maintenant tout est discutable et si ça se trouve vous allez obtenir des réponses bien différentes de la mienne 
-- Côme, Clairinfo |
| |
| |
| | | |
|
| | | | |
| | |
|