Access - Realizar una acción en base al valor de un cuadro combinado

 
Vista:
Imágen de perfil de Jorge
Val: 8
Ha aumentado su posición en 16 puestos en Access (en relación al último mes)
Gráfica de Access

Realizar una acción en base al valor de un cuadro combinado

Publicado por Jorge (4 intervenciones) el 25/05/2020 01:45:46
Buenas, estoy tratando de hacer que, dependiendo del valor que seleccione en una lista de un cuadro combinado, pueda establecer un valor en un cuadro de texto con formato "fecha". Para esto estoy usando el siguiente código:

1- Le digo a mi primer campo de fecha ("fecha_hecho") que no puedo establecer una fecha si mi campo ("causa") no tiene un valor definido:
1
2
3
4
5
6
7
8
9
10
11
'DEFINEME LA CAUSA
Private Sub fecha_hecho_GotFocus()
On Error Resume Next
    If IsNull(Me![causa]) Then
        Beep
        MsgBox "Por favor define la Causa", vbInformation, "No hay Causa"
        causa.SetFocus
        Exit Sub
    End If
On Error GoTo 0
End Sub

2- Le digo al campo ("causa") que es mi lista de opciones que cuando entre me establezca estos valores en variables publicas tipo String (*Esta opción también la puedo aplicar al cargar el formulario*):
1
2
3
4
5
6
7
Private Sub causa_GotFocus()
'CAUSAS CON VALOR ESTABLECIDO PARA VARIABLES
c1 = "PERMANENCIA"
c2 = "EVADIDO"
c3 = "RETARDO"
c4 = "FUERA"
End Sub

3- Si el valor del campo ("causa") corresponde a el valor de una de las variables, al establecer una fecha en el campo ("fecha_hecho"), deberá establecer esa misma fecha en el campo ("fecha_pnafu"), y en el campo ("cont_day") debera comenzar a contar los días respecto a la fecha del campo ("fecha_pnafu") y el campo ("fechaHoy"):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'CUANDO LA CAUSA ES POR PNAFU
Private Sub fecha_hecho_AfterUpdate()
On Error Resume Next
    If [causa] = c1 Or [causa] = c2 Or [causa] = c3 Or [causa] = c4 Then
        fecha_pnafu = fecha_hecho
        cont_day = DateDiff("D", fecha_pnafu, fechaHoy)
        Exit Sub
    End If
 
    If [causa] <> c1 Or [causa] <> c2 Or [causa] <> c3 Or [causa] <> c4 Then
        fecha_pnafu = ""
        cont_day = ""
        Exit Sub
    End If
On Error GoTo 0
End Sub

El problema que se presenta es que el campo ("fecha_hecho") le asigna la fecha al campo ("fecha_pnafu") sin importar la restricción que solo asignara la fecha al campo ("fecha_pnafu") si el valor del campo ("causa") es igual al valor de las variables.

*NECESITO QUE ALGUIEN ME EXPLIQUE... AYUDA POR FAVOR*
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

Realizar una acción en base al valor de un cuadro combinado

Publicado por Anonimo (3312 intervenciones) el 25/05/2020 09:37:44
Otra versión:

1
2
3
4
5
6
7
8
9
10
11
12
Private Sub fecha_hecho_AfterUpdate()
If Not IsDate(Me.fecha_hecho) Then Exit Sub
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Me.Causa) Then
    Me.fecha_pnafu = Me.fecha_hecho
    Me.cont_day = DateDiff("D", Me.fecha_pnafu, fechaHoy) ' ?FechaHoy = Date? (date = fecha del sistema)
    Else
    Me.fecha_pnafu = ""
    Me.cont_day = "" ' no deberia ser cero? .....
    End If
End Sub
 
' apreciaras que son innecesarios c1 ==> c4 y en todo caso se puede obtener una lista de valores del propio combo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jorge
Val: 8
Ha aumentado su posición en 16 puestos en Access (en relación al último mes)
Gráfica de Access

Realizar una acción en base al valor de un cuadro combinado

Publicado por Jorge (4 intervenciones) el 25/05/2020 15:37:46
Coloque el código así como dijistes pero me sale este error, no reconoce los valores

Imagen1
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

Realizar una acción en base al valor de un cuadro combinado

Publicado por Anonimo (3312 intervenciones) el 25/05/2020 20:28:22
Access tiene una utilidad (la 'ventana de inmediato') que permite verificar el funcionamiento de sentencias y verificar expresiones.

En la ventana de inmediato:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Causa = "abc"
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Causa) then debug.Print "Localizado" else debug.Print "Desconocido"
Desconocido
 
Causa = "PERMANENCIA"
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Causa) then debug.Print "Localizado" else debug.Print "Desconocido"
Localizado
 
Causa = "Anonimo"
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Causa) then debug.Print "Localizado" else debug.Print "Desconocido"
Desconocido
 
Causa = "EVADIDO"
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Causa) then debug.Print "Localizado" else debug.Print "Desconocido"
Localizado


Desconozco donde esta la variable 'causa' asumí que era un cuadro de texto (y que tenia un valor, cualquier valor pero NUNCA un Null)

En lo que has publicado la referencias asi:
===> [causa]

Y asi también:
==> Me![causa]

Utiliza la que sea adecuada, lo que publique funciona (al menos en mi maquina)

Se basa en que la función INSTR devuelve el punto donde se encuentra coincidencia (un cero si no la encuentra)

Cero y no cero son los equivalentes de False y TRUE …. mas bien lo único que es cierto es que cero = FALSE y cualquier otro valor (incluido el -1 que aplica Access por defecto) es un TRUE.

