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





Bonjour à vous,
Je fais appel à vous car j'ai un petit problème avec mes DataWindowChild.
Tout d'abord il faut savoir que dans me fenêtre j'ai une datawindow (dw_interop).
Dans cette datawindow j'ai diverses listes déroulantes qui pointent donc sur d'autres datawindow (DropDownDataWindow).
Donc, dans le open() event de ma fenêtre j'initialise mes listes en récupérant les données depuis la base de données :
Ici la liste a pour valeur un ID.
long ll_V_char_type, ll_V_char_code li_getchild_ok = dw_interop.GetChild("char_env_euro_id", idwc_char_env_euro_id) If li_getchild_ok <> -1 Then idwc_char_env_euro_id.setredraw(false) idwc_char_env_euro_id.SetTransObject(SQLCA) idwc_char_env_euro_id.Retrieve(1, 2) ll_row = idwc_char_env_euro_id.Find("characteristic_code = 0", 1, idwc_char_env_euro_id.RowCount()) if row > 0 then dw_interop.object.char_env_euro_id[1] = idwc_char_env_euro_id.GetItemNumber(row , 'characteristic_id') end if idwc_char_env_euro_id.setredraw(true) else messagebox('', 'Can~'t get it !') end if
Jusque là tout va bien : ma liste est correctement initialisée, le row par défaut est trouvé et sélectionné.
Un peu plus loin dans mon open() event, je fais appel à une fonction dont voici un morceau de code :
ll_row = idwc_char_env_euro_id.Find("characteristic_code = 0" , 1, idwc_char_env_euro_id.RowCount()) if ll_row < 1 then dw_interop.object.char_env_euro_id[1] = ll_null end if
Sauf que dans ce cas, le row dont le characteristic_code vaut 0 n'est pas trouvé... Et je ne parviens pas à comprendre pourquoi. J'ai bien vérifié et je ne fais rien qui touche à ma DataWindowChild idwc_char_env_euro_id entre les deux morceaux de code.
Edition :
Voici ce que j'ai constaté :
messagebox('1', string( idwc_char_env_euro_id.Find("characteristic_code = 0" , 1, idwc_char_env_euro_id.RowCount()) )) dw_interop.Modify('char_env_euro_id.background.color=' + string(rgb(255, 0, 0))) messagebox('2', string( idwc_char_env_euro_id.Find("characteristic_code = 0" , 1, idwc_char_env_euro_id.RowCount()) ))
Le premier message me retourne 1 row.
Le second message me retourne -1, comme quoi il y a eu une erreur.
Sur certaines de mes listes (initialisées de la même façon) il n'y a pas de problème sur les find(), mais sur d'autres ça ne veut rien savoir...
Est-ce "normal" ? :-o
Dernière modification par Nyphel (25-08-2008 16:21:22)
Hors ligne




C'est normal, en effet. Si on regarde l'aide du getChild(), on peut y lire:
F1 a écrit:
Changing property values with the Modify method can cause the reference returned by GetChild to become invalid. After setting such a property, call GetChild again. If a property causes this behavior, this is noted in its description in Chapter 3, "DataWindow Object Properties."
De toute facon, je te deconseille de garder des variables d'instance pointant vers des dataWindowChild. Mieux vaut les recuperer juste avant de les utiliser...
Hors ligne





Oui mais dans ce cas je vais de nouveaux devoir faire un retrieve, non ?
Hors ligne




Non, je penses pas. Pourquoi?
Ce que je penses, c'est que tu dois faire ton retrieve 1 seule fois. Et qu'a chaque fois que tu veux triturer ton child, ben tu re-récupère sa référence avec le getchild(), c'est tout...
C'est juste la variable qui portait la référence au dernier appel de getChild() qui est invalide, ta colonne dddw, elle, porte toujours ses valeurs, son tri, etc...
Donc il n'y a rien qui t'oblige a faire un retrieve a chaque getChild()... A moins que tu me prouve le contraire!
Hors ligne





D'accord, merci bien pour ces informations !
Je n'avais pas saisi la nuance ;)
Hors ligne