Hay muchas formas de evitarlo, pero lo que uso es mas simple y mucho menos código, a demás sirve para cualquier control que uses el Valid
El truco esta en crear un propiedad en el formulario cualquier nombre, aunque lo mejor es tener un clase de cada control y dentro de este crear la propiedad, ejemplo usando la propiedad del formulario.
thisform.lcambios = .f.
Luego en el evento InterativeChange del control pones la propiedad así:
thisform.lcambios = .t.
Y ya en el evento valid de tu control haces lo siguiente
If thisform.lcambios
thisform.lcambios = .f.
* Aquí todo tu código de validación
ENDIF
Lo que hace es que si el control recibe el focus, y presiona enter, tab, esc, usas las flechas, etc no ejecuta tu código, solo lo hará si el usuario cambia el valor, si quieres mas validaciones las puedes hacer, por ejemplo supongamos que el usuario escribió el cliente 10 pero se arrepiente y presiona ESC para salir, entonces seria algo así
If thisform.lcambios
thisform.lcambios = .f.
IF LASTKEY() = 27
return
ENDIF
* Aquí todo tu código de validación
ENDIF
Igual si quieres a demás que cuando escriban 0 (cero) avise o no avise que el código no es valido, y regrese al control es decir que no pierda el focus seria algo así
If thisform.lcambios
thisform.lcambios = .f.
IF LASTKEY() = 27
return
ENDIF
IF this.value = 0
messagebox("Codigo no valido")
return 0
ENDIF
* Aquí todo tu código de validación
ENDIF
saludos
Antonio Meza