Tengo un problema con el campo que manejo para la fecha Tiene una mascara de entrada, ##/##/####, bueno todo funciona bien, solo que cuando se pone la fecha, digamos 01/02/20__ y falta los 2 ultimos digitos igual acepta o cualquier otro campo digamos 01/__/2007, etc... Eso hace que al momento de grabar a la BD, me sale un error porque los tipos no coinicden, y es lógico, como puedo
hacer para cuando quieras cambiar eser campo si no esta llenos todos los campo no salga Estoy intentando con: Private Sub TXFECH_lostFocus() If TXFECH <> "##/##/####" Then MsgBox "No coincide la fecha con el formato.", vbOKOnly, "Se Requiere Datos" TXFECH.SetFocus Exit Sub End If End Sub ¿Pero nada, alguna idea?
1 respuesta
Respuesta de vegaobrien
1
1
vegaobrien, Ingeniero Informático con más de 10 años de experiencia en...
Desde Chile... Lo que debemos hacer en tu caso es una validación de las fechas que los usuarios ingresen, para esto usaremos una función que yo te daré.. Primero, en el form que tienes la fecha debes crear una variable, por ejemplo yo la llamaré "formatofecha" y será del tipo variant, es decir: Public formatofecha as variant Luego, colocaremos una validación que se dirija a la función que te daré en el instante en que la fecha pierda el foco, así evitas llegar a la grabación y encotrarte con el problema, haremos algo así. Private Sub txtfecha_LostFocus() If txtfecha.Text <> "__/__/____" Then formatofecha = gValidaFecha(txtfecha) End Sub Como vez, la función a la cual direcciono se llama gvalidafecha y un detalle importante, es que cuando haces referencia a ella incluyes solo el nombre del campo donde va la fecha, es decir, txtfecha. Luego, insertas una hoja de módulo y copias el siguiente código de la función. (Tomalo, cópialo y pégalo directamente, pues va listo) Public Function gValidaFecha(fecha As Control) As Boolean ' Función que permite validar una fecha, si la validación ' resulta negativa pone el campo en blanco, esta ' validación retorna true cuando el campo viene en blanco '*************************************************************** Dim Bisiesto As Integer, Fecha1 As Long, anho2 As Long If fecha.Text <> "__/__/____" Then Static mes(13) If Trim(fecha.Text) = "" Then fecha.Text = "__/__/____" gValidaFecha = True Exit Function End If If Len(fecha.Text) < 8 Or Len(fecha.Text) > 10 Then Beep MsgBox "La fecha que ha ingresado no es válida para el sistema", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" gValidaFecha = False fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible = True Then fecha.SetFocus End If Exit Function End If On Error Resume Next mese$ = Month(fecha.Text) dias$ = Day(fecha.Text) If Err.Number = 13 Then Beep MsgBox "La fecha que ha registrado no es válida para el sistema.", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" gValidaFecha = False fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) fecha.SetFocus Exit Function End If On Error GoTo 0 mes(1) = 31: mes(2) = 28: mes(3) = 31: mes(4) = 30 mes(5) = 31: mes(6) = 30: mes(7) = 31: mes(8) = 31 mes(9) = 30: mes(10) = 31: mes(11) = 30: mes(12) = 31 mes(13) = 29 anho$ = Trim(Mid$(fecha.Text, 7, 4)) mese$ = Mid$(fecha.Text, 4, 2) dias$ = Mid$(fecha.Text, 1, 2) If Val(mese$) < 1 Then Beep MsgBox "El mes que ha ingresado no es válido.", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" gValidaFecha = False fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible Then fecha.SetFocus End If Exit Function ElseIf Val(mese$) > 12 Then Beep MsgBox "Rectifique Mes, no corresponde..." + Chr$(13) + Chr$(10) + "[ Mes <= 12]...", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible = True Then fecha.SetFocus End If gValidaFecha = False Exit Function Else VDia = mes(Val(mese$)) If Val(dias$) < 1 Then Beep MsgBox "El día que ha ingresado no es válido.", 1 fecha.Text = "__/__/____" gValidaFecha = False If fecha.Visible Then fecha.SetFocus End If Exit Function ElseIf Val(dias$) > VDia And Val(mese$) <> 2 Then Beep MsgBox "Rectifique Día, no corresponde..." + Chr$(13) + Chr$(10) + " [ Día <=" + Str$(VDia) + " ]...", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible Then fecha.SetFocus End If gValidaFecha = False Exit Function ElseIf Val(mese$) = 2 Then If Val(anho$) < 0 Then Beep MsgBox "El año que ha ingresado no es válido.", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible Then fecha.SetFocus End If gValidaFecha = False Exit Function Else Bise = Val(anho$) Mod 4 If (Bise <> 0 And Val(dias$) = 29) Or (Bise = 0 And Val(dias$) > 29) Or (Bise <> 0 And Val(dias$) > 28) Then Beep MsgBox "Rectifique Día, no corresponde...", vbCritical, "Módulo de Seguridad" fecha.Text = "__/__/____" fecha.SelStart = 0 fecha.SelLength = Len(fecha.Text) If fecha.Visible Then fecha.SetFocus End If gValidaFecha = False Exit Function End If End If End If End If fecha.Text = Format(fecha.Text, "dd/mm/yyyy") gValidaFecha = True End If End Function Es un poco largo, pero funciona que es lo importante, entonces, para cada fecha que tengas en tu sistema, debes hacer su correspondiente validación para cuando el objeto haya perdido el foco. Un cordial saludo desde Chile. Vega O'Brien. PD: No olvides finalizar la pregunta.