Cuadro de texto basado en una consulta en formulario Access 2010

Tengo un formulario basado en varias tabla relacionadas. La principal tiene tres campos hora/fecha; Fecha, Hora entrada y Hora salida. Sobre esta tabla hice una consulta que mediante una macro me calcula las horas trabajadas. Al hacer un formulario basado en la tabla principal he creado dos campos, horas trabajadas y horas nocturnas. En propiedades le digo que el origen de control es la macro y como error me arroja ¿Nombre?. Lo mismo ocurre si le indico que el origen es la consulta en sí misma. He revidado todo y no encuentro cual puede ser el problema.

2 Respuestas

Respuesta
3

Exactamente ¿a qué te refieres con que calculas en una consulta las horas con una macro? Que yo sepa, en una consulta no puedes usar macros (entendidas como las trata Access), sino sólo expresiones (con las operaciones y funciones incorporadas) en un nuevo campo calculado o una función personalizada que hayas creado previamente en VBA.

Por otro lado, como origen de un control en un formulario solo puedes poner: el nombre de un campo (de una tabla o consulta), una expresión (con las operaciones y funciones incorporadas) o una función personalizada (vamos, lo mismo que para las consultas), pero no el nombre de una macro, porque las macros no devuelven ningún valor.

En todo caso, si ya tienes el cálculo hecho en la consulta, usa esa consulta en vez de la tabla en el formulario, y así le puedes poner como origen de control el nombre de ese campo de la consulta y ya te mostrará los datos.

Otra opción es que uses la función DBúsq() en el origen de control (o DLookUp, si lo haces por código) para buscar y traer el dato que te interesa.

