Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
Malgré que cela fait un petit moment que je code en PowerScript, je reste toujours un peu démuni face aux datawindowchilds.
Je vous expose mon problème :
J'ai une datawindow (que l'on appellera dw pour faire plus simple) qui contient un champ 'NOM'. dw n'est pas construite à partir d'un select, c'est une datawindow de type External.
Sur ce champ 'NOM' j'applique le style DropDownDataWindow.
La "DisplayColumn" sera le champ 'NOM'
La "DataColumn" sera le champ 'IDENTIFIANT'
La dropdowndatawindow (que l'on appellera dddw pour faire plus simple) est crée à partir d'une requête SQL de ce type :
SELECT NOM, PRENOM, IDENTIFIANT FROM UTILISATEUR
Dans la fenêtre je suis amené à modifier l'utilisateur selectionné et affiché dans dw à partir d'un identifiant.
Et c'est là que je coince car je ne peux pas faire un Find() sur dw car elle ne contient pas le champ 'IDENTIFIANT'
Faut t-il forcer la sélection d'une ligne dans dddw ou bien y a t-il moyen d'utiliser la "DataColumn" de dw pour parvenir au résultat attendu?
Merci pour vos éclaircissements.
Dernière modification par Nephtis (21-04-2009 13:02:28)
Hors ligne
Sur ce champ 'NOM' j'applique le style DropDownDataWindow.
La "DisplayColumn" sera le champ 'NOM'
La "DataColumn" sera le champ 'IDENTIFIANT'
en principe c'est l'identifiant qui est stocké dans dw et le nom qui est affiché...
Hors ligne
Pourquoi désires-tu faire un find ?
le nom du champs de dw (nom) prête un peu à confusion à mon sens, mais soit..
Si tu veux récupérer l'identifiant sélectionné, il suffit de faire
valeur = dw.object.nom[1]
Si tu veux faire un find :
dw.getchild( "NOM", ldwc_nom) ls_chaine = "IDENTIFIANT = " + tonidentifiant? ll_row = ldwc_nom.Find(ls_chaine, 1,ldwc_nom.rowcount( ) )
Et là tu récupères le numéro de ligne où se trouve l'identifiant que tu cherches..
Ensuite, si tu veux avoir son nom par exemple..
ls_nomrecherche = ldwc_nom.getitemString(ll_row,"NOM") ls_prenomrecherche = ldwc_nom.getitemString(ll_row,"PRENOM")
Voilà, j'espère avoir pu t'aider et ne pas m'être trompé !
Bonne chance
NB :
Dernière modification par micmx (21-04-2009 07:15:28)
Hors ligne
Peut être qu'en le transformant en exemple plus parlant cela vous aidera à comprendre mes besoins :
dddw liste les utilisateurs de PBADonf (Pseudo + Nom/Prenom).
Dans ce cas il affiche le nom des utilisateurs ("DisplayColumn") mais stocke leur pseudo ("DataColumn")
erasorz a écrit:
en principe c'est l'identifiant qui est stocké dans dw et le nom qui est affiché...
Je pensais que c'était ce que je faisait : identifiant comme "DataColumn" et nom comme "DisplayColumn". Il y a peut être une nuance qui m'a échappée
Quand je sélectionne un utilisateur dans dw, une autre datawindow m'indique d'autres informations sur l'utilisateur (elle prend notamment en paramètre le pseudo de l'utilisateur récupéré à l'aide d'un GetItemString() sur dw)
La fenêtre me permet tout de même de modifier la fiche d'information des utilisateurs.
Imaginons que je change le pseudo d'un utilisateur par un autre pseudo existant, comment faire pour forcer l'affichage du nouveau pseudo dans dw?
Un dw.Find("pseudo="+ls_pseudo) ne fonctionne pas car dw ne contient pas la colonne "Pseudo"
Dernière modification par Nephtis (21-04-2009 08:40:23)
Hors ligne
Dans ton exemple, le colonne identifiant est dans la dw, l'identifiant et le nom sont dans la dddw.
Lorsque la dw affiche l'identifiant qu'elle contient, la dddw remplace automatiquement à l'affichage la valeur par le libellé mais la valeur seule reste dans dw(le nom dans ton exemple).
Donc pour lire ou écrire une valeur dans la dw, il faut utiliser un getitemnumber(row,"identifiant") ou un setitem(row,"identifiant",id).
Maintenant si le but est de rechercher le nom (dans la dddw) correspondant à l'identifiant stocké dans la dw, il faut utiliser la méthode Lookupdisplay. Pour recherche un autre nom que celui affiché (et son identifiant) dans la dddw, il faut faire un find sur la dddw (voir script de mimcx auquel j'ajoute la déclaration de ldwc_nom... )_
datawindowschild ldwc_nom dw.getchild( "NOM", ldwc_nom) ls_chaine = "IDENTIFIANT = " + tonidentifiant? ll_row = ldwc_nom.Find(ls_chaine, 1,ldwc_nom.rowcount( ) )
Si le but est de mettre à jour d'autres champs de la dw à partir de la dddw.
Il faut déclencher un rechargement la dddw si des modifications sont faites parallèlement par un autre écran sur les données contenues dans la dddw.
datawindowschild ldwc_nom
dw.getchild( "NOM", ldwc_nom)
ldwc_nom.retrieve()
Hors ligne
Juste un petit truc
La déclaration que tu as ajoutée comporte une petite faute de frappe ^^
datawindowchild ldwc_nom
un petit "s" de trop ;)
Hors ligne
micmx a écrit:
Juste un petit truc
La déclaration que tu as ajoutée comporte une petite faute de frappe ^^Code: pb
datawindowchild ldwc_nom
un petit "s" de trop ;)
Oui, j'ai des gros doigts de temps en temps
et en plus je ctr+c ctrl+v à tout va !
Hors ligne
En fait je veux forcer l'affichage d'un certain utilisateur dans dw, comme si l'utilisateur l'avait sélectionné lui même.
Je peux faire un SetItem dans dw, l'affichage sera bon mais la "DataColumn" sera égale à la valeur de mon SetItem, par exemple :
Pseudo | Nom
Toto | Albert
dw.SetItem(1, "nom", "Albert") // Le résultat m'affiche correctement Albert dans dw MessageBox("debug", dw.GetItemString(1, "nom")) // La chaîne renvoyée est "Albert" alors qu'il faudrait que ce soit "Toto" qui soit renvoyé
Hors ligne
Si Pseudo est ta DATACOLUMN
fait le avec :
dw.setItem(1,"nom","Toto")
ça t'affichera bien ALBERT (et non pas TOTO)
et lorsque tu feras
MessageBox("debug", dw.GetItemString(1, "nom"))
ça te retournera TOTO
Hors ligne
datawindowschild ldwc_nom string ls_sonNom,ls_sonPseudo dw.getchild( "NOM", ldwc_nom) // Ici le nom que je veux rechercher ls_sonNom="Albert" // Je cherche le numéro de ligne où se trouve le nom ls_chaine = "NOM = " + ls_sonNom ll_row = ldwc_nom.Find(ls_chaine, 1,ldwc_nom.rowcount( ) ) // Si le nom se trouve dans la dddw if(ll_row>0) then // je récupère son pseudo ls_sonPseudo=ldwc_nom.getItemString(ll_row,"pseudo") // je le désigne comme élément courant de ma DW dw.setItem(1,"nom",ls_sonPseudo) end if
Je pense qu'avec ça tu devrais tout comprendre
Dernière modification par micmx (21-04-2009 12:55:39)
Hors ligne
Merci micmx
Le seul truc que je n'arrivais pas encore à comprendre était que dw allait chercher directement le nom à afficher dans dddw en fonction de la valeur de la variable qu'on lui passait dans le SetItem()
Hors ligne
J'aurais bien mérité quelques pépites pour une fois
Ben quoi.. dans deux semaines ça sera déjà fini pour moi le PB
Pas de quoi en tout cas ;)
a+
Hors ligne
Regarde bien ton compte en banque
Hors ligne
wow, ça change !
sympa !
Ps: arnaque cette loterie
Hors ligne