none
CALCULOS DE VALORES DE CAMPOS EN UNA TABLA SQL PARA INVENTARIOS RRS feed

  • Pregunta

  • Hola,

    Os consulto acerca de un problema que me ha surgido en la empresa a raiz de un encargo que me han hecho para gestionar los stocks mediante sql. Decir que utilizo SQL SERVER R2.

    El tema es que no se bien cómo puedo dar forma a un script el cual coja datos del pasado de los ultimos stocks y precios medios de un articulo que tenemos en inventario y con ello calcule el nuevo inventario, nuevo coste asi como el resultado del movimiento realizado.

    A continuación os muestro una imagen de como seria la tabla sobre la que trabajariamos.

    Obviamente los campos que le dariamos al procedimiento son CODIGOARTICULO, FECHA,TIPOMOVIMIENTO,CANTIDAD Y PRECIO. A partir de ellos deberiamos ir al movimiento inmediatamente anterior realizado en ese articulo para tomar los datos de stock y precio medio. Con dichos datos calculariamos nuestro stock restandole la cantidad si es una venta o sumándole si es una compra.

    Es por ello que os consulto acerca en qué forma podria hacer un script o procedimiento que buscara el valor inmediatamente anterior a movimiento que necesito grabar en la tabla junto con los valores que necesito. Igualmente cómo podria calcular en T SQL por ejemplo el nuevo stock que tendriamos tras ese movimiento.

    Muchas gracias por vuestra ayuda.

    Un saludo

    Charo


    Saluditos, Charo

    miércoles, 6 de mayo de 2015 23:27

Respuestas

  • Primero yo le pondria a la tabla un campo identity para poder tener el ultimo anterior por si el mismo articulo tiene mas de un registro por fecha.

    ALTER TABLE STOCK ADD Orden INT IDENTITY(1,1)

    Para obtener el ultimo e insertar:

    Hay algunas variables que debes declarar y  llenar con los datos de la venta pero en @cantidad estaria lo que salio del stock o entro.

    DECLARE @PRECIOPROM NUMERIC(5,2),@STOCK NUMERIC(5,2)

    SELECT @PRECIOPROM=A.PRECIOPROMEDIO,@STOCK = A.STOCK FROM TABLA  A WHERE A.ORDEN = (SELECT MAX(B.ORDEN) FROM TABLA B

    WHERE A.CODIGOARTICULO = B.CODIGOARTICULO)

    Una vez que tenes los datos

    INSERT INTO TABLA

    VALUES (@ARTICULO,@FECHA,@TIPOMOV,@CANTIDAD,@PRECIO,@STOCK-@CANTIDAD,@PRECIOPROM,@RESULTADO)

    jueves, 7 de mayo de 2015 2:47

Todas las respuestas

  • Primero yo le pondria a la tabla un campo identity para poder tener el ultimo anterior por si el mismo articulo tiene mas de un registro por fecha.

    ALTER TABLE STOCK ADD Orden INT IDENTITY(1,1)

    Para obtener el ultimo e insertar:

    Hay algunas variables que debes declarar y  llenar con los datos de la venta pero en @cantidad estaria lo que salio del stock o entro.

    DECLARE @PRECIOPROM NUMERIC(5,2),@STOCK NUMERIC(5,2)

    SELECT @PRECIOPROM=A.PRECIOPROMEDIO,@STOCK = A.STOCK FROM TABLA  A WHERE A.ORDEN = (SELECT MAX(B.ORDEN) FROM TABLA B

    WHERE A.CODIGOARTICULO = B.CODIGOARTICULO)

    Una vez que tenes los datos

    INSERT INTO TABLA

    VALUES (@ARTICULO,@FECHA,@TIPOMOV,@CANTIDAD,@PRECIO,@STOCK-@CANTIDAD,@PRECIOPROM,@RESULTADO)

    jueves, 7 de mayo de 2015 2:47
  • Gracias por tu respuesta Luis.

    Una pregunta, veo que usas una tabla A y otra tabla B. Discúlpàme pero no consigo entender cual de esas dos seria la tabla que he creado y a qué correspondería la tabla B que me indicas.

    Gracias de nuevo

    Charo


    Saluditos, Charo

    jueves, 7 de mayo de 2015 15:41
  • Es la misma tabla pero usada en la subquery para traer el max del orden.
    jueves, 7 de mayo de 2015 23:10
  • Otra pregunta que me surge.

    Veo que utilizas un Inser Into lo cual tengo entendido es para insertar nuevas filas en la tabla. En mi caso solo tengo que modificar los campos stock , preciomedio y resultado. Es decir, no he de insertar nuevas filas sino modificar las que ya tengo.

    Por ello, me surge la duda de cómo podria ordenar una sentencia que fuera linea a linea segun el campo Identity que me indicas realizando esta modificiación que necesito.

    Gracias

    Charo

    Saluditos, Charo

    viernes, 8 de mayo de 2015 16:21