Formulario independiente editable con registros de dos tablas

Leyendo algunos temas del foro puede ver como crear un formulario independiente que inserta registros en dos tablas relacionadas de una a varios, clientes y pedidos.

Ahora lo que me gustaría es tener un formulario similar para llamar a un registro específico de la tabla pedidos con un textbox, y luego poder editar y guardar los cambios con un botón.

Supongo que es una consulta sencilla pero he buscado y no encontré una solución para formularios independientes que permitan editar registros de dos tablas relacionadas.

2 respuestas

Respuesta
2

Puedes poner un combinado llamado, por ejemplo, ElegirProducto, donde selecciones el nombre de un producto, su id, o lo que sea, y los cuadros de texto, por ejemplo, TextoA, TextoB, TextoC...

Y en las propiedades del combinado - Eventos - Después de actualizar crear un procedimiento de evento y poner

textoA=dlookup("categoria","productos","producto='" & me.elegirproducto & "'")

TextoB==dlookup("precio","productos","producto='" & me.elegirproducto & "'")

Etc

También podrías usar un

me.recordsource="select...

Pero al no saber como es ese formulario que quieres crear no te puedo decir más.

Luego, o bien en cada cuadro de texto TextoA, TextoB, ... en sus propiedades-eventos-Después de actualizar crear un procedimiento de evento y poner

Docmd. Setwarnings false( es para que no aparezca la ventanita de "Va a actualizar...)

docmd.runsql"update productos set categoría ='" & me.TextoA & "' where producto='" & me.elegirproducto & "'"

O lo podrías hacer todo de golpe con un botón de comando

Docmd.setwarnings false

docmd.runsql"update productos set Categoria='" & me.textoA & "', precio=" & me.textob & "... where producto=" & me.elegirproducto & "'"

Por eso sería conveniente que precisaras lo que quieres hacer, o como sería ese formulario.

Muchas gracias por la respuesta, hice rápido un formulario para intentar hacer más clara la idea.

Una solución que vi por aquí incluía utilizar una cadena inner join.

Intenté llamar a ambas tablas con un inner join que vincula las tablas proveedores y productos filtrando el valor ingresado en el txt (id del producto).

Mi intención es traer ese registro específico (id producto) y poder modificar los registros de ambas tablas por si hubo errores en la carga tanto de proveedores como de productos (ya que el ingreso también es simultáneo).

Al ser un formulario independiente el inner join del código que vi no rellena los campos excepto que ponga como origen los campos correspondientes de las tablas, lo que tiene dos problemas, por una parte no puedo utilizar un botón guardar como en el formulario de ingreso (razón para hacer los formularios independientes) y además al intentar cerrar el formulario sale un cuadro de conflicto de escritura con tres botones.

El formulario es algo así (tiene más campos):

El código que vi y que no pude hacer funcionar del todo es:

Private Sub Comando45_Click()

'If txteditar <> "" Then 

Me.RecordSource = SELECT Proveedores.Id_Cliente, Proveedores.Nombre, Proveedores.Direccion, Proveedores.Telefono, Productos.*, Productos.Id FROM Proveedores INNER JOIN Productos ON Proveedores.IdCliente = Productos.IdCliente WHERE (((Productos.Id)=[Formularios]![Editar]![txteditar]));

End If

If txteditar = "" Then

MsgBox "Ingresar Id", vbOKOnly, "Error"

txteditar.SetFocus

End If

If Me.RecordsetClone.RecordCount = 0 Then

MsgBox "El registro no existe", vbOKOnly, "Error"

End If

Exit Sub

End Sub

Private Sub Comando45_Click()
'If txteditar <> "" Then  
Me.RecordSource = SELECT Proveedores.Id_Cliente, Proveedores.Nombre, Proveedores.Direccion, Proveedores.Telefono, Productos.*, Productos.Id FROM Proveedores INNER JOIN Productos ON Proveedores.IdCliente = Productos.IdCliente WHERE (((Productos.Id)=[Formularios]![Editar]![txteditar]));
End If
If txteditar = "" Then 
MsgBox "Ingresar Id", vbOKOnly, "Error"
txteditar.SetFocus 
End If
If Me.RecordsetClone.RecordCount = 0 Then 
MsgBox "El registro no existe", vbOKOnly, "Error"
End If
Exit Sub
End Sub

En mi opinión no te puede funcionar, porque los cuadros de texto son independientes. Me explico, si tengo una tabla Productos como en la imagen

y una tabla Proveedores

Si construyo un formulario independiente como el de la imagen

Cuando elija un producto no hace nada, y eso que le tengo puesto en el evento Después de actualizar del cuadro combinado ElegirProducto

Private Sub ElegirProducto_AfterUpdate()
Me.RecordSource = "SELECT Productos.IdProducto, Productos.Producto, Productos.Existencias, Productos.Precio," _
& "Proveedores.IdProveedor, Proveedores.NombreProveedor, Proveedores.Direccion, Proveedores.Poblacion " _
& " FROM Proveedores INNER JOIN Productos ON Proveedores.IdProveedor = Productos.IdProveedor where idproducto=" & Me.ElegirProducto & ""
End Sub

El inner join que decías. Pero no funciona porque los cuadros de texto no tienen origen de control. Y si le pusieras origen de control, cuando abrieras el formulario te aparecería( te lo pongo en 2)

Porque busca y no encuentra ese valor por ningún lado, el formulario no tiene origen de registros.

Ahora bien, si los cuadros los pones como ocultos hasta que elijas un producto en el combinado entonces sí. Como sería el caso

Y te mostraría

Pero, y aquí está el famoso pero, no te dejaría modificar nada, ya que las consultas donde interviene más de una tabla no son modificables. Es decir, esos cuadros de texto están bloqueados.

Por todo eso te decía que lo mejor es lo de

Idproveedor=dlookup("idproveedor","productos","idproducto=" & me.elegirProducto & ""

Etc

Lo pongo así porque la columna dependiente del combinado es la de idproducto pero está oculta.

Y una vez que has modificado algo en un cuadro de texto usar lo de

Docmd.runsql"update...

Ese código que viste lo usa con un formulario con el origen de registros en la consulta de unión.

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

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

Respuesta
1

Si adiciona una imagen al respecto nos ayudaría bastante.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas