
actualización entre tablas
#1
Escrito 08 septiembre 2011 - 05:10
Me enfrento a un reto que nunca ante había hecho ni escuchado y quisiera que me ayudarais, tengo 2 tablas en sql2005 y quisiera actualizar una con otra les pongo un ejemplo
Tengo una tabla de stock de almacén en las cual tengo un campo con el código del articulo y la cantidad. En la otra tabla que es de compras también tengo el campo código y la cantidad, quiero poder actualizar la cantidad de la tabla de almacén con la cantidad de la tabla de compra, teniendo como referencia el código del artículo es decir sumar lo nuevo a la existencia pero también si no existe que me agregue el nuevo artículo. Espero haberme explicado bien de antemano gracias por vuestra ayuda
#2
Escrito 08 septiembre 2011 - 06:46
teniendo como referencia el código del artículo es decir sumar lo nuevo a la existencia pero también si no existe que me agregue el nuevo artículo.
Primero que todo, deberás tener muy claro el diseño de las tablas para poder cumplir esta tarea eficientemente, yo pienso que Stock de almacén podría ser más fácil una vista o una consulta, lo que podrías es agregar a la tabla ARTICULOS un campo "EXISTENCIAS" que se incrementaría mediante un trigger cada vez que hay una compra y se restaría mediante otro trigger cada vez que haya una venta o salida
ARTICULOS
IdArticulo
Codigo
Descripcion
Existencias
Los respectivos triggers para inserción, borrado y actualización de una tabla de detalles de compra que contiene además de otros, los campos (IdArticulo, cantidad) serían mas o menos así:
create trigger DETALLES_COMPRA_i on dbo.DETALLES_COMPRA
with encryption for insert as
update dbo.ARTICULOS
set Existencias = Existencias + ins.Cantidad
from inserted ins
where dbo.ARTICULOS.IdArticulo = ins.IdArticulo
go
create trigger DETALLES_COMPRA_d on dbo.DETALLES_COMPRA
with encryption for delete as
update dbo.ARTICULOS
set Existencias = Existencias - del.Cantidad
from deleted del
where dbo.ARTICULOS.IdArticulo = del.IdArticulo
go
create trigger DETALLES_COMPRA_u on dbo.DETALLES_COMPRA
with encryption for update as
update dbo.ARTICULOS
set Existencias = Existencias - del.Cantidad + ins.Cantidad
from inserted ins, deleted del
where dbo.ARTICULOS.IdArticulo = ins.IdArticulo and
dbo.ARTICULOS.IdArticulo = del.IdArticulo and
ins.Cantidad <> del.Cantidad
go
Para las ventas, los triggers irían contra la tabla de detalles de ventas y bastaría con cambiar los signos (+ , -) y entonces harían exactamente lo contrario.
Saludos
PD: Nótese que en mi ejemplo la tabla ARTICULOS no debe tener un campo de nombre "Cantidad"
#3
Escrito 08 septiembre 2011 - 06:48
1) Realizamos una consulta a la tabla de Almacén verificando si el artículo existe o no.
2) Si el Artículo existe pues realizamos una consulta realizando la actualización de lo contrario insertamos un nuevo registro.
Si con esos dos pasos aún no tienes idea, pues nos avisas a ver si hacemos un ejemplito pequeño.
Saludos.
EDITO: Me ganó Wilson

#4
Escrito 08 septiembre 2011 - 09:02
#5
Escrito 08 septiembre 2011 - 10:08
Saludos
#6
Escrito 08 septiembre 2011 - 10:46
Mira la tabla del almacén se denomina “artículos” y cuenta con todos los campos afines
Id
Código
Descripción
Precio
Unidades
La tabla de compra se denomina “ComArt”y cuenta entre otro los campos (que son los que me interesan)
Id
CódigoArt
DescripArt
PrecioComp
Unidades
La tabla artículos se debe actualizar cuando la tabla ComArt se modifique.
El campo por el cual se relacionana las dos es el campo “código” y” codigoArt”
#7
Escrito 08 septiembre 2011 - 11:44
CREATE TRIGGER CompArt_i ON dbo.CompArt
WITH encryption FOR INSERT AS
UPDATE dbo.ARTICULOS
SET Unidades = Unidades + ins.Unidades
FROM inserted ins
WHERE dbo.ARTICULOS.Codigo = ins.CodigoArt
go
CREATE TRIGGER CompArt_d ON dbo.CompArt
WITH encryption FOR DELETE AS
UPDATE dbo.ARTICULOS
SET Unidades = Unidades - del.Unidades
FROM deleted del
WHERE dbo.ARTICULOS.Codigo = del.CodigoArt
go
CREATE TRIGGER CompArt_u ON dbo.CompArt
WITH encryption FOR UPDATE AS
UPDATE dbo.ARTICULOS
SET Unidades = Unidades - del.Unidades + ins.Unidades
FROM inserted ins, deleted del
WHERE dbo.ARTICULOS.Codigo = ins.CodigoArt AND
dbo.ARTICULOS.Codigo = del.CodigoArt AND
ins.Unidades <> del.Unidades
go
Saludos.
PD: Este código es compatible con SQL SERVER 2000, pero creo que funcione en 2005, pues abandoné SQL SERVER hace mucho tiempo.
#8
Escrito 12 septiembre 2011 - 09:27
#9
Escrito 12 septiembre 2011 - 10:06
Intenta comprender tan solo un "poquito" el código del scrpit, y notarás que se ejecutarán cada vez que insertes una compra, cada vez que modifiques una compra o cada vez que elimines una compra, respectivamente, y no todos los días por la mañana como pretendes.
Saludos
#10
Escrito 12 septiembre 2011 - 10:28
SET Unidades = Unidades - del.Unidades
Estas unidades a que tabla pertenece cada una es decir cuál es la de stock y cual la de CompArt te pregunto para tener referencia en un futuro de como hacer el tigger
#11
Escrito 12 septiembre 2011 - 10:30
#12
Escrito 12 septiembre 2011 - 10:50
Observa:hola wilson gracias por ayudarme, si he analizado y si cada vez que modifique la tabla de compra se actualizara la de artículos ahora una duda más cuando haces referencia
SET Unidades = Unidades - del.Unidades
Estas unidades a que tabla pertenece cada una es decir cuál es la de stock y cual la de CompArt te pregunto para tener referencia en un futuro de como hacer el tigger
CREATE TRIGGER CompArt_i ON dbo.CompArt /*Crear un TRIGGER de nombre "CompArt_i" para la tabla "CompArt" */
WITH encryption FOR INSERT AS /*Para que se ejecute el siguiente código al insertar registros en la tabla "CompArt" */
UPDATE dbo.ARTICULOS /* Actualice en la tabla ARTICULOS */
SET Unidades = Unidades + ins.Unidades /*el Campo "Unidades" sumando a las unidades existentes */
FROM inserted ins /* las unidades de esta inserción (ins.Unidades) */
WHERE dbo.ARTICULOS.Codigo = ins.CodigoArt /* hacerlo solamente en los ARTICULOS cuyo CODIGO se igual al CodigoArt */
go
ahhhhhh y perdona cuando quiero agregar un articulo que no existe es decir no tengo referencia como lo haria si se puede digo gracias
La lógica dice que no puedes comprar un artículo que no existe, por lo tanto deberás crearlo antes en la tabla de artículos.
Saludos