Ir al contenido


Foto

actualización entre tablas


  • Por favor identifícate para responder
11 respuestas en este tema

#1 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 08 septiembre 2011 - 05:10

Hola salu2
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

  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

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"
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 08 septiembre 2011 - 06:48

Hola eso es sencillo de hacer, normalmente es recomendado el uso de Stored Procedures (Procedimientos Almacenados), pero por el momento te daré un ejemplo sencillo para que te des un idea:

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 :p
  • 0

#4 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 08 septiembre 2011 - 09:02

Hola  Wilson y enecumene y gracias como siempre, a ver no entiendo muy bien lo que me pones wilson o bueno si un poco pero creo que me enredo muxo ,  en cuanto a enecumene si algo asi querria pero no sé cómo hacerlo pues  la tabla de las compras se actualiza diario  entonces seria repetitivo articulo por articulo y son bastante por favor si puedieras  ponerme un ejemplito te lo agradecería mucho más
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 08 septiembre 2011 - 10:08

Me gustaría ver el diseño de las tablas involucradas.

Saludos
  • 0

#6 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 08 septiembre 2011 - 10:46

Hola wilson es mi primera vas con los triggers  pero veo que son muy parecidos a las sentencias  sql
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”

  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 08 septiembre 2011 - 11:44

Entiendo que en  tu diseño solo es posible comprar un artículo a la vez, de todas formas  creando estos tres triggers en la base datos debería ser suficiente:




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.
  • 0

#8 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 12 septiembre 2011 - 09:27

Hola wilson perdona mi ignorancia pero como dije antes es mi primera vez con triggers  donde debo poner el trigger para que funcione correctamente, ah  cuando se ejecutara este.  Yo desearía que lo hiciera todos los días por las mañana  gracias
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 septiembre 2011 - 10:06

Lo que debes hacer es ejecutar el script que crea los triggers desde el  SQL SERVER MANAGEMENT STUDIO,  seleccionas la base de datos a la que le vamos a agregar los triggers, le das click con el botón derecho del mouse, del menú contextual seleccionas NEW QUERY  a la derecha aparecerá una página en blanco, en ésta copia y pega  el código que te puse en el post anterior, haces click en el botón execute que se encuentra justo arriba de la página, confirma los cambios,  si todo está bien con esto será suficiente.


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
  • 0

#10 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 12 septiembre 2011 - 10:28

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

  • 0

#11 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 12 septiembre 2011 - 10:30

ahhhhhh y perdona cuando quiero agregar un articulo que no existe es decir no tengo referencia como lo haria si se puede digo gracias
  • 0

#12 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 septiembre 2011 - 10:50

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

Observa:


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




  • 0




IP.Board spam blocked by CleanTalk.