Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un problème au sein d'une datawindows qui contient de nombreuse dddw.
Mon soucis c'est que PB considère qu'il y a eu une modification quand je fais sur une ligne et que pourtant je ne change rien.
Je précise que ma datawindows est un pu complexe, c'est à dire que les dddw qu'elle contient son rafraichis à chaque changement de ligne en fonction des valeurs de la ligne.
Mais bon, la valeur finalement selectionné reste la même.
En mettant des MessageBox, je constate que :
a la premiere ligne de la méthode rowfocuschanged, le modified count est toujours à 0,
juste aprés (sans rien faire au milieu, il est à 1.
C'est est un peu de la magie. Savez vous ce que je fais de mal ou comment surcharger moi même la méthode qui détermine si une valeur a été modifié pour "l'améliorer".
Méthode RowFocusChanged
TRY
Messagebox("rowFocusChanged", String(dw_attribuer_adressage_principal.modifiedcount( ))) ==> Ici le modifiedCount vaut 0
Messagebox("rowFocusChanged2", String(dw_attribuer_adressage_principal.modifiedcount( ))) ==> Ici le modifiedCount vaut 1 (Pourquoi )
Dernière modification par eric69 (15-02-2013 15:57:51)
Hors ligne
Salut,
toujours difficile de répondre à ce genre de question sans connaitre tout le contexte mais d'après ce que tu dis ça me parait comparable à ceci et donc plutot normal comme comportement.
si j'ai un SingleLineEdit avec du code dans l'event modified,
-je tape "lulz" dedans puis je fais Enter => l'event se déclenche
-je fais Enter de nouveau => l'event ne se déclenche pas, normal, je n'ai pas fait de modif
-je fais backspace pour effacer le "z" puis je frappe (brutalement) la touche z, le texte affiché est donc de nouveau "lulz", je fais Enter => l'event se déclenche (il y a bien eu modification du texte, peu importe que le résultat de la modif soit le même que le résultat avant modif, il y a eu modif)
du coup au lieu d'utiliser modifiedcount() il afut que tu compare tes données avant/après pour savoir si tu dois updater ou pas.
My 2 cents.
Dernière modification par rincevent (15-02-2013 10:55:02)
Hors ligne
Regarde le DWStatus de tes champs et lignes dans ta datawindow principale. Il est probable que ceux-ci soient à DataModified! du fait de tes manipulations sur les changements de lignes.
Pour que le ModifiedCount() reste à 0, il faut que tous les DW Status des lignes et champs soient à NotModified!
En faisant cette recherche, tu pourras déterminer quel(s) est(sont) le(s) champ(s) incriminé(s).
PS:
Hors ligne
eric69 a écrit:
En mettant des MessageBox, je constate que :
a la premiere ligne de la méthode rowfocuschanged, le modified count est toujours à 0,
juste aprés (sans rien faire au milieu, il est à 1.
C'est est un peu de la magie.
Pas forcément, parce que l'affichage de la messagebox(), fait perdre le focus à ta ligne, et tu as peut-être des traitements qui s'effectuent à ce moment ou juste après quand la dw reprend le focus
Si tu mets dans une variable la valeur du ModifiedCount() une première fois, puis dans une seconde le second ModifiedCount(), tu devrais voir qu'il ne change pas.
Une bonne solution pour tracer des messages sans MessageBox, c'est d'utiliser la fonction système OutputDebugString() qui est une fonction du noyau windows permettant de logger des messages. Tout debugger en fonction à ce moment (Visual Studio, OllyDbg) ou simplement le viewer DebugView permettra d'écouter ces logs.
Il suffit de déclarer cette méthode en global ou local external function :
SUBROUTINE OutputDebugString (String lpszOutputString) LIBRARY "kernel32.dll" ALIAS FOR "OutputDebugStringW";
Ensuite un simple appel à cette méthode permet d'envoyer le log (le viewer doit être démarré avant car ces logs sont perdus si personne n'écoute)
OutputDebugString("mon message de debug :" + string(ModifiedCount()))
eric69 a écrit:
Savez vous ce que je fais de mal
Comme dit, certainement un bout de code qui modifie une ligne, même pour y mettre des valeurs identiques, la ligne devient alors "modifiée". Tu peux connaître la ligne en question avec un GetNextModified() sur la DW
parce que sinon
eric69 a écrit:
ou comment surcharger moi même la méthode qui détermine si une valeur a été modifié pour "l'améliorer".
Comment dire...
Hors ligne
ça fait plusieurs fois que je le pense alors cette fois je le dis, Seki t'es vraiment un Killer
Hors ligne
Bon, j'ai trouvé.
A un moment, je faisais un setitem d'une valeur vide dans une zone déjà vide.
Bon, je veux bien qu'il detecte que c'est quand même une modification.
La question, c'est pourquoi il le dis pas tout de suite.
Parce que mon affichage qui fais perdre le focus, je le faisais tout le temps et il se décide à me le dire que quand il a envie .
Pas simple pour trouver, le bout de code qui fait l'erreur.
Mais bon, en parcourant les lignes et colonne et en sachant qui pose problème, j'ai pu trouver le problème.
Merci de votre aide en tout cas.
Hors ligne
N'oublie pas le [RESOLU]
Hors ligne
rincevent a écrit:
ça fait plusieurs fois que je le pense alors cette fois je le dis, Seki t'es vraiment un Killer
Boaf, merci
Le coup de la perte de focus et de l’exécution possible d'évènements entre 2 MessageBox() c'est xlat qui en a eu l'idée
Hors ligne
eric69 a écrit:
A un moment, je faisais un setitem d'une valeur vide dans une zone déjà vide.
Juste pour dire ( parce que c'est comme "goto" : si c'est mal utilisé la solution peut être pire que le problème) : il existe SetItemStatus(NotModified!) qui peut servir à persuader la DW qu'il ne s'est rien passé...
On peut modifier une colonne d'une ligne, ou toute une ligne.
Hors ligne