Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Salut !
Encore une fois j'arrive avec une interrogation qui va peut être encore faire couler de l'encre.
(d'ailleurs je fais quoi du sujet précédent je le balise 'résolu' ? :x)
Depuis que j'ai découvert les fonctions setfilter() et filter() des datawindow je n'utilise plus que ça, au détriment
de la méthode habituelle de mes coworkers qui font un getsqlselect(), charcutent la pauvre chaine et lui assemblent
des tumeurs au bout pour obtenir le résultat souhaité et wop setsqlselect(), retrieve().
On m'a parlé d'une plus grande rapidité pour la méthode setsqlselect() et une plus grande fiabilité lorsqu'il s'agit d'applications
tournant sur beaucoup de postes car la requete est regénérée, (ceci dit rien ne m’empêche de faire un retrieve avant mon filter() ...)
Enfin voilà, j'voulais avoir votre précieux avis amis PBusers ;)
Bonne journée gentlemen !
Hors ligne
Il y a un point aussi à prendre en compte: le trafic réseau. A chaque fois que tu fais un retrieve, ça fait un aller-retour sur le serveur.
Le setfilter, filter, lui, travaille directement sur le resultset du retrieve de la datawindow. Donc, ça permet de limiter le trafic réseau, car seul le poste
client est sollicité.
Hors ligne
GrowGeorges a écrit:
Depuis que j'ai découvert les fonctions setfilter() et filter() des datawindow je n'utilise plus que ça, au détriment
de la méthode habituelle de mes coworkers qui font un getsqlselect(), charcutent la pauvre chaine et lui assemblent
des tumeurs au bout pour obtenir le résultat souhaité et wop setsqlselect(), retrieve().
Pouark!
GrowGeorges a écrit:
On m'a parlé d'une plus grande rapidité pour la méthode setsqlselect() et une plus grande fiabilité lorsqu'il s'agit d'applications
tournant sur beaucoup de postes car la requete est regénérée, (ceci dit rien ne m’empêche de faire un retrieve avant mon filter() ...)
Enfin voilà, j'voulais avoir votre précieux avis amis PBusers ;)
Quelques points :
- plus grande rapidité : bench pour étayer ça ? Parce PB n'est pas très bon en natif pour jouer avec les chaînes, setsqlselect nécessite une recompilation de la requête... alors que le setfilter travaille directement au niveau de la machine virtuelle DW (l'interpréteur qui est dans pbdwexxx.dll).
- d'un autre côté le filtre, c'est comme le tri (setstort()), ça travaille sur les données déjà descendues de la base. Il est sûr que si il ya beaucoup de données il vaut mieux limiter au niveau de la requête que de filtrer après, mais moi je ferais ça avec des retrival arguments, au moins la requête n'est pas recompilée pour changer les critères.
- plus grande fiabilité : c'est plutôt subjectif... fiabilité envers les bugs glissés par le programmeur ? au lieu d'avoir un bug dans le filtre, on peut avoir un bug dans la manipulation de chaîne, ou une farce du système quand les réglages linguistiques ou le système du client sont différents du poste de dev (cas vu chez un client chinois : Asc retourne -1 (non documenté) sur des caractères exotiques)... juste pour dire
Hors ligne
GrowGeorges a écrit:
la méthode habituelle de mes coworkers qui font un getsqlselect(), charcutent la pauvre chaine et lui assemblent
des tumeurs au bout pour obtenir le résultat souhaité et wop setsqlselect(), retrieve().
Comment dire ...
Hors ligne
GrowGeorges a écrit:
Depuis que j'ai découvert les fonctions setfilter() et filter() des datawindow je n'utilise plus que ça, au détriment
de la méthode habituelle de mes coworkers qui font un getsqlselect(), charcutent la pauvre chaine et lui assemblent
des tumeurs au bout pour obtenir le résultat souhaité et wop setsqlselect(), retrieve().
J'espère qu'ils ne contrôlent pas une centrale nucléaire ou des missiles atomiques, avec des dev comme ça, tes co-workers
Hors ligne
héhé, allez c'est vrai que c'est moche a relire mais ça doit tout de même pas être si infâme que ça !?
Vous utilisez quoi vous quand vous installez une interface de filtre a vos fenêtres sur une data ?
Hors ligne
- on construit dynamiquement les sql, qu'on exploite avec SyntaxFromSQL mais jamais en bricolant avec get/setsqlselect
- SetFilter() / Filter() en interne dans des traitements
- pour un truc agréable à l'utilisateur PowerFilter qui est une surcouche au SetFilter() standard.
Hors ligne
GrowGeorges a écrit:
héhé, allez c'est vrai que c'est moche a relire mais ça doit tout de même pas être si infâme que ça !?
Vous utilisez quoi vous quand vous installez une interface de filtre a vos fenêtres sur une data ?
La fonction prévue pour, SetFilter() / Filter()
Au passage si tu appelles SetFilter() avec un string de valeur nulle comme argument PB affichera automatiquement la fenêtre de définition de filtre pour la DW (attention, ne marche as avec les DS)
Sinon ben fenêtre spécifiquement conçue pour et intégrée dans le framework de dév.
C'est infâme de faire ça avec des retrieves car tu vas chaque fois solliciter la DB et le réseau uniquement pour faire un filtre sur des données que tu as déjà récupérées.
Hors ligne
rincevent a écrit:
C'est infâme de faire ça avec des retrieves car tu vas chaque fois solliciter la DB et le réseau uniquement pour faire un filtre sur des données que tu as déjà récupérées.
Bah ça a son utilité pour disons une liste de commandes accessible a de nombreux opérateurs, par exemple faudrait pas qu'un gus vois sa commande comme 'éditable' parce que lorsqu'il est entré
sur sa fenêtre elle était dans cet état mais dans l'intervalle un autre gus l'a 'traité' .
Oui j'parle avec mes mots et ça a du sens pour moi ! :D
Hors ligne
Moi, le soucis que je voyais en relançant le retrieve, c'est que si tu es sur une datawindows ou tu peux ajouter des lignes, si tu filtres sans avoir enregistrer, tu perd ce que tu as saisis.
Hors ligne
GrowGeorges a écrit:
rincevent a écrit:
C'est infâme de faire ça avec des retrieves car tu vas chaque fois solliciter la DB et le réseau uniquement pour faire un filtre sur des données que tu as déjà récupérées.
Bah ça a son utilité pour disons une liste de commandes accessible a de nombreux opérateurs, par exemple faudrait pas qu'un gus vois sa commande comme 'éditable' parce que lorsqu'il est entré
sur sa fenêtre elle était dans cet état mais dans l'intervalle un autre gus l'a 'traité' .
Oui j'parle avec mes mots et ça a du sens pour moi ! :D
Oui là je décèle une utilisation rauisonnable d'un "Re Select" parceque tes rows sont susceptibles d'avoir changés entre le retrieve et l'update mais bon ça tu nous l'avais pas expliqué au départ. (ou j'ai mal lu, possible)
Je vais enfoncer une porte ouverte et sans doute pas t'avancer plus mais j'ai envie de dire que quand on veut FILTRER on utilise SetFilter() / Filter(), et quand on veut rafraichir les données récupérés là on peut faire un re-select
faut juste savoir déterminer ce qu'on doit/veut faire exactement.
Hors ligne
Ok mais moi je veux filter mes row tout en m'assurant qu'aucune mis a jour n'a été faite sur ma BD,
dans ce cas faire un getsql(), setsql(), retrieve()
ou un setfilter(), filter(), retrieve()
c'est tout bon pareil ?
Dernière modification par GrowGeorges (15-01-2013 15:36:05)
Hors ligne
Je dirais qu'il serait mieux de faire un Retrieve( critere1, critere2, ... ), comme çà tu ne remonte que les données nécessaires et ce sans patcher à la mano tes SQL.
Maintenant si tu as besoin de tripatouiller d'autres lignes dans le filtered buffer, c'est autre chose.
Hors ligne
Bah le reproche que je fait aux retrivials arguments cest que c'est chouette pour faire un filtre basique sur deux, trois colonnes
mais ça devient vite pénible (à mon sens) si tu veux faire un filtre interactif avec des champs renseignés ou non par l'utilisateur et qui peut
contenir une vingtaine de colonnes, le setfilter() devient juste génial dans ce genre de configuration !
(Au fait merci seki pour le powerfilter, ça m'a l'air bien sympas tout ça ! j'vais voir ce que ça donne une fois implémenté ^^)
Dernière modification par GrowGeorges (15-01-2013 15:54:52)
Hors ligne
GrowGeorges a écrit:
Ok mais moi je veux filter mes row tout en m'assurant qu'aucune mis a jour n'a été faite sur ma BD,
dans ce cas faire un getsql(), setsql(), retrieve()
ou un setfilter(), filter(), retrieve()
c'est tout bon pareil ?
ouep
Ouaich dommage que c'est payant le PowerFilter... ( $99.95 )
Dernière modification par rincevent (15-01-2013 16:00:36)
Hors ligne
rincevent a écrit:
ouep
Ouaich dommage que c'est payant le PowerFilter... ( $99.95 )
oui, mais c'est plus rentable pour une boite de se payer la librairie (code source fournis) que de le faire développer, si on arrive a faire comprendre çà à sa direction c'est ok.
Hors ligne
ouch ok, j'avais bien vu le purchase mais j'pensais que c'était juste un lien pour un achat de licence pb !
J'vais plutot m'abstenir alors ^^
Hors ligne
xlat a écrit:
rincevent a écrit:
ouep
Ouaich dommage que c'est payant le PowerFilter... ( $99.95 )oui, mais c'est plus rentable pour une boite de se payer la librairie (code source fournis) que de le faire développer, si on arrive a faire comprendre çà à sa direction c'est ok.
c'est clair ça fait même pas une demi-journée de presta...
c'est ce que j'essayais aussi de faire comprendre à ceux qui voulaient réinventer la roue en redéveloppant un DW2XLS maison
Hors ligne
Je reviens vers vous après avoir constater d'étranges soucis de lenteur au niveau de mes retrieve et en particulier lors de l'utilisation de setsqlselect ...
Voici le test que jai mis en place :
afin de calculer le temps de retrieve je recupere les temps entre le début de l'event retrievestart et le debut de l'event retrieveend (grace a un now() qui stocke les valeurs dans des variables locales).
J'ai mis en place quelques autres boutons : 'retrieve' qui fait uniquement un retrieve de la data, 'temps' qui calcule et m'affiche la diff de temps et enfin 'setsql' qui va simplement concatener la requete initiale
avec une chaine ' where col1=val1 and col2=val2 '
J'arrive sur la fenetre, premiers tests juste sur le bouton 'retrieve' : mes rows sont affichées pour un temps moyen de 0.400s
Maintenant, appuie 1 fois sur 'setsql' puis tests répétés sur 'retrieve' : mes rows sont affichées pour un temps moyen de 3.700s
Et euh bah conclusion : je suis perplexe.
Hors ligne
Si ta requête n'est pas la même dans les 2 cas forcément le temps d'exécution non plus.
Si tu rajoute des choses dans la Where Clause c'est ça en plus que le SGBD doit gérer donc logiquement il va mettre plus de temps.
P.S. moi j'éviterai d'aller coder dans retrievestart et retrieveend pour ça sachant que ça influence aussi le temps de réponse (voir l'aide de PB)
je chopperai plutôt mon temps de départ avant le retrieve et le temps de fin après tout simplement. en plus tu fais tout dans un script comme ça, pas besoin de vars d'instance (je suppose que c'est ce que tu voulais dire en disant variables locales parceque je vois pas comment comparer 2 var locales dans 2 scripts différents.)
Hors ligne
Mon avis : si avant de faire le premier retrieve(), aucun setsqlselect() n'est fait, la requête est déjà sous forme compilée dans la DW.
Après un setsqlselect() la requête sql doit être traitée (recompilée) pour que la DW sache quoi faire avec. Il est probable que ce soit le temps supplémentaire constaté.
C'est pour ça que je disais que le filter() se limitait à travailler sur l'affichage ou non d'enregistrements, il ne nécessite pas de recompilation de la requête associées à la dw. (Bien que le filtre soit une expression sql, il est probable que le moteur de DW sache l'interpréter directement sans tout recompiler)
Hors ligne
ok revoici mon test modifié : j'ai suivi tes conseils rincevent et j'ai tout mis dans le meme script.
1er test : une requete sql avec un 'where col1=val1 and col2=val2' (par construction) et 10retrieve : des temps qui vont de 3.5 à 5.5 sec pour une moyenne de 4.5sec
2nd test : une requete sql sans where mais un set sql 'where col1=val1 and col2=val2' un retrieve préalable non comptabilisé, puis 10 retrieve : les tps vont de 2.7 à 3.7 sec pour une moyenne de 3.2sec
3eme test : une requete sql sans where mais un setfilter('col1=val1 and col2=val2') un retrieve préalable non comptabilisé, puis 10 retrieve : des tmps de 0.35 à 1.25sec et une moy de 0.64sec.
Dernière modification par GrowGeorges (22-01-2013 12:21:14)
Hors ligne
Quelques éléments en plus, parce que attendre 3 à 4 secondes pour un utilisateur c'est quand même impensable :
Les deux colonnes du critère 'where' concernent une table qui est en 'left outter join' dans ma requete, si en revanche
je modifie mon 'where' pour qu'il cible plutot deux colonnes de la table du 'from' les trois tests présentés ci dessus ont tous
des résultats équivalent (0.5sec en moyenne).
Hors ligne