Anónimo
Validar textbox en fox
Hola... Recibí tu respuesta y te agradezco.
Te paso el código tal como lo escribí... Siempre me da el mesagebox ponga números o letras... ¿?...
X=0
I=LEN(thisform.text1.value)
FOR a=1 TO I
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,I,1) > '9' THEN
X=1
ENDIF
next
IF X <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
¿Endif
qué puede estar pasando?
No entiendo esto: SUBSTR(thisform.text1.value, a, ¿1) - me lo podes explicar?
Gracias. Fernando - Posadas, Misiones, Argentina
Te paso el código tal como lo escribí... Siempre me da el mesagebox ponga números o letras... ¿?...
X=0
I=LEN(thisform.text1.value)
FOR a=1 TO I
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,I,1) > '9' THEN
X=1
ENDIF
next
IF X <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
¿Endif
qué puede estar pasando?
No entiendo esto: SUBSTR(thisform.text1.value, a, ¿1) - me lo podes explicar?
Gracias. Fernando - Posadas, Misiones, Argentina
1 Respuesta
Respuesta de fcosapa
1
1
fcosapa, Programación en COBOL, RPG y PROGRESS sobre DB2 de Iseries,...
En primer lugar disculpa por la palabra coger, creo que vara vosotros significa otra cosa, en españa significa tomar, asir, es decir, "coger con la mano la maleta que esta en el suelo", por ejemplo.
En el IF, en el substring que compara el 9 has puesto I, cuando debe de ser A, es decir, SUBSTR(thisform.text1.value, A, 1) > '9'. No obstante ten encuenta lo siguiente:
1236 es totalmente numérico, pero si tiene un espacio al principio te lo invalidará
1.236 el punto no es numero, por lo que si te interesa tendrás que incluirlo en la pregunta, así como el separador de decimales. Cualquier carácter no comprendido entre 0 y 9 tendrás que controlarlo. Por ejemplo:
if (substr(thisform.text1.value, a, 1) < '0' or substr(thisform.text1.value, a, 1) > '9') and substr(thisform.text1.value, a, 1) <> '.' then
Cualquier carácter que quieras que sea considerado numérico lo incluyes en la pregunta con la condición AND como ves en el ejemplo que considera al punto numérico.
La función SUBSTR es una función que obtiena una subcadena desde el carácter que se le indica en el segundo parámetro y cuantos caracteres indique el tercero. Según nuestro ejemplo, obtiene 1 carácter de la cadena thisform.text1 desde la posición que indica A. El formato es el siguiente:
SUBSTR(cadena, nº que indica posición desde donde queremos coger, numero que indica cuantos caracteres queremos coger)
Si te sigue funcionando mal, habría que ver si FOX tiene un código ASCII distinto al normal, aunque seria extraño.
Un saludo,
fcosapa
En el IF, en el substring que compara el 9 has puesto I, cuando debe de ser A, es decir, SUBSTR(thisform.text1.value, A, 1) > '9'. No obstante ten encuenta lo siguiente:
1236 es totalmente numérico, pero si tiene un espacio al principio te lo invalidará
1.236 el punto no es numero, por lo que si te interesa tendrás que incluirlo en la pregunta, así como el separador de decimales. Cualquier carácter no comprendido entre 0 y 9 tendrás que controlarlo. Por ejemplo:
if (substr(thisform.text1.value, a, 1) < '0' or substr(thisform.text1.value, a, 1) > '9') and substr(thisform.text1.value, a, 1) <> '.' then
Cualquier carácter que quieras que sea considerado numérico lo incluyes en la pregunta con la condición AND como ves en el ejemplo que considera al punto numérico.
La función SUBSTR es una función que obtiena una subcadena desde el carácter que se le indica en el segundo parámetro y cuantos caracteres indique el tercero. Según nuestro ejemplo, obtiene 1 carácter de la cadena thisform.text1 desde la posición que indica A. El formato es el siguiente:
SUBSTR(cadena, nº que indica posición desde donde queremos coger, numero que indica cuantos caracteres queremos coger)
Si te sigue funcionando mal, habría que ver si FOX tiene un código ASCII distinto al normal, aunque seria extraño.
Un saludo,
fcosapa
Hola Francisco, nuevamente yo molestándote... disculpas...
Te paso el código tal como lo escribí. Sigue igual, me da siempre el messagebox..
X=0
FOR a=1 TO len(thisform.text1.value)
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,a,1) > '9'
X=1
ENDIF
next
IF X <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
Endif
¿Qué puede estar pasando?
Bueno, gracias por tus respuestas, y te comento que la palabra coger tal como allá, acá significa exactamente lo mismo como me lo explicas... pero acá peyorativamente la utilizamos para definir otras cosas... jajaja...
Saludos.. Fernando
Te paso el código tal como lo escribí. Sigue igual, me da siempre el messagebox..
X=0
FOR a=1 TO len(thisform.text1.value)
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,a,1) > '9'
X=1
ENDIF
next
IF X <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
Endif
¿Qué puede estar pasando?
Bueno, gracias por tus respuestas, y te comento que la palabra coger tal como allá, acá significa exactamente lo mismo como me lo explicas... pero acá peyorativamente la utilizamos para definir otras cosas... jajaja...
Saludos.. Fernando
Vamos a realizar distintas pruebas:
1. Según que lenguaje / BBDD utilicemos, el substr funciona de una manera u otra, hay sistemas que parte de la posición 0 y otras de la posición 1. Para ello vamos a introducir dentro del FOR/NEX un MESSAGEBOX SUBSTR(thisform.text1.value, a, 1). Esto hará que te enseñe el carácter que procesa en cada bucle. Observa si el primer mensaje te enseña el 1er carácter de TEXT1, si el segundo mensaje te visualiza el segundo de text1 y así sucesivamente. También observa si te enseña algún carácter no perteneciente a TEXT1, sobre todo el ultimo.
2. Si el primero que te enseña esta desplazado, es decir, te enseña el segundo de TEXT1 en vez del primero, El FOR seria así: FOR A=0 to LEN(thisform.text1.value) - 1.
3. Si te esta enseñando uno más que no esta en TXT1 (el ultimo messagebox del bucle), y el primero es correcto, el for seria así: FOR a=1 to len(thisform.text1.value) -1.
Dime los resultados, ya que tal como esta en su equivalente ACCESS visual funciona bien, por lo que debe de ser algo de lo mencionado. Al hacer la prueba cerciorate de que el contenido de TEXT1 donde pruebes sea todo números. Si deseas enviarme 'pantallazos' de algo raro que veas puedes hacerlo a [email protected].
Un saludo,
fcosapa
1. Según que lenguaje / BBDD utilicemos, el substr funciona de una manera u otra, hay sistemas que parte de la posición 0 y otras de la posición 1. Para ello vamos a introducir dentro del FOR/NEX un MESSAGEBOX SUBSTR(thisform.text1.value, a, 1). Esto hará que te enseñe el carácter que procesa en cada bucle. Observa si el primer mensaje te enseña el 1er carácter de TEXT1, si el segundo mensaje te visualiza el segundo de text1 y así sucesivamente. También observa si te enseña algún carácter no perteneciente a TEXT1, sobre todo el ultimo.
2. Si el primero que te enseña esta desplazado, es decir, te enseña el segundo de TEXT1 en vez del primero, El FOR seria así: FOR A=0 to LEN(thisform.text1.value) - 1.
3. Si te esta enseñando uno más que no esta en TXT1 (el ultimo messagebox del bucle), y el primero es correcto, el for seria así: FOR a=1 to len(thisform.text1.value) -1.
Dime los resultados, ya que tal como esta en su equivalente ACCESS visual funciona bien, por lo que debe de ser algo de lo mencionado. Al hacer la prueba cerciorate de que el contenido de TEXT1 donde pruebes sea todo números. Si deseas enviarme 'pantallazos' de algo raro que veas puedes hacerlo a [email protected].
Un saludo,
fcosapa
Ok Francisco... muchas gracias por el envío- Lo pruebo y te comunico los resultados pero a tu mail particular.
Saludos- Fernando.
Saludos- Fernando.
Hola Francisco..
Bueno, ya estamos más cerca... hice todas las pruebas que me dijiste, y me parece que el problema está en el "LEN(thisform.text1.value)"
Te digo por qué:
1) Si yo NO lo limito con la propiedad maxlenght al text1 me toma como que hay 17 caracteres con los espacios en blanco que siguen; si por ejemplo coloco "qwe"- realmente hay 3 caracteres pero el ciclo lo repite 17 veces... Si yo limito el text1 a 5 caracteres (maxlenght=5) el ciclo se repite 5 veces; esto es: me muestra que, dsps w, dsps e, dsps " " (vacío) y luego el msg...
2) Si coloco "12" el ciclo se repite 2 veces (o sea para 1 y 2 no muestra nada, porque no entra en el for-next) pero al entrar por tercera vez me muestra " "; y luego el msg...
O sea, el LEN(...) no esta contando la cantidad de caracteres escritos... y el ciclo se repite con los caracteres en blanco que siguen hasta completar el maxlenght (acordate, si NO limito me cuenta los caracteres escritos + lo que restan vacíos hasta completar 17).
entendes mi explicacion?
Gracias de nuevo... Saludos - Fernando
Bueno, ya estamos más cerca... hice todas las pruebas que me dijiste, y me parece que el problema está en el "LEN(thisform.text1.value)"
Te digo por qué:
1) Si yo NO lo limito con la propiedad maxlenght al text1 me toma como que hay 17 caracteres con los espacios en blanco que siguen; si por ejemplo coloco "qwe"- realmente hay 3 caracteres pero el ciclo lo repite 17 veces... Si yo limito el text1 a 5 caracteres (maxlenght=5) el ciclo se repite 5 veces; esto es: me muestra que, dsps w, dsps e, dsps " " (vacío) y luego el msg...
2) Si coloco "12" el ciclo se repite 2 veces (o sea para 1 y 2 no muestra nada, porque no entra en el for-next) pero al entrar por tercera vez me muestra " "; y luego el msg...
O sea, el LEN(...) no esta contando la cantidad de caracteres escritos... y el ciclo se repite con los caracteres en blanco que siguen hasta completar el maxlenght (acordate, si NO limito me cuenta los caracteres escritos + lo que restan vacíos hasta completar 17).
entendes mi explicacion?
Gracias de nuevo... Saludos - Fernando
Si lo entiendo.
Parece ser que al igual que DB2 la longitud del campo manda. Bien vamos a ver si lo conseguimos. En visual Basic y otras bases de datos, existen funciones como LTRIM quita espacios a la izquierda, RTRIM quita espacios a la derecha y TRIM que quita los espacios a la izquierda/derecha, mira si tienes algo parecido y lo aplicas a text1 de la siguiente forma TRIM(thisform.txt1.value)
Se me ocurren varias ideas pero todo pasa por que puedas crear variables sin longitud fija, ¿puedes?.
Fcosapa
Parece ser que al igual que DB2 la longitud del campo manda. Bien vamos a ver si lo conseguimos. En visual Basic y otras bases de datos, existen funciones como LTRIM quita espacios a la izquierda, RTRIM quita espacios a la derecha y TRIM que quita los espacios a la izquierda/derecha, mira si tienes algo parecido y lo aplicas a text1 de la siguiente forma TRIM(thisform.txt1.value)
Se me ocurren varias ideas pero todo pasa por que puedas crear variables sin longitud fija, ¿puedes?.
Fcosapa
Se me encendió la bombilla !.
Vamos a realizar el bucle al revés, es decir, en vez de empezar por el carácter 1º, empezaremos por el ultimo (maxlen). Iremos despreciando los espacios en blanco a la derecha hasta encontrar uno no blanco, por lo que el código quedaría así:
Recuerda que los next deben de provocar la vuelta al for, pon su equivalente en FOX.
X=0
Y=0
'
FOR A=LEN(thisform.txt1.value) to 1
'
If MID(thisform.txt1.value,a,1) " " and Y = 0 then
next
endif
'
Y=1
'
if MID(thisform.txt1.value,a,1) < '0' OR MID(thisform.txt1.value,a,1) > '9' then
x=1
ENDIF
next
'
IF Y = 0 then
msgbox('Campo vacio')
endif
'
if x <> 0 then
msgbox('caracteres no numericos')
Endif
Vamos a realizar el bucle al revés, es decir, en vez de empezar por el carácter 1º, empezaremos por el ultimo (maxlen). Iremos despreciando los espacios en blanco a la derecha hasta encontrar uno no blanco, por lo que el código quedaría así:
Recuerda que los next deben de provocar la vuelta al for, pon su equivalente en FOX.
X=0
Y=0
'
FOR A=LEN(thisform.txt1.value) to 1
'
If MID(thisform.txt1.value,a,1) " " and Y = 0 then
next
endif
'
Y=1
'
if MID(thisform.txt1.value,a,1) < '0' OR MID(thisform.txt1.value,a,1) > '9' then
x=1
ENDIF
next
'
IF Y = 0 then
msgbox('Campo vacio')
endif
'
if x <> 0 then
msgbox('caracteres no numericos')
Endif
Hola Francisco...
Antes que nada, te agradezco muchísimo la ayuda que me has brindado ya que buscaba un código general que pueda aplicar a cualquier caso que se me presentara de validación de textbox, y gracias a tu colaboración desinteresada creo que lo he conseguido.
En tu anteultima explicación me decías que utilice TRIM(thisform.text1.value)... y funcionó perfectamente... Igualmente el ultimo código que me pasaste ya lo he guardado para tener una variante respecto al tema. Mucha gracias!
En definitiva el código quedó así:
d=0
FOR a=1 TO len(TRIM(THISFORM.Text1.VALUE))
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,a,1) > '9'
d=1
ENDIF
next
IF d <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
d=0
else
thisform.text2.enabled=.t.
Endif
Bueno Francisco, muchas gracias por tu colaboración... mi mail particular es: (xxxxxx) - Por favor, enviame tu mail particular de nuevo porque me parece que no lo copie bien.
Saludos desde Posadas, Misiones, la provincia de las Cataratas del Iguazú, Argentina.
www.misiones.gov.ar
Un abrazo.
Fernando.
Antes que nada, te agradezco muchísimo la ayuda que me has brindado ya que buscaba un código general que pueda aplicar a cualquier caso que se me presentara de validación de textbox, y gracias a tu colaboración desinteresada creo que lo he conseguido.
En tu anteultima explicación me decías que utilice TRIM(thisform.text1.value)... y funcionó perfectamente... Igualmente el ultimo código que me pasaste ya lo he guardado para tener una variante respecto al tema. Mucha gracias!
En definitiva el código quedó así:
d=0
FOR a=1 TO len(TRIM(THISFORM.Text1.VALUE))
IF SUBSTR(thisform.text1.value,a,1) < '0' OR SUBSTR(thisform.text1.value,a,1) > '9'
d=1
ENDIF
next
IF d <> 0
messagebox("INTRODUZCA SOLO NUMEROS")
thisform.text1.value=""
return 0
d=0
else
thisform.text2.enabled=.t.
Endif
Bueno Francisco, muchas gracias por tu colaboración... mi mail particular es: (xxxxxx) - Por favor, enviame tu mail particular de nuevo porque me parece que no lo copie bien.
Saludos desde Posadas, Misiones, la provincia de las Cataratas del Iguazú, Argentina.
www.misiones.gov.ar
Un abrazo.
Fernando.
- Compartir respuesta
- Anónimo
ahora mismo