Estimado Rolando,
que gusto saber de ti, como andas espero alg煤n d铆a podamos tomar un cafe.
Sobre el tema de validaci贸n, como dice Rolando es menos dolor de cabeza hacerlo en bloque, pero puedes validar alg煤n tipo de dato como por ejemplo un c贸digo para no introducir uno repetido, y colocas la clausa CANCEL en el BUTTON (de cancelar o salir) o si no esta disponible utilizar oBtn:lCancel := .T. eso te permite no trancarte en una validacion de un GET.
Yo utilizo un validador basico
//------------------------------------------------------------------------------
FUNCTION validador ( oDbf, aParam )
// 聽aParam { bloque de verificaci贸n, Campo de la tabla, mensaje }
//------------------------------------------------------------------------------
聽 聽LOCAL i
聽 聽FOR i := 1 TO LEN( aParam )
聽 聽 聽 IF VALTYPE( aParam[i,1] ) = "B"
聽 聽 聽 聽 聽IF ! EVAL( aParam[i,1], oDbf )
聽 聽 聽 聽 聽 聽 RETURN .F.
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 ELSE
聽 聽 聽 聽 IF EVAL( aParam[i,2], oDbf:fieldGet( oDbf:FIELDPOS( aParam[i,1] ) ), oDbf:RECNO(), oDbf )
聽 聽 聽 聽 聽 聽MSGALERT( aParam[i,3] )
聽 聽 聽 聽 聽 聽RETURN .F.
聽 聽 聽 聽 ENDIF
聽 聽 聽 ENDIF
聽 聽NEXT
聽 聽RETURN .T.
y lo defines
::aValids := {{ "almacen", 聽 聽 {|c| EMPTY(c) }, "Se debe definir un almacen" 聽 聽 聽 聽},;
聽 聽 聽 聽 聽 聽 聽 聽 聽{ "item", 聽 聽 聽 聽{|c| EMPTY(c) }, "Se debe definir un c贸digo de item" },;
聽 聽 聽 聽 聽 聽 聽 聽 聽{ IF( job $ "NEW,DUPLI", {| oDbf | valid_item( oDbf ) }, {|| .T. } ) 聽},;
聽 聽 聽 聽 聽 聽 聽 聽 聽{ "descripcion", {|c| EMPTY(c) }, "Se debe definir una descripci贸n" 聽 },;
聽 聽 聽 聽 聽 聽 聽 聽 聽{ "aplicacion", 聽{|c| EMPTY(c) }, "Se debe definir la aplicaci贸n" 聽 聽 };
聽 聽 聽 聽 聽 聽 聽 聽 聽}
y lo llamas antes de cualquier operaci贸n, funciona en base a la clase tDataBase para los campos de validaci贸n
validador( ::oDbf, ::aValids )
Son solo ideas pero espero ayuden
Saludos
Marcelo