Y otra opción más es que como origen de control hagas lo mismo que en la consulta para calcular las horas (de nuevo entiendo que usas una función o una expresión como [Hora salida]-[Hora entrada] o DifFecha("h";"[Hora entrada];[Hora Salida]) o similar)

Gracias por su ayuda. Para calcular tanto las horas nocturnas como las trabajadas uso una macro creada por usted. Después de mucho buscar encontré algo perfecto para mi objetivo. Este es el encabezamiento, no lo pongo todo pues no se si quiere que lo haga.

' Procedimiento: fncHorasNoche
' Autor: Sveinbjorn para www.todoexpertos.com
' Fecha: 22/07/2015
' Descripción: Función que devuelve las horas en horario nocturno
' (entre las 22 y las 6 horas)

Esto me permite calcular las horas nocturnas y trabajadas. El problema lo tengo al intentar que en un formulario la información quede reflejada. Le doy como origen de los datos la consulta y no la tabla, el resultado es un error. No sé como solucionarlo.

Pues no sé como lo estás haciendo, pero en el ejemplo que acompaña al código (http://neckkito.xyz/nck/index.php/miscelanea/aportaciones y busca Horas nocturas o Horas por turnos) el formulario está basado sobre una consulta exactamente igual que la tuya y funciona sin problemas.

Si quieres sube una copia de tu BD, con un par de datos inventados y le hecho un ojo, pero si en la cosnutla la función te funciona, el problema está en otro lado

Por ir mirando cosas: en el cuadro de texto que te da error, ¿qué le pones como origen de control? Tendría que ser los mismos nombres que tienes en la consulta.

También puedes hacer la prueba y crear un formulario sobre la consulta usando el asistente ( luego ya le das el formato que quieres) y lo comparas con el tuyo, a ver si encuentras alguna diferencia que explique el error...

Gracias por tu inestimable ayuda. Ya tengo solucionado el problema del calculo de horas. He reorganizado todo desde cero y ahora funciona bien. He basado el formulario en la consulta. Ahora me surge otro inconveniente. El formato en el que me devuelve la consulta el resultado de la diferencia entre la Hora entrada ( 8:45 ) y Hora salida ( 20:15 ) es tipo número ( 11,5 ). He probado a dar formato en propiedades del cuadro de texto: hora corta, hora mediana...... el resultado es un redondeo a ( 12:00 ) y no las ( 11:30 ) horas reales de trabajo. No sé como solucionarlo, he buscado por la red y no encuentro nada que me de solución . 

Puedes hacerlo así, en la propia consulta, cambiando la expresión del campo de las horas nocturnas (lo mismo te vale con las otras) por esta otra:

 Format(CFecha(fncHorasNoche([HoraEntrada];[HoraSalida])/24/60);"hh:nn:ss")

o añadiendo un nuevo campo a tu consulta como:

 Format(CFecha([HorasNoche])/24/60);"hh:nn:ss")

GRACIAS, mil gracias. 

He tenido que modificarlo un poco para que no me cuente los segundos, no me son necesarios; Format(CFecha(fncHorasNoche([Hora Entrada];[Hora Salida])/24);"Hora corta").

Pero es justo lo que necesito. De nuevo GRACIAS. 

Ahora, permíteme que siga abusando de tu tiempo y saber. En mi trabajo, el tiempo que va desde las 22:00 horas del viernes a las 23:59:59 horas del domingo, cuenta como horas festivas. ¿Es posible calcular este tiempo?. Por ejemplo: un viernes de 20:00 a 04:00 tiene 8:00 horas de trabajo, pero solo 6:00 son en tiempo festivo. El sábado todo el tempo es festivo. El domingo, 22:00 a 06:00 son 8:00 horas de trabajo pero solo 2:00 son festivas. (A tener en cuenta que los turnos de trabajo pueden variar, esto es solo un ejemplo).  Los festivos que no caen en fin de semana los calcularé de forma manual, a menos que también se pueda hacer. 

Espero que esto no sea mucho jaleo. Solo dime si es posible y seguiré buscando. Hasta ahora no encontré nada.

Gracias de nuevo. 

Claro que es posible, solo necesitas hacer una función siguiendo el esquema de las que calculan las horas trabajadas y las nocturnas.

Tienes la función WeekDay() para saber qué día de la semana es una fecha.

Y tendrás que modificar la función de horas nocturnas para que no te las calcule en ese tramo (de nuevo usando Weekday).

A ver si te sale.

Y no te olvides de valorar la respuesta, ;-D

Respuesta
1

Juan Manuel, no uso consultas( a menos que sea estrictamente necesario) ni macros(nunca). Pero por si te sirve te lo explico en código y no necesitas consultas. Como tampoco sé a que llamas horas nocturnas, ni como las calculas, ni que es lo que hace la macro. Como he supuesto que son a partir de las 22:00. Si tengo el formulario

Como puedes ver, en el primer caso me calcula las horas trabajadas, pero como la salida es antes de las 22:00 no hay horas nocturnas. En los otros dos sí

El código del evento Después de actualizar del cuadro de texto HoraSalida es

Private Sub HoraSalida_AfterUpdate()
If HoraSalida < HoraEntrada Then
HorasTrabajadas = HoraSalida + 1 - HoraEntrada
Else
HorasTrabajadas = HoraSalida - HoraEntrada
End If
If HoraSalida > #10:00:00 PM# And HoraSalida < #11:59:59 PM# Then
HorasNocturnas = HoraSalida - #10:00:00 PM#
ElseIf HoraSalida < HoraEntrada Then
HorasNocturnas = (#11:59:59 PM# - #10:00:00 PM#) + (HoraSalida + 1 - #11:59:59 PM#)
End If
End Sub

Hola Gracias por tu ayuda. Te explico, esta BD gestiona mi tiempo de trabajo. Mis turnos de trabajo varían entre mañana, tarde y noche. Las horas nocturnas son las comprendidas entre las 22:00 y las 06:00. Mediante un código puedo calcular tanto las horas trabajadas como las que son en horario nocturno, todo ello a través de una consulta. Luego en el formulario inserto un cuadro de texto para que me arroje el resultado de la consulta, o eso pretendo. 

Vamos a suponer que ese cuadro de texto se llama HN(abreviatura de Horas Nocturnas)

Al no saber como está construido el formulario tengo que suponer. En algún evento, por ejemplo, al abrir, al activar registro, al recibir el enfoque, etc podrías poner

HN=dlookup("horasnocturnas","nombreconsulta","y aquí iría el criterio que diferencia un registro de la consulta de otro")

Por ejemplo( pero insisto en que no sé como es el formulario)

HN=dlookup("horasnocturnas","nombreconsulta","Empleado=""Pepe"" and year([fechatrabajo])=2020")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas