[MySQL] Porque no me suma bien este SP

183 views
Skip to first unread message

ZeRoberto

unread,
Nov 18, 2018, 10:36:19 PM11/18/18
to publice...@googlegroups.com
Tengo un procedimiento almacenado en MySQL que me saca un detalle de una tabla sumando las entradas y salidas ordenados por fecha y hora, el problema esta en que la sumatoria esta bien pero lo muestra desordenado. Si se dan cuenta en la imagen en la columna saldo del grid empieza con 10 a la segunda fila deberia ser 87 y luego 139 pero por alguna razon lo saca mal, pero en otras registros si lo saca bien.

Detalle.png

Aca el procedimiento almacenado en MySQL

PROCEDURE sp_detalle(IN tnCajaID int)
BEGIN
   SET @lnSaldo := 0.00;
   SELECT CajaID, 0 CorteID, '' OrigenID, DATE(Fecha) Fecha, DATE_FORMAT(Fecha, '%h:%i %p') Hora, 'INICIAL' Concepto, '' Glosa, '' DocumentoID,
          '' NumDocumento, 0 Importe, '' UniqueID, '' Tipo, 0 TipoPagoID, '' TipoPago, 0 Estado, TRUNCATE(@lnSaldo := Inicial, 3) Saldo, Fecha Registro
          FROM cajas 
          WHERE CajaID = tnCajaID
   UNION ALL
   SELECT a.CajaID, a.CorteID, a.OrigenID, DATE(a.Fecha) Fecha, DATE_FORMAT(a.Fecha, '%h:%i %p') Hora, a.Concepto, a.Glosa, a.DocumentoID,
          a.NumDocumento, a.Importe, a.UniqueID, a.Tipo, a.TipoPagoID, b.TipoPago, a.Estado, 
          TRUNCATE(@lnSaldo := @lnSaldo + IF(a.Tipo = 'E', a.Importe, -a.Importe) * IF(a.Estado = 1, 0, 1), 3) Saldo, a.Fecha Registro
          FROM cajas_lineas a
               LEFT JOIN tipopago b ON a.TipoPagoID = b.TipoPagoID
          WHERE a.CajaID = tnCajaID 
          ORDER BY Registro ASC;
END

Que estoy haciendo mal?

Gracias de antemano


Saludos







ZeRoberto

unread,
Nov 18, 2018, 10:57:28 PM11/18/18
to publice...@googlegroups.com
Bueno ya lo solucione aparentemente la funcion suma primero y luego lo ordena lo que tuve que hacer es ordernar primero y luego sumar

Gracias

Saludos






mpulla

unread,
Nov 24, 2018, 9:56:00 PM11/24/18
to Comunidad de Visual Foxpro en Español
Hola ZeRoberto.

El orden de ejecución de sql es

From
On
Join
Where
Group By
With cube o With Rollup
Having
Select
Distinct
Order By
Top, Limit, offset (depende de la base de datos que uses)

Entonces es lógico que tengas ese resultado.

En las últimas versiones o si no es la ultima, Mysql incluyo las funciones de ventana, que te permite hacer running total, te hacen la vida más fácil, ademas de darte un juego amplio de herramientas.

Saludos
Mauricio

ZeRoberto

unread,
Nov 25, 2018, 12:03:40 AM11/25/18
to publice...@googlegroups.com
Hola mpulla lo que necesitaba es ir sumando por linea que me vaya mostrando linea por linea cuanto es la sumatoria

Al final lo solucione asi (La parte roja fue lo que adicione) 

   SET @lnSaldo := 0.00;
   SELECT CajaID, 0 CorteID, '' OrigenID, DATE(Fecha) Fecha, DATE_FORMAT(Fecha, '%h:%i %p') Hora, 'INICIAL' Concepto, '' Glosa, '' DocumentoID,
          '' NumDocumento, 0 Importe, '' UniqueID, '' Tipo, 0 TipoPagoID, '' TipoPago, 0 Estado, TRUNCATE(@lnSaldo := Inicial, 3) Saldo, Fecha Registro
          FROM cajas 
          WHERE CajaID = tnCajaID
   UNION ALL
   SELECT a.CajaID, a.CorteID, a.OrigenID, DATE(a.Fecha) Fecha, DATE_FORMAT(a.Fecha, '%h:%i %p') Hora, a.Concepto, a.Glosa, a.DocumentoID,
          a.NumDocumento, a.Importe, a.UniqueID, a.Tipo, a.TipoPagoID, b.TipoPago, a.Estado, 
          TRUNCATE(@lnSaldo := @lnSaldo + IF(a.Tipo = 'E', a.Importe, -a.Importe) * IF(a.Estado = 1, 0, 1), 3) Saldo, a.Fecha Registro
          FROM (SELECT * 
                       FROM cajas_lineas 
                       WHERE CajaID = tnCajaID
                       ORDER BY Fecha) a
               LEFT JOIN tipopago b ON a.TipoPagoID = b.TipoPagoID
          WHERE a.CajaID = tnCajaID;


Saludos


mpulla

unread,
Nov 26, 2018, 10:34:12 PM11/26/18
to Comunidad de Visual Foxpro en Español
Hola ZeRoberto

Entiendo lo que necesitas, lo que trato de decirte es que hay formas eficientes de hacerlo, Mysql recientemente incluyo funciones de ventana, antes de eso la forma de hacerlo es la que utilizas.

Saludos
Mauricio

ZeRoberto

unread,
Nov 27, 2018, 7:23:56 AM11/27/18
to publice...@googlegroups.com
Gracias mpulla en el link que me enviaste veo nuevas funciones, pero por el momento estoy usado la version  5.5.28

Gracias nuevamente por contestar

Saludos


Reply all
Reply to author
Forward
0 new messages