| Title: | *OLD* ALL-IN-1 (tm) Support Conference |
| Notice: | Closed - See Note 4331.l to move to IOSG::ALL-IN-1 |
| Moderator: | IOSG::PYE |
| Created: | Thu Jan 30 1992 |
| Last Modified: | Tue Jan 23 1996 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 4343 |
| Total number of notes: | 18308 |
Hello
I have a problem in an ALL-IN-1 V3.0A application.
The file CHCL_NODE contains the node name (field NAME) and the
privilege (field PRIV) required to work on this node. If PRIV is null
means that no privilege is required to work on this node.
The variable #CHCL_PRIV is a list of privileges separated by commas for
the current user. "ALL" is a special privilege to allow the user to work
on all nodes.
In this particular form, what I want is the user is only allowed to enter
the node he/she has privilege on the field NODE.
The following named data work fines except when the user press RETURN on
the NODE field. So this form accept node which the user is not privileged
to work on.
********************************************************************************
;;NODE;;
/VALID=CHCL_NODE.NAME
/SHOW='.NAME " " .DESC'
/OPTIONAL
/POST='XOP "~~CHECK_NODE~~"'
;;~~CHECK_NODE~~;;
.IF (#CHCL_PRIV CONTAINING "ALL") OR
(#CHCL_PRIV CONTAINING CHCL_NODE.PRIV[NODE]) THEN
GET #CHCL_NODE = NODE
ELSE
GET OA$DISPLAY="Insufficient Privilege to work on this node"\\
OA$VAL_SET_INVALID NODE\\
OA$FRM_SET_FIELD NODE
********************************************************************************
The OA$VAL_SET_INVALID function seems to have *NO EFFECT AT ALL*. I have
tried this:
********************************************************************************
/VALID=CHCL_NODE.NAME; .IF (...) THEN OA$VAL_SET_INVALID NODE
********************************************************************************
Nothing happens.
Have tried to include this OA$VAL_SET_INVALID function in the POST function
of the whole form, again nothing happens.
Then I tried the /RSE_VALID qualifier like this
********************************************************************************
/RSE_VALID=CHCL_NODE.NAME WITH (#CHCL_PRIV CONTAINING "ALL") OR
(#CHCL_PRIV CONTAINING .PRIV)
********************************************************************************
This works when user press FIND, the list comes up exactly what I want.
However it accepts everything, even the node name not in the CHCL_NODE file.
I guess it is because when the node name is not in CHCL_NODE, .PRIV will
return null.
Then I tried this
********************************************************************************
/RSE_VALID=CHCL_NODE.NAME WITH ((#CHCL_PRIV CONTAINING "ALL") OR
(#CHCL_PRIV CONTAINING .PRIV)) AND
(#CHCL_NODE.%KEY[.NAME] NES "")
********************************************************************************
Tried that
********************************************************************************
/RSE_VALID=CHCL_NODE.NAME WITH ((#CHCL_PRIV CONTAINING "ALL") OR
(#CHCL_PRIV CONTAINING .PRIV)) AND
(#CHCL_NODE.%KEY[NODE] NES "")
********************************************************************************
Nothing works.
??? Any suggestion?
??? Can I force the user to stay in a form when the user press RETURN?
??? I have thought about setting a variable so that the form will be
invoked again if the NODE field is not correct, but it seems crazy?
??? What are OA$VAL_SET_VALID and OA$VAL_SET_INVALID doing?
Thanks
Banquo
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3628.4 | OA$VAL_SET_INVALID does work; suggestions for fixing the problem | SCOTTC::MARSHALL | Spitfire Drivers Do It Topless | Tue Dec 07 1993 12:12 | 23 |
Hi,
OA$VAL_SET_INVALID *does* work; see US$CHANGE$PASSWORD for examples of its use.
Without playing with your code in more detail (which I don't have time for) I
don't know why it isn't working in your case.
Are you sure the ELSE part is actaully being exectued? Do you see the message
�nsufficient priv..."?
Try OA$FLD_STAY instead of OA$FRM_SET_FIELD.
Try replacing your /VALID with some functions that explicitly set the field
to valid/invalid, rather than validating it then having to have post-processing
to invalidate it again!
eg: /VALID=<.IF CHCL_NODE.NAME[NODE] NES "" AND
((#CHCL_PRIV CONTAINING "ALL") OR
(#CHCL_PRIV CONTAINING CHCL_NODE.PRIV[NODE])) THEN OA$VAL_SET_VALID
ELSE XOP "~~INVALID~~"
Then ~~INVALID~~ can print the message, call OA$VAL_SET_INVALID, OA$FLD_STAY, etc
Scott
| |||||
| 3628.5 | When to use OA$VAL_SET_INVALID | IOSG::TALLETT | Gimmee an Alpha colour WinPad! | Mon Jan 10 1994 16:42 | 38 |
OA$VAL_SET_INVALID is very rarely needed and difficult to
understand. It helps to know the sequence of events when
validating a form.
When a user enters a field and moves off it (eg TAB or RETURN)
then ALL-IN-1 calls your validation. If it is valid, ALL-IN-1
sets a flag for that field to say that it has been validated.
This flag is unset if the user alters the contents of the field.
When the user hits RETURN to finish the screen, ALL-IN-1 goes
through the form, and for each field that has not yet been
validated, it calls the validation for that field. If the field
is invalid, processing stops at that field. If all the fields
are valid, ALL-IN-1 *THEN* executes any /POST processing.
So you see, calling OA$VAL_SET_INVALID in the /POST processing
will not work, ALL-IN-1 is already past the point of no return.
The time to use OA$VAL_SET_INVALID is if you have two fields
that depend on each other:
First Field Second Field
1 ONE
2 TWO
Imagine the user must enter in the second field, the text
corresponding to the number in the first field. If you didn't have
OA$VAL_SET_INVALID, you could enter "1" then "ONE" then backspace
to the first field and enter 3 and hit RETURN. Because the field
validation for the second field has set the flag to valid on the
first time through, it will not get re-validated. For this reason
the validation of the first field should contain a
OA$VAL_SET_INVALID SECOND_FIELD
See, I told you it was hard to understand, didn't I??!! :-)
Regards,
Paul
| |||||