Access - ¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

 
Vista:
sin imagen de perfil

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Cristobal (6 intervenciones) el 18/01/2023 03:25:10
Hola buenas, mi nivel no es muy bueno en access pero he estado tratando de idear un método para validar los registros que se van ingresando en una tabla entre datos del mismo campo, el problema que tengo es saber si es posible ejecutar el macros automáticamente al ingresar un dato en el registro del campo seleccionado. .

La tabla consta de horas acumuladas por vehículos y el registro indica las horas de servicio que se tuvieron durante el día. Por lo tanto se busca verificar que el resto entre el día de hoy y el de ayer tengan un horario de funcionamiento entre 0 y 24 horas A continuación muestro lo que llevo desarrollado.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Validacion()
 
Dim V1 As Variant, V2 As Integer, V3 As Integer
 
 
V1 = DLookup("[Veh1]", "Tabla1", "[Fecha] = Date()")
V2 = DLookup("[Veh1]", "Tabla1", "[Fecha] = Date() - 1")
 
 
V3 = V1 - V2
MsgBox V1
MsgBox V2
MsgBox V3
If V3 < 0 And V3 > 24 Then
 
    MsgBox "Corregir", V3
Else
    MsgBox "Dato ingresado correctamente"
End If
End

Me surgen dos problemáticas el probar este método, el primero es que quiero que sea mas sencillo de ejecutar, lo ideal es que se ejecute el macros cada vez que se completa la hora de un vehiculo pero desconozco si es posible lograr eso. El otro problema es que cada vez que se quiera verificar los datos es necesario que se haya ingresado todas las horas de servicio de cada vehículo, puesto que eso posibilita que se guarde el registro completo del día, si no es así los datos reales no son tomados por la tabla.

Espero puedan ayudarme o si me pueden facilitar herramientas que me puedan enseñar les agradecería mucho.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Anonimo (3316 intervenciones) el 18/01/2023 10:39:38
Las macros pueden ejecutarse en cualquier evento del objeto con el que se interactúa (si no se interactúa con el objeto no se producen eventos).

Las macros (es mi opinión) solo son plantillas para ayudar en los primeros pasos de la programación y eso las limita en sus posibilidades con respecto a crear el mismo código directamente, Access tiene una opción para 'traducir' las macros a VBA y poder ampliarlas sin los limites impuestos.

La ventaja de las macros esta en el férreo control al que las someten los limites impuestos por los diseñadores, en un intento de evitar los estropicios de los que comienzan sus primeros pasos.
En cuanto se avanza se pueden convertir a VBA (código) y ampliarlas sin restricciones (hay una opción en el menú para convertir las macros).

Las 'macros convertidas' se convierten en Funciones que pueden ser utilizadas en su lugar.

Lo que se muestra no es una macro, es una función y de entrada tiene algunas cosas que no son correctas, esto es: no se esta utilizando el tipo de dato correcto, a las variables (v1, v2, v3) se les asigna tipos diferentes siendo todos los datos del mismo tipo.

Si el dato (en origen) es 'tiempo' el tipo de datos correcto no es Variant (que es ambiguo, al estilo de un comodín pero podría funcionar) ni Integer (entero), siendo el dato una Fecha/Hora, el tipo de datos correcto es DATE para todas las variables.

El tipo de dato Variant emula a un 'comodín', esto es: admite cualquier tipo de dato y por definición 'es indefinido'
El tipo de dato Integer aquí no tiene cabida ya que al ser entero no admitirá un numero con decimales y las fechas los tienen cuando hay parte horaria.

El tipo de dato correcto es DATE y como sustituto un tipo Double (que si admite decimales) y en los que su parte entera representa los días y su parte decimal el resto de tiempo que no completa las veinticuatro horas (equivalencia a un numero complejo, por eso hay un dato especifico para las fechas), los datos de tipo Date (Fecha) siguen de forma estricta las reglas consensuadas:
.- sesenta segundos = un minuto
.- sesenta minutos = una hora
.- veinticuatro horas = un día
.- día = la unidad base
.- siete días = semana
.... etc.

