Un mismo registro de una tabla con procedencia de distintos formularios

Tengo un formulario principal que guarda registros en una tabla. "Al abrir" el formulario me va a un nuevo registro y hay un botón llamado "Siguiente" que me lleva al siguiente registro. El tema es que he hecho un segundo formulario (que se puede acceder con un botón del formulario principal) que registra datos a la misma tabla y no sé que ordenes tengo que poner al abrir y cerrar este segundo formulario para que registre al mismo lugar que el principal.

Por ejemplo, si al abrir el formulario principal está en el registro 2 quiero que al abrir el formulario secundario, introducir los datos y al cerrar que se guarden al registro 2.

1

1 respuesta

Respuesta
2

Fácil, solo has de abrir el segundo formulario en ese registro, usando el parámetro apropiado de Docmd. OpenForm (o de la macro asociada al botón).

Por ejemplo, si tienes un campo ID que identifica inequívocamente cada registro, en tu botón pondrías:

DoCmd.OpenForm "nombreFormulario2",,,"ID=" & Me.ID

Si el campo que identifica el registro fuera, por ejemplo DNI (de texto):

DoCmd.OpenForm "nombreFormulario2",,,"DNI='" & Me.DNI & "'"

Un saludo.


     bit.ly/ForoNkSv 

Si sólo pongo Docmd.Openform "Nombre formulario", no se me abre el formulario limpio sino que me sale un registro anterior. No tengo un campo que asocie de forma inequívoca cada registro.

Muchas gracias

Si solo pones DoCmd. OpenForm "nombreFormulario", se te abrirá el formulario en el primer registro (sería lo normal), salvo que hayas modificado la opción "entrada de Datos" a Sí, que te lo abrirá en uno nuevo, o que el el evento "al abrir" o "al cargar" le digas que se vaya a algún otro registro (nuevo, último...)

Si no tienes forma de identificar individualmente cada registro tienes un problema, porque ¿cómo le dices que quieres ir a ese registro? Lo más sencillo sería que añadieses a tu tabla un campo autonumérico (no te va a influir en lo que ya tengas) y hagas lo que te dije antes.

Otra forma (que a mi no me gusta) podría ser pasarle con OpenArgs el número de posición de registro y en el evento al cargar, decirle que se vaya a ese registro con GoToRecord.

La cosa iría así:

En el botón del primer formulario:

    DoCmd. OpenForm "nombreformulario2",,,,,, Me. CurrentRecord

En el evento "al cargar" del segundo formulario:

    If Len(Me.OpenArgs) > 0 Then DoCmd.GoToRecord , , acGoTo, Me.OpenArgs

Ten en cuenta una cosa: CurrentRecord es una posición relativa y depende, por ejemplo, del orden o del filtro que tenga el recordset. Eso quiere decir que si el primer formulario lo abres filtrado y te devuelve, por ejemplo 5 registros, si estás en el registro 2 de esos 5, al pulsar el botón el segundo formulario te irá al registro 2 de la tabla, que no tiene por qué coincidir con el registro activo en que pulsaste el botón (y con un 99 % de probabilidades no te coincidirá)...

Perdón no sé en que estaba pensando, claro que tengo un identificador por cada registro un campo llamado Idregistro. Lo que he hecho ha sido lo siguiente: 

Botón de abrir el formulario secundario:

DoCmd.OpenForm "Nombreformulario", , , "IdRegistro=" & Me.IdRegistro

Botón de cerrar formulario secundario:

DoCmd.Close

Además en el formulario secundario le he dicho; Entrada de datos: SÍ

Con estas modificaciones sigue haciendo lo mismo, un registro con los campos del principal y me hace otro con los del secundario. Y lo quiero todo junto.

La idea es introducir unos cuantos datos en el formulario principal y en el momento que se desee abrir el otro, rellenarlo y cerrarlo, a continuación acabar de rellenar los datos que falten del principal y una vez hecho esto, se pasaría al siguiente registro con un botón del formulario principal.

Si en el formulario secundario le pones "entrada de datos" en Sí, solo te va a dejar añadir registros, no modificarlos... Si se lo vuelves a poner en No, debería funcionarte.

Perfecto! Resuelto!

Sólo he añadido DoCmd.RunCommand acCmdSaveRecord   antes de abrir el formulario.

Muchas gracias!

Me ha surgido un problema parecido con otro tipo de formulario secundario. Me pasa exactamente igual y es que se me guarda lo que he introducido en el formulario principal en un registro, y lo que he introducido en el secundario, en el siguiente registro de la misma tabla pero ahora en este caso, los botones de apertura y cierre del formulario secundario he puesto los siguientes códigos.

El de abrir:

Private Sub Comando65_Click()
DoCmd.OpenForm "Averias"
End Sub

El de cerrar:

Private Sub Comando4_Click()
DoCmd.RunSQL "Insert Into RegistroProduccion(Maquina,Averia) Values(Form!CmbM?quina, Form!CmbAver?a)"
DoCmd.Close

End Sub

Creo que es el Insert to que hace que se cree un nuevo registro debería conectar esto con el IdRegistro de la tabla, cosa que no sé como hacer.

Si usas una SQL de tipo INSERT INTO ..., le estás diciendo: "añade un registro NUEVO a la tabla...", y por eso te crea un registro nuevo en vez de seguir guardando en el mismo...

