Powerbuilder pour les completement Geeks !

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 25-08-2008 13:49:36

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

[RESOLU] DataWindowChild et problèmes de find()

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.

Code: pb

  
  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 :

Code: pb

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

Code: pb

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

 

#2 25-08-2008 14:35:05

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] DataWindowChild et problèmes de find()

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

 

#3 25-08-2008 15:04:52

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] DataWindowChild et problèmes de find()

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

Hors ligne

 

#4 25-08-2008 15:30:31

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] DataWindowChild et problèmes de find()

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

 

#5 25-08-2008 16:22:01

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: [RESOLU] DataWindowChild et problèmes de find()

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

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22