No se lo que se pretende calcular u obtener pero si cada día o jornada laboral se ha de cumplir un horario, para saber si se cumplió se suman las horas empleadas y esta suma se compara con el objetivo (que se supone que es el mismo objetivo del día anterior o de un día cualquiera del mes pasado), se pueden sumas las horas y verificar si cumple el objetivo de la semana, mes, año .....
Si cada día el objetivo es diferente, en una tabla se crean los objetivos (para el lunes, martes ... domingo, semana, mes ..) con DLookup se obtiene el deseado y se compara con la suma de ese periodo.

Cuanta mas información aportes mas ayuda podrás obtener y no olvides nunca lo útil que puede ser la tecla F1 para conocer la esencia de Access.
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 Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 18/01/2023 21:48:59
Sería conveniente subiera la estructura de su tabla. No utilice macros para este proceso, reemplácelo por una función que retorne un valor booleano, Respecto a las variables estoy de acuerdo todas deben ser similares y tipo fecha. Si la macro es incrustada no es fácil convertir macros a código. De acuerdo con su pregunta "Me surgen dos problemas ..." lo cual indica que la función debe ser más completa.
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
sin imagen de perfil

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Cristobal (6 intervenciones) el 19/01/2023 15:36:23
Hola buenas, tomé en consideración las mejoras que me comentaron con respecto a los datos y las dejé en tipo double y las fechas tipo date, adjunto la tabla para un mejor entendimiento y el código del modulo con algunos comentarios, lo que espero que se pueda lograr es que se realice esa verificación para cada uno de los campos, ya que al ingresar la casilla de un registro se esta ingresando el valor acumulado de las horas de conducción que ha tenido un vehículo.

En este momento solo estoy probando con el campo del primer vehículo ( Veh1), para poder replicarlo en los demás después, el objetivo que quiero lograr es que tenga un funcionamiento parecido a la regla de verificación que trae la Vista Diseño de la tabla, es decir que se realice la comprobación cada vez que el conductor ingrese las horas acumuladas del vehículo. Muestro el código a continuación.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Validation()
 
' ###Comprobación de horas de servicio para vehiculo 1 (Veh1)###
 
Dim ValorHoy As Double, ValorAyer As Double, V3 As Double, FechaHoy As Date, FechaAyer As Date
 
DoCmd.Save acTable, "Tabla1" 'guardado de tabla cada vez que se ejecute el modulo
 
' Captura de hora de servicio de hoy y el dia anterior
    ValorHoy = DLookup("[Veh1]", "Tabla1", "[Fecha] = Date()")
    ValorAyer = DLookup("[Veh1]", "Tabla1", "[Fecha] = Date() - 1")
 
V3 = ValorHoy - ValorAyer 'Resta entre los dos dias
 
' Comprobación del rango entre la resta de los dos días
If V3 >= 0 And V3 <= 24 Then
     MsgBox "Correcto en Veh1"
Else
    MsgBox ("Corregir en Veh1" & V3), vbExclamation Or vbRetryCancel
 
End If
 
End Sub

Adjunto una imagen de la tabla para mejor entendimiento.

Captura-de-pantalla-2023-01-19-112944
Captura-de-pantalla-2023-01-19-113010

Agradezco la aclaración entre macros y función, en este caso la función busca comprobar que el conductor esta ingresando las horas correctamente entre un rango de 0 a 24 horas, puesto que por día puede que conduzcan distinta cantidad de horas. La idea es que si se da el caso en que ingrese un dato fuera de rango en la casilla, se debería de abrir una advertencia a través de un MsgBox.

Muchas gracias por la ayuda me está contribuyendo bastante.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Anonimo (3316 intervenciones) el 19/01/2023 17:57:15
Para poder validar sea con una macro o con una función se ha de hacer en un formulario (que es el medio correcto parta interactuar con los datos), el formulario no aparece por parte alguna, las consultas no admiten este tipo de validaciones, y las tablas dependiendo del dato se pueden condicionar o no.

