¿Cómo guardar en tabla access con una estructura personalizada?

Estoy creando un access en el cual debo registrar las actividades de mis compañeros de forma semanal y por rangos de tiempo de 15 minutos.

Ejemplo del formulario:

Pero necesito registrar los datos anteriores  en la siguiente estructura:

No se como hacer un registro en filas diferentes con la información selecciona en cada cuadro combinado y que además en la misma línea se registre el nombre del funcionario, día de la semana, la hora y la actividad.

2 Respuestas

Respuesta
1

Poder se puede hacer, de muchas maneras, pero todo depende en gran medida de cómo hayas llamado a los distintos elementos de tu formulario.

Por mostrarte la opción más "automatizada posible": http://www.filebig.net/files/cntBRkJHcW 

¡Gracias! Esta excelente!!! 

Buenos Días

 Adapte tu ejemplo al que estoy haciendo, pero se me presento un problema al momento que deseo editar alguna actividad de la semana.

No sé como hacer, para que se muestre en el formulario todas las actividades que se encuentran registradas a cada funcionario.

Al ejemplo anterior, le agregué el campo "semana", ya que existen algunos compañeros que las actividades cambian de forma semanal(semana1, semana2, semana3 y semana4).

Los formularios de actualización que tengo en otros Access, toda la información esta en una fila, se busca por identificación y con solo dar doble click en un cuadro de lista se mostraban los datos y podía editarlos.

Utilizaba lo siguiente:

Pag2 = es la página del Control de pestaña

indexKey = es un campo tipo autonumeracion en la tabla

LTS_Lista_Semanas = es un cuadro de lista

DoCmd.GoToControl "Pag2"
Me.Filter = "indexKey =" & Me.LTS_Lista_Semanas
Me.FilterOn = True

Y cada cuadro de texto del formulario en Origen del control, estaba al campo de la tabla, de esa forma al dar doble click ya se cargaban los datos.

Necesito ayuda para poder buscar y editar las actividades en este otro Access.

Este sería el formulario que tengo para editar:

De antemano les agradezco la valiosa ayuda

Como el formulario no depende directamente de la tabla, la solución está en usar la función DLookup para traer los datos a cada uno de los cuadros combinados de las actividades.

En el DLookup tendrás que buscar el campo actividad en la tabla que coincida con los cinco criterios (Código, funcionario, día, semana y hora), algo como esto, para el lunes a la 6:00 (y el resto igual cambiado el día y la hora):

Me.Combinado1=DLookup("actividad","tblact","semana='" & Me.lstSemana & "' AND funcionario='" & Me.cboFuncionario & "' AND dia_semana='lunes' AND hora=#00:6:00 am# AND codigo=" & Me.cboCodigo )

Gracias por tu rápida repuesta y esta perfecta, busca las actividades muy bien!!

Con los otros Access que tengo, en el botón Actualizar tengo este código:

Me.Refresh
DoCmd.RunCommand acCmdSaveRecord

y se actualizaban los datos.

Pero en este Access no me funciona, se debe usar algún otro código ?

No te funciona porque tratas de aplicar a un formulario independiente los mismos procesos que usarías en un formulario dependiente de una tabla. Al no tener un origen de control el formulario, esas dos lineas no hacen nada, la primera porque no tiene de dónde acualizar y la segunda porque no tiene dónde guardar.

Si quieres actualizar los datos, debes usar el DLookup, y para guardar los datos, el código de mi primera respuesta si son registros nuevos o con una SQL de tipo UPDATE en vez de tipo INSERT INTO si son modificaciones de registros ya existentes

Hola

Gracias por tu ayuda.

Intente hacer el UPDATE pero me da un error:

Dim i As Integer, j As Integer
For j = 1 To 3 
For i = 1 To 4 
CurrentDb.Execute "UPDATE tbl_act(hora,dia_semana,num_semana,cod_funcionario,dsc_servicio,dsc_depart,actividad) " _
& "VALUES(#" & Me.Controls("hora" & Format(i, "00")).Caption & "#,'" & WeekdayName(j) & "','" _
& Me.txt_semana & "','" & Me.txt_Cod_Func_buscar & "','" & Me.txt_Servicio_buscar & "','" & Me.txt_departa & "','" & Me.Controls(Replace(WeekdayName(j) & Format(i, "00"), "é", "e")) & "')"
Next i
Next j

