Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Talking Como hacer una columna Acumulada en SQL

Buenas, tengo el siguiente problemita:

Mi base de datos es sql server 2005, programo en delphi 2006, y uso ADO.

Tengo una tabla que se llama CTACTE (Cuenta Corriente) en la cual se guardan todos los movimientos (DEBITOS, CREDITOS, FACTURAS, PAGOS) de los clientes.
Sus campos son: Id_cliente, MontoMovimiento(si es un pago o una nota de crédito el valor es negativo), TipoMovimiento(DB,FAC,NC,PAG), Concepto, FechaEmision, Status(A ó N).

se muestra mas o menos asi cuando ejecuto los siguiente:
Código SQL [-]
Select * from CTACTE where Id_cliente=1
Código SQL [-]
 
ID_cliente    MontoMovimiento            TipoMovimiento            Concepto              FechaEmision
      1                    1,000.00                      FAC                        Factura                 08/08/2007
      1                     -500.00                       NC                         nota cre                01/09/2007
Perfecto, pero yo quiero que me salga una columna acumulando el balance del cliente, o que salga de esta forma:
Código SQL [-]
ID_cliente    MontoMovimiento            Acumulado           Concepto           FechaEmision
      1                    1,000.00                 1,000.00               Factura               08/08/2007
      1                     -500.00                   500.00                nota cre              01/09/2007
la columna que quiero calcular, es ACUMULADO, y no se como hacerlo


Sus aportes serían de gran ayuda.

Gracias Anticipadas

Última edición por egarc fecha: 18-09-2007 a las 18:32:13.
Responder Con Cita
  #2  
Antiguo 18-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
No es cierto... dejame consulto
__________________


Última edición por ContraVeneno fecha: 18-09-2007 a las 19:30:55. Razón: pequeño error
Responder Con Cita
  #3  
Antiguo 18-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código SQL [-]
Select cast(F1.MontoMovimiento as money) as total,
cast(sum (F2.MontoMovimiento) as money) as Acumulativo
from CTACTE F1
join CTACTE F2 on (F1.MontoMovimiento > F2.MontoMovimiento) 
or (F1.MontoMovimiento = F2.MontoMovimiento and F1.Codigo= F2.Codigo)
Group By F1.MontoMovimiento

"Codigo" es el índice que identifica a cada registro
__________________

Responder Con Cita
  #4  
Antiguo 18-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
no entendi nada......
Responder Con Cita
  #5  
Antiguo 18-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código SQL [-]
Select C1.MontoMovimiento, Sum(C2.MontoMovimiento)
from CTACTE C1
join CTACTE C2 on (C1.MontoMovimiento > C2.MontoMovimiento) or (C1.MontoMovimiento = C2.MontoMovimiento)
Group By C1.MontoMovimiento
Order by C1.MontoMovimiento

Más claro, ya no puedo
__________________

Responder Con Cita
  #6  
Antiguo 18-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Talking

Muchas gracias, es exactamente lo que buscaba.....
Responder Con Cita
  #7  
Antiguo 18-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Exclamation

es exactamento lo que buscaba, pero.....los datos que me arroja no son reales la columan ACUMULADO...

Probé el código, a simple vista vi que me daba datos, pero luego detalladamente no fue así....

Responder Con Cita
  #8  
Antiguo 18-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Pues yo lo probé y sí me da los datos exactos de un acumulado.
http://www.geocities.com/bodokike/acumulado.jpg

¿te tomaste la molestia de analizar lo que propuse?

¿sabes para qué es el cast?

La primer consulta utiliza un campo "código" que en tu ejemplo, "código" debería ser el campo llave de tu tabla. Debes de tener cuidado con la forma en que lo ordenas y especialmente con la parte:
Código SQL [-]
C1.MontoMovimiento > C2.MontoMovimiento
Dependiendo de como lo ordenes, sera un ">" o un "<".

Vamos, que esto no se trata de copiar y pegar.

Ahora bien, exactamente: ¿porque dices que los datos no son reales? ¿no te los suma? ¿no están en orden? ¿no sale nada?
y principalmente:
¿cómo adaptaste el ejemplo a tu código?
__________________

Responder Con Cita
  #9  
Antiguo 19-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Wink

Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, C1.Tipo,C1.NumeroControl
from CTACTE C1
join CTACTE C2 on (C1.Monto < C2.Monto) or (C1.Monto = C2.Monto) 
where (c1.cod_cliente=1)and (c2.cod_cliente=1)
Group By C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, c1.id ,C1.Tipo,C1.NumeroControl, c1.monto,C1.Id
Order by C1.id

Id es el campo que me dice el orden en que entraron a la tabla las transacciones....es autonumérico..

este es el SQL que estoy ejecutanto, pero....

la columna acumulado, no sale debidamente ordenada...

entiendo todo el sql que pusiste.....

Gracias anticipadas

Última edición por egarc fecha: 19-09-2007 a las 18:46:34.
Responder Con Cita
  #10  
Antiguo 19-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, C1.Tipo,C1.NumeroControl
from CTACTE C1
join CTACTE C2 on (C1.Monto > C2.Monto) or (C1.Monto = C2.Monto and C1.Cod_Cliente = C2.Cod_Cliente and C1.ID = C2.ID)
where c1.cod_cliente=1
Group By C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, c1.id ,C1.Tipo,C1.NumeroControl, c1.monto,C1.Id
Order by C1.id
__________________

Responder Con Cita
  #11  
Antiguo 19-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Unhappy

me dio lo mismo!

Última edición por egarc fecha: 19-09-2007 a las 21:10:43.
Responder Con Cita
  #12  
Antiguo 19-09-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
no pues ahí sí ya no te puedo ayudar. Necesitaría conocer tu sistema de base de datos y toda la estructura para saber exactamente que esta pasando. Pero así desde aquí, no tengo la más mínima idea.
__________________

Responder Con Cita
  #13  
Antiguo 19-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Unhappy

Gracias de todas formas.....

pero, no habrá otra forma, por ejemplo con un campo calculado....o algo asi??

si conoces alguna, por favor!!

Gracias
Responder Con Cita
  #14  
Antiguo 20-09-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, 
         C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion,  
         C1.Tipo,C1.NumeroControl
from CTACTE C1 inner join CTACTE C2 on (C1.id >= C2.id) 
where c1.cod_cliente = 1
Group By C1.FechaEmision, C1.Usuario, C1.NCF, 
             C1.NroComprobante,C1.Cod_actuacion, c1.id, 
             C1.Tipo, C1.NumeroControl, c1.monto, C1.Id
Order by C1.id

Prueba con esto, así te debería funcionar. Pero te aconsejaria que intentaras entender la consulta y no simplemente copiarla, ya que te lo dieron hecho, simplemente tenias que amoldarlo a tus necesidades. El problema es que ordenabas por id y en el join la comparación la hacias con monto. Intenta entenderlo, que así te valdrá de algo, y si no entiendes pregunta, ya sabes que aquí estamos para ayudarte.

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 20-09-2007 a las 10:40:12.
Responder Con Cita
  #15  
Antiguo 21-09-2007
egarc egarc is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
egarc Va por buen camino
Amigo gracias, lo unico que le falto algo en el WHERE, que en C2.Cod_cliente=1
Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision,          
C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion,          
C1.Tipo,C1.NumeroControlfrom CTACTE C1 inner join CTACTE C2 on (C1.id >= C2.id)
 where c1.cod_cliente = 1 and c2.cod_cliente = 1 Group By C1.FechaEmision, C1.Usuario, C1.NCF,              
C1.NroComprobante,C1.Cod_actuacion, c1.id,              
C1.Tipo, C1.NumeroControl, c1.monto, C1.IdOrder by C1.id


Muchisimas gracias...
Responder Con Cita
Respuesta



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
Hacer que una columna de un DbGrid aparezca distinta según valor Aprendiendo OOP 11 30-11-2018 14:47:20
Como hacer esto a una columna de un cxgrid??? AFilth Varios 0 22-11-2006 12:08:19
Como hacer para que el ancho de una columna de un TListView permanezca inalterable abracadabra OOP 17 01-10-2005 00:33:35
como hacer que una columna del dbgrid contenga un valor de un TEdit en cada celda Shidalis OOP 2 02-08-2005 12:05:35
Como hacer invisible columna de Grid? txuseibar OOP 4 10-10-2003 19:04:15


La franja horaria es GMT +2. Ahora son las 23:43:25.


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