The AFTER INPUT block is executed after the user has validated or canceled the INPUT or INPUT ARRAY dialog with the accept or cancel default actions, or when the ACCEPT INPUT instruction is executed.
The AFTER INPUT block is not executed when the EXIT INPUT instruction is performed.
In singular and parallel dialogs, this block is typically used to implement global dialog validation rules depending from several fields. If the values entered by the user do not satisfy the constraints, use the NEXT FIELD instruction to force the dialog to continue. The CONTINUE INPUT instruction can be used instead of NEXT FIELD, when no particular field has to be select.
Before checking the validation rules, make sure that the INT_FLAG variable is FALSE: in case if the user cancels the dialog, the validation rules must be skipped.
INPUT BY NAME cust_rec.* WITHOUT DEFAULTS ATTRIBUTES ( UNBUFFERED ) ... AFTER INPUT IF NOT INT_FLAG THEN IF cust_rec.cust_address IS NOT NULL AND cust_rec.cust_zipcode IS NULL THEN ERROR "Address is incomplete, enter a zipcode." NEXT FIELD zipcode END IF END IF END INPUT
To limit the validation to fields that have been modified by the end user, you can call the FIELD_TOUCHED() function or the DIALOG.getFieldTouched() method to check if a field has changed during the dialog execution. This will make your validation code faster if the user has only modified a couple of fields in a large form.
In an INPUT or INPUT ARRAY sub-dialog of a procedural DIALOG instruction, the AFTER INPUT block is executed when the focus is lost by a group of fields driven by an INPUT or INPUT ARRAY sub-dialog. This trigger is invoked if a field of the sub-dialog loses the focus, and a field of a different sub-dialog gets the focus. When the focus is in a list driven by an INPUT ARRAY sub-dialog, moving to a different row will not invoke the AFTER INPUT block.
If the focus leaves the current group and goes to an action view, this trigger is not executed, because the focus did not go to another sub-dialog yet.
AFTER INPUT is executed after the AFTER FIELD, AFTER ROW blocks and before the AFTER DIALOG block.
Executing a NEXT FIELD in the AFTER INPUT control block will keep the focus in the group of fields. Within an INPUT ARRAY sub-dialog, NEXT FIELD will keep the focus in the list and stay in the current row. You typically use this behavior to control user input.
In this example, the AFTER INPUT block is used to validate data and disable an action that can only be used in the current group:
INPUT BY NAME p_order.* AFTER INPUT IF NOT check_order_data(DIALOG) THEN NEXT FIELD CURRENT END IF CALL DIALOG.setFieldActive("validate_order", FALSE)