Supongo que los vehículos son el elemento a verificar y tendrán mas de un conductor (que lo utilizaran por turnos) y asumiendo que tienen tacógrafo y cada conductor 'su disco', estos datos se tomaran del tacógrafo por lo que los datos deberán ser correctos.

La tabla (en mi opinión) NO es correcta o los datos que se introducen no son horas (y de introducirlas seria en formato decimal, esto es: horas de noventa y nueve minutos, si llegan a cien: los minutos 'se convierten' en una hora más).

Convirtiendo los campos de los vehículos a un dato de tipo fecha/hora y condicionado su formato a hora (larga, mediana o corta), Access establecerá de forma automática los limites, no aceptando mas de 23 horas y/o mas de 59 minutos/segundos (el máximo de producción diaria del vehículo).

Por los datos presentados (en un formato no adecuado) se aprecia que se genera una suma continua que hará (con sus métodos) quien introduzca los datos.

Mi personal punto de vista es que se introduzca (en el formato correcto) el tiempo trabajado ese día y en el pie del formulario la suma de las horas (y si llegamos a este diseño, nos planteamos el presentarlo en un formato personalizado que no convierta en días las horas que superen las 23:59:59).

Si se utiliza una base de datos relacional (sea Access u otra cualquiera), se debería utilizar de forma correcta y no como un block de notas 'diferente'.
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
Imágen de perfil de Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 19/01/2023 22:22:35
Para validar los datos a medida que se van introduciendo necesita un formulario, para este caso en particular, Le preparé este ejemplo:

FORMULARIO PARA INGRESAR DATOS

horas_vehiculo_00

Observe que si intento pasar al siguiente registro me informa el error.

CÓDIGO DEL EVENTO ANTES DE ACTUALIZAR

1
2
3
4
5
6
7
8
9
Private Sub Form_BeforeUpdate(Cancel As Integer)
 
 If Me.NewRecord Then
  If valida_hora(Me.Fecha) = True Then
     Cancel = True
  End If
 End If
 
End Sub


FUNCIÓN A NIVEL DE FORMULARIO PARA VALIDAR

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
Function valida_hora(mfecha As Date) As Boolean
 
  Dim ValorHoy As Double, ValorAyer As Double, V3 As Double, FechaHoy As Date, FechaAyer As Date
  Dim x As Integer
 
  valida_hora = False
 
    For x = 1 To 5
    ' Captura de hora de servicio de hoy y el dia anterior
 
        ValorHoy = Me("veh" & x)
        ValorAyer = Nz(DLookup("Veh" & x, "Tabla1", "[Fecha] = Date() - 1"))
 
        V3 = ValorHoy - ValorAyer 'Resta entre los dos dias
 
        ' Comprobación del rango entre la resta de los dos días
        If V3 >= 0 And V3 <= 24 Then
             MsgBox "Correcto en Veh" & x, vbInformation, "Correcto"
        Else
            MsgBox ("Corregir vehículo Veh" & x & " ... en  " & V3 & " horas"), vbExclamation, "Error..."
            valida_hora = True
            Exit Function
        End If
 
    Next x
 
End Function

Lo que le dicen de las horas es mentira asi como está se entiende que la información ya venía consolida de alguna parte, no obstante, persolamente utilizaría otra estructura, no puede limitar a 5 vehículos, elaboré la función pensando en su pregunta.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Anonimo (3316 intervenciones) el 19/01/2023 23:00:11
Inestimable Eduardo, tu juicio esta equivocado o bien no tienes conocimientos básicos de matemáticas o simplemente hablas por hablar.

Si introduce el tiempo en formato decimal y el tiempo son 3 horas 20 minutos (3,20) al que le suma 2 horas y cuarenta minutos (2,40) la suma que se obtiene aplicando el sistema métrico decimal no obtendrá el mismo resultado que sumando las mismas cifras aplicando el formato establecido internacionalmente para el tiempo.

Pudiera darse el caso que el usuario efectuase una conversión mental entre ambos tipos de dato (pero no plantearía problemas de este tipo, es mas, posiblemente pudiera darnos lecciones a ambos).

Intenta leer con mayor atención o simplemente ofrece tu respuesta sin evaluar las ajenas y cuidadito con el SPAM que suele acompañar a tu variable humor.

No es el primer caso en que he visto calcular así el tiempo extra de trabajo 'porque a su jefe lo quería así (le producía mas beneficio)' y también estaba en ese lado del charco.
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
Imágen de perfil de Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 19/01/2023 23:21:58
No complique la respuesta el usuario no está utilizando formato fecha está refiriéndose a tiempo absoluto en horas y tipo double. No se usted donde estudio las matemáticas, pero si le importa una de mis profesiones es matemáticas puras de la Universidad Nacional de Colombia. Acá no hay problemas porque no están utilizando fracciones de minutos. Y dele con el SPAM cambie su teoría barata y vuelvo a decirle reconozca las respuestas de otras personas así todos aprendemos.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Anonimo (3316 intervenciones) el 20/01/2023 09:19:19
Dado su nivel (el que muestra en sus respuestas) es dudoso que tenga estudios universitarios y mucho menos que sea maestro de algo que no sea su propio ego.

Fantasmas hay en todas partes y el mundo virtual es el medio ideal para inventarse el mundo que no alcanzan.

De tener esa cultura de la que presume (pero no demuestra, solo insulta e intenta ningunear al resto) no le tendría la fobia que demuestra a la teoría (que es la base para avanzar en el conocimiento) y en lugar de decir 'copia esto' (en la búsqueda de 'estómagos agradecidos') le enseñaría como y (lo mas importante): porqué se debería hacer así.

Como esto no va ninguna parte y sus limites están bien claros, siga su camino a ningún destino y si alguien le acompaña en el (que no sea un alias) le será mas entretenido ese viaje sin final.

Y si el autor del hilo quiere o necesita sumar de esa forma, tanto dará que sean horas como que sean salchichas, es de esperar que las fracciones de hora sean computadas como horas completas y no desestimadas por no cumplir los 60 (o cien) minutos.
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
Imágen de perfil de Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 20/01/2023 12:23:52
Discutir con un ignorante es perder el tiempo, su arrogancia lo llevará lejos.... Usted para mi es un mediocre e ignorante en Access lo digo en voz alta, mire por ejemplo sus respuestas en TodoExpertos, prácticamente todas no son tenidas en cuenta, ¿por qué? porque sencillamente no llevan a ninguna solución, solo confunden a los usuarios y como la mayoría son novatos se aprovecha para confundirlos, pero ahí estaré siempre refutando sus burradas.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Anonimo (3316 intervenciones) el 20/01/2023 15:01:56
No vales la pena ni vale la pena intentar un dialogo, sigue en ese camino a ninguna parte.
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
Imágen de perfil de Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 20/01/2023 15:26:08
Es cierto no vale la pena no es fácil hacer que un mediocre entienda.
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

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Cristobal (6 intervenciones) el 20/01/2023 15:57:54
Muchas gracias don Eduardo, me ha quedado claro su explicación, la verdad me ha costado pasar del Excel al Access puesto que tenía un poco mas de dominio con el VBA nada mas y las formulas, de alguna forma siento que los formularios no traen esa simplicidad que trae Excel para poder conectarlos a algún módulo. ¿Usted podría recomendarme algún video o documento para poder entender como es que se conectan los Formularios, Macros y Módulos de forma correcta?, repito muchas gracias y que le vaya bien.
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
Imágen de perfil de Eduardo

¿Se puede ejecutar un macros al rellenar un registro en una tabla de access?

Publicado por Eduardo (317 intervenciones) el 20/01/2023 16:11:35
Escríbame a [email protected] y le ofrezco mis cursos.
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