Validar dato en control TextBox

1,495 views
Skip to first unread message

integral

unread,
Feb 16, 2016, 4:54:46 PM2/16/16
to Comunidad de Visual Foxpro en Español

Que tal Amigos :

Estoy tratando de validar un campo de tipo caracter dentro de un control TextBox, Dicho campo sirve para ingresar el Nro.. de Placa del Vehiculo.

El sistema debe validar y mostrar un mensaje de error en los 2 casos siguientes :

1) Que los 6 digitos sean solo numeros

2) Que los 6 digitos sean sobre Letras....

Aqui el codigo que estoy empleando pero no funciona segun lo esperado.

IF BETWEEN(nKeyCode,ASC("0"),ASC("9")) 
  WAIT WINDOW "Número de la Placa incorrecto" TIMEOUT .5
  ? CHR(7) 
  RETURN .F. 
ENDIF 

IF nKeyCode <> 13
IF BETWEEN(nKeyCode ,65,127) .AND. nKeyCode <> 32 
        WAIT WINDOW "Número de la Placa incorrecto" TIMEOUT .5
        RETURN .F. 
ENDIF  
ENDIF

El Nro. de placa contiene letras y numeros 

Agradezco vuestra ayuda.

Saludos,

INTEGRAL

ZeRoberto

unread,
Feb 16, 2016, 4:56:20 PM2/16/16
to publicesvfoxpro
Validalo al final no en el KeyPress

Miguel Canchas

unread,
Feb 16, 2016, 5:13:07 PM2/16/16
to publice...@googlegroups.com

En el valid del texbox :

nCantidad = LEN(ALLTRIM(this.Value))

oContador = 0

FOR i = 1 TO nCantidad

 

      IF SUBSTR(this.Value, i, 1) $ '1234567890'

           oContador = oContador + 1

 

      ENDIF

     

ENDFOR

 

IF oContador = nCantidad

      MESSAGEBOX("Puros Numeros")

ENDIF

Víctor Hugo Espínola Domínguez

unread,
Feb 16, 2016, 5:59:50 PM2/16/16
to publice...@googlegroups.com
Hola Integral

En el VALID del textbox:

Local llOK

lcSoloLetras = Trim(Chrtran(This.Value, "0123456789", ""))
lcSoloCifras = Trim(Chrtran(This.Value, m.lcSoloLetras, ""))

Do Case
Case Empty(m.lcSoloLetras + m.lcSoloCifras)
    Wait Window "No puede quedar en blanco!"

Case Len(m.lcSoloLetras) = 0
    Wait Window "Puros Números!"

Case Len(m.lcSoloCifras) = 0
    Wait Window "Puras Letras!"

Otherwise
    llOK = .T.
    Wait Window "Nro. de placa OK"

Endcase

Return Iif(m.llOK, m.llOK, 0)


Saludos,
Víctor.
Lambaré - Paraguay.

ArturoPC

unread,
Feb 16, 2016, 7:54:27 PM2/16/16
to Comunidad de Visual Foxpro en Español
Puedes usar expresiones regulares. Chequea esto: http://comunidadvfp.blogspot.com/2016/01/una-biblioteca-de-expresiones-regulares.html

Suerte.

Arturo PC.

Carlos Miguel FARIAS

unread,
Feb 17, 2016, 6:09:48 AM2/17/16
to Grupo Fox
El uso de expresiones regulares puede quitarte el sueño, pero una vez que lo entiendes vas a sorprender a tu suegra cuando llegue y vos le sonrías.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, si usted maneja expresiones regulares sin el manual al lado, ud es "El" maestro Jeidi

integral

unread,
Feb 18, 2016, 10:04:16 PM2/18/16
to Comunidad de Visual Foxpro en Español

Que tal amigos :

Gracias amigo Miguel y Victor por los ejemplos mostrados.

Pero para el caso el utilizar el VALID no permite que funcione correctamente una rutina de validaciones en bloque.

Estuve probando y al parecer el evento KEYPRES seria el indicado..

Amigo VICTOR el ejemplo que indicas como quedaria o que cambios aplicaria en dicho ejemplo...

Espero me puedas ayudar con ello

Saludos,

INTEGRAL .


El martes, 16 de febrero de 2016, 16:54:46 (UTC-5), integral escribió:

Jorge Zapata

unread,
Feb 19, 2016, 9:01:03 AM2/19/16
to Comunidad de Visual Foxpro en Español
Integral,al  Ejemplo de Victor Hugo, creo que solo le faltaria la validación de caracteres invalidos,  lo he agregado y te lo dejo para que lo revises:

*!* Valid

cPlaca='TI*218'
cRestrictedchars='/*()@#!%&_¡?+ºª<>'

cString        = UPPER(cPlaca)
cSpecial_Chars = UPPER(cRestrictedchars)

        FOR nChar=1 TO LEN(cSpecial_Chars)
            cChar = SUBSTR(cSpecial_Chars, nChar, 1)
            IF (cChar $ cString)
               MESSAGEBOX('El valor actual de la casilla contiene el caracter: ' + cChar + CHR(13) + ;
                              'Este caracter es inválido, por favor reemplácelo y continue.', 16, 'Caracter inválido')
               RETURN 0
            ENDIF
        ENDFOR

