FoxPro/Visual FoxPro - textbox solo numerico

 
Vista:
sin imagen de perfil

textbox solo numerico

Publicado por melisa (22 intervenciones) el 11/10/2013 23:37:22
hola!
necesito saber como hago para que un textbox me acepte solo numeros..en este caso numeros enteros...
y que al abrir el formulario en ese mismo text me aparezca ya el siguiente numero que le sigue al ultimo de mi tabla..gracias!
estoy usando vfp9
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

textbox solo numerico

Publicado por Fidel (558 intervenciones) el 12/10/2013 00:35:19
Melisa:
1) Si el valor es numérico, al asignarlo al textbox se convierte en numérico.
2) si el valor es alfanumérico, necesitas configurar la propiedad InputMask del textbox. Por ejemplo, si esperas que tegan 6 dígitos
Thisform.Text1.InputMask="999999"
Ahora bien, si se trata de una secuencia que se genera automáticamente, el usuario no puede interferir en el número y el TextBox tiene que ser Enabled=.F.

En cuanto al número consecutivo, en Visual Fox hay varias formas.
En este tema, lo esencial es que se pueda determinar justo en el momento de grabar la transacción, independientemente de que se lo quiera llamar al inicio del proceso, como para tener una guía. La razón es simple: si hay otros usuarios efectuando las mismas transacciones, existe el peligro de que el número se repita. Por este motivo, es harto recomendable utilizar una tabla de numeradores ya que el que confirme la grabación captura el número actualizando la tabla. El que grabe una transacción similar desde otro equipo se quedará con el consecutivo siguiente.
En el caso de la consulta a la tabla, es posible que los dos obtengan el mismo número por consulta concomitante. Y se repita el identificador.

1) Se puede utilizar una tabla dedicada a numeradores con una función de usuario para actualizar el número. La tabla debe tener un código de identificación, un campo numérico que tiene el orden y se pueden utilizar otros campos para definir el tipo de número (por ejemplo si devuelve un número o una cadena alfanumérica con ceros a la izquierda). Para el caso de cadenas, debes tener también un campo para indicar cuántos caracteres son. Debes tener un campo para consignar la tabla maestra y el nombre del campo de la tabla maestra al que corresponde el numerador. Puedes incluir el índice correspondiente, o calcularlo luego.

2) Puedes calcular en cada caso cuál es el último valor que tiene la tabla. Para eso te conviene crear una función de usuario.
Esta función devuelve el último número ingresado más uno, sea un campo numérico o alfanumérico. Cuando los campos son alfanuméricos, deben consignarse los ceros a la izquierda a fin de evitar la confusión de valores.
Transcribo una función posible, aunque repito, no recomiendo este procedimiento. Es sencillo y válido solamente para entornos monousuario. De todos modos, esta rutina con alguna modificación debería existir para revisar la tabla de numeradores cuando se aplique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
FUNCTION LastNumber( xcTAbla , xcIndice , xcCampo , xnDigitos )
&& Si se omite xnDigitos, se autodetermina para el caso de Character
&& xnDigitos no se emplea en caso Numeric o Interger
 
LOCAL lcOrder,lnRecord,lcType,lcEval,lFlag,lnValor,;
	lcExact,lnElemen
LOCAL ARRAY gaFields(1)
 
* <Detección de errores>
IF EMPTY(xcTabla)
	MESSAGEBOX("No consignó el nombre de la tabla")
	RETURN ""
ENDIF
IF EMPTY(xcIndice)
	MESSAGEBOX("No consignó la etiqueta de índice")
	RETURN ""
ENDIF
IF EMPTY(xcCampo)
	MESSAGEBOX("No consignó el nombre del campo de control")
	RETURN ""
ENDIF
IF !USED(xcTabla)
	MESSAGEBOX("La tabla &xcTabla no está en uso")
	RETURN ""
