none
Actualizar tabla de Stock con otra tabla RRS feed

  • Pregunta

  • Saludos expertos, estoy intentado una consulta de actualización para modificar el estock de un sistema para una tienda, ubicado en la tabla Articulos, a través de un update que realizo empleando campos de una segunda tabla llamada Facturas. el query me actualiza la tabla pero solo reduce en uno la cantidad en almacen aun cuando la factura muestre ventas mayores de artículos.

    me explico, si realizo una venta de tres camisas que corresponden al mismo código, cuando actualizo la tabla de artículos, me reduce el stock como si solo se hubiese vendido una camisa y no tres. la consulta que utilizo para el update es esta:

    UPDATE ARTICULOS SET CANTIDAD_VENDIDA_ART = B. CANTIDAD_ART,
    RESTANTE_ALMACEN_ART=CANTIDAD_ADQUIRIDA_ART - B.CANTIDAD_ART
    FROM ARTICULOS A JOIN FACTURA_DETALLES B  ON A. ARTICULO = B. ARTICULO  
    WHERE   A. ARTICULO = B. ARTICULO

    y aqui estan mis tablas.

    Tabla Articulos

    ARTICULO  int
    NOMBRE_ART varchar(50)
    DESCRIPCION_ART varchar(100)
    SUPLIDOR_ART varchar(50)
    PRECIO_COMPRA_UND_ART numeric(18, 2)
    CANTIDAD_ADQUIRIDA_ART numeric(18, 0)
    PRECIO_VENTA_ART numeric(18, 2)
    CANTIDAD_VENDIDA_ART numeric(18, 0)
    RESTANTE_ALMACEN_ART numeric(18, 0)
    FECHA_COMPRA_ART datetime

    Tabla Facturas

    FACTURA int
    CLIENTE int
    NOMBRE_CLIENTE varchar(50)
    NCF varchar(19)
    ARTICULO int
    NOMBRE_ART varchar(50)
    PRECIO_VENTA_ART numeric(18, 2)
    CANTIDAD_ART numeric(18, 0)
    ITBIS numeric(18, 2)
    SUBTOTAL_ART numeric(18, 2)
    DESCUENTO numeric(18, 2)
    TOTAL_FACTURA numeric(18, 2)
    VENDEDOR varchar(50)

    Agradezco me den una mano en esto.

    viernes, 17 de mayo de 2013 19:11

Respuestas

  • Hola.

    No aportas lo que te requeríamos y eso hace que la ayuda que puedas recibir sea más lenta y más imprecisa, porque tenemos que imaginarnos cosas que puede que no se produzcan.

    A pesar de ello, decirte que el problema (sospecho que) está en que no agrupas y sumas las líneas antes de realizar el update de la cabecera. Sospecho que tienes 3 líneas de detalle, no únicamente una, donde la cantidad es uno en cada registro. Tampoco filtras por la factura, eso no tiene sentido, lo he añadido.

    Sería algo más o menos así lo que tendrías que realizar:

    Update A set
      CANTIDAD_VENDIDA_ART = Suma_cant_Art, 
      RESTANTE_ALMACEN_ART = CANTIDAD_ADQUIRIDA_ART - Suma_cant_Art
    from ARTICULOS A inner join
      (select ARTICULO, Suma_cant_Art = sum(CANTIDAD_ART)
       from FACTURA_DETALLES 
      --Aquí echo en falta un filtro por factura que no indicas, así que lo añado, lo contrario no tendría sentido
       where ID_FACTURA = 3
       group by ARTICULO) B on A.ARTICULO = B.ARTICULO
    

    El modelo es confuso (por ejemplo, no nos pasas información de las cabeceras de las facturas), la información parcial, difícilmente será lo que vas buscando, espero que te dé una pista al menos. En caso de que no ser así, por favor, aporta el modelo implicado y scripts de inserción para todas las tablas implicadas.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    sábado, 25 de mayo de 2013 6:51
    Moderador

Todas las respuestas

  • Hola.

    Pásanos scripts de creación de tablas (eso lo tienes ya casi hecho), scripts de inserción de datos de ejemplo y el ejemplo concreto en el cual, tras realizar el update no deja correcta la cifra.

    Adicionalmente, verifica que no existan triggers en la tabla a modificar.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    sábado, 18 de mayo de 2013 7:56
    Moderador
  • Lo que te dice Alberto es que nos pases un script que inserte datos en las tablas, para que así podamos hacer pruebas con los datos reales y no tengamos que inventárnoslos nosotros

    http://blog.sqlauthority.com/2011/05/07/sql-server-2008-2008-r2-create-script-to-copy-database-schema-and-all-the-objects-data-schema-stored-procedure-functions-triggers-tables-views-constraints-and-all-other-database-objects/
    lunes, 20 de mayo de 2013 15:49
  • Mi error... aquí coloco información que considero mas precisa.

    --El campo FACTURA es identity, se incrementa automaticamente de uno en uno

    INSERT INTO [VENTAS].[dbo].[FACTURA_DETALLES]
               ([CLIENTE],[NOMBRE_CLIENTE],[NCF],[ARTICULO],[NOMBRE_ART]
               ,[PRECIO_VENTA_ART],[CANTIDAD_ART],[ITBIS],[SUBTOTAL_ART]
               ,[DESCUENTO],[TOTAL_FACTURA],[VENDEDOR])
         VALUES
               (3, 'EDISON GUZMÁN', 'A010010100010000001', 1, 'PANTALÓN JEAN LEE HOMBRE',
               560.00, 3, 100.80, 660.80,
               100.00, 561.00, 1)

    --Resultado antes del update
    Cant. Adquirida Cant. Vendida  Restante Almacén
    60 0 60
    36 0 36
    48 0 48
    72 0 72

    --Este es el ultimo update que he probado

    UPDATE ARTICULOS SET CANTIDAD_VENDIDA_ART = B. CANTIDAD_ART,
    RESTANTE_ALMACEN_ART=CANTIDAD_ADQUIRIDA_ART - B.CANTIDAD_ART
    FROM ARTICULOS A JOIN FACTURA_DETALLES B  ON A. ARTICULO = B. ARTICULO  
    WHERE   A. ARTICULO = B. ARTICULO

    --Resultado después del update
    Cant. Adquirida Cant. Vendida  Restante Almacen
    60 1 60
    36 1 36
    48 1 48
    72 1 72


    • Editado soyeddygh lunes, 20 de mayo de 2013 16:25
    lunes, 20 de mayo de 2013 16:23
  • Hola.

    No aportas lo que te requeríamos y eso hace que la ayuda que puedas recibir sea más lenta y más imprecisa, porque tenemos que imaginarnos cosas que puede que no se produzcan.

    A pesar de ello, decirte que el problema (sospecho que) está en que no agrupas y sumas las líneas antes de realizar el update de la cabecera. Sospecho que tienes 3 líneas de detalle, no únicamente una, donde la cantidad es uno en cada registro. Tampoco filtras por la factura, eso no tiene sentido, lo he añadido.

    Sería algo más o menos así lo que tendrías que realizar:

    Update A set
      CANTIDAD_VENDIDA_ART = Suma_cant_Art, 
      RESTANTE_ALMACEN_ART = CANTIDAD_ADQUIRIDA_ART - Suma_cant_Art
    from ARTICULOS A inner join
      (select ARTICULO, Suma_cant_Art = sum(CANTIDAD_ART)
       from FACTURA_DETALLES 
      --Aquí echo en falta un filtro por factura que no indicas, así que lo añado, lo contrario no tendría sentido
       where ID_FACTURA = 3
       group by ARTICULO) B on A.ARTICULO = B.ARTICULO
    

    El modelo es confuso (por ejemplo, no nos pasas información de las cabeceras de las facturas), la información parcial, difícilmente será lo que vas buscando, espero que te dé una pista al menos. En caso de que no ser así, por favor, aporta el modelo implicado y scripts de inserción para todas las tablas implicadas.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    sábado, 25 de mayo de 2013 6:51
    Moderador
  • no se si te entiendo tu haces el insert de tu factura y luego realizas un update a la tabla donde estan las existencias, pero me pierdo  en tu codigo

    UPDATE ARTICULOS SET

    CANTIDAD_VENDIDA_ART = B. CANTIDAD_ART, *** estas actualizando lo que acabas de guardar 


    RESTANTE_ALMACEN_ART=CANTIDAD_ADQUIRIDA_ART - B.CANTIDAD_ART *** y aqui q haces dond esta la variable que toma la cantida 

    FROM ARTICULOS A JOIN FACTURA_DETALLES B  ON A. ARTICULO = B. ARTICULO  
    WHERE   A. ARTICULO = B. ARTICULO

    de esta forma lo realizo 

    update articulos set restante_almacen_art=(restante_almacen_art-@cantida) where articulo=@articulo


    fredy_najarro

    domingo, 26 de mayo de 2013 3:18
  • Como te dicen los compañeros, escribir el query es fácil (creo que el script de alberto resuelve el problema) pero si nos pasas uno que incluya la inserción de datos, seguro que podemos resolverte el query, en este link puedes ver como se hace sin que tengas que teclear tu los inserts. 

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    domingo, 26 de mayo de 2013 8:13
    Moderador