*!* El Código de V.H.

Local llOK

lcSoloLetras = Trim(Chrtran(cString , "0123456789", ""))
lcSoloCifras = Trim(Chrtran(cString , m.lcSoloLetras, ""))

integral

unread,
Feb 19, 2016, 11:50:52 AM2/19/16
to Comunidad de Visual Foxpro en Español

Estimado Amigo JORGE :

Te agradezco por tu ayuda con el ejemplo brindado, pero solo valida los caracteres especiales si ingreso un numero de placa valido que esta compuesto de letras y números también lo invalida.

  Place Valida :    D4C234

Lo que deseo validar realmente son estos 3 casos

1) Cuando el usuario ingrese 6 dígitos de números como PLACA

2) Cuando el usuario ingrese 6 dígitos de letras...  
 
3) Y también cuando ingrese algun carácter especial... 

El sistema deberá mostrar un mensaje de error de Placa Invalida.

El problema con el VALID ademas es que no permite cancelar el ingreso, por ello estoy tratando de utilizar el evento KEYPRESS para la validación.

Agradezco a algún colega que me pueda ayudar a encontrar la solución...

Saludos,

INTEGRAL

El martes, 16 de febrero de 2016, 16:54:46 (UTC-5), integral escribió:

Foxshin

unread,
Feb 19, 2016, 4:34:30 PM2/19/16
to Comunidad de Visual Foxpro en Español
Buenas tardes. :D

Pienso que lo mejor sería ubicar el código en el evento valid del textbox.
Y tomando como referencia lo hecho por Victor Hugo y Jorge Zapata se podría hacer algo como:

LOCAL lcPlaca,lcLetrasValidas,lcNumerosValidos;
        ,lcSoloLetras,lcSoloCifras,lcMenErr
lcPlaca = UPPER(ALLTRIM(This.Value))
lcLetrasValidas = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'    && Aqui indicas que letras son permitidas para las placas
lcNumerosValidos = '0123456789'
IF !INLIST(LEN(lcPlaca),0,6)
    lcMenErr = 'Contiene menos de los caracteres permitidos.'
ENDIF
IF EMPTY(lcMenErr)
    IF LEN(CHRTRAN(lcPlaca,lcLetrasValidas+lcNumerosValidos,'')) != 0
        lcMenErr = 'Contiene caracteres inválidos.'
    ELSE
        lcSoloLetras = TRIM(CHRTRAN(lcPlaca, lcNumerosValidos, ""))
        lcSoloCifras = TRIM(CHRTRAN(lcPlaca, lcSoloLetras, ""))
       
        lcMenErr = ICASE(EMPTY(lcSoloLetras + lcSoloCifras),"";
                            ,LEN(lcSoloLetras) = 0,"Contiene sólo números!.";
                            ,LEN(lcSoloCifras) = 0,"Contiene sólo letras!.";
                            ,lcMenErr)
    ENDIF
ENDIF
IF !EMPTY(lcMenErr)
    MESSAGEBOX(lcMenErr + ' Por favor reemplácelo y prosiga.';
            ,0+16;
            ,'Verificación')
ENDIF

RELEASE lcPlaca,lcLetrasValidas,lcNumerosValidos;
        ,lcSoloLetras,lcSoloCifras
RETURN EMPTY(lcMenErr)
**

Claro, todo se puede mejorar, eso ya depende mucho de ti.

Espero sirva.

Saludos.

Jorge Zapata

unread,
Feb 19, 2016, 8:33:14 PM2/19/16
to Comunidad de Visual Foxpro en Español
Definitivamente en el Validad del TXT; Solo evaluo el código si el Valor del campo es igual a 6
Caracteres.


*Validad

Local llOK

IF LEN(ALLTRIM(this.Value))==6

cRestrictedchars='/*()@#!%&_¡?+ºª<>'
cString        = UPPER(this.Value)

cSpecial_Chars = UPPER(cRestrictedchars)
      FOR nChar=1 TO LEN(cSpecial_Chars)
       
           cChar = SUBSTR(cSpecial_Chars, nChar, 1)
                IF (cChar $ cString)
                   MESSAGEBOX('El valor actual de la casilla contiene el caracter: ' + cChar + CHR(13) + ;
                                  'Este caracter es inválido, por favor reemplácelo y continue.', 16, 'Caracter inválido')
                   RETURN 0
                ENDIF
       ENDFOR
        *!* El Código de V.H.
        lcSoloLetras = Trim(Chrtran(cString , "0123456789", ""))
        lcSoloCifras = Trim(Chrtran(cString , m.lcSoloLetras, ""))
        Do Case
        Case Empty(m.lcSoloLetras + m.lcSoloCifras)
               MESSAGEBOX('El valor actual de la casilla : ' +CHR(13) + ;
                                      'No puede quedar en blanco, por favor Intente Nuevamente.', 16, 'Caracter inválido')
                                
        Case Len(m.lcSoloLetras) = 0
            MESSAGEBOX('El valor actual de la casilla : ' +CHR(13) + ;
                                      'No puede ser Solo Números, por favor Intente Nuevamente.', 16, 'Caracter inválido')
                                   
        Case Len(m.lcSoloCifras) = 0
            MESSAGEBOX('El valor actual de la casilla : ' +CHR(13) + ;
                                      'No puede ser Solo Letras, por favor Intente Nuevamente.', 16, 'Caracter inválido')
        Otherwise
            llOK = .T.
             MESSAGEBOX('El valor actual de la casilla : '+ CHR(13) + ;
                                      'Contiene Nro. de placa OK ',64, 'Nro. Placa Correcto')

        Endcase
