Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Salut à tous!
Alors ca c'est du titre de topic où on sent déjà que ca va être chiant bien que je pense que certains d'entre vous ont déjà été confronté à ce genre de problème.
Le problème, quel est il ?
Eh bien, partons d'une datawindow qui me génèrent plusieurs lignes. Dans cette datawindow, j'ai une colonne qui fait appel à une dropdown d'articles par exemple.
Admettons que dans la premiere ligne de la dw, je selectionne "Produit 1", lorsque je passe a la seconde ligne je voudrais que "Produit 1" n'apparaissent pas. J'ai donc fait un filter, mais lorsque je l'applique, la premiere ligne ne m'affiche plus "Produit 1" mais PDT1 (perd le display, garde le data) ce qui parait logique puisque le filtre masque cette valeur sur la dropdown qui est utilisée par toute les lignes.
Quelqu'un a t il une idée pour palier à ce problème, je pense pas trop original?
Je poursuis les recherches, si j'ai de plus amples informations, croyez moi bien que vous en serez les premiers informés.
C.U
Hors ligne
salut
waouuuuuuuu la question ! (non, je faisais référence à Vista...waouuuuuuuuu !)
En fait, quand tu fais un filtre sur une dddw, le filtre s'applique pour toutes les lignes de cette dddw.
hooooooooooooooo nonnnnnnnnnnnnnnnnnnnn (en réponse à waoooooooooo!)
Hors ligne
hellkinder a écrit:
ce qui parait logique puisque le filtre masque cette valeur sur la dropdown qui est utilisée par toute les lignes.
Oui, ca j'avais bien saisi. La question est comment faire pour qu'il ne me perde pas l'affichage et la valeur de la premiere ligne quand je filtre.
Comme solution, tout ce que je vois c'est de creer un compute à chaque ligne dans lequel je stock la valeur de la dddw et je colle le libellé sur la dddw 'a l'arrache'
Mais n'y a t il pas une solution plus propre?
Hors ligne
comme solution simple,
je vois une fausse dddw... une fenetre response quoi...
je pense que ce sera plus simple à gérer.
Hors ligne
LOOOOOOOOOL, ami du bidouillage bonjour...
Effectivement la fenetre response est une alternative à moindre coût.
Sinon en farfouillant sur le net (de toute facon on peut pas faire autre chose que farfouiller), j'ai vu qu'un americain utilisait la meme solution que celle que j'ai proposé...donc je pense que je vais choisir ..... la fenetre response
Youhouuuu Farfouillage Poo0000OOOwwwwwW\/\/\/\/\/\/aaaaaAAAAA44444444
Hors ligne
waoooooooooooooooooooooouaaaaaaaa
effectivement, j'ai deja eu affaire à ce genre de cas...
et c'est un vrai casse tete chinois ! suivant les cas à filtrer...et suivant le nombre de lignes...
DEBUT DU HS
waooooooooooooooooooooooisttaaaaaaaaaaa
Hors ligne
Vive les casse tete chinois, je vais remanier tout ca à la baguette en utilisant le nem de la colonne...j'ai pas peur des grande muraille, et hors de question que je sois la riziere des developpeurs, ca va marcher pek-in, et si ca marche pas, ya de forte chance que je riz jaune.
Un point tsé tung!!
Hors ligne
je crois que j'ai trop mangé de kinder ce matin...
Hors ligne
désolé de plomber l'ambiance...
Hors ligne
et sinon un restau chinois ça te dis?
Hors ligne
je nem pas ca
Hors ligne
arretes de pourir le post quoi :x
Hors ligne
on arrete nos chinoiseries
FIN
DU
HS
Hors ligne
Bon, j'ai deux liens que j'ai volés sur ma page perso :
1) pbdr.com : Ah zut le lien marche plus (TCP ERROR)
2) Multi-Key DropDownDataWindows par Breck Carter en juillet 1996 (je suis sûr qu'il y en a qui n'étaient pas encore nés)
creer un compute à chaque ligne
Moi je verrai plutôt un champs texte qui serait la plupart du temps au dessus (bring to front) de la dropdown
Hors ligne
Pas de réponses ? Me voilà obligé de me répondre à moi même.
shahin a écrit:
1) pbdr.com : Ah zut le lien marche plus (TCP ERROR)
Bon, mon premier lien est revenu : How to filter Dropdown Datawindows
Hors ligne
Merci beaucoup shanin, désolé pour le temps de réponse..
Je vais etudier tes solutions..pour l'instant j'ai reussi avec un compute mais qui doit faire a peut pres la meme chose que prévu dans le champs texte que tu propose..enfin je dis ca mais j'ai pas encore, regardé les liens...je me plonge dedans demain, promis.
Hors ligne
hellkinder a écrit:
j'ai reussi avec un compute
ça c'est le plus important. Eh bien bravo
j'ai pas encore, regardé les liens...
Moi, non plus. Quand c'est en anglais, je ne lis qu'avec une baïonnette dans le dos...
Hors ligne
hellkinder a écrit:
j'ai reussi avec un compute
tu peux rappeler le principe de l'utilisation du compute? c'était bien ça :
de creer un compute à chaque ligne dans lequel je stock la valeur de la dddw et je colle le libellé sur la dddw 'a l'arrache'
<hs>
shahin a écrit:
Moi, non plus. Quand c'est en anglais, je ne lis qu'avec une baïonnette dans le dos...
Ben alors grâce à PB tu dois avoir plein de cicatrices dans le dos...
</hs>
Hors ligne
oula désolé, j'avais pas vu que vosu aviez posté!
Donc voila ma solution... (cochon land)
Bon alors vu que mon code est enorme, je vais essayer de vous expliquer avec un exemple :
LE BUT : je veux selectionner une position dans une dddw et lorsque j'en selectionne une sur la premiere ligne de ma datawindow, je ne veux pas que cette position selectionnée s'affiche à la deuxième ligne.
LE PRINCIPE : On utilise un champs dit "compute" que l'on va filtrer, et un champs code_position correspondant a l'entrée base, qui lui est basé sur la meme dddw mais qui n'est pas filtré, afin de fournir les informations manquantes (libelles) au champ compute
LE CODE (miam) :
voila ma datawindow :
le champs superieur est le compute cpt_position, l'autre le champs code_position.
Ces deux champs sont asscoiés à la meme dddw.
Lorsque on génère les lignes de la dw, on fait un retrieve de la dddw sur chacun des champs :
//Initialisation de la dddw des positions dw_reservation.getchild("code_position",ldw_child2) ldw_child2.settransobject(SQLCA) ldw_child2.retrieve() dw_reservation.getchild("cpt_position",ldw_child1) ldw_child1.settransobject(SQLCA) ldw_child1.retrieve()
puis, dans l'event itemchange de ta dw (moi c dw_reservation),
tu construis une datastore que tu remplis avec les enregistrements de ta dw qui ont code_position rempli.
//rq on rempli la datastore des enregistrements dont code position rempli for i=1 to dw_reservation.rowcount() if dw_reservation.getitemstring(i,"code_position")<>"" and not(isnull(dw_reservation.getitemstring(i,"code_position"))) then dw_reservation.rowscopy( i, i, Primary!, lds_reservation, 1, Primary!) end if next
A partir de cette datastore, tu peux construire ton filtre :
if lds_reservation.rowcount() > 0 then ls_filtre = "code_position <> '"+lds_reservation.getitemstring(1,"code_position") +"'" if lds_reservation.rowcount() > 1 then for i = 2 to lds_reservation.rowcount() ls_filtre = ls_filtre + " and code_position <> '"+lds_reservation.getitemstring(i,"code_position")+"'" next end if end if
Bon il doit y avoir + optimisé, mais au moins c'est lisible = maintenable
Tu appliques ton filtre seulement au champs compute, cpt_position
ldw_child1.setfilter("")
ldw_child1.filter()
Vu que là on filtre sur la colonne cpt_position, les autres lignes de la dw vont perdre leur libelle dans le champs cpt_position, mais le champs non filtré code_position est toujours là..donc il reste plus qu'a mettre le libelle de code_parution, dans cpt_position.
for i=1 to dw_reservation.rowcount() //rq on recupere le libelle de la position li_num=ldw_code_position.Find ( "code_position = '"+ dw_reservation.getitemstring(i,"code_position") + "'", 1, ldw_code_position.rowcount()) if li_num>0 then ls_libelle_pos = ldw_child2.getitemstring(li_num,"libelle_pos") else ls_libelle_pos = "" end if next //rq on met le libelle dans le compute if dw_reservation.getitemstring(i,"code_position")<>"" and not(isnull(dw_reservation.getitemstring(i,"code_position"))) then dw_reservation.setitem(i,"cpt_position",ls_libelle_pos) end if
Dans l'itemchange toujours, si c'est le champs cpt_position qui est modifié, tu copie cette valeur dans le champs code_position de la meme ligne afin de pouvoir recuperer son libellé :
ls_position=dw_reservation.getitemstring(dw_reservation.getrow(),"cpt_position") dw_reservation.setitem(dw_reservation.getrow( ),"code_position",ls_position)
Enfin il ne reste plus qu'a cacher le champs code_position.
L'avantage, c'est que si on update la datawindow ou qu'on fait un retrieve, c'est le champs code_position qui est utilisé.
Lors d'un retrieve sur la datawindow, il suffit de refaire le code du "collage de libellé" apres le retrieve de la dw et banco!
Hors ligne
Un Grand Merci à toi pour ta solution !
Hors ligne
Hors ligne
De rien les pbdonfeurs! :D
Hors ligne