Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 15-01-2013 08:59:33

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Nouveau match up : Setsqlselect ou filter ?

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

 

#2 15-01-2013 09:24:51

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Nouveau match up : Setsqlselect ou filter ?

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é.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#3 15-01-2013 09:36:04

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: Nouveau match up : Setsqlselect ou filter ?

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


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#4 15-01-2013 10:25:37

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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 ...


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#5 15-01-2013 10:55:57

Geo  
Membre completement Geek
Lieu: Binche
Date d'inscription: 15-12-2008
Messages: 119
Pépites: 378
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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


Rien ne sert de courir, il faut partir à point .

Hors ligne

 

#6 15-01-2013 11:00:26

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#7 15-01-2013 11:11:17

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: Nouveau match up : Setsqlselect ou filter ?

- 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.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#8 15-01-2013 11:29:55

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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.


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#9 15-01-2013 12:29:59

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#10 15-01-2013 13:52:41

eric69  
Membre Geek
Date d'inscription: 03-01-2013
Messages: 30
Pépites: 139
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#11 15-01-2013 14:54:15

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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.


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#12 15-01-2013 15:34:38

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#13 15-01-2013 15:38:21

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Nouveau match up : Setsqlselect ou filter ?

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.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#14 15-01-2013 15:45:44

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#15 15-01-2013 15:55:48

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#16 15-01-2013 16:19:10

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Nouveau match up : Setsqlselect ou filter ?

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.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#17 15-01-2013 17:03:46

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#18 15-01-2013 20:02:06

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Nouveau match up : Setsqlselect ou filter ?

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


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#19 22-01-2013 11:03:05

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#20 22-01-2013 11:10:32

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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.)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#21 22-01-2013 11:11:57

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: Nouveau match up : Setsqlselect ou filter ?

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)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#22 22-01-2013 12:19:18

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

#23 23-01-2013 08:18:10

GrowGeorges  
Membre Geek
Date d'inscription: 26-12-2012
Messages: 36
Pépites: 120
Banque: 0

Re: Nouveau match up : Setsqlselect ou filter ?

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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22