none
Problema de Vista SQL Server RRS feed

  • Pregunta

  • Tengo esta vista:

    CREATE VIEW Existencias
    AS
    	WITH Movimientos (Id, FechaOperacion, Producto, Cantidad) AS
    	(
                SELECT Numero, FechaCompra [FechaOperacion], Descripcion [Producto], CantidadCompra [Cantidad] 
    		FROM DetalleCompra
    	    UNION ALL
    	    SELECT CodFactura, FechaVenta, Descripcion [Producto], CantidadVenta * -1 [Cantidad] 
    		FROM DetalleVentas
    	)
    	SELECT
    	    t1.FechaOperacion,
    	    t1.Producto,
    	    CASE WHEN t1.Cantidad > 0 THEN t1.Cantidad END [Comprado],
    	    CASE WHEN t1.Cantidad < 0 THEN ABS(t1.Cantidad) END [Vendido],
    	    SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.Id, t1.Id) [Saldo]
    	FROM
    	    Movimientos t1

    Trabaja bien el problema se da cuando yo hago por ejemplo:

    que se ordena por fecha y sale valor negativo y no deberia verse asi. Que esta faltando ? 

    Saludos

     PD. Se que esto va en la seccion SQL pero ya cuando me di cuenta no lo pude mover.


    viernes, 5 de enero de 2018 14:26

Respuestas

  • Los valores de la columna 'FechaOperacion' no determinan secuencia en el orden porque hay valores repetidos, quizá debas combinar el orden junto con la columna 'Id', por ejemplo:

    SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.FechaOperacion, t1.Id) [Saldo]
    

    • Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:45
    viernes, 5 de enero de 2018 14:33
  • Hola,

    Deberias ordenar los movimientos por fecha y dentro de la fecha por algun otro dato dependiendo de como identificas al movimiento.

    Es muy comun que en las empresas primero se registren las salidas y luego las entradas. Es decir si no son algo prolijos para las cosas va a ser dificil que la infomacion sea confiable o refleje la realidad.

    Una solucion posible es guardar en cada registro un dato que identifique si es entrada "E" o salida "S". entonces si ordenas por fecha + ese dato, para una misma fecha tendrias primero las entradas y luego las salidas, pero eso no siempre es asi, podes tener excepciones, hay que ver lo que pretende tu cliente.

    Una cosa es saber que saldo de stock habia en cieto momento, puede ser a nivel de hora y minuto, y otra que saldo habia al final del dia. Para el primer caso la cosa es dificil de solucionar si no hay un poco de prolijidad en el cliente, para el segundo no importa si registran, para un mismo dia, primero las salidas y luego las entradas total al final del dia el saldo sera el correcto. Claro que a nivel de renglon puede ser que alguno posea saldo en negativo.

     


    Victor Koch

    • Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:44
    viernes, 5 de enero de 2018 16:19

Todas las respuestas

  • Los valores de la columna 'FechaOperacion' no determinan secuencia en el orden porque hay valores repetidos, quizá debas combinar el orden junto con la columna 'Id', por ejemplo:

    SUM(t1.Cantidad) OVER(PARTITION BY t1.Producto ORDER BY t1.FechaOperacion, t1.Id) [Saldo]
    

    • Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:45
    viernes, 5 de enero de 2018 14:33
  • Hola, Gracias por contestar,

    He probado eso y sale igual. Le quite  t1.FechaOperacion parece que por interno hace el Id, pero se ve igual sin el valor negativo pero no se ve bien de todas formas 

    viernes, 5 de enero de 2018 14:39
  • He probado eso y sale igual no muestra ID

    Agradeceré seas algo mas explicito en tus respuestas.

    La intención de la instrucción sugerida no es que muestre la columna 'Id', de hecho no se va a mostrar porque no forma parte de la lista de selección. Propuse combinar el orden para determinar una secuencia basada en la fecha y en el correlativo de la operación. Por otro lado, utiliza los mismos criterios de orden que ocupaste en la cláusula OVER() para la cláusula ORDER BY externa.

    viernes, 5 de enero de 2018 14:49
  • Disculpa de echo borre esa respuesta antes y como mencione es algo por interno que toma el orden Id pero de igual forma sale lo mismo pero a mi parece es un error interno de las fechas creo ya que al inicio el datetimepicker esta tomandome fechas pasadas por defecto y como me olvido de indicarlo creo lo tomare de otra modo
    viernes, 5 de enero de 2018 15:04
  • Buen dia,

    Supongo que el ID debe ser un autonumerico. Si te fijas en FechaOperacion primero fue registrado el egreso y luego el ingreso. Entiendo que esos movimientos fueron registrados en esas fecha por lo tanto es correcto que el ingreso posea in ID superior al egreso.

    Los resultados que obtenes son correctos.


    Victor Koch

    viernes, 5 de enero de 2018 15:14
  • ?¿ Bueno suponiendo no cuentes con material entonces hoy compras dicho material y mañana o pasado posiblemente lo vendes entonces Primero es la compra y luego es la venta.

    Entonces para lo que me comentas es por decirlo que si ese material lo compre hace meses atras y hoy lo vendo la venta es primero segun la fecha. Pero si es que tienes stock y si no?

    Haciendo como que haga todo un mismo dia esto se ve asi pero hay un detalle a pesar que todo parece verse bien hay un item que no.

    Entonces de que manera esta tomando la fecha ? para ordenar por la hora ? esos 50 de compra lo hice el mismo dia pero minutos antes que venda 1 .

    viernes, 5 de enero de 2018 16:00
  • Hola,

    Deberias ordenar los movimientos por fecha y dentro de la fecha por algun otro dato dependiendo de como identificas al movimiento.

    Es muy comun que en las empresas primero se registren las salidas y luego las entradas. Es decir si no son algo prolijos para las cosas va a ser dificil que la infomacion sea confiable o refleje la realidad.

    Una solucion posible es guardar en cada registro un dato que identifique si es entrada "E" o salida "S". entonces si ordenas por fecha + ese dato, para una misma fecha tendrias primero las entradas y luego las salidas, pero eso no siempre es asi, podes tener excepciones, hay que ver lo que pretende tu cliente.

    Una cosa es saber que saldo de stock habia en cieto momento, puede ser a nivel de hora y minuto, y otra que saldo habia al final del dia. Para el primer caso la cosa es dificil de solucionar si no hay un poco de prolijidad en el cliente, para el segundo no importa si registran, para un mismo dia, primero las salidas y luego las entradas total al final del dia el saldo sera el correcto. Claro que a nivel de renglon puede ser que alguno posea saldo en negativo.

     


    Victor Koch

    • Marcado como respuesta Javier Roque miércoles, 10 de enero de 2018 4:44
    viernes, 5 de enero de 2018 16:19
  • Lo analizare y te comento. Bueno te marcare la respuesta ya que es una idea extra posible de realizar.

    Gracias


    viernes, 5 de enero de 2018 16:34
  • Hasta el momento probando tu idea del id tambien va bien no se que pase mas adelante quizas sea un prpblema con las fechaa. Igual gracias
    miércoles, 10 de enero de 2018 4:45
  • Hola de nuevo volviendo a intentar usar esto en SQL server 2014 o 2019 me sale que order by hay error de sintaxis si antes funcionó porque ahora sale ese error? 
    martes, 19 de mayo de 2020 14:54