Como controlar que no se salten los Gets con el Mouse
Como controlar que no se salten los Gets con el Mouse
Buen dia con todos
De vuelta por aqui, para ver como controlar este caso :
Recordaran que en Clipper, cuando uno tenia varios GETS, en Usuario para llegar al Ultimo debia de presionar ENTER en cada campo hasta llegar al Ultimo Get, (era un ingreso SECUENCIAL).
Imaginando que tenemos 10 Gets, con el windows y el Uso del Mouse el Usuario puede estar en el Tercer GET y con el Mouse hacer un click en el Ultimo (EL GET) y saltarse del resto, y dejando sin informacion , o teniendo que validar al final si el Usuario ingreso todos los datos.
Hay una forma de Evitar que se salten _ con el mouse y obligar al Usuario pase por todos _ GET en forma SECUANCIAL ??? ,,
" QUIZAS PREGUNTAR SI EL CAMPO DONDE ESTOY HACIENDO CLICK ES EL SIGUIENTE CAMPO QUE ME TOCA REGISTRAR ??? " es posible esto ,, ??
Gracias por su ayuda por adelantado
Lubin
De vuelta por aqui, para ver como controlar este caso :
Recordaran que en Clipper, cuando uno tenia varios GETS, en Usuario para llegar al Ultimo debia de presionar ENTER en cada campo hasta llegar al Ultimo Get, (era un ingreso SECUENCIAL).
Imaginando que tenemos 10 Gets, con el windows y el Uso del Mouse el Usuario puede estar en el Tercer GET y con el Mouse hacer un click en el Ultimo (EL GET) y saltarse del resto, y dejando sin informacion , o teniendo que validar al final si el Usuario ingreso todos los datos.
Hay una forma de Evitar que se salten _ con el mouse y obligar al Usuario pase por todos _ GET en forma SECUANCIAL ??? ,,
" QUIZAS PREGUNTAR SI EL CAMPO DONDE ESTOY HACIENDO CLICK ES EL SIGUIENTE CAMPO QUE ME TOCA REGISTRAR ??? " es posible esto ,, ??
Gracias por su ayuda por adelantado
Lubin
-
- Posts: 188
- Joined: Mon Jun 10, 2013 6:40 pm
Re: Como controlar que no se salten los Gets con el Mouse
Podrías ocultar el mouse en ese dialogo, y usar puro teclado
ShowCursor(.F.)
Saludos.
ShowCursor(.F.)
Saludos.
Re: Como controlar que no se salten los Gets con el Mouse
Javier
Podria ser un metodo, pero en en dialogo tambien tengo un listbox para opciones , o por ahi algunos botones que deben activarse para terminar el dialogo, se que los que podria enlazar con un hipervinculo ("A&ceppatar" ) para que lollamen por teclado ,,,
Pero me di cuenta que la flecha del mouse se apaga efectivamente,, pero si tengo en ese dialogo botones, y por casualidad paso la "flecha del mouse invisible" el boton "se prende el focus" y aun mas puedo darle click!!.. es decir el usuario se salto los Get que debia digitar !!!
Gracias Javier,, es una alternativa ,,, seguieremos buscando alguna alternativa que asegure al 100% todo el dialogo.
Pienso :... Los Get, Botones,, y otros objetos dentro de un dialogo tienen un orden o secuencia de uso, hay alguna funcion de dialogo que indique en que Nro de Objeto estoy y cuantos objetos hay en el dialogo ???
saludos
Lubin
Podria ser un metodo, pero en en dialogo tambien tengo un listbox para opciones , o por ahi algunos botones que deben activarse para terminar el dialogo, se que los que podria enlazar con un hipervinculo ("A&ceppatar" ) para que lollamen por teclado ,,,
Pero me di cuenta que la flecha del mouse se apaga efectivamente,, pero si tengo en ese dialogo botones, y por casualidad paso la "flecha del mouse invisible" el boton "se prende el focus" y aun mas puedo darle click!!.. es decir el usuario se salto los Get que debia digitar !!!
Gracias Javier,, es una alternativa ,,, seguieremos buscando alguna alternativa que asegure al 100% todo el dialogo.
Pienso :... Los Get, Botones,, y otros objetos dentro de un dialogo tienen un orden o secuencia de uso, hay alguna funcion de dialogo que indique en que Nro de Objeto estoy y cuantos objetos hay en el dialogo ???
saludos
Lubin
-
- Posts: 188
- Joined: Mon Jun 10, 2013 6:40 pm
Re: Como controlar que no se salten los Gets con el Mouse
Otra opción.
Podrías hacer que todos tus GET se validen y que salten al siguiente objeto,
asi cuando te sales del primero con el mouse automáticamente te regrese al segundo get
Saludos.
Podrías hacer que todos tus GET se validen y que salten al siguiente objeto,
asi cuando te sales del primero con el mouse automáticamente te regrese al segundo get
Saludos.
Re: Como controlar que no se salten los Gets con el Mouse
Javier,
Quizas me darias una mano como hacer ello en este ejemplo de dialogo ??:
DEFINE DIALOG oDlg RESOURCE "JKRGCM10_S2" TITLE "{ "+ PROCNAME()+" } "
REDEFINE GET oWTOT_HB VAR WTOT_HB PICTURE "99999999.99" ID 952 OF oDlg
REDEFINE GET oWSAL_DB VAR WSAL_DB PICTURE "99999999.99" ID 953 OF oDlg
REDEFINE GET oWSAL_HB VAR WSAL_HB PICTURE "99999999.99" ID 954 OF oDlg
REDEFINE LISTBOX oLb1 FIELDS LeeCampo(oWDetTabla,"nl_v2") ,;
LeeCampo(oWDetTabla,"cdct_v2") ,;
LeeCampo(oWDetTabla,"debe_v2") ,;
LeeCampo(oWDetTabla,"haber_v2") ,;
LeeCampo(oWDetTabla,"fgmy_v2") ;
HEADERS "NL", "Cta","Debe","Haber","St.My" ;
FIELDSIZES 20 , 50, 55 ,130 , 20 ;
UPDATE ;
ID 119 OF oDlg
mysetBrowse(oLb1,oWDetTabla)
REDEFINE GET oWMIO_HB VAR WMIO_HB PICTURE "99999999.99" ID 960 WHEN .F. OF oDlg
ACTIVATE DIALOG oDlg
Gracias
Quizas me darias una mano como hacer ello en este ejemplo de dialogo ??:
DEFINE DIALOG oDlg RESOURCE "JKRGCM10_S2" TITLE "{ "+ PROCNAME()+" } "
REDEFINE GET oWTOT_HB VAR WTOT_HB PICTURE "99999999.99" ID 952 OF oDlg
REDEFINE GET oWSAL_DB VAR WSAL_DB PICTURE "99999999.99" ID 953 OF oDlg
REDEFINE GET oWSAL_HB VAR WSAL_HB PICTURE "99999999.99" ID 954 OF oDlg
REDEFINE LISTBOX oLb1 FIELDS LeeCampo(oWDetTabla,"nl_v2") ,;
LeeCampo(oWDetTabla,"cdct_v2") ,;
LeeCampo(oWDetTabla,"debe_v2") ,;
LeeCampo(oWDetTabla,"haber_v2") ,;
LeeCampo(oWDetTabla,"fgmy_v2") ;
HEADERS "NL", "Cta","Debe","Haber","St.My" ;
FIELDSIZES 20 , 50, 55 ,130 , 20 ;
UPDATE ;
ID 119 OF oDlg
mysetBrowse(oLb1,oWDetTabla)
REDEFINE GET oWMIO_HB VAR WMIO_HB PICTURE "99999999.99" ID 960 WHEN .F. OF oDlg
ACTIVATE DIALOG oDlg
Gracias
-
- Posts: 188
- Joined: Mon Jun 10, 2013 6:40 pm
Re: Como controlar que no se salten los Gets con el Mouse
Que tal, buen dia
yo lo haría asi :
por cada get :
ya lo probe y funciona bien, le doy click con el mouse (saliéndome del get) y me retorna al que yo le indique
que regresara.
Saludos.
yo lo haría asi :
por cada get :
Code: Select all
oWTOT_HB:bLostFocus := {|| Salta_Siguiente(oWTOT_HB,oWSAL_DB) }
FUNCTION Salta_Siguiente(oIni,oFin)
oIni:oJump := oFin
oFin:SetFocus()
RETURN .T.
que regresara.
Saludos.
Re: Como controlar que no se salten los Gets con el Mouse
otra opción..si utiliza el mouse
Code: Select all
DEFINE DIALOG oDlg FROM 4, 4 TO 40, 60 TITLE "test"
....
..
@ 1, 10 GET oNom_Clie VAR cNom_Clie PICTURE "@!" VALID !Empty(cNom_Clie) OF odlg SIZE 10, 10 FONT oFont
@ 5, 10 GET oFan_Clie VAR cFan_Clie PICTURE "@!" VALID !Empty(cFan_Clie) OF odlg SIZE 10, 10 FONT oFont
@ 10, 10 BUTTON "save" PIXEL OF oDlg SIZE 30, 10 ACTION (lSave := NotEmpty(oNom_Clie, oFan_Clie), If(lSave, oDlg:End(), nil) )
Function NotEmpty(oNom_Clie, oFan_Clie)
If Empty(cNom_Clie)
MsgInfo("cNom_Clie empty")
oNom_Clie:SetFocus()
oNom_Clie:Refresh()
Return .f.
Endif
If Empty(cFan_Clie)
MsgInfo("cFan_Clie empty")
oFan_Clie:SetFocus()
oFan_Clie:Refresh()
Return .f.
Endif
Return .t.
FWH2008 | xHarbour | BCC74 | SQLRDD
Re: Como controlar que no se salten los Gets con el Mouse
Amigos,
tengo dos buenas alternativas bastantes manejables
Vere su aplicacion, y se los comentare
muchas cabezas, piensan mejor que una!!!
Gracias
Lubin
tengo dos buenas alternativas bastantes manejables
Vere su aplicacion, y se los comentare
muchas cabezas, piensan mejor que una!!!
Gracias
Lubin
Un consejo
Lubin:
Y si cambia el chip de programacion.
Lo que estas queriendo hacer te va a traer muchos dolores de cabeza (que por supuesto yo tambien los tube)
Te aconsejo que mejor utilices un validador (clausula VALID) al momento de salir del dialogo.
En el validador puedes colocar todos los controles necesarios para controlar la integridad en la captura de datos.
A continuacion te pongo un ejemplo muy basico (construido al vuelo)
Atentamente,
Rolando
Cochabamba, Bolivia
Y si cambia el chip de programacion.
Lo que estas queriendo hacer te va a traer muchos dolores de cabeza (que por supuesto yo tambien los tube)
Te aconsejo que mejor utilices un validador (clausula VALID) al momento de salir del dialogo.
En el validador puedes colocar todos los controles necesarios para controlar la integridad en la captura de datos.
A continuacion te pongo un ejemplo muy basico (construido al vuelo)
Code: Select all
//----------------------------//
Function CapturaDatos()
local oDlg, lOk := .F.
DEFINE DIALOG oDlg RESOURCE "JKRGCM10_S2" TITLE "{ "+ PROCNAME()+" } "
:
REDEFINE BUTTON ID 10 MESSAGE "CANCEL" ACTION (lOk:=.F.,oDlg:End())
REDEFINE BUTTON ID 20 MESSAGE "OK" ACTION (lOk:=.T.,oDlg:End())
ACTIVATE DIALOG oDlg VALID (!lOk .Or. Validador(cGet1,cGet2,nGet3))
IF lOk
//Procesar datos
endif
Return NIL
//----------------------------//
Function Validador(cGet1,cGet2,nGet3)
If Emty(cGet1).OR.Emty(cGet2).OR.Emty(cGet3)
MsgStop("Datos no validos")
Return .F.
endif
Rerturn .T.
Rolando
Cochabamba, Bolivia
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: Un consejo
+1RSalazarU wrote:Lubin:
Te aconsejo que mejor utilices un validador (clausula VALID) al momento de salir del dialogo.
En el validador puedes colocar todos los controles necesarios para controlar la integridad en la captura de datos.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
- joseluisysturiz
- Posts: 2024
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: Como controlar que no se salten los Gets con el Mouse
No se si ya resolvistes, pero hago algo parecido, pero en cada GET usa en VALID una funcion novacio() para que no salga si no llena nada y en los siguientes GET hago un WHEN que solo se active si el anterior GET tiene datos, un ejemplo rapido, saludos, gracias...
Code: Select all
// PRIMER GET
redefine GET aGet[1] VAR aVar[1] ID nId of oWd ;
VALID novacio()
// SIGUIENTES GETs
redefine GET aGet[2] VAR aVar[2] ID nId of oWd ;
VALID novacio() ;
WHEN !Empty( aVar[2] )
// y asi sucesivamente, asi obligas al usuario a llenar si porque si cada GET y en ORDEN si todos _ son OBLIGATORIOS...aunque lo mejor es como dicen algunos colegas, hacer una sola VALIDACION cuando se vayan guardar datos...
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
Re: Como controlar que no se salten los Gets con el Mouse
Mis Estimados
Como bien dicen, si pongo un Valid que verifica y controla que esta lleno, pero ante un campo (por ejemplo .. "la direccion del cliente" ),,, el campo no esta vacio .. pasaria.. pero el usuario en vez de presionar el Enter , agarra el mouse y hace click en otro campo (sea get, checkbox, listbox u otro objeto ) saltandose de llenar el resto de campos.. bien dice nuestro amigo Rolando,,, "un dolor de cabeza..." , Asi que creo que realizare un Mix de todos sus consejos:
1. Acentuar las Validaciones x Get y buscar que salte al siguiente objeto.
2. Validacion final antes de salir del Dialogo
Muchas Gracias
Saludos
Lubin
Como bien dicen, si pongo un Valid que verifica y controla que esta lleno, pero ante un campo (por ejemplo .. "la direccion del cliente" ),,, el campo no esta vacio .. pasaria.. pero el usuario en vez de presionar el Enter , agarra el mouse y hace click en otro campo (sea get, checkbox, listbox u otro objeto ) saltandose de llenar el resto de campos.. bien dice nuestro amigo Rolando,,, "un dolor de cabeza..." , Asi que creo que realizare un Mix de todos sus consejos:
1. Acentuar las Validaciones x Get y buscar que salte al siguiente objeto.
2. Validacion final antes de salir del Dialogo
Muchas Gracias
Saludos
Lubin
Re: Como controlar que no se salten los Gets con el Mouse
Lubin:
Sin animo de crear polemica, te aconsejo NO colocar VALIDADORES en los Gets y ningun otro control de captura de datos.
Cuando colocas un validador a un GET, NO puedes salir de el mientras no se cumpla la condicion, lo cual te impide presionar en el boton CANCEL o CLOSE del dialogo, la unica forma de salir del dialogo es presionando la tecla ESC.
Aveces se da el caso de que tienes que anular la tecla ESC; si de da el caso no podras cerrar el DIALOGO a menos que se cumpla la condicion.
Esto me ocurrio, sobre todo, cuando hacia: VALID !Empty(cDato)
Mas aun, te consejaria que le des mayor enfasis al VALIDADOR del Dialogo.
Yo lo tengo organizado asi:
1. Validar campos NULOS/VACIOS
Si hay uno o mas vacios, mostrar 1 solo mensaje de error indicando cuales estan vacios.
MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS VACIOS")
2. Validar la existencia de los datos en las tablas.
Si alguno de los datos (uno o mas) debe estar en alguna tabla relacionada (CODIGO/ID), verificar que exista.
Si uno o mas no estan bien ingresados, mostrar 1 solo mensaje de error indicando cuales.
MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS MAL INGREADO O NO EXISTE")
3. Validar la relacion/dependencia entre datos.
Si alguna condicion no se cumple, mostrar mensaje error, estos mensajes normamente son individuales.
Si colocas 1 mensaje de error por cada dato, no sera muy agradable para el usuario.
Yo tengo esto como una plantilla y voy copiando y pegando
Espero haberte ayudado.
Atentamente,
Rolando
Sin animo de crear polemica, te aconsejo NO colocar VALIDADORES en los Gets y ningun otro control de captura de datos.
Cuando colocas un validador a un GET, NO puedes salir de el mientras no se cumpla la condicion, lo cual te impide presionar en el boton CANCEL o CLOSE del dialogo, la unica forma de salir del dialogo es presionando la tecla ESC.
Aveces se da el caso de que tienes que anular la tecla ESC; si de da el caso no podras cerrar el DIALOGO a menos que se cumpla la condicion.
Esto me ocurrio, sobre todo, cuando hacia: VALID !Empty(cDato)
Mas aun, te consejaria que le des mayor enfasis al VALIDADOR del Dialogo.
Yo lo tengo organizado asi:
1. Validar campos NULOS/VACIOS
Si hay uno o mas vacios, mostrar 1 solo mensaje de error indicando cuales estan vacios.
MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS VACIOS")
2. Validar la existencia de los datos en las tablas.
Si alguno de los datos (uno o mas) debe estar en alguna tabla relacionada (CODIGO/ID), verificar que exista.
Si uno o mas no estan bien ingresados, mostrar 1 solo mensaje de error indicando cuales.
MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS MAL INGREADO O NO EXISTE")
3. Validar la relacion/dependencia entre datos.
Si alguna condicion no se cumple, mostrar mensaje error, estos mensajes normamente son individuales.
Si colocas 1 mensaje de error por cada dato, no sera muy agradable para el usuario.
Yo tengo esto como una plantilla y voy copiando y pegando
Espero haberte ayudado.
Atentamente,
Rolando
-
- Posts: 1033
- Joined: Fri Oct 07, 2005 3:33 pm
- Location: Cochabamba - Bolivia
Re: Como controlar que no se salten los Gets con el Mouse
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
y lo defines
y lo llamas antes de cualquier operación, funciona en base a la clase tDataBase para _ de validación
Son solo ideas pero espero ayuden
Saludos
Marcelo
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
Code: Select all
//------------------------------------------------------------------------------
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.
Code: Select all
::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" };
}
Code: Select all
validador( ::oDbf, ::aValids )
Saludos
Marcelo
Re: Como controlar que no se salten los Gets con el Mouse
Marcelo Via Giglio wrote: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
y lo definesCode: Select all
//------------------------------------------------------------------------------ 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 llamas antes de cualquier operación, funciona en base a la clase tDataBase para _ de validaciónCode: Select all
::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" }; }
Son solo ideas pero espero ayudenCode: Select all
validador( ::oDbf, ::aValids )
Saludos
Marcelo
Hola buenos dias de antemano les envio cordial saludos.
Aqui pongo mi forma de validar mis gets antes de grabar el registro,segun sea la condicion ...
Code: Select all
REDEFINE GET oG_IVA[03] VAR nIVA_1 ID 103 OF oDlgIVA PICT "99,999,999.99" VALID V_IVA(1)
//------------------------------------------------------------------------------
STATIC FUNCTION V_IVA(nOp) // Function para validar el get
//Esta parte de aqui te permite regresar al get anterior en caso que tecleaste mal el dato\\
IF !GetKeyState( VK_RETURN ) .and. !GetKeyState( VK_DOWN ) .and. !GetKeyState( VK_TAB )
RETURN( .T. )
ENDIF
DO CASE
CASE noP = 1 .AND. nIVA_1 <> 0 .AND. !nImpBs1 <> 0 .AND. !nTasa1 <> 0
MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")
RETURN .F.
CASE noP = 2 .AND. nIVA_2 <> 0 .AND. !nImpBs2 <> 0 .AND. !nTasa2 <> 0
MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")
RETURN .F.
ENDCASE
RETURN (.T.)
//------------------------------------------------------------------------------
STATIC FUNCTION Reg_Cap()
Local nNumMov,cCtaSN
oG_D[06]:SetColor()
oG_D[06]:Refresh()
oG_D[07]:SetColor()
oG_D[07]:Refresh()
cCtaSN := SUBS(cCta,1,4) + SUBS(cCta,6,4) + SUBS(cCta,11,4) + SUBS(cCta,16,4)
cCta2 := FORMATO1("cCta",cCta, .F.) // No Permite separar guiones
//Aqui antes de registrar el dato al dbf...te valida cada campo si esta vacio o no...\\
// Aqui te valida cada get despues del boton de agregar nuevo registro...yo creo que es lo mas fiable y seguro...
DO CASE
CASE !(S09)->( DbSeek(STR(nSegNg,4)) ) .AND. lAP_SN
MsgInfo("Error: No existe Segmento de Negocio","Confirme")
oG_D[02]:SetFocus()
oG_D[02]:Refresh()
RETURN.F.
CASE EMPTY(cCta)
MsgInfo("Error: Favor de teclear subcuenta")
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
CASE (S08)->( DbSeek(cCta2) )
IF (S08)->TIPONAT = "A"
MsgInfo("Error: La cuenta debe ser de detalle!","Confirme")
cCta := SPACE(19)
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
ENDIF
CASE !(S08)->( DbSeek(cCta2) )
MsgInfo("Error: La cuenta no existe!","Confirme")
cCta := SPACE(19)
oG_D[01]:SetFocus()
oG_D[01]:Refresh()
RETURN .F.
ENDCASE
// Aqui se añade nuevo registro en caso que todos los gets hayan cumplido la validacion ...\\
//* Paso 1 ----- Agrega datos a S12:= Abre_Dbf(12,12) // Abre: POLZxMxA.DBF -----*\\
IF lAdd // Agrega nuevo registro
(S12)->( DbSeek(cID_AMMov+cTipo+STR(nNumPol,5)) )
IF (S12)->(!FOUND()) // Si agrega nuevo resistro en la base de datos
(S12)->(DbAppend())
(S12)->FECALTA := DATE()
(S12)->REGHORA := AMPM(TIME())
(S12)->NICKUSUA:= cNombUsua
(S12)->NOMBUSUA:= cNombre
ENDIF
*?"Regisro nuevo dado de alta"
IF nCarg <> 0
aSum[1, 2] += nCarg
aSum[1, 3] += nAbon
aSum[1, 4] += nImpBs1
ENDIF
...Mas intrucciones
Return nil..
Saludos cordiales .
Atte: Adrian C. C.