VBA Access: Controlar condiciones y mostrar info relacionada

En la tabla tengo el número de teléfono, horario de contacto desde y hasta y si es prioritario. EL usuario sólo puede tener UN tipo de contacto prioritario. Entonces, al abrir el formulario necesito que verifique si el registro tiene un checkbox marcado como prioridad y si es así, verifique si está dentro o no del horario de contacto. Si está dentro dice una cosa y si no lo está dice otra.

Tengo este código pero siempre me arroja dos veces el msgbox.

    If vDNICon = vDNI And Me.chkPrioridad.Value = -1 And vHActual > vHDesde And vHActual < vHHasta Then
        TXTVAL = "En estos momentos se encuentra dentro del horario de contacto solicitado por el Lector." & vbCrLf & "Tipo: " & TIPO_TEL & vbCrLf & "Número: " & [CONCATENA] & vbCrLf & "Horario: " & vHDesde & " a " & vHHasta & "."
        GoTo EXITH
    Else
        TXTVAL = "En estos momentos se encuentra fuera del horario especificado o el lector no ha indicado un horario de contacto."
    End If
' FIN ESTABLECER POSIBILIDAD DE CONTACTO
EXITH:
    MsgBox TXTVAL, 32, "Contacto"
    Exit Sub

Obviamente el usuario podrá tener infinitos números telefónicos en agenda pero sólo uno prioritario y es la información de este el que quiero que se muestre en el msgbox UNA vez y ya.

Probé con un Do Loop pero no lo sé armar y me devuelve error constantemente con el tema sintaxis y no encuentro la diferencia de los ejemplos en la web.

¿Cómo puedo lograr ese análisis y el resultado correcto?

1 respuesta

Respuesta
1

Sasha: Creo tener clara la estructura. Lo que no acabo de entender es el "Proceso".

Ese Formulario que citas ...Entonces, al abrir el formulario... ¿lo haces desde otro en el que está el DNI del usuario?

En ésta línea de código>>

If vDNICon = vDNI And Me.chkPrioridad.Value = -1 And vHActual > vHDesde And vHActual < vHHasta Then

Veo un Me.ChkPrioridad refiriendote a un control de formulario, y el resto me parecen variables.

¿Dónde les pasas los valores?. Aunque no sea yo quien te conteste, supongo que éstos datos pueden ayudar a generar una respuesta. Mis saludos >> Jacinto

El código está dentro de un subformulario que lo único que trae del formulario general es el DNI de la persona para comprararlo con el DNI de la tabla para analizar sus valores. Si el DNI coincide, verifica que el Checkbox esté en True (probé con -1, true, Yes) y si es así, verifique estar dentro del horario de contacto (entre DESDE y HASTA) para decir "Oye, estás en el horario" o decir "Espera a las DESDE para contactarte.

En definitiva las variables traen bien los datos y la comparación de los datos se hace bien porque trae el "Oye, estás en el horario" o "Espera..." pero lo hace dos veces (una por el Checkbox TRUE y otra por el primer checkbox FALSE, supongo).

El código completo es este:

Private Sub Form_Current()
' ESTABLECER POSIBILIDAD DE CONTACTO SEGÚN HORA
Dim vHActual As Date, vHDesde As Date, vHHasta As Date, vDNICon As Long, vDNI As Long, vMje As Byte, vChk As Boolean
vDNI = Forms![Con_Lector_Contacto]![txtFiltro].Value
vDNICon = [DNI]
vHActual = Format(Now, "hh:mm")
vHDesde = Format(DLookup("[DESDE]", "[LECTOR_TEL]", "[DNI] = " & vDNI & " AND [PRIORIDAD] = True"), "hh:mm")
vHHasta = Format(DLookup("[HASTA]", "[LECTOR_TEL]", "[DNI] = " & vDNI & " AND [PRIORIDAD] = True"), "hh:mm")
vChk = chkPrioridad
DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
'For x = 1 To Form.Recordset.RecordCount
    If vDNICon = vDNI Then
'        MsgBox "DNI = DNI " & vDNICon & " " & vDNI
        If vChk = True Then
'            MsgBox "Es prioridad " & vChk
            If vHActual > vHDesde And vHActual < vHHasta Then
'                MsgBox "En horario"
                TXTVAL = "Para contactar al Lector, hágalo hasta las " & Format(vHHasta, "hh:mm") & " horas a su " & LCase(TIPO_TEL) & " marcando " & [CONCATENA] & ". Sino, espere hasta mañana a las " & Format(vHDesde, "hh:mm") & " para intentarlo."
                GoTo CORRECTO
            Else
'                MsgBox "Fuera del horario"
                TXTVAL = "Para contactar al Lector, espere hasta las " & Format(vHDesde, "hh:mm") & " para intentarlo."
            End If
        Else
            DoCmd.GoToRecord , , acNext
        End If
    End If
'Next
' FIN ESTABLECER POSIBILIDAD DE CONTACTO
EXITH:
    Exit Sub
CORRECTO:
    Forms![Con_Lector_Contacto]![txtResumen].Value = TXTVAL
    MsgBox TXTVAL, 32, "Contacto"
    GoTo EXITH
End Sub

Como verás, puse MSGBOX para controlar si llegaba a este y a aquél punto y llega siempre de manera correcta (están comentados). Este código varía del que pasé porque quería verlo desde otro punto y aún así funciona Ok pero el msgbox TXTVAL, 32, "Contacto" se repite dos veces seguidas. Y eso es lo que quiero evitar (que encuentre el primer vChk, traiga los valores que va a informar y ahí termine.
Espero haber sido más concreto.
NOTA: COn la línea Forms![Con_Lector_Contacto]![txtResumen].Value = TXTVAL ya obtengo lo que necesito aún cuando se haga dos veces porque ya se escribe en el textbox el resultado correcto pero el objetivo es poder aprender a salir de un proceso cuando ya se cumplió la condición fundamental.

Sasha: Ya que tienes el código, para evitarun tiempo de análisis mío y como no, para que tu mismo puedas llegar a la solución, pones un punto de interrupción en el Form_Current y ejecutas el código paso a paso. Ahí verás donde se repite la ejecución del mensaje. Mis saludos >> Jacinto

Ya probé. Y se completa. O sea, llega al final porque muestra el MSGBOX (está colocado después del Exit sub pero antes estaba antes del End Sub) y aún así aparece dos veces el mismo msgbox.

Sasha: Esta tarde ya no podré mirarlo, pero lo haré tan pronto me sea posible.

Por tu parte mira de que no estés llamando el Form_Current() dos veces, una desde el Form_Load() o Form_Open, y otr desde el própio Form_Current, ya que la secuencia de Eventos es, Open-Load-Current etc, de ese modo si repites un código lógicamente, las acciones ocurren dos veces, y si no hay mensajes, tu no te enteras. Mis saludos >> Jacinto

Controlé paso por paso pero no encuentro donde se da. Quizá sea por la forma en que presento el formulario. De todos modos, usaré otra forma de mostrar ese mensaje al usuario.
Gracias de todas formas por tu esfuerzo.

Sasha: La verdad es que ando un poco liado y no he podido analizar o intentar reproducir tu código

Si en la nueva metodología tienes alguna dificultad y puedo ayudarte, encantado. Mis saludos >> Jacinto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas