Recalculo de saldo

23/10/2004 - 00:25 por LS - Sistemas | Informe spam
La pregunta es si puede hacerse en una sola sentencia SQL o debo recurrir a
un SP para hacer que se recalcule el saldo en una tabla con la siguiente
estructura:

Fecha,debe,haber,saldo

donde el saldo_fila = saldo_fila_anterior + debe_fila - haber_fila.
La fila insertada puede caer en cualquier lugar, no necesariamente al final,
y todo obviamente ordenado por fecha.

Lo tengo armado con un SP, pero no encuentro como hacerlo en una sola
sentencia.

Gracias

Leandro Sponton
Goya - Argentina

Preguntas similare

Leer las respuestas

#16 Eric Garza
25/10/2004 - 17:51 | Informe spam
Maxi:

Puedes llamar a un SP que te traiga los movimientos de la cuenta T y en el
componente agregar una columna con el saldo y calcularlo renglón por renglón
en vez de pedírselo a la BDD.

Saludos,
Eric Garza
AMIGE

"Maxi" wrote in message
news:
mmm, son formas nomas de hacer las cosas!! yo en todo caso siempre lo
pondria en un SP por muchas razones

(Seguridad, Performance, Reutilizacion, Sistematizacion para tus
desarrollarores)

Ademas mi concepto es otro, los motores de BDD lo que hacen muy bien es
trabajar justamente con datos, en el caso de Sql-Server hacen muy bien la
tera haciendo uso de T-sql dentro de SP por ej. Si no armas un SP estas
enviando los comandos por fuera, cosa que se recompilaran cada rato,


estaras
teniendo acceso directo a las tablas (a menos que uses Roles de


aplicacion,
pero claro no son 100% compatibles con otros motores y por ej en la


version
7.0 no los tenes)

Respuesta Responder a este mensaje
#17 Maxi
25/10/2004 - 17:57 | Informe spam
En ese caso si!! los cursores me gusta del lado del cliente y no del
Servidor


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Eric Garza" escribió en el mensaje
news:%23DPj$
Maxi:

Puedes llamar a un SP que te traiga los movimientos de la cuenta T y en el
componente agregar una columna con el saldo y calcularlo renglón por


renglón
en vez de pedírselo a la BDD.

Saludos,
Eric Garza
AMIGE

"Maxi" wrote in message
news:
> mmm, son formas nomas de hacer las cosas!! yo en todo caso siempre lo
> pondria en un SP por muchas razones
>
> (Seguridad, Performance, Reutilizacion, Sistematizacion para tus
> desarrollarores)
>
> Ademas mi concepto es otro, los motores de BDD lo que hacen muy bien es
> trabajar justamente con datos, en el caso de Sql-Server hacen muy bien


la
> tera haciendo uso de T-sql dentro de SP por ej. Si no armas un SP estas
> enviando los comandos por fuera, cosa que se recompilaran cada rato,
estaras
> teniendo acceso directo a las tablas (a menos que uses Roles de
aplicacion,
> pero claro no son 100% compatibles con otros motores y por ej en la
version
> 7.0 no los tenes)
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.781 / Virus Database: 527 - Release Date: 21/10/2004
Respuesta Responder a este mensaje
#18 Tomas Martin
26/10/2004 - 10:06 | Informe spam
Perdón por inmiscuirme. En un caso como este yo utilizaria una técnica
intermedia y me gustaría vuestra opinión:
- eliminar la columna saldo
- utilizar una tabla donde guardar los acumulados por meses (o semanas o
años dependiendo del número de movimientos) que sea actualizada por trigers
cuando se modifique la tabla principal
- para el calculo de saldo a una fecha utilizar un procedimiento que calcule
desde la tabla de acumulados al saldo a mes anterior al dado y le añada la
suma de movimientos desde el primer día del mes de la fecha dada hasta esa
fecha.

Tomás Martín
Respuesta Responder a este mensaje
#19 Eric Garza
26/10/2004 - 16:15 | Informe spam
Tomas:

Puedes usar una vista materializada (indexed view) para no tener que usar
una tabla de acumulados mensuales. SQL lo hará en automático por ti.

Saludos,
Eric Garza
AMIGE

"Tomas Martin" <t o m a s m m [ARROBA] m i c r o v e n [punto] n e t> wrote
in message news:uCag%
Perdón por inmiscuirme. En un caso como este yo utilizaria una técnica
intermedia y me gustaría vuestra opinión:
- eliminar la columna saldo
- utilizar una tabla donde guardar los acumulados por meses (o semanas o
años dependiendo del número de movimientos) que sea actualizada por


trigers
cuando se modifique la tabla principal
- para el calculo de saldo a una fecha utilizar un procedimiento que


calcule
desde la tabla de acumulados al saldo a mes anterior al dado y le añada la
suma de movimientos desde el primer día del mes de la fecha dada hasta esa
fecha.

Tomás Martín


Respuesta Responder a este mensaje
#20 Eric Garza
26/10/2004 - 19:04 | Informe spam
Para complementar este thread.

Un caso muy similar se analizó y discutió aquí:
Originalmente la versión de cursor es la más rápida debido a que es O(n)
mientras que las demás son O(n^2).

Calculating Running Totals
http://www.sqlteam.com/item.asp?ItemID856
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID`27

Por ahi, "nr" y "richardd" proponen un método lineal usando un UPDATE.
Desafortunadamente, dado que el UPDATE no soporta ORDER BY, no hay forma de
garantizar que el UPDATE se haga en el orden adecuado ya que depende de la
implementación de la BD.
Sin embargo, en SQL Server 2000 funciona muy bien, más no necesariamente en
futuras versiones ni en otras BD.

Aquí está mi versión (básicamente pone DayCount como PK para forzar el
recorrido de la tabla en el orden correcto):

DECLARE @Sales TABLE (DayCount smallint PRIMARY KEY, Sales money,
RunningTotal money)

INSERT INTO @Sales (DayCount, Sales) VALUES (4, 40)
INSERT INTO @Sales (DayCount, Sales) VALUES (5, 50)
INSERT INTO @Sales (DayCount, Sales) VALUES (6, 60)
INSERT INTO @Sales (DayCount, Sales) VALUES (3, 30)
INSERT INTO @Sales (DayCount, Sales) VALUES (1, 10)
INSERT INTO @Sales (DayCount, Sales) VALUES (2, 20)

DECLARE @RunningTotal money
SET @RunningTotal = 0

UPDATE @Sales
SET @RunningTotal = RunningTotal = @RunningTotal + Sales

SELECT * FROM @Sales ORDER BY DayCount

Saludos,
Eric Garza
AMIGE

"Eric Garza" wrote in message
news:
Hola Maxi:

1.- Esa tabla no está normalizada, la columna "saldo" es completamente
innecesaria y sólo se usa en la capa de presentación (Es una cuenta T de
Contabilidad).
2.- El tener una columna saldo asume que nadie va a insertar un registro


con
una fecha anterior e invalidar todos los saldos posteriores.
Se presentan problemas de integridad de información; si no, ¿por qué
necesitaría hacer un UPDATE como ese?
3.- Las soluciones para realizar semejante UPDATE no escalan


adecuadamente;
con tablas grandes, un cursor tal vez sea más apropiado que una solución


de
O(n^2) como la que le propuse.

Pero en fin, cada cabeza es un mundo, como decimos por acá.
¿Cuáles son tus razones para usar un diseño como ese?

Saludos,
Eric Garza
AMIGE

"MAXI" wrote in message
news:
> Eric, creo que la mejor forma es justamente hacerlo en la BDD mientras
esto
> no haga cursores claro esta!!
>
> En que te basas para decir que no es para la BDD? porque yo creo que
> justamente este tipo de cosas dentro de un SP son lo ideal
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida