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




Bonjour,
Je réalise pour l'instant un programme de location de documentations pour pour bibliothèque.
A partir d'une window qui gère la documentation, je veux faire un drag and drop vers une autre window ( la window de location)
La window pour la location est en master-detail.
Lorsque que j'ai choisi le document que le client veut louer, je drag and drop dans la dw_detail de la window location.
La dw source contient une dddw (Code doc_id, display value doc_titre)
Dans le dragDrop event de la dw_detail de destination, je fais un insertrow. Je charge les valeurs et la dddw de destination identique à celle du source affiche bien le titre du document.
Jusque là tout va bien.
Lorsque je choisis un autre document, et que je fait le drag and drop, juste après l'insertrow, la display value de l'enregistrement précédent disparait et c'est le code qui est visualisé. Le code est bon mais la display value a disparu. Par contre sur le 2e enregistrement c'est bon. Et ainsi de suite pour les autres enregistrements.
Exemple
Source : code 238 - display value Maladie cardivasculaire ===> destination Maladie cardiovasculaire OK
2e selection
Source : code 127 - Display value Allergie ===> 1er enregistrement destination 238 pas OK plus de display value
===> 2e enregistrement destination Allergie OK
Etc.....
Je ne fais pas de save entre chaque détail car je dois pouvoir, après avoir terminé ma sélection, encoder les quantités.
Li_row = insertrow(0) le renvoie bien à chaque fois le numéro de record.
Le scrolltorow(li_row) aussi.
setitem(li_row',"doc_id",source) fonctionne et visualise la display value.
Toutes les enregistrements précédents sont affectés par ma dernière sélection.
J'ai mis un messagebox juste après l'insertrow. le li_row renvoie bien le bon résultat. Mais dès l'insert exécuté les display values des records précédent disparaissent.
Pouvez-vous m'aider. Je ne vois pas ce qui cloche.
Merci
Dernière modification par jcc (30-09-2008 09:39:43)
Hors ligne






Bonjour,
De souvenir, j'ai déjà eu ce genre de comportement (avec une version d'EBF de la 9.0.3) . Il me semble qu'en entourant le code avec un this.SetRedraw(FALSE) et this.SetRedraw(TRUE) dans l'événement de dragdrop pour forcer le rafraichissement avait résolu le problème.
De toute façon, il est conseillé de le faire systématiquement. Si tu as de nombreuses lignes à traiter en drag en drop, ça va accélérer très nettement le temps de traitement (pas de refresh graphique entre chaque insertion).
Quelle version de PB ? Database ?
Hors ligne




PB enterprise 11.1 Build 8123 et SqlAnywhere 10
J'ai mis un setredraw(False) au début du script dans le dragdrop event et un setredraw(true) à la fin
Ca ne change rien.
A chaque insertrow la display value de la ligne précédente disparait et j'ai le code à la place. Sur la ligne courante c'est toujours OK
Hors ligne
salut,
comment est alimentée ta dddw ?
tu le fais via un retrieve() simple et sans expression ?
au pire des cas, apres chaque insertrow(), lances le retrieve de ta dddw.
A+

Hors ligne




Ma dddw a un retrievial argument qui est le doc_id.
Pour ne pas avoir la window qui me demande le retrievial argument, je fais un retrieve de la child_doc avant le insertrow avec le le code_id qui vient de la dw source.
c'est toujours bon sur le record courant mais jamais sur les précédents.
Les valeurs doc_id sont exactes mais j'aimerais voir les display values car les doc_id ne veulent rien dire pour les utilisateurs.
Même si je supprime le code après la commande insertrow, la display value de la ligne précédente et remplacée par le doc_id correspondant.
Dernière modification par jcc (29-09-2008 16:32:39)
Hors ligne






Bonjour,
Une dddw doit contenir l'ensemble des translations possibles code <-> display value pour l'ensemble des lignes de la datawindow. Tu l'initialises une seule fois et non pas à chaque insertrow.
J'ai l'impression que tu récupères uniquement la translation code <-> display value pour la ligne courante que tu es en train d'insérer avec l'argument que tu donnes à la dddw.
Dans ce cas, c'est donc normal que tu perdes la correspondance pour les lignes précédentes puisqu'elle n'existe plus.
ex : contenu de la dddw après retrieve :
code 238 - display value Maladie cardivasculaire
code 127 - Display value Allergie
Hors ligne
en conclusion,
au lieu de passer via une dddw, tu utilises 2 colonnes.
1 colonne ID et 1 colonne libellé.
tu ajoutes un petit bouton à coté de la colonne ID, histoire d'avoir une fenetre LISTE des libelles - ID.

Hors ligne






Bonjour,
Pour être sur d'avoir bien compris :
Tu as une Windows 1 dans laquelle se trouve une DW source qui contient une dddw (Code doc_id, display value doc_titre)
Lorsque l'utilisateur choisi un doc_titre, tu va l'insérer dans ta Windows 2 ou se trouve une DW detail qui contient une dddw identique (Code doc_id, display value doc_titre).
Fait tu un retrieve() sur ta DW detail?
Fait tu un accepttext(), bien que je ne pense pas que ça fasse grand chose?
As tu coché l'autoretrieve dans les propriété de ta dddw?
Comme dit Pick Ouic, tu règlerais surement ton problème en faisant une mise à jour puis un retrieve() de ta dddw dans ta DW_detail
A+
Hors ligne






Oups,
je vois que plusieurs messages ont été écris pendant que j'écrivais.
Le message précédent risque de ne rien vouloir dire.
Désolé
Hors ligne




Tu viens de me mettre sur le bon chemin.
En fait, j'ai utilisé un dddw que j'utlisais dans une autre dw. Et Cette dddw avait un retrievial argument.
Or, dans ce cas, je n'ai pas besoin de retrievial argument.
J'ai recrée une nouvelle dddw san retrievial argument et maintenant ça semble fonctionner.
Merci de m'avoir éclairé.
A+
Hors ligne











Bonsoir,
N'oublies pas le [RESOLU]
Hors ligne