ECHKFLD_METHOD
WSupported on Windows
|
USupported on Unix
|
VSupported on OpenVMS
|
NSupported in Synergy .NET
|
subroutine ECHKFLD_METHOD a_input ,a a_type ,a a_text ,a a_status ,n a_inpinfo ,a
Arguments
a_input
The contents of the input field. (a)
a_type
The user_type string specified in the .FIELD USER qualifier. (a)
a_text
(optional) The user_text string specified in the .FIELD USER qualifier. (a)
a_status
Must be returned with a value of zero if the input is valid, and with a non-zero value if the input is invalid. Refer to tools.def for the list of valid return values. (n)
a_inpinfo
The structure of input information. (a)
ECHKFLD_METHOD is a subroutine that you write and name. The name of your subroutine is registered with UI Toolkit using the E_METHOD subroutine This subroutine replaces the default field validation that Toolkit does for the current field.
We recommend using an input field change method (%ICHANGE_METHOD) instead of ECHKFLD_METHOD. Unlike ECHKFLD_METHOD, your %ICHANGE_METHOD adds to Toolkit functionality rather than replaces it. %ICHANGE_METHOD also provides access to the structure defined in inpinf.def and to the 20 optional arguments passed to I_INPUT and L_INPUT. See %ICHANGE_METHOD for more information. |
The UI Toolkit input routine calls your ECHKFLD_METHOD subroutine to validate the contents of the current input field. It is only called if the field definition uses the user_type argument from the .FIELD USER qualifier.
You will never call ECHKFLD_METHOD directly; it is called only by UI Toolkit.
Note that the length of the text passed in a_input is defined by the input length for the field. It is not limited by either the display length or the view length.
If a_status is returned non-zero, UI Toolkit will display the appropriate error message. (See ECHKFLD_METHOD section of the tools.def file for the error flags.) If you return an a_status value of D_EMITTEDERR, no error message will be emitted, but input will be performed again for the field. This assumes that you have emitted any appropriate messages from within ECHKFLD_METHOD.
The inpinf.def file defines a_inpinfo. See IARRIVE_METHOD for information.
S/DE Repository allows you to specify a subtype (or class) for user-defined fields. The default subtype is alpha, but you can optionally specify numeric or date. To access this subtype within the Toolkit user-defined processing routines, use the window ID and field number contained within the inputinfo structure (the a_inpinfo argument). Pass these two values to the I_FLDINF subroutine to retrieve the gs_inpfld structure (the controls argument) which contains the gs_class (user subtype) value. For user-defined alpha fields; gs_class = 0; for user-defined numeric fields, gs_class = 1; for user-defined date fields, gs_class = 2.
If ECHKFLD_METHOD doesn’t exist, your code will still run but UI Toolkit will not check whether the data entered by the user meets any user-defined criteria.
The ECHKFLD_METHOD subroutine works together with the EDSPFLD_METHOD and EEDTDSP_METHOD subroutines (which you write also). See the EDSPFLD_METHOD Discussion for more information on the steps that occur when a user-defined field is displayed, edited, and validated. If you have both Exxx_METHODs and an %ICHANGE_METHOD specified, the %ICHANGE_METHOD will be called after the Exxx_METHODs for the user-defined field.
Be sure that you write ECHKFLD_METHOD in such a way that it returns the validated data in storage format. EDSPFLD_METHOD, which is called by ECHKFLD_METHOD, needs the data in proper storage format to display the data correctly.
The following is a sample window script for both the following example and the example for the EDSPFLD_METHOD subroutine:
.input window, 1, 17 .placement 5, 29 .title " Zip Test " .field zip, a10, pos(1, 2), prompt("Zip "), – user(, "TYP_ZIPCODE"), uc .end
See also
- Overloading UI Toolkit routines for more information on creating this subroutine
- Appendix D: Methods
This following example shows how to use ECHKFLD_METHOD, EDSPFLD_METHOD, and EEDTDSP_METHOD to validate a ZIP Code field.
The ECHKFLD_METHOD example checks the length of the input. If the length is either five or nine digits, the value is a U.S. code. If the length is six characters, it is a Canadian postal code. The routine verifies that U.S. ZIP Codes contain only numbers.
If the ZIP Code contains any errors, the subroutine sets the a_status return variable to D_EMITTEDERR (a non-zero value). This tells the Toolkit input routine that the input is invalid and needs to be re-entered. When the subroutine verifies that the input is valid, it returns a value of zero in a_status, which tells the Toolkit input routine that the input is valid and to call EDSPFLD_METHOD to display the data.
For an example that shows how you can use ECHKFLD_METHOD and EDSPFLD_METHOD to handle user-defined field types, see the EDSPFLD_METHOD Examples. |
subroutine echkfld_method a_input ,a ;Characters input by user a_type ,a ;User-defined designation of this field a_text ,a ;Optional user string associated with this field a_status ,n ;Returned with zero if input valid a_inpinfo ,a ;Input information .include "WND:tools.def" record len ,i4 num ,i4 proc clear a_status ;Assume valid at outset case (a_type) of begincase "TYP_ZIPCODE": ;Accept either 5 or 9 digits only begin len = %trim(a_input) if (len.eq.1 .and. a_input.eq." ") len = 0 ;(Trim returns 1 if all blanks) if (len.eq.5 .or. len.eq.9) then begin onerror bad_digit num = a_input offerror a_input = num,"xxxxxxxxx" exit bad_digit, xcall u_message("Only 5 or 9 digits are valid", D_ERROR) a_status = D_EMITTEDERR end else if (len.eq.6)then ;Canadian ZIP Code format nop ;All characters valid, do nothing else if (len.ne.0) ;Ignore empty field begin xcall u_message("Invalid U.S. or Canadian zip", D_ERROR) a_status = D_EMITTEDERR end end ;Enter code of other user-types here endcase xreturn endsubroutine
The EDSPFLD_METHOD example puts a space between the numbers in a Canadian postal code (for example, 1G3 234) and inserts a hyphen in nine-digit U.S. ZIP Codes. To get this space, it manipulates the input (1G3234) and then calls Synergy DBL routines to display the data. It then passes the displayed result into the a_dest argument.
subroutine edspfld_method a_buf ,a ;Characters input by user a_typ ,a ;User-defined designation of this field a_usr ,a ;Optional user string associated with this field a_inpid ,n ;Window ID a_fld ,n ;Window field number a_dest ,a ;Optional destination area in storage record. ; If present, this routine must fill with the ; storage representation. a_attr ,n ;Attribute for display a_color ,n ;Color for display a_inpinfo ,a ;Input information .include "WND:tools.def" .include "WND:windows.def" record dsptxt ,a20 dsp10 ,a10 @dsptxt dspcz1 ,a3 @dsptxt dspczd ,a1 @dspcz1+3 dspcz2 ,a3 @dspczd+1 numzip ,d9 firstfour ,d4 @numzip canzip ,a6 canz1 ,a3 @canzip canz2 ,a3 @canz1+3 proc clear numzip, canzip, dsptxt case (a_typ) of begincase "TYP_ZIPCODE ": begin onerror (20) canadian ;Assume numeric, numzip = a_buf ; otherwise Canadian if (.not.firstfour) then ;Either 5 or 9 digits begin dsp10 = numzip(5:5), "XXXXX" [left] numzip=numzip*10000 end else dsp10 = numzip, "XXXXX-XXXX" if (^passed(a_dest)) ^d(a_dest) = numzip if (FALSE) ;Enter here if error #20 from above begin canadian, canzip = a_buf ;Canadian ZIP Code dspczl = canzl ;Load first 3 characters dspcz2 = canz2 ;Load second 3 characters if (^passed(a_dest)) a_dest = canzip end end ;Enter code for other user-types here endcase xcall w_flds(a_inpid, WF_PUT, a_fld, dsptxt, WF_ATTR, & a_fld, a_attr, WF_COLOR, a_fld, a_color) xreturn endsubroutine
This EEDTDSP_METHOD example left-justifies editable numeric text.
subroutine eedtdsp_method a_data ,a ;Data as stored a_type ,a ;Data type a_text ,a ;User text a_edit ,a ;Returned edit data a_inpinfo ,a ;Input information .align record numeric ,i4 ;Numeric test field proc case a_type of begincase "TYP_ZIPCODE ": call zipcode endcase else a_edit = a_data xreturn zipcode, onerror (20) canzip numeric = a_data offerror a_edit = numeric [left] ;Left-justify numeric return canzip, offerror a_edit = a_data ;Just move alphanumeric return endsubroutine