Si lo vas a hacer con consultas de acción, tienes que usar una consulta de actualización : "UPDATE Tabla..." (https://www.w3schools.com/sql/sql_update.asp ) Ten en ceunta que obligatoriamente has de usar una condición WHERE para indicar el registro que vas a actualizar, pues si no la usas, te actualizará todos los registros con los mismos datos.

No me ha funcionado lo del Update porque seguro que he usado algo mal (por falta de experiencia).

Intuyo que este código del Update se tiene que introducir Al hacer click en el botón de salida del Formulario secundario?

Private Sub Comando4_Click()
DoCmd.SetWarnings False
DoCmd.RunSQL "Update Registroproduccion SET Maquina = '" & Me.CmbMaquina & "', Averia = '" & Me.CmbAveria & "' WHERE IdRegistro='" & Me.IdRegistro & "'"
DoCmd.Close

End Sub

Dónde:

Registroproduccion es la tabla donde se introducen los datos de los registros

Maquina y Averia son los campos de la tabla donde quiero introducir los datos

CmbMaquina y CmbAveria son los cuadros combinados del Formulario secundario  

IdRegistro es el identificador (autonumerico) de cada registro.

No tengo claro qué tengo que introducir en el WHERE para referirme al registro al que quiero ir.

Gracias!!

A priori tu instrucción SQL es correcta.

En la parte del WHERE tienes que poner primero (antes del igual) el campo en que vas a buscar el registro a actualizar, y luego el valor a buscar que identifica ese registro.

Si me pones un ejemplo me harías un favor ya que no entiendo lo del valor a buscar que identifica el registro, seria algo así?

WHERE Maquina AND Averia = " & Me.IdRegistro & "'"

El AND seria porque voy a buscar dos campos.

(Con esta expresión hay algo que no funciona ya que no se me registran los datos del formulario secundario)

Ok, te pongo varios:

1º/ quieres que te actualice el registro cuyo ID sea el 5:

"UPDATE .... WHERE ID=5"

2º/ Que actualice el registro cuya máquina es la NWA31B:

"UPDATE ... WHERE Maquina='NWA31B'" 'Fijate que los textos van entre comillas simples

3º/ Que actualice el registro cuya FAveria sea el 02/10/2018:

"UPDATE .... WHERE FAveria=#10/02/2018#"    'Fijate que las fechas van entre almohadillas y en formato americano

4º/ Que actualice el registro cuya máquina es NWA31B y averiado hoy:

"UPDATE .... WHERE Maquina='NWA31B' AND FAveria=#10/08/2018#" 

5º/ Que actualice el registro cuyo id coincide con el del campo txtID del formulario:

"UPDATE .... WHERE ID=" & Me.txtID

6º/Que actualice el registro cuya máquina es la que tienes en el cuadro combinado cboMaquina

"UPDATE .... WHERE Maquina='" & Me.cboMaquina & "'"

7º/ Que actualice todos los registros cuya fecha de avería fue ayer:

"UPDATE .... WHERE FAveria=#" & Format(Date()-1,"mm/dd/yyyy") & "#"  

8º/ Que actualice la maquina y la avería que tienes en los cuadros combinados cboMaquina y cboAveria de tu formulario:

"UPDATE .... WHERE Maquina='" & Me.cboMaquina & "' AND Averia='" & Me.cboAveria & "'"

Y así cualquier combinación que se te ocurra. Solo has de poner en la parte izquierda el campo (o campos) por el que vas a limitar la actualización, y en la parte derecha, el valor o de dónde cogerlo en un formulario

Y para decirle que lo tiene que introducir en el registro del formulario principal?

Llevas todo el rato hablando de formularios principales y formularios secundarios, pero no tengo nada claro a qué te refieres con ello ¿son dos formularios simples? ¿Es un formulario con subformulario?...

Además, para hacer referencia a un control de un formulario (o subformulario) hay que saber desde dónde se hace referencia, pues la sintaxis es diferente.

Por ejemplo:

.-Si el control está en el mismo formulario que donde escribes el código, lo haces con Me. NombreControl (como en todos los códigos que te envié anteriormente)

.- Si estás en un subformulario, para hacer referencia a un control del formulario principal: Me. Parent. NombreControl

.- Si estás en un formulario formX, para hacer referencia a un control de un formulario formY: Forms("formY"). NombreControl

En este enlace tienes todas las posibilidades: http://www.llodax.com/Tutoriales/SintaxisForms.htm 

Son dos formularios, uno que es el principal y otro (el secundario) que se accede mediante un botón que se encuentra en el principal. Los dos tienen el Origen de registro a la misma tabla y en esta tabla hay un identificador de registro "IdRegistro". En el WHERE tengo que decirle al formulario secundario que registre los datos en el mismo numero de registro que se encuentra el formulario principal, es decir, en el último registro (ya que cuando se abre el formulario principal siempre va a un Nuevoregistro). 

Pues entonces tu WHERE tiene que ser así:

....WHERE IdRegistro=" & Me.IdRegistro

Porque entiendo que ele id es un campo numérico.

Perfecto! Solucionado!

Muchas gracias!

¡Por fin lo conseguimos, je je!

Me alegra que ya esté solucionado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas