J'ai un objet utilisateur qui utilise les services pfc. Maintenant, lors de la mise à jour, comment puis-je m'assurer qu'un champ de texte dans DataWindow n'est pas vide?powerbuilder: Comment puis-je m'assurer qu'un champ de texte dans datawindow n'est pas vide?
Répondre
PFC dispose d'un service DataWindow Column Required, qui modifie le comportement de l'attribut Required des colonnes à évaluer lors de la sauvegarde. Si votre exigence implique des colonnes editmask, cela ne fonctionnera pas, mais peut être un moyen facile d'y parvenir autrement.
Pour l'utiliser, je mettrais le code suivant dans le constructeur (avertissement: il a été un moment que je l'ai utilisé):
of_SetReqColumn(TRUE)
inv_reqcolumn.of_RegisterSkipColumn ("col_a")
Bonne chance,
Terry .
Je vais essayer d'expliquer la méthode que j'utilise afin de m'assurer qu'un utilisateur ne laissera pas un champ spécifié vide. Ce qui suit est le code que j'ai mis dans l'événement pfc_updateprep de u_dw (l'ancêtre). Ensuite, pour chacune des colonnes que je veux donner une valeur dans tous les cas, je mets un M
dans la propriété tag
du champ de texte qui décrit la colonne. HTH.
integer li_size,i,l,li_zero
string ls_textname,ls_tag,ls_objects[]
string ls_col,ls_type,ls_text,ls_key,ls_any
any la_null,la_any
dec ld_zero
real lr_zero
long ll_zero
boolean lb_zero
dwItemStatus l_status,l_key_status
This.Modify("DataWindow.Table.UpdateKeyinPlace=Yes")
li_size = This.inv_base.of_Getobjects(ls_objects[ ],"column","*",TRUE)
FOR l=1 TO This.Rowcount()
l_status=This.GetItemStatus(l, 0,Primary!)
IF l_status=NewModified! OR l_status=Datamodified! THEN
FOR i = 1 to li_size
ls_col=ls_objects[i]
ls_key = Upper(This.Describe(ls_col+".Key"))
ls_type=This.Describe (ls_col + ".ColType")
ls_textname=ls_col+"_t" // because the textnames that I use are the same as the column names followed by a "_t"
ls_tag=This.Describe(ls_textname+".Tag")
ls_text=This.Describe(ls_textname+".Text")
IF ls_tag='M' THEN
lb_zero = FALSE
IF This.Rowcount()>0 THEN
la_null=This.inv_base.of_GetItemany(l,ls_col)
choose case Upper(MidA(ls_type,1,3))
case 'DEC'
ld_zero=Dec(la_null)
IF ld_zero = 0 THEN lb_zero=TRUE
case 'INT'
li_zero=Integer(la_null)
IF li_zero = 0 THEN lb_zero=TRUE
case 'REA'
lr_zero=Real(la_null)
IF lr_zero = 0 THEN lb_zero=TRUE
case 'LON'
ll_zero=Long(la_null)
IF ll_zero = 0 THEN lb_zero=TRUE
end choose
IF Isnull(la_null) OR lb_zero THEN
Messagebox(gnv_app.of_Getframe().Getactivesheet().Title,&
"You must provide a value for the following field ~r("+&
ls_text+") !!!")
Return FAILURE
END IF
END IF
END IF
NEXT
END IF
NEXT
Return SUCCESS
Ce que je l'ai fait dans PB est de définir les propriétés de la colonne DataWindow suivantes à TRUE ou vérifié:
- Chaîne vide est NULL
- requis
Si vous faites Ainsi, la fenêtre de données doit automatiquement valider le champ pour vous et empêcher l'utilisateur de laisser le champ vide.
[EDIT - clarification après toujours de bons conseils de Terry]
La première partie de mon poste devrait travailler pour les champs de texte au moment de la saisie des données et je crois forcera l'utilisateur d'entrer une valeur valide dans l'entrepôt de données avant d'autoriser Vous pouvez modifier le focus à moins de modifier ce comportement, par exemple, dans l'événement itemchanged.
Le service PFC Required Column peut être activé et la colonne enregistrée avec pour assurer la validation de la sauvegarde. Cela rend moins fastidieux pour un utilisateur de se déplacer dans les champs tout en naviguant dans les champs, et ne pèse que sur l'utilisateur lorsqu'il tente d'enregistrer.