se marca todo el código en amarillo.

Intente hacer el update de la siguiente forma:

CurrentDb.Execute "UPDATE tbl_act SET actividad='" & lunes01 & "'"

lunes01 =nombre del cuadro combinado donde están las actividades

Si  se actualizó la actividad, que encontró el DLookup con el que me ayudaste, pero el problema fue que  se modificaron  todos los registros que existían en la columna ACTIVIDAD

busqué,si existe alguna forma de combinar el DLookup con el UPDATE pero hasta el momento no encuentro algo funcional y no entiendo como hacerlo.

La sintaxis de una SQL de tipo UPDATE no es la que has usado en primer lugar (no puedes cambiar INSERT por UPDATE y ya...), sino ésta: https://www.w3schools.com/sql/sql_update.asp

Y para que no te pase como con la segunda que has usado, lógicamente tienes que indicar qué registro concreto quieres actualizar (con la parte del WHERE), pues de lo contrario se entiende que quieres actualizar toda la tabla.

¡Gracias! 

Sin el WHERE no hubiera logrado actualizar, gracias por tu valiosa ayuda.

El UPDATE quedo de la siguiente forma:

CurrentDb.Execute "UPDATE tbl_act SET actividad='" & lunes01 & "' where  num_semana='" & Me.txt_semana & "' AND funcionario='" & Me.txt_Dsc_funcionario_buscar & "'AND dia_semana='lunes' AND hora=#06:00 am# AND cod_funcionario=" & Me.txt_Cod_funcionario_buscar & ""

Hola

Ya le puse el código para todos los cuadros combinados, pero ahora me da este error:

Lo que se me ocurrió, fue, hacer 5 botones y en cada uno colocar el código de cada día de la semana y luego desde otro botón llamar los eventos de esos 5 botones.

Si existe alguna otra forma de hacerlo, agradezco la ayuda, ya que en este caso es la primera vez que me da ese error y es lo que se me ocurrió hacer.

Nunca había visto ese error... Pero no necesitas tener los 5 botones, puedes poner 5 procedimientos sin asociar a nada para los 5, y luego los llamas desde tu botón.

¡Gracias!  eso es lo que mejor hice!!

Buenas Tardes

El código para registrar me estaba funcionando bien, pero ya me empezó a dar problemas y no esta guardando.

Lo único que le modifique fue que le puse un 96 por la cantidad de controles( For i = 1 To 96) y coloque un 7 para todos los días de la semana(For j = 1 To 7).

Dim i As Integer, j As Integer
For j = 1 To 7 ' Aqui poner  los  días
    For i = 1 To 96  'Aquí poner el número de cuadros de actividades
        CurrentDb.Execute "INSERT INTO tbl_act(hora,dia_semana,usuario_registra,num_semana,cod_funcionario,funcionario,dsc_servicio,dsc_especialidad,actividad) " _
                            & "VALUES(#" & Me.Controls("hora" & Format(i, "00")).Caption & "#,'" & WeekdayName(j) & "','" _
                            & Forms!frmRegistro!txt_usuario_registra & "','" & Forms!frmRegistro!txt_num_semana & "','" & Forms!frmRegistro!txt_Cod_Medico & "','" & Forms!frmRegistro!txt_Dsc_Medico & "','" & Forms!frmRegistro!txt_Servicio & "','" & Forms!frmRegistro!txt_Especialidad & "','" & Me.Controls(Replace(WeekdayName(j) & Format(i, "00"), "é", "e")) & "')"
Next j

El problema será porque son demasiados controles ?

estoy intentándolo, haciendo un formulario para cada día de la semana, pero solo le cambié