Return Iif(m.llOK, m.llOK, 0)  
ENDIF



*-Te subo el formulario con el que trabaje.


Validatxt.rar

integral

unread,
Feb 20, 2016, 11:27:43 AM2/20/16
to Comunidad de Visual Foxpro en Español

Gracias Amigos por su tiempo y cooperación...

Amigo JORGE ZAPATA el ultimo código que expones funciona tan solamente le falta crear la validación cuando los digitos de la Placa son menores a 6 caracteres..

La Rutina del Amigo FOXSHIN funciona perfectamente...

Tendré que utilizar el VALID.

Saludos,

INTEGRAL

El martes, 16 de febrero de 2016, 16:54:46 (UTC-5), integral escribió:

integral

unread,
Feb 21, 2016, 9:47:13 PM2/21/16
to Comunidad de Visual Foxpro en Español

Que tal amigos :

Siguiendo sus consejos me decidi por utilizar el VALID para la validacion que estaba implementando.

Saludos,

INTEGRAL

El martes, 16 de febrero de 2016, 16:54:46 (UTC-5), integral escribió:

Víctor Hugo Espínola Domínguez

unread,
Feb 21, 2016, 9:49:53 PM2/21/16
to publice...@googlegroups.com
Astuta idea 👍


Saludos,
Víctor.
Lambaré - Paraguay.


Víctor Hugo Espínola Domínguez

unread,
Feb 21, 2016, 9:51:34 PM2/21/16
to publice...@googlegroups.com
Bromas aparte, el KEYPRESS es útil para filtrar caracteres no permitidos.


Saludos,
Víctor.
Lambaré - Paraguay.


Alejandro Isla

unread,
Feb 21, 2016, 11:01:31 PM2/21/16
to Comunidad de Visual Foxpro en Español
Disculpa que te conteste en un tema finalizado, pero te aconsejo que amplíes tu campo a 7 caracteres porque dentro de poco el sistema de patentes cambia a la forma AB123CD, no hagas un sistema que cuando implementes sea ya obsoleto.

Saludos

Carlos Miguel FARIAS

unread,
Feb 22, 2016, 6:09:21 AM2/22/16
to Grupo Fox
Coincido con Alejandro: Creo que lo apropiado es prever varios modelos de patentes.
Aquí en Argentina, suelen verse todavía vehículos el viejo sistema de letra provincia y un número, que en el caso de varias jurisdicciones tenían hasta 7 dígitos.
El nuevo sistema 2 letras, 3 números, 2 letras es estándar para todo el mercosur, en Argentina en marzo creo ya empieza a aplicarse, y no hay re-empadronamiento obligatorio (como fue con el sistema anterior). Por lo que el sistema debería prever al menos los formatos de patentes que van a coexistir durante entiendo, muchos años.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe

integral

unread,
Feb 22, 2016, 7:18:47 AM2/22/16
to Comunidad de Visual Foxpro en Español
Que tal amigos :
 
No se preocupen Amigos ALEJANDRO y MIGUEL los buenos comentarios son bien recibidos...Ya tenia planeado hacer el cambio a 7 caracteres...
 
En la tarde de ayer que hacia demasiado calor me fui a comprar unos Helados y de regreso observe una MotoTaxi estacionado que tenia su Placa compuesta de 7 caracteres entre digitos y letras...
 
En virtud de los hechos procede a realizar el cambio.
 
Saludos,
 
INTEGRAL

El martes, 16 de febrero de 2016, 16:54:46 (UTC-5), integral escribió:

Antonio Meza

unread,
Feb 22, 2016, 10:45:01 AM2/22/16
to Comunidad de Visual Foxpro en Español
En lo personal no me preocuparía por crearle una mascara al campo de Placas o validar está, me parece algo un poco irrelevante, mejor un textbox ligado aun campo de 10 caracteres por si en el futuro cambian algo.

Mejor jugar un poco con el ticket, es decir si es la primera vez que ingresan al estacionamiento en el ticket que se entrega al cliente ponerle una bienvenida, si es la segunda vez o futuras visitas un comentario diferente según el numero de visitas e incluso llegada a determinada cantidad de visitas una gratis, donde Felicidades te has ganado la visita de hoy gratis por confiar en nosotros, etc etc jajajaja

saludos
Antonio Meza
Reply all
Reply to author
Forward
0 new messages