In the Form's Validate() Message = '' Severity = 0 IF ThisForm.oData.Validate(@Message, @Severity) * Everything checked out. Action = "Save" ELSE Action = ThisForm.GetUserInput(m.Message, m.Severity) ENDIF RETURN ThisForm.DataAction(m.Action) * Return .T. to indicate OK to go on. .F. means stay here. In the DE's Validate(Message, Severity) FOR EACH oCursor IN This.aCursors oCursor.Validate(@Message, @Severity) ENDFOR In each cursor class's Validate(Message, Severity) ChangedRecNo = GETNEXTMODIFIED(0,.Alias) DO WHILE NOT m.ChangedRecNo = 0 IF This.oValidate(@Message, @Severity) * BaseClass does this from the list of fieldnames. This enables the form * to call these same methods as needed. IF PEMSTATUS(This, "v" + m.FieldName,5) * Now validate this field. RetVal = EVALUATE( "This.v" + m.FieldName + "()" ) * Valid must set the Message and Severity properties. IF NOT m.RetVal Message = m.Message + This.Message + CRLF Severity = MAX(m.Severity, This.Severity) ENDIF ENDIF RETURN m.RetVal * In the SubClass I write the methods needed to validate. PROCEDURE vFirstName() LOCAL RetVal IF EMPTY(Customer.FirstName) This.Message = "Fill this in." ELSE RetVal = .T. ENDIF RETURN m.RetVal or PROCEDURE vSSN LOCAL RetVal, Name Name = '' IF This.oParent.Check4Dupes(Customer.SSN, @Name) * oParent is the cursor object that created this Validation object. * Can't use addobject, so we use this property to refer to our creator. RetVal = .T. ELSE This.Message = "SSN-" + Customer.SSN + " has already need used by " + m.Name + "." This.Severity = 4 && Warning. ENDIF Taking the 2. approach. I haven't done this, but here you could do methods like this. SCATTER NAME oRecord MEMO IF This.Validate(oRecord, @Message, @Severity) * Here the Validation object is passed the data to validate. * or IF This.Validate(oCursor, oRecord, @Message, @Severity) * Your validation object now can check for consistency of the data, and if * it needs access to the DS, it can call a method back in the cursor object. IF oCursor.Look4Dupes(m.ID, Message)>I'd be interested in your opinion on how to do this in an OOP sense.