ENDIF
 
 
AFIELDS(gaFields,xcTabla)
lcExact=SET("Exact")
SET EXACT ON
lnElemen=ASCAN(gaFields,UPPER(xcCampo))
SET EXACT &lcExact
IF lnElemen=0
	MESSAGEBOX("El campo indicado no existe en la tabla &xcTabla")
	RETURN ""
ENDIF
lcType=gaFields[lnElemen+1]
IF lcType="C"
      xnDigitos=EVL(xnDigitos,gaFields[lnElemen+2])
ENDIF
IF !INLIST(lcType,"C","N","I")
	MESSAGEBOX("El campo &xcCampo indicado tiene un tipo incorrecto")
	RETURN ""
ENDIF
* </Detección de errores>
 
lcEval=xcTabla+"."+xcCampo
lnValor=0
 
select (xcTabla)
lcOrder=Order()
lnRecord=Recno()
SET ORDER TO (xcIndice)
go bott
if !eof()
	IF lcType="C"
		&& Rulo en prevención de que existan
		&& códigos alfabéticos reservados.
		DO WHILE VAL(EVALUATE(lcEval))=0
			SKIP -1
			IF BOF()
				lFlag=.t.
				EXIT
			ENDIF
		ENDDO
		IF !lFlag
			lnValor=VAL(alltrim(Evaluate(lcEval)))
		ENDIF
	ELSE
		lnValor=EVALUATE(lcEval)
	ENDIF
 
ENDIF
 
* Reponer el estado en que se encontró
if !Empty(lcOrder)
      set order to (lcOrder)
endif
if !empty(lnRecord)
       go LnRecord
ENDIF
 
* Devolver el valor de acuerdo al tipo detectado.
Return IIF(lcType="C",;
	Padl(LTRIM(STR(lnValor+1)),xnDigitos,"0"),;
	lnValor+1)
 
ENDFUNC

3) Puedes usar un campo autoincremental. Pero esto requiere experiencia para controlar los problemas que se pueden generar. En particular, olvidarse de Append Blank y reemplazarlo por INSERT - SQL. Pero también hay que ver qué sucede con los registros borrados y cual es la idea de la secuencia. Por ejemplo, para generar números de facturas, no debe utilizarse un campo autoincremental, aunque más no sea porque, dado cierto entorno, una factura puede abarcar más de un número de comprobante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

textbox solo numerico

Publicado por melisa (22 intervenciones) el 12/10/2013 00:47:19
Thisform.Text1.InputMask="999999"
escribir eso en el form me da como error: UNKNOWN MEMBER TEXT2.
de lo demas no entendi nada!!! =(

te puedo mandar un mail con mi "proyecto" para que lo veas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

textbox solo numerico

Publicado por Fidel (558 intervenciones) el 12/10/2013 01:43:51
Si pones Thisform.Text1.InputMask="", te daría un error de Unknown Member Text1, si el tal TExt1 no existe. El tal "Text1", es solamente un ejemplo. Si tu textbox se llama TxtNumero, entonces:
thisform.TxtNumero.Inputmask="999999"
También puedes atacar el Inputmask directamente desde el diseñador de formularios.
Puedes enviar un mail con tu proyecto. Desde ya te digo que no siempre es fácil entender el diseño de otro programador. Aunque puede servir para algunas observaciones más bien conceptuales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

textbox solo numerico

Publicado por Melisa (22 intervenciones) el 12/10/2013 04:31:57
si, eso lo entendi, yo escribi el nombre de mi text pero me da ese error. lo escribi haciendo doble click en el form donde esta el tex.ahi lo tengo que programar?
a que direccion puedo enviarte el mail fidel?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

textbox solo numerico

Publicado por Melisa (22 intervenciones) el 12/10/2013 04:55:25
ahi lo puse en el text y creo que funciono!!! pero necesito que cuando lo vuelva a abrir me aparezca vacio, y no el ultimo numero que escribi!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar