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




Bonjour à tous,
Je suis en train actuellement de faire de la compta.
Dans ma datawindow, j'ai un champ 'ecr_cpte' qui correspond donc à un numéro de compte. Il s'agit d'un champ à 6 caractères. Lors de l'itemchanged, il faut que je vérifie, dans une datastore, si le numéro de compte saisi existe ou non...Jusque là tout va bien.
Ce que je souhaiterais faire, c'est laisser à l'utilisateur la possibilité de rentrer moins de 6 caractères et de rajouter des 0 pour compléter.
Exemple : l'utilisateur entre 2748, le programme complete pour obtenir 274800 et ensuite intervient tout le processus de l'itemchanged avec verification de l'existence de ce numéro de compte....
Le soucis est donc qu'il faut que je puisse modifier mon argument "data" dans l'itemchanged. J'ai essayé, je le modifie bien, mais au final, visuellement parlant, le resultat ne change pas, je reste toujours avec 2748 au lieu de 274800.
Quelqu'un a une solution pour moi (si j'ai été clair)?
Merci d'avance
Dernière modification par Sebou (14-02-2008 17:25:09)
Hors ligne
Pour remettre la valeur modifiée du data dans la colonne, tu utilises SetText ou SetItem ?
Hors ligne














bonjour, itemchanged est déclenché à la "fin" de la saisie : ie lorsque le controle perd le focus (tab ou clic ailleurs, etc.)
Je pense qu'il faut coder au niveau de la saisie clavier, vérifier quand est-ce qu'il y a assez de caractères (4?) avant d'ajouter des zéros.
Hors ligne




non, voila ce que je fais :
IF len(data) <> il_compta THEN ll_nb_zero = il_compta - len(data) FOR ll_i = 1 TO ll_nb_zero data = data + '0' NEXT END IF
avec il_compta = nombre de caractères nécessaires (soit 6 dans mon cas)
Hors ligne
C'est une complession automatique à la saisie ou au changement de zone que tu veux ?
Car dans le premier cas c'est Editchanged qu'il faut traiter. Sinon Itemchanged mais avec un SetText et non un SetItem pour mettre la valeur complétée.
Hors ligne
Sebou a écrit:
non, voila ce que je fais :
Code:
IF len(data) <> il_compta THEN ll_nb_zero = il_compta - len(data) FOR ll_i = 1 TO ll_nb_zero data = data + '0' NEXT END IFavec il_compta = nombre de caractères nécessaires (soit 6 dans mon cas)
Ca ne suffit pas, le data n'est pas remis dans ta zone, il faut le faire avec un settext.
Dans ton cas tu testes bien la donnée complétée dans l'itemchanged mais tu ne l'a pas mise dans ta DW donc à la sortie de l'itemchanged la valeur reste sans les zéro...
Et utilises FILL c'est mieux (Pas de boucle inutile)
data += FILL('0', il_compta - len(data))
Hors ligne




ok, merci...j'essaie ca...
Hors ligne




ca marche tjs pas :'(...j'apercois brievement mon 274800 mais le 2748 le remplace
Hors ligne




voila mon code, j'place peut etre les elements au mauvais endroit ?
IF dwo.name = 'ecr_cpte' THEN IF len(data) <> il_compta THEN data += fill('0', il_compta - len(data)) END IF ls_plan = GetItemString(row, 'ecr_plan') ls_format = "num = '" + data + "' AND typ = '" + ls_plan + "'" ll_pos = gds_compte.find(ls_format, 1, gds_compte.RowCount()) IF ll_pos <= 0 THEN li_rep = messagebox("QUESTION", , question!, yesno!) IF li_rep = 2 THEN return 1 ELSE END IF ELSE ls_type_cpt = f_type_cpt(ls_plan, data) SetItem(row, 'type_cpt', ls_type_cpt) //Si c'est un compte collectif IF ls_type_cpt = 'collectif' THEN SetItem(row, 'ecr_pemt', ls_plan) SetItem(row, 'ecr_cemt', data) SetItem(row, 'ecr_plan', "") return 2 post event aller_colonne('ecr_plan') ELSE this.SetItem(row, 'ecr_cpte', data) this.SetText(data) //Si on a rempli un compte emetteur IF NOT isNull(GetItemString(row,'ecr_pemt')) THEN //et que le compte saisi est un cpt auxiliaire IF ls_type_cpt = 'auxiliaire' THEN trigger event aller_colonne('ecr_piece') ELSE messagebox("ERREUR", "Le compte choisi n'est pas un compte auxiliaire", stopsign!) return 2 END IF //S'il n'y a pas de cpt emetteur rempli ELSE //et que le cpt saisi est un cpt auxiliaire IF ls_type_cpt = 'auxiliaire' THEN trigger event aller_colonne('ecr_pemt') //sinon, c'est un cpt general ELSE trigger event aller_colonne('ecr_piece') END IF END IF END IF
Hors ligne
des trigger event pour changer de colonne dans un itemchanged.
Que de mauvais souvenir
Et sans le this.SetItem(row, 'ecr_cpte', data) et des post event pour les changements de colonnes qui suivent ça donne quoi ?
D'ailleurs j'aime beaucoup le post juste derrière le return 2. Il doit pas beaucoup fatiguer le CPU celui là ...
Hors ligne




pareil, la completion se fait bien, apparait furtivement et l'ancienne version du data revient à l'écran (sans les 0 koi)
Hors ligne
il faut voir la valeur du return par lequel tu sorts de l'itemchanged et éventuellement voir dans l'itemerror si tu n'as pas un code qui met la grouille...
Sans oublier les scripts ancêtres éventuels...
Hors ligne




dans l'itemerror, je n'ai qu'un 'return 1' et la valeur de retour par laquelle je sors dans mon itemchanged est 0
Hors ligne




bon béh c'est bon, en fait, il suffisait de passer par une variable intermediaire dans laquelle je stocke mon data + fill...et ensuite, je place mon setitem en post...et ca roule
Merci pour l'aide tout de meme
Hors ligne
Pourquoi passer par une variable intermédiaire ?
Tu sais que tu peux faire directement un
this.Post SetItem(row,"ecr_cpte",data)
Sinon pour info voici ce que te dit l'aide sur l'utilisation du settext et du setitem dans un itemchanged :
Using SetText in the ItemChanged and ItemError events
In the ItemChanged or ItemError event, PowerBuilder or your own script might determine that the value in the edit control is invalid or that it needs further processing. You can call SetItem to specify a new item value for the row and column. If you want the user to have an opportunity to enter a different value, after calling SetItem you can call SetText to put that same value in the edit control so that the user sees the value too. You can also call SetText without calling SetItem. In the script, use a return code that rejects the value in the edit control, avoiding further processing, but does not allow the focus to change. To retain focus and display an error message, return 1 for ItemChanged or 0 for ItemError.
When you use a return code that rejects the data the user entered but allows the focus to change (a return code of 2 in the script for the ItemChanged event or 3 in the ItemError event), you do not need to call SetText because the value set with SetItem displays when the focus changes.
Ton return 1 dans l'itemerror rejette systématiquement la valeur !
A l'inverse tu traites les erreurs directement dans ton itemchanged (messages suivi de return 2), ce qui fait :
1- Perdre le focus à la DW (messagebox)
2 - Déclenche l'itemerror (return 2)
Il vaut mieux traiter les erreurs dans l'itemerror (prévu à cet effet)
Ton appli va devenir un ensemble de "post" que tu ne maitriseras plus (plusieurs post avec certains qui feront probablement des triggers... comment pourras-tu maîtriser l'ordre d'enchainement de tes évènements ? )
Hors ligne