Como evitar modificar datos de consultas

Tengo un formulario que se alimenta de una consulta que involucra varias tablas.

Digamos que en la tabla principal (tareas) tengo un idUsuario que indica a qué usuario se asigna una tarea.

La consulta tiene vinculada la tabla usuarios y lo que pretendo es mostrar como resultado de la consulta tanto tareas. IdUsuario como usuarios. NombreUsuario.

En un formulario tengo una lista que cargo con todos los usuarios pero que se muestra seleccionado el nombre de usuario que corresponde a tareas. IdUsuario.

El problema es que si cambio en esta lista el usuario, automáticamente me guarda el cambio en la base de datos cuando yo lo que quiero es que se guarden al pulsar un botón Guardar. ¿Cómo puedo bloquear la actualización automática del registro?

Y voy a más, en lugar de modificarse el campo tareas. IdUsuario lo que se actualiza es usuarios. NombreUsuario.

¿Se os ocurre algo de que puede estar pasando?

Respuesta
2

Si el formulario depende de la tabla, y por tanto los controles, sean cuadro de texto, etc. cuando cambies algún valor te lo cambiara en la tabla.

Soluciones

1º O creas un formulario independiente

2 Deja el origen del control en blanco, que siempre estás a tiempo de usar una instrucción

Docmd. Runsql"update nombretabla

ó

Docmd.runsql"insert into nombretabla....

Personalmente te aconsejaría la primera solución. Ya que, por ejemplo, seleccionas en un combinado el nombrecliente, y en los demás cuadros de texto puedes usar

Dirección=dlookup("direccion","clientes","nombrecliente='" & me.nombredelcombo & "'")

telefono=dlookup(....

y luego, cuando quieras puedes decirle

Docmd.runsql"insert into Clientes(......)values(......)"

En fin, si pudieras poner una imagen de la tabla y del formulario, sería más fácil decirte algo más concreto.

Gracias por la contestación.

Ahora mismo lo que he hecho es vincular el formulario a la consulta y una vez rellenos los campos con los resultados de la consulta he dejado en blanco el origen de datos......pero no creo que sea muy correcto esto, ¿no?

Lógicamente luego tendría que hacer un update de los campos con un docmd.runqsl....update....

La segunda opción que planteas sería sacar los datos uno a uno y guardarlos en los campos del formulario, y sería muy tocho el codigo....pero creo que más correcto.

Es muy sencillo. Al no saber como es la consulta voy a usar la tabla Clientes. Con ella creo un formulario (da igual que sea único o continuo), al que le voy a añadir un combinado llamado ElegirCliente, con las columnas IdCliente y cliente de la tabla. Sólo muestra la segunda columna pero la dependiente es la de Idcliente

Selecciono uno, en este caso Comercio Mineiro y automáticamente

Como en este caso, el formulario tiene el origen de registros en la tabla, si modifico algo, automáticamente me queda reflejado en la tabla.

Vamos a suponer que el formulario lo hago independiente de la tabla (aprovecho el mismo quitándole el origen de registros al formulario y el origen del control a los cuadros de texto pero les dejo el mismo nombre del control. Selecciono uno

En cuanto lo selecciono

Ahora voy a cambiarle el valor del control Ciudad.

Como el formulario es independiente tengo que decirle que guarde esa modificación en la tabla. Cuando pulso Guardar modificación

En el caso del formulario independiente, en el evento Después de actualizar del combinado ElegirCliente le digo

Private Sub ElegirCliente_AfterUpdate()
For Each Control In Form.Controls
If Control.ControlType = acTextBox Then
Control.Value = DLookup("" & Control.Name & "", "clientes", "idcliente=" & Me.ElegirCliente & "")
End If
Next
End Sub

Es decir, que para cada textbox busque en la tabla Clientes el valor del campo que tenga el mismo nombre que el cuadro de texto, en aquel registro en que Idcliente sea igual al que acabo de elegir en el combinado.

Y si he efectuado algún cambio y quiero guardarlo, en el evento Al hacer clic del botón le he puesto

Private Sub Comando13_Click()
DoCmd.SetWarnings False
DoCmd.RunSQL "update clientes set cliente='" & Me.Cliente & "', nombrecontacto='" & Me.NombreContacto & "', dirección ='" & Me.Dirección & "'," _
& "ciudad='" & Me.Ciudad & "',pais='" & Me.Pais & "' where idcliente=" & Me.ElegirCliente & ""
End Sub

El primer Docmd.set.... es para que no aparezca la maldita ventanita de "Va a actualizar....

De todas formas, si quieres el ejemplo, que siempre se ve mejor, repito, si quieres, mándame un mensaje ( sólo el mensaje) a [email protected] y te mando el ejemplo,

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas