Access - Actualizar campos dependientes automáticamente

Una tabla con clientes (cada uno de los cuales tiene una forma de pago asociada) y otra con las facturas, en cuyo formulario, selecciono un cliente de un combobox, y, automáticamente, en la factura también aparece la forma de pago que tengo introducida en la tabla del cliente en cuestión. Ejemplo:
A mi cliente 1, forma de pago 1
Le corresponde FACTURA A CLIENTE 1 >> FORMA DE PAGO 1 (automático)
Ahora bien, cuando, por el motivo que sea, entro a la tabla de clientes, y cambio su forma de pago, ¿cómo puedo hacer para que actualice todas las facturas a nombre de ese cliente, y aparezca su forma de pago modificada?
Modifico: CLIENTE 1, FORMA DE PAGO 5
Pero FACTURA A CLIENTE 1 >> FORMA DE PAGO 1 (no aparece cambiado el registro)
Lo único que he podido hacer, es entrar a cada registro de factura del CLIENTE 1 en el formulario, y volver a seleccionar ese mismo cliente en el combobox, con lo cual ya me actualiza su forma de pago, pero... Imaginad que tengo 286 facturas de ese cliente, ¿qué forma puedo tener para evitar pasar una por una y que se actualice automáticamente?

Respuesta
1

Vete a la ventana de relaciones de la BD (en access 2007 y siguientes está en la pestaña de "herramientas de la base de datos) y si, no te salen tus dos tablas, pulsa en "Mostrar tablas" y añádelas.

Si las tienes relacionadas, verás una línea que las une. Haz click en esa línea para seleccionarla, luego click con el botón derecho y pulsa "modificar relación". Marca las casillas "exigir integridad referencial" y "actualizar en cascada". Acepta los cambios y ya lo tienes.

Gracias, Sveinbjorn. La verdad, no lo había considerado, porque ya, al crear las sucesivas tablas, supuestamente las había relacionado con la integridad referencial, pero... ya veo que me faltaba algo. Lo repasaré.

Buenas de nuevo, Sveinbjorg.

No actualiza los datos, pero debe ser porque las tablas están relacionadas, sí, pero a través del combobox, ¿me comprendes?

El cliente cuyos datos yo quiero actualizar en la factura ya guardada como registro, no está en un campo de texto simple, sino que es un elemento de una lista del combo, supongo que eso tenga que ver, y sea necesario un Requery o similar del mismo, pero lo desconozco.

Gracias.

¿Cómo es la estructura (campos) de las tablas? ¿El combo que campos coge?

¿Prefieres que te adjunte la BD?

Antes, te respondo.

La tabla de clientes tiene su ID autonumérico, y un campo con el nombre del cliente (texto), y otro con su forma de pago asociada (también texto; más otros campos, que no vienen al caso)

La tabla de facturas tiene el famoso combo en el que está el listado de clientes, y al seleccionarlo, aparece en otro campo el valor de su forma de pago.

La relación está hecha correcta (porque cuando selecciono el cliente, me aparece su forma de pago relacionada), salvo porque no la actualiza, como comenté en el principio.

En el evento "change" del combo, tengo el siguiente código (me parece que ahí puede estar el meollo de la cuestión):

Private Sub CC1_Change()
Dim sCli As String
sCli = Me.CC1.Column(1)
' Guardamos en la variable sCli el nombre del cliente
' seleccionado en el combo CC1
Me.FEMIT_PAGO = DLookup("CLI_PAGO", "T1C", "CLI_NOMB='" & sCli & "'")
' Según la forma de pago del cliente de la factura
' se cambia automáticamente la fecha de vencimiento
' de la misma

A ver si te sirve.

O bien, te paso la BD, como prefieras.

Gracias

Si me pasas la BD, mejor, porque así puedo testarla.

Pero creo que ya veo el problema: la actualización en cascada sólo funciona entre los campos relacionados. Como guardas en la tabla facturas la forma de pago, que no es un campo de la relación, no se actualiza.

Para ello tendrás que "forzarlo", por ejemplo, poniendo en el evento "Al activar registro" del formulario una llamada al procedimiento "CC1_Change()" para que te vaya actualizando la información a medida que recorres los registros del formulario.

De todas formas, yo optaría por otro enfoque: al cambiar la forma de pago (en el formulario de clientes), haría una actualización por SQL de la tabla facturas. Por ejemplo:

Private Sub Forma_Pago_AfterUpdate()

Dim miSQL As String

If Nz(Me.Forma_Pago,"")<>"" Then

miSQL="UPDATE FACTURAS SET Forma_Pago='" & Me.Forma_Pago & "' WHERE Cliente=" & Me.Id

CurrentDb.Execute miSQL

End Sub

Adapta los nombres de los campos y tablas a los que tengas y te debiera funcionar.

Aunque probaré lo que me dices, te paso igualmente la BD.

http://we.tl/2oJBEqPWaD 

Gracias.

Por la tarde, si no lo solucionas con esas indicaciones, la miro y te la devuelvo corregida, que en el PC del curro no me reconoce el formato (debe tener alguna característica no compatible con access 2007)

Sí, porque, como sabes, aunque está en formato 2007, se ha construido en 2010-2013, y no va.

Gracias por las molestias.

Ahí te devuelvo la BD

Te lo programé en el evento después del actualizar del combo CLI_PAGO. Podrías hacerlo, si prefieres en el código del "botón" guardar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas