none
Ayuda con reporte de kardex, estoy atrapado aqui RRS feed

  • Pregunta

  • Hola a todos:

    Tengo 3 tablas: Producto, Kardex y Stock

    Producto (idproducto,nombre.. etc) - kardex (idproducto,fecha,entradas,salidas) - stocks (idproducto, idalmacen, stockinicial, stockactual)

    Tengo que generar un reporte de acuerdo a la imagen adjunta en un rango de fechas que las paso por parametro.

    select p.idproducto, p.nombre, s.stockinicial+(select sum(kd.entradas)-sum(kd.salidas) from Kardex kd

    where k.Fecha<@fechainicial) as SaldoAnterior, k.Entradas, k.Salidas, Saldo???

    from Kardex k inner join Producto on k.idproducto=p.idproducto inner join stocks s on p.idproducto=s.idproducto

    Se me presentado algunos problemas :

    1. Tengo que obtener el saldo anterior por cada producto, en consecuencia que pondria en el where... considerando que saldo anterior es igual al saldo inicial + entradas - salidas para todos los registros menores a la fecha inicial del rango enviada como parámetro.

    2. Si un producto existe, pero en el mes que se lista no tiene movimiento, igual debe calcular su saldo anteriorl y poner cero de entradas y salidas. Como haria esto?

    3. Como hago para que imprima particionando por cada idproducto, según la imagen.

    Agradecere cualquier apoyo, idea, sugerencia o cualquier correcion de la consutal. Pf es urgente. Gracias de antemano


    Armando

    viernes, 28 de abril de 2017 14:22

Respuestas

  • Armando,

    Es recomendable, para este tipo de preguntas, que se postee la estructura de las tablas involucradas (solo columnas de interes), data de ejemplo en forma de sentencias INSERT, asi como el resultado esperado.

    No por postear la pregunta multiples veces reciviras una respuesta inmediata.

    R1 - Usa las tablas Producto, Kardex, Stocks para calcular primero el saldo anterior a la fecha de inicio. Usa la tabla Producto como el lado a preservar en la union (OUTER JOIN) para que un producto aparezca aunque este no haya tenido movimientos anteriores a la fecha indicada.

    El resultado puede ser volcado hacia una tabla o usar el query como una tabla derivada.

    R2 - Nuevamente comienza con la tabla Producto como el lado a preservar en la union (OUTER JOIN) y agrega los movimientos durante el rango de fechas indicado.

    Ahora que tienes la lista de productos, sus saldos anteriores al comienzo del rango de fechas indicado y el total de movimientos durante ese rango de fechas entonces el resto es unir los tres por el codigo del producto. El saldo seria la suma del saldo anterior mas el total de movimientos.

    R3 - Pudieras usar una herramienta de reportes como SQL Server Reporting Services para generar el reporte segun tus necesidades.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    • Editado HunchbackMVP viernes, 28 de abril de 2017 15:36
    • Marcado como respuesta Armando Salas viernes, 28 de abril de 2017 17:25
    viernes, 28 de abril de 2017 15:04

