Validar Números

Fecha: 31/Ago/97
Autor: Gerardo Alvarez


From: "Gerardo Alvarez" asaca@telcel.net.ve
Date sent: Thu, 28 Aug 1997 11:59:56 -0400



Nota al Guille: si te gusta la publicas en tus páginas:
(era una respuesta a una consulta de la lista VB-ESP)

Lo que tu preguntas, lo soluciono en tres pasos:

1 -  En el evento KeyPress dejo pasar sólo números y opcionalmente el
punto decimal, si el campo lo acepta.
El SetFocus a Command2 sólo dispara el evento LostFocus . Command2 no
necesita hacer nada, incluso puede estar oculto tras otro control....
el setfocus al siguiente campo lo haré en el lostfocus de este campo si
las validaciones pasan ok.

Sub Text1_KeyPress (KeyAscii As Integer)
char = Chr(KeyAscii)
If KeyAscii = enter Then GoTo sigue1
If KeyAscii = backsp Then GoTo sigue1
'If char = "." Then GoTo sigue1           'opcional
If IsNumeric(char) Then
   GoTo sigue1
Else
   msg = "Debe ser Numérico"
   MsgBox msg, 16, progname$
   KeyAscii = H00
   Text1.SetFocus
   GoTo fint1kp
End If
sigue1:
    If KeyAscii = enter Then command2.SetFocus
    If KeyAscii = backsp Then GoTo fint1kp
    If Len(Text1) > 7 Then command2.SetFocus
fint1kp:
End Sub



2 - En el evento LostFocus llamo a la función val_ent_dec con tres
parametros: el campo con el número, los enteros y los decimales así: 
En el ejemplo: text1 con cuatro enteros y dos decimales.

   vderr = val_ent_dec(text1, 4, 2)

   If vderr  Then
      text1.Visible = True
      text1.SetFocus
      GoTo t10fin
   End If
   ....otras validaciones p.ej. si el número está en el maestro de
clientes, etc...
   ....Si esta bien,  hago setfocus al siguiente texto.

3 - La función para validar enteros y decimales:

Function val_ent_dec (vdnum, vdent, vddec)
Dim vdi
Dim vdpunto
Dim vdcont
Dim vdcent
Dim vdx

vdx = Str$(Val(vdnum))
vdpunto = 0
vdcont = 0
vdcent = 0

For vdi = 1 To Len(vdx)
    If vdpunto = 1 Then vdcont = vdcont + 1 Else vdcent = vdcent + 1
    If Mid(vdx, vdi, 1) = "." Then vdpunto = 1: vdcent = vdcent - 1
Next vdi

If vdcont > vddec Then
   val_ent_dec = 1
       If Val(vddec) = 0 Then
msg = "Error, Máximo " & vdent & " enteros sin decimales."
       Else
msg = "Error, Máximo " & vddec & " decimales."
       End If
    MsgBox msg, 16, progname$

ElseIf vdcent > vdent + 1 Then
   val_ent_dec = 1
       If Val(vddec) = 0 Then
msg = "Error, Máximo " & vdent & " enteros."
       Else
msg = "Error, Máximo " & vdent & " enteros y " & vddec & " decimales."
       End If
   MsgBox msg, 16, progname$
Else
   val_ent_dec = 0
End If



'EJEMPLO DE LLAMADA

'   vderr = val_ent_dec(text1, 4, 2)
'   If vderr = 1 Then
'      text1.visible = true
'      text1.setfocus
'      GoTo ffin
'   End If

End Function

Y tengo otra funcioncita para validar fechas, si a alguien le interesa....

Se oyen sugerencias!!!!
Buena Suerte, Amigo
Gerardo Alvarez
asaca@telcel.net.ve