(For j = 1 To 7 ' Aqui poner  los  días) el 7 por un 1, pero no guarda nada y si dejo el 7, solamente me guarda la información de 48 controles y no de los 96 controles

De antemano le agradezco la ayuda que me puedan brindar

Te falta un Next i antes del Next j

Gracias por tu respuesta 

Cuando copie el código a mi pregunta, sin querer lo borré. 

Pero en mi access si esta el Next i. 

Igualmente sigue dando el error, a lo que estuve leyendo es que me da ese error porque son 672 cuadros combinados en ese formulario. 

Por eso estaba tratando de hacer  7 subformularios, uno por cada día de la semana. 

Pero pensé en quitar el For j =1 to 1 y que en el formulario de lunes guarde la palabra 'Lunes', hasta el momento no lo logro hacer 

hice las siguientes  pruebas :

caso 1: Abro el formulario y le he creado un botón para que me llene todos los cuadros combinados(672) de forma automática, con el siguiente código:

Dim a As Byte
a = 0
For Each Control In Form.Controls
If Control.ControlType = acComboBox Then
If IsNull(Control) Or Control = "" Then
a = a + 1
Control.Value = "Fuera de Horario"
End If
End If
Next

luego, hago clic en el botón guardar y todo se guarda perfecto.

Caso 2: vuelvo abrir el formulario, empiezo de forma manual a seleccionar una a una cada actividad, pero al seleccionar la actividad 130 me empieza a dar el error "no se pueden abrir más bases de datos" y el cuadro combinado no despliega mas la lista de actividades.

Algo pasa al hacer lo mismo(desplegar la lista) 130 veces.

Y la forma correcta de llenar el formulario es como lo hice en el Caso 2.

me llamo la atención que cuando me dio el error, abrí el formulario en vista diseño, luego lo volví abrir en vista formulario sin hacerle ningún cambio y ya pude continuar llenando las siguientes actividades(las que están después del cuadro combinado 130)

A mi me da que el problema está en que has excedido del número de controles que admite un formulario. Según las especificaciones de Microsoft (https://support.microsoft.com/es-es/office/especificaciones-de-access-0cf3c66f-9cf2-4e32-9568-98c1025bb47c ), el número de controles y secciones que se pueden agregar a lo largo de la vida del formulario o informe es de 754. Según lo entiendo, no es necesario que el formulario tenga los 754 controles, sino que basta con que hayas llegado a ese número aunque se hayan borrado.

En cualquier caso, tener 672 cuadros combinados en un formulario (más las etiquetas y otros controles), no me parece la mejor opción.

Yo hubiera resuelto el problema con muchísimos menos controles: uno para elegir o escribir el trabajador, otro para el día, otro para la hora y otro para la actividad, y un botón para pasarlo a la tabla. Luego siempre puedes hacer un formulario con ese diseño o parecido para mostrar el planning semanal.

La mayor dificultad (que tampoco lo es tanto) es controlar que no se repitan las horas el mismo día para un trabajador.

Respuesta
1

Si quieres, repito, si quieres, mándame un mensaje, sólo el mensaje, a [email protected] y te mando un ejemplo de como lo haría.

Si lo haces, en el asunto del mensaje pon tu alias RMendez, ya que si no sé quien me escribe ni los abro.

¡Gracias!  Esta muy interesante!!!

Buenos Días

El código para registrar me estaba funcionando bien, pero ya me empezó a dar problemas y no esta guardando.

Lo único que le modifique fue que le puse un 96 por la cantidad de controles( For i = 1 To 96) y coloque un 7 para todos los días de la semana(For j = 1 To 7).

Dim i As Integer, j As Integer
For j = 1 To 7 ' Aqui poner  los  días
    For i = 1 To 96  'Aquí poner el número de cuadros de actividades
        CurrentDb.Execute "INSERT INTO tbl_act(hora,dia_semana,usuario_registra,num_semana,cod_funcionario,funcionario,dsc_servicio,dsc_especialidad,actividad) " _
                            & "VALUES(#" & Me.Controls("hora" & Format(i, "00")).Caption & "#,'" & WeekdayName(j) & "','" _
                            & Forms!frmRegistro!txt_usuario_registra & "','" & Forms!frmRegistro!txt_num_semana & "','" & Forms!frmRegistro!txt_Cod_Medico & "','" & Forms!frmRegistro!txt_Dsc_Medico & "','" & Forms!frmRegistro!txt_Servicio & "','" & Forms!frmRegistro!txt_Especialidad & "','" & Me.Controls(Replace(WeekdayName(j) & Format(i, "00"), "é", "e")) & "')"
Next j

 El problema será porque son demasiados controles ?

De antemano les agradezco la ayuda que me puedan brindar

Este es el error que me está dando:

Buenas Tardes

quería consultarle si a tu ejemplo se le puede bloquear la cantidad de registros? Por ejemplo si la última hora es 5:45am no permita ingresar más actividades.

gracias por la ayuda 

¿Le has puesto Next i? La respuesta es no.

for  j=...

           for i=....

                    ......

           next i

next j

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas