Como controlar que no se salten los Gets con el Mouse

User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Estimado Rolando.
Nuestros conocimientos y experiencia son lo mejor que tenemos, ! , Nunca sera una polemica, es un regalo que damos todos.

Por ello este Foro es tan especial !

Gracias
Lubin
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by ACC69 »

ACC69 wrote:
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

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.
 
y lo defines

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"     };
                 }
 
y lo llamas antes de cualquier operación, funciona en base a la clase tDataBase para _ de validación

Code: Select all

validador( ::oDbf, ::aValids )
 
Son solo ideas pero espero ayuden

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..
Y creo que es la forma correcta ,que muchas veces no siempre se podra validar en cada get, porque el usuario siempre tendra acceso usando el mouse..es mejor validar al darle click de grabar y ahi que se haga toda la validacion correcta y segura...

Saludos cordiales .

Atte: Adrian C. C.

Hola de nuevo Ing. Lubin, significa que ya solucionaste el problema de la validacion..???

Saludos.

Atte: Adrian C. C.
User avatar
Maggiro
Posts: 76
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by Maggiro »

RSalazarU:

Respecto a tu comentario:
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.
A veces 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)

Toma ésta apreciación:

01. En un formato con cualesquier campos de llenado, las opciones proporcionadas
por Windows a travéz de FWH y Xharbour son muy ricas en opciones y nos permiten
el pasearnos por todo el dialogo GET como queramos.
02. El entrampamiento VALID si te permite salir si lo programas para todos los actos del
usuario, por ejemplo
- Tienes un campo GET que te pide un código de tabla.
- Tu VALID podría considerar hasta cuatro opciones
FUNCTION ValidaGETdeTabla()
LOCAL uvf:=.F.
IF GETKEYSTATE(VK_UP) // al pulsar tecla flecha arriba
uvf=.T. //te permite salir del GET para regresar al campo GET anterior.
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_RETURN)
uvf=.T. //si quieres pasar sin llenar, puedes hacerlo
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_F2)
//despliegas la tabla para que el usuario elija su clasificacion y le retornas
//los datos complementarios en _ necesarios.
Eligió los datos de un registro en la tabla sin pulsar ESC ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ELSEIF LEN(CampoGetConTabla)=6
//usuario conoce el codigo de la tabla ... realizas la busqueda y le retornas
//los datos complementarios en _ necesarios.
Encontró los datos del codigo ingresado en un registro de la tabla ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ENDI
RETU uvf

03. La pos validación en el boton ACEPTAR es obligada antes de grabar.

Para Lubin:
El desorden con el que el usuario registre una forma no tiene que ser un problema para
encasillarlo a pasar los gets uno por uno en orden riguroso. Puede que el usuario NO tenga
en determinado momento el dato para llenar el GET tres, pero pero en ese mismo momento
SI tiene los datos para llenar los GETS seis, ocho y once.

Saludos


Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by ACC69 »

Maggiro wrote:RSalazarU:

Respecto a tu comentario:
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.
A veces 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)

Toma ésta apreciación:

01. En un formato con cualesquier campos de llenado, las opciones proporcionadas
por Windows a travéz de FWH y Xharbour son muy ricas en opciones y nos permiten
el pasearnos por todo el dialogo GET como queramos.
02. El entrampamiento VALID si te permite salir si lo programas para todos los actos del
usuario, por ejemplo
- Tienes un campo GET que te pide un código de tabla.
- Tu VALID podría considerar hasta cuatro opciones
FUNCTION ValidaGETdeTabla()
LOCAL uvf:=.F.
IF GETKEYSTATE(VK_UP) // al pulsar tecla flecha arriba
uvf=.T. //te permite salir del GET para regresar al campo GET anterior.
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_RETURN)
uvf=.T. //si quieres pasar sin llenar, puedes hacerlo
ELSEIF EMPTY(CampoGetConTabla) .AND. GETKEYSTATE(VK_F2)
//despliegas la tabla para que el usuario elija su clasificacion y le retornas
//los datos complementarios en _ necesarios.
Eligió los datos de un registro en la tabla sin pulsar ESC ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ELSEIF LEN(CampoGetConTabla)=6
//usuario conoce el codigo de la tabla ... realizas la busqueda y le retornas
//los datos complementarios en _ necesarios.
Encontró los datos del codigo ingresado en un registro de la tabla ??
uvf=.T.
No eligió, la tabla esta vacia ??
sigue uvf en .F.
ENDI
ENDI
RETU uvf

03. La pos validación en el boton ACEPTAR es obligada antes de grabar.

Para Lubin:
El desorden con el que el usuario registre una forma no tiene que ser un problema para
encasillarlo a pasar los gets uno por uno en orden riguroso. Puede que el usuario NO tenga
en determinado momento el dato para llenar el GET tres, pero pero en ese mismo momento
SI tiene los datos para llenar los GETS seis, ocho y once.

Saludos


Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú

Exactamente asi es Ing. Maggiro, por eso puse el ejemplo como se valida al pulsar el boton agregar y dentro de ese boton se valida si cada get se valide.. y si en el get tienes forzado a validar no podras regresar al get anterior, es por eso del ejemplo que puse de como lo hago .

Code: Select all

//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

Saludos cordiales Ing. Maggiro

Atte: Adrian C. C.
User avatar
Maggiro
Posts: 76
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by Maggiro »

Esa es la idea ACCE69, nosotros hacemos que el usuario posea una buena herramienta
de trabajo operativo-productivo, bien por ser previsivo !!
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Como controlar que no se salten los Gets con el Mouse

Post by Carlos Mora »

Julio César,
Maggiro wrote: 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.
Creo que en los botones se puede añadir la cláusula CANCEL que permite que se ejecuten con el get inválido, como es el caso que mencionas. ¿Lo has probado?

Un saludo
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
Maggiro
Posts: 76
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by Maggiro »

Carlos Mora :

La referencia corresponde a lo descrito por nuestro amigo RSalazarU:
Podrias escribir un ejemplo de lo que indicas?
<< cláusula CANCEL que permite que se ejecute con el get inválido >>

Saludos

Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
Post Reply