P.D.
Puedes copiar una pareja de líneas (la que asigna el valor y la que lo verifica) y experimentar en la ventana de inmediato a la que se llega mediante el menú en la ventana de VBA o (también en la ventana de VBA) con Control+G
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jorge
Val: 8
Ha aumentado su posición en 16 puestos en Access (en relación al último mes)
Gráfica de Access

Realizar una acción en base al valor de un cuadro combinado

Publicado por Jorge (4 intervenciones) el 25/05/2020 23:39:02
El campo [causa] es una lista desplegable donde hay una lista de causas para seleccionar, esta es una base de datos que estoy haciendo para un conscripto, las opciones que se pueden seleccionar están enlazadas a una tabla de excel...

Imagen1

La acción debe realizarla [fecha_hecho], que al seleccionar una opción de la lista desplegable [causa] y que la opción sea alguna de esas 4 ya sea "PERMANENCIA", "EVADIDO", "RETARDO" o "FUERA" me coloque la fecha que elija en la [fecha_hecho] en la [fecha_pnafu]
Aun me sigue dando el mismo error en la línea

1
If InStr("PERMANENCIA EVADIDO RETARDO FUERA", Me.Causa) Then
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

Realizar una acción en base al valor de un cuadro combinado

Publicado por Anonimo (3312 intervenciones) el 26/05/2020 01:11:55
Sospecho que el valor que devuelve ese objeto (el cuadro de lista),no es el esperado.

Normalmente los cuadros de lista (y los combos) muestran una información y devuelven otra (devuelven el ID y presentan la descripción).

Si esa fura la causa (algo fácil de verificar) bastaría indicarle que el objeto es un cuadro de lista, que como tal tiene (suele tener) mas de una columna (alguna de ellas oculta) y que lo que deseamos de 'él' es una determinada de sus columnas, la que devuelve el valor que deseamos.

También esta la opción de convertirla la columna que nos interesa en 'la columna referente' … pero desconociendo la aplicación no aseguraría que fuera la opción correcta, pues puede interferir en otras asociaciones o referencias.

Como supongo que ese error lo da en tiempo de ejecución, veamos que valor real tenemos:

En la línea inmediata anterior a la marcada en amarillo insertar esto:

1
MsgBox causa

Por cierto, cuando Access encuentra un problema, no solo se para y delata el punto (aproximado) donde tropieza, también suele acompañarlo de un mensaje que en muchas ocasiones acostumbra a ser útil …. yo no tengo el problema, es quien lo tiene el que debería aportar lo máximo para solucionarlo, solo el creador tiene una visión global del conjunto, el resto las pistas que se aportan …. cuanto mas escasas, mas lejano esta el final (si se llega a alcanzar)..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jorge
Val: 8
Ha aumentado su posición en 16 puestos en Access (en relación al último mes)
Gráfica de Access

Realizar una acción en base al valor de un cuadro combinado

Publicado por Jorge (4 intervenciones) el 26/05/2020 02:29:04
evidentemente el error vino del cuadro de combinado, el error venía porque le tenia activado la opción de "Varios valores", al quitarle esa opción ice la prueba del "msgBox causa" y efectivamente me dio el valor, ahora el problema es que el campo [fecha_hecho] no manda la fecha al campo [fecha_pnafu]
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

Realizar una acción en base al valor de un cuadro combinado

Publicado por Anonimo (3312 intervenciones) el 26/05/2020 09:30:34
Un campo de tipo fecha (en Access) solo almacena un dato que represente a una fecha en formato 'fecha de Access' (no en formato texto).

Cualquiera entiende que 'la semana que viene' es una fecha a siete días vista, Access no tiene empatía y eso … no le sirve para nada se le ha de indicar que a la fecha actual se le han de añadir siete días :
.- Date + 7
.- DateAdd ("d" ,7, Date)

Si se intenta esto :
Me.fecha_hecho + 7

Cuando 'Me.fecha_hecho' no es un dato fecha-Access (por ejemplo: 8/5/2020 ) dará error de tipo y no asignara el valor

Que sea capaz de interpretar si un valor en texto (los cuadros de texto solo admiten TEXTO que luego interpretaremos como nos interese) no lo convierte en el dato que se espera, me refiero a esto:

1
If Not IsDate(Me.fecha_hecho) Then Exit Sub

Para que el valor de 'me.Fecha_hecho' sea utilizado como un dato tipo fecha, se ha de convertir a fecha.
Suele ser automático si existen dependencias con una tabla, de existir, la tabla exigirá que ese dato sea del tipo correcto.

Formas de 'convertir' el dato 'en texto' a una fecha para Access:
El original --> Me.fecha_pnafu = Me.fecha_hecho

Si no interpreta 'fecha_hecho' como fecha...

1
2
Me.fecha_pnafu = "#" & Me.fecha_hecho & "#"
Me.fecha_pnafu = CDate (Me.fecha_hecho)

Y la que menos problemas dará con las diferentes configuraciones regionales:
Si se parte de un texto que representa a una fecha ( 7/5/2020, 7 may 2020 ……)

1
Me.fecha_pnafu = CDbl(CDate(Me.fecha_hecho))

En esta expresión CDate se encarga de 'convertir a fecha' cualquiera de las variantes reconocidas en el formato regional del sistema y CDbl convierte ese dato al numero real que guardara como tal fecha.

Las fechas en su formato básico (un numero tipo coma flotante ) ignoran los formatos regionales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar