Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2015
adripugliesso adripugliesso is offline
Miembro
NULL
 
Registrado: jul 2015
Posts: 49
Poder: 0
adripugliesso Va por buen camino
Optimizar StoreProcedure Resumen de Cuenta

Buenos dias tengo un Store Procedure que arma un resumen de cuentas de proveedores calculando Debe, Haber y Saldo. El problema es que cuando existen muchos registros de un proveedor esta consulta tarda 10 a 20seg en responder o a veces mas. Lo que hace la consulta es ir calculando el saldo restando el total de haber - total de debe en cada registro.


Código SQL [-]
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, S.fecha)) as Fecha, S.percIIBB, S.PercGcias,
  S.idMovimiento, ISNULL(S.idMovCampo, 0) as idMovCampo, S.importe, S.Neto, S.idOP,
  S.Empresa, S.idProveedor,  S.NroComprobante, S.idTipoMov, S.idOrigenPago, S.idEmpresa,
  S.Tipo, S.TipoLetra, S.NroLote, S.NroFact, S.Detalle, S.Vehiculo, S.Debe, S.Haber,

  ((SELECT (F.Facturas - P.pagos - CASE WHEN ch.Saldo is NULL THEN 0 ELSE ch.Saldo END) as SAldo FROM

  (SELECT (CASE WHEN SUM(Importe) IS NULL THEN 0 ELSE SUM(Importe) END) as Facturas FROM Movimientos
  WHERE
  idProveedor = @paramidProveedor
  AND
  idTipoMov = 1
  AND
  idMovimiento < s.idMovimiento) as F,

  (SELECT (CASE WHEN SUM(Importe) IS NULL THEN 0 ELSE SUM(Importe) END) as Pagos FROM Movimientos M1
  WHERE
  M1.idProveedor = @paramidProveedor
  AND
  ((idTipomov = 5) OR (idTipomov = 3) OR (idTipomov = 6) OR (idTipomov = 7))
  AND
  M1.idMovimiento < s.idMovimiento) as P,

  (Select SUM(Monto) as Saldo FROM 
  Cheques C INNER JOIN Movimientos M
  ON M.idMovimiento = C.idMov 
  WHERE 
  M.idProveedor =  @paramidProveedor
  AND
  C.idMov < s.idMovimiento) as Ch) + s.Debe - s.Haber 
  
  ) as Saldo 
  
  FROM 

  (SELECT fecha ,  percIIBB, PercGcias, idMovimiento, idmovcampo, Importe, neto,
    idOP, E.Nombre as Empresa, idProveedor, NroComprobante, idTipoMov, idOrigenPago,
    M.idEmpresa, TC.Tipo, TipoLetra, NroLote, NroFact, Detalle, Vehiculo,
    Importe as Debe, 0 as Haber
  FROM Movimientos M INNER JOIN TipoComprobante TC
  ON M.idTipoComp = TC.idComprobante   LEFT JOIN Empresas E
  ON M.idEmpresa = E.idEmpresa
  WHERE
  idProveedor = @paramidProveedor
  AND
  idTipomov = 1
  
  UNION

  SELECT M.fecha , M.percIIBB, M.PercGcias, M.idMovimiento, idmovcampo, Importe,
         neto, idOP, E.Nombre as Empresa, M.idProveedor, NroComprobante, M.idTipoMov,
         M.idOrigenPago, M.idEmpresa, TC.Tipo, TipoLetra, NroLote, NroFact, M.Detalle,
         M.Vehiculo, 0 as Debe, M.Importe + (CASE WHEN (Select SUM(Monto)
  FROM Cheques WHERE idMov = M.idMovimiento) IS NULL THEN 0
       ELSE (Select SUM(Monto) FROM Cheques WHERE idMov = M.idMovimiento) END) as Haber
  FROM Movimientos M INNER JOIN TipoComprobante TC
  ON M.idTipoComp = TC.idComprobante LEFT JOIN Empresas E
  ON M.idEmpresa = E.idEmpresa
  WHERE
  M.idProveedor = @paramidProveedor
  AND
  ((idTipomov = 5) OR (idTipomov = 3) OR (idTipomov = 6) OR (idTipomov = 7))
  GROUP BY M.fecha , M.percIIBB, M.PercGcias, M.idMovimiento, idmovcampo, E.Nombre,
           M.idProveedor, NroComprobante, M.idTipoMov, M.idOrigenPago, M.idEmpresa,
           TC.Tipo, TipoLetra, NroLote, NroFact, M.Detalle, M.Vehiculo, M.Importe,
           M.Neto, M.idOP
  ) as S 

WHERE S.idMovimiento >= @paramDesde
  AND S.idMovimiento <= @paramHasta
  AND S.Detalle LIKE '%'+@paramDetalle+'%'
ORDER BY idMovimiento

hay alguna manera mas eficiente de ir armando un resumen de cuentas ???

Última edición por ecfisa fecha: 30-09-2015 a las 13:44:01. Razón: Ajustar longitud de líneas para mejorar visualización
Responder Con Cita
  #2  
Antiguo 30-09-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
Vaya lío....
con qué motor trabajas?

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 30-09-2015
adripugliesso adripugliesso is offline
Miembro
NULL
 
Registrado: jul 2015
Posts: 49
Poder: 0
adripugliesso Va por buen camino
SQL Server 2005. No me interesa por ahi corregir el codigo de programacion, sino la logica. O sea cual es la mejor forma para armar un resumen de cuentas con Debe - Haber - Saldo con un Store Procedure SQL..
Responder Con Cita
  #4  
Antiguo 01-10-2015
gaunmanuel gaunmanuel is offline
Miembro
 
Registrado: may 2015
Posts: 48
Poder: 0
gaunmanuel Va por buen camino
Definitivamente es un query enorme.
Si tu problematica es el tiempo que tarda, te recomiendo que la consulta la analices con la herramienta DataBase Engine Tuning Advisor, la encuentras en el menu Herramientas del Management Studio.
Esta herramienta lo que detectara es si te faltan algunos indices en las tablas que manejas y te recomendara generarlos, y esto hara que tu consulta sea mas rápida.


saludos.
Responder Con Cita
  #5  
Antiguo 01-10-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
La semana pasada respondí a una pregunta parecida, y la repuesta fue "divide y vencerás". Al final era un campo por el que se ordenaba y que no tenía índice.

Divide las querys tal y como te recomiendan y mide los tiempos. Revisa el plan de ejecución e identifica qué queries se ejecutan lentas para revisar los índices o la posible mejora de la consulta.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DataSnap con StoreProcedure ramflores Conexión con bases de datos 7 17-09-2014 17:53:05
¿'Storeprocedure que devuelva registros? JXJ Firebird e Interbase 2 21-02-2014 14:03:53
consulta sql para resumen de cuenta corriente pjacob80 SQL 9 24-01-2013 17:10:46
Error en cuenta/Login/cuenta robada coso___ La Taberna 17 24-02-2009 17:30:14
sybase + storeprocedure y RollBack Enan0 Conexión con bases de datos 0 09-06-2006 03:24:11


La franja horaria es GMT +2. Ahora son las 17:15:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi