Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Actualizar valores de una tabla al actualizar otra

Estas en el tema de Actualizar valores de una tabla al actualizar otra en el foro de SQL Server en Foros del Web. Saludos, la situación es la siguiente: Como puedo conseguir que el valor de un registro en una tabla A se incremente/decremente automáticamente cada vez que ...
  #1 (permalink)  
Antiguo 04/05/2006, 16:28
 
Fecha de Ingreso: marzo-2002
Mensajes: 16
Antigüedad: 22 años, 1 mes
Puntos: 0
Exclamación Actualizar valores de una tabla al actualizar otra

Saludos, la situación es la siguiente:

Como puedo conseguir que el valor de un registro en una tabla A se incremente/decremente automáticamente cada vez que se agregue/borre un renglón de una tabla B?

en un ejemplo sería más claro:

Tabla Clientes:
codigo_cliente(clave primaria)
nombre
direccion
nro_de_compras_efectuadas(campo a incrementar/decrementar)
...y otros campos .....

Tabla Ventas:
codigo_venta(clave primaria)
fecha
monto
codigo_cliente(cada cliente puede hacer varias compras)
...y otros campos....

El objetivo es que cada vez que se efectúe una venta, de acuerdo con el "codigo_cliente" en la tabla "ventas" se incremente en la tabla "clientes" el valor de "nro_de_compras_efectuadas" de forma automática. y cada vez que se elimine una venta (por diversos motivos) se decremente automaticamente tal valor para el "codigo_cliente" especifico de la tabla "ventas" en la tabla "clientes".

Se podría ampliar la extensión del problema si agregamos el campo "cuanto_dinero_nos_ha_dado_este_cliente" en la tabla "clientes" y ese valor fuese la suma de todos los renglones con similar "codigo_cliente" de la tabla "ventas".

Claro que cada vez que se efectúe una venta, se puede hacer por programación externa (accedo desde VB6, un webservice y además por ASP.Net) usando una segunda (y tercera) consulta a la BD; pero por asuntos de integridad preferiría que fuese el motor del SQL Server 2000 quien haga estos ajustes a los datos.

No domino el SQL Server, poseo conocimientos corrientes, realmente no sé que mecanismos puedo utilizar para llevar a cabo esta tarea (de ser viable claro está): procedimientos almacenados, cursores, etc..... por lo tanto no sabría como empezar a atacar el problema. Toda sugerencia será útil.

Gracias de antemano.
  #2 (permalink)  
Antiguo 05/05/2006, 14:50
Avatar de claray  
Fecha de Ingreso: agosto-2004
Ubicación: ahora... en Caracas
Mensajes: 345
Antigüedad: 19 años, 8 meses
Puntos: 0
Triggers

Hola, se me ocurre que la mejor opcion para hacer este tipo de cosas es la utilizacion de "triggers". Como sabras, los triggers se asocian a una tabla y puedes controlar lo que hacer en cada evento (Insert o Update). Por tanto, podrias modificar la tabla CLIENETS cada vez que se inserte un registro en la tabla VENTAS.

Saludos y suerte
__________________
:pirata: El arte de desarrollar es dejar que los otros lo hagan
  #3 (permalink)  
Antiguo 05/05/2006, 15:23
 
Fecha de Ingreso: marzo-2002
Mensajes: 16
Antigüedad: 22 años, 1 mes
Puntos: 0
Gracias claray, no conozco los triggers, pero me has dado un buen punto de partida
  #4 (permalink)  
Antiguo 05/05/2006, 20:10
 
Fecha de Ingreso: marzo-2002
Mensajes: 16
Antigüedad: 22 años, 1 mes
Puntos: 0
Listo, luego de mucho indagar y aprender logre solucionarlo usando triggers (o desencadenadores, como lo define el VStudio.Net en el explorador de servidores).

el código para el insert sería:

CREATE TRIGGER compra_add
ON Tabla_Ventas
FOR INSERT
AS
BEGIN
DECLARE @codigo_cliente int
DECLARE @cuantas_compras int

SELECT @codigo_cliente = codigo_cliente FROM INSERTED

SELECT @cuantas_compras = COUNT(codigo_cliente)
FROM Tabla_Ventas
WHERE codigo_cliente = @codigo_cliente

UPDATE Tabla_Clientes
SET nro_de_compras_efectuadas = @cuantas_compras
WHERE cod = @codigo_cliente
END

y para el trigger delete, muy similar:

CREATE TRIGGER compra_del
ON Tabla_Ventas
FOR DELETE
AS
BEGIN
DECLARE @codigo_cliente int
DECLARE @cuantas_compras int

SELECT @codigo_cliente = codigo_cliente FROM DELETED

SELECT @cuantas_compras = COUNT(codigo_cliente)
FROM Tabla_Ventas
WHERE codigo_cliente = @codigo_cliente

UPDATE Tabla_Clientes
SET nro_de_compras_efectuadas = @cuantas_compras
WHERE cod = @codigo_cliente
END

Son Bienvenidos los comentarios y las sugerencias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:55.