Todas las respuestas

  • Armando,

    Es recomendable, para este tipo de preguntas, que se postee la estructura de las tablas involucradas (solo columnas de interes), data de ejemplo en forma de sentencias INSERT, asi como el resultado esperado.

    No por postear la pregunta multiples veces reciviras una respuesta inmediata.

    R1 - Usa las tablas Producto, Kardex, Stocks para calcular primero el saldo anterior a la fecha de inicio. Usa la tabla Producto como el lado a preservar en la union (OUTER JOIN) para que un producto aparezca aunque este no haya tenido movimientos anteriores a la fecha indicada.

    El resultado puede ser volcado hacia una tabla o usar el query como una tabla derivada.

    R2 - Nuevamente comienza con la tabla Producto como el lado a preservar en la union (OUTER JOIN) y agrega los movimientos durante el rango de fechas indicado.

    Ahora que tienes la lista de productos, sus saldos anteriores al comienzo del rango de fechas indicado y el total de movimientos durante ese rango de fechas entonces el resto es unir los tres por el codigo del producto. El saldo seria la suma del saldo anterior mas el total de movimientos.

    R3 - Pudieras usar una herramienta de reportes como SQL Server Reporting Services para generar el reporte segun tus necesidades.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    • Editado HunchbackMVP viernes, 28 de abril de 2017 15:36
    • Marcado como respuesta Armando Salas viernes, 28 de abril de 2017 17:25
    viernes, 28 de abril de 2017 15:04
  • Hola, probe lo que me indicaste, me une las dos consultas pero quiero que se vea horizontalmente.

    Al unir el resultado de la segunda query me lo pone a continuacion.

    Aqui la query:

    declare @fechaini date
    set @fechaini='2014-12-31'

    (select p.IdProd_TabProductos, p.Descripcion, u.Abreviatura, p.SaldoInicial, p.SaldoInicial+
    ((select ISNULL(sum(k.Entradas),0) from SF_Tab_Kardex k where k.Fecha < @fechaini
    and k.IdProd_TabProductos=p.IdProd_TabProductos) -
    (select isnull(sum(k.Salidas),0) from SF_Tab_Kardex k where k.Fecha< @fechaini
    and k.IdProd_TabProductos=p.IdProd_TabProductos)) as SaldoAnterior
    from SF_Tab_Productos p left join SF_Tab_Kardex k
    on p.IdProd_TabProductos=k.IdProd_TabProductos
    inner join SF_Tab_Unidades u
    on p.IdUnidades_TabUnidades=u.IdUnidades_TabUnidades
    group by p.CodBarras,p.Descripcion,u.Abreviatura, p.SaldoInicial,p.IdProd_TabProductos)

    union ALL

    (select k.IdProd_TabProductos, p.Descripcion, p.CodBarras, k.Entradas, k.Salidas 
    from SF_Tab_Productos p left join SF_Tab_Kardex k
    on p.IdProd_TabProductos=k.IdProd_TabProductos
    where k.Fecha>'2014-12-31')


    Armando

    sábado, 29 de abril de 2017 6:34
  • Hola con esta query me imprime el producto y si no tiene movimiento en kardex le pone null...

    Tobo bien, pero cuando pongo en el where el condicional de rango de fechas (lo que esta al costado del codigo de barras) me devuelve vacio. fechas me devuelve la consulta vacia

    Esta es la query, que estoy haciendo mal.

    select * from SF_Tab_Productos pro
    left join SF_Tab_Kardex kdx on pro.IdProd_TabProductos=kdx.IdProd_TabProductos
    inner join SF_Tab_Unidades u on
    pro.IdUnidades_TabUnidades=u.IdUnidades_TabUnidades
    where pro.CodBarras='0000000001734' --- and (kdx.Fecha>='2017-01-01' and kdx.Fecha<='2017-02-28')


    Armando

    sábado, 29 de abril de 2017 7:01
  • Armando,

    Deberas usar el filtro del lado contrario a preservar como parte de la union, de lo contrario estarias convirtiendo la operacion de union de OUTER a INNER.

    select
        *
    from
        SF_Tab_Productos pro

        left join
        SF_Tab_Kardex kdx
        on pro.IdProd_TabProductos = kdx.IdProd_TabProductos
        and kdx.Fecha>='2017-01-01' 
        and kdx.Fecha<='2017-02-28'

        left outer join
        SF_Tab_Unidades u
        on 
    pro.IdUnidades_TabUnidades = u.IdUnidades_TabUnidadeswhere
        pro.CodBarras='0000000001734';

    Te recomiendo este libro para familiarizarte con los fundamentos de T-SQL.

    https://www.amazon.com/T-SQL-Fundamentals-3rd-Itzik-Ben-Gan/dp/150930200X/ref=mt_paperback?_encoding=UTF8&me=


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 1 de mayo de 2017 16:16