The following example uses the NO-ERROR and the ERROR-STATUS handle extensively to demonstrate when ERROR-STATUS attributes are reset:
r-errst1.p
CONNECT "db-xyz" NO-ERROR.
RUN chk-connect NO-ERROR.
IF ERROR-STATUS:ERROR THEN
MESSAGE "Run statement failed.".
PROCEDURE chk-connect:
DEFINE VARIABLE connect-ok AS LOGICAL NO-UNDO INITIAL TRUE.
IF ERROR-STATUS:ERROR THEN DO:
MESSAGE "Connect failed.".
connect-ok = FALSE NO-ERROR.
IF ERROR-STATUS:ERROR THEN
MESSAGE "Assignment failed.".
END.
IF connect-ok THEN RETURN "OK".
ELSE RETURN "FAILED".
END PROCEDURE.
Within the internal procedure, chk-connect, the first reference to ERROR-STATUS:ERROR returns status on the CONNECT statement from the main procedure. The second reference returns status on the assignment statement. The reference to ERROR-STATUS:ERROR in the main procedure returns status on the RUN statement. Note that the ERROR-STATUS attributes are set only after the statement with NO-ERROR completes. Therefore the references in the internal procedure are not affected by the RUN statement itself.
The following procedure accepts a character string value and lets you convert it to one of several data types. The internal convert procedure attempts the conversion. If the conversion is successful, it displays the converted value. If the conversion is unsuccessful, the ERROR-STATUS handle holds error information. After running convert, the CHOOSE trigger checks ERROR-STATUS:ERROR and ERROR-STATUS:NUM-MESSAGES to determine if either error information is available or messages have been returned, even if ERROR is not raised. If either condition is true, this lets you view this information. ABL includes many errors that generate messages, but do not raise the ERROR condition, such as most errors generated by ABL built-in functions and handle methods.
r-errsts.p
DEFINE VARIABLE txt AS CHARACTER NO-UNDO FORMAT "X(20)".
DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE FRAME butt-frame
b_int b_date b_dec b_log b_quit
WITH CENTERED ROW SCREEN-LINES - 2.
DEFINE FRAME get-info
txt LABEL "Enter Data To Convert"
WITH ROW 2 CENTERED SIDE-LABELS TITLE "Data Conversion - Error Check".
ON CHOOSE OF b_int, b_date, b_dec, b_log IN FRAME butt-frame DO:
IF txt:MODIFIED IN FRAME get-info THEN DO:
ASSIGN txt.
RUN convert(txt).
IF ERROR-STATUS:ERROR OR ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
MESSAGE ERROR-STATUS:NUM-MESSAGES " errors occurred during conversion." SKIP
"Do you want to view them?"
VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO
UPDATE view-errs AS LOGICAL.
IF view-errs THEN
DO ix = 1 TO ERROR-STATUS:NUM-MESSAGES: MESSAGE ERROR-STATUS:GET-NUMBER(ix) ERROR-STATUS:GET-MESSAGE(ix). END.
END.
END. /* IF txt:MODIFIED... */
ELSE
MESSAGE "Please enter data to be converted, then choose the type of
conversion to perform."
VIEW-AS ALERT-BOX MESSAGE BUTTONS OK.
END.
ENABLE ALL WITH FRAME butt-frame.
ENABLE txt WITH FRAME get-info.
WAIT-FOR CHOOSE OF b_quit IN FRAME butt-frame FOCUS txt IN FRAME get-info.
PROCEDURE convert:
DEFINE INPUT PARAMETER cText AS CHARACTER NO-UNDO.
DEFINE VARIABLE dValue AS DATE NO-UNDO.
DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.
DEFINE VARIABLE iValue AS INTEGER NO-UNDO.
DEFINE VARIABLE lValue AS LOGICAL NO-UNDO.
MESSAGE SELF:LABEL.
CASE SELF:LABEL:
WHEN "Integer" THEN DO:
ASSIGN iValue = INTEGER(cText) NO-ERROR.
MESSAGE "Converted value:" iValue.
END.
WHEN "Date" THEN DO:
ASSIGN dValue = DATE(INTEGER(SUBSTRING(cText,1,2)),
INTEGER(SUBSTRING(cText,4,2)),
INTEGER(SUBSTRING(cText,7)) ) NO-ERROR.
MESSAGE "Converted value:" dValue.
END.
WHEN "Decimal" THEN DO:
ASSIGN fValue = DECIMAL(cText) NO-ERROR.
MESSAGE "Converted value:" fValue.
END.
WHEN "Logical" THEN DO:
ASSIGN lValue = (cText = "yes" OR cText = "true") NO-ERROR.
MESSAGE "Converted value:" lValue.
END.
END.
END PROCEDURE.
Notes
The ERROR attribute indicates whether the ERROR condition was raised during the execution of the last statement that contained the NO-ERROR option. Some errors may occur without raising the ERROR condition. For example, compiler errors do not raise the ERROR condition.
The NUM-MESSAGES attribute indicates the total number of errors that occurred during that statement.
The ERROR-OBJECT-DETAIL attribute identifies a SOAP-fault object that contains SOAP fault message detail.
If a Web service operation generates a SOAP fault message, the AVM generates the following error:
Web service %s<operation> failed. SOAP faultstring is %s (nnnn)
The complete SOAP fault error message is returned to the AVM as part of the ERROR-STATUS system handle.
If the ABL application invokes the Web service operation with the NO-ERROR option on the RUN statement, any errors that occur as a result of the operation are suppressed. In this case, the application can access the SOAP fault message detail using the SOAP-fault and SOAP-fault-detail object handles. Otherwise, the AVM displays the error message to the end user.
The TYPE attribute returns the widget type, PSEUDO-WIDGET.
The GET-MESSAGE method and the GET-NUMBER method let you access the error numbers and messages for all errors that occurred during the execution of the last statement with the NO-ERROR option.
Usually, the NO-ERROR option on a statement suppresses the display of error messages. However, if a STOP condition occurs, the error message is written to the windows. These messages are also available through the ERROR-STATUS attributes. For example, the STOP condition is raised when a procedure to be run is not found. Two specific instances of this are:
If you use NO-ERROR on a RUN statement and the procedure is not found or cannot compile.
If you execute a data handling statement, such as DELETE with the NO-ERROR option and the corresponding trigger procedure is not found or cannot compile.