Jump to content


Photo

Consulta para acumular valor de fila a fila


  • Please log in to reply
9 replies to this topic

#1 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 20 April 2012 - 07:55 PM

Hola Gente

Quiero mejor una consulta que ya tengo resulta de forma "artesanal".
Es un resumen de cuenta

Ejemplo:

FECHA - DEBE - HABER - SALDO DE LA FILA

01/05/2012 - $1000 - $700 - $ 300
10/05/2012 - $0500 - $000 - $ 800
20/05/2012 - $0000 - $200 - $ 600


Básicamente, lo que necesito es almacenar por fila, la resta de Debe y Haber, y tomarla como saldo para la próxima fila.


pd: estuve leyendo, y algunos lo resuelven con "cursores", los cuales no se utilizar.


http://www.firebirds...ql-declare.html ahi tengo como se declara.  :|



Gracias.



  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 20 April 2012 - 08:27 PM

Hola
No entiendo amigo, en el ejemplo se restan debe y haber pero el saldo no esta en la siguiente fila.
No entiendo.
Saludos
  • 0

#3 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 20 April 2012 - 08:46 PM

Hola
No entiendo amigo, en el ejemplo se restan debe y haber pero el saldo no esta en la siguiente fila.
No entiendo.
Saludos


claro, lo tomo de la fila anterior.

01/05/2012 - $1000 - $700 - $ 300
10/05/2012 - $0500 - $000 - $ 800 (acá son 300 + 500)
20/05/2012 - $0000 - $200 - $ 600 (acá 800 - 200)

¿Me explico ahora?


  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3283 posts
  • LocationColombia

Posted 20 April 2012 - 09:57 PM

La información del enlace se refiere a si es un procedimiento de almacenado, ya si se trata de un query mira si te funciona una subconsulta para la operación.


Saludos!
  • 0

#5 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 posts
  • LocationOaxaca, México

Posted 20 April 2012 - 11:14 PM

Haber si esto ayuda, trate de simular lo que tratas pero con una tabla que no va al caso pero sustituyo los campos que creo se involucran en tu caso Nikolas:


CREATE OR ALTER PROCEDURE sp_CalculaSaldos
returns (
    o_fecha  date,                          <--Campo que nuestro Select extrae de tus tablas
    o_debe  numeric(18,2),            <--Campo que nuestro Select extrae de tus tablas
    o_haber numeric(18,2),            <--Campo que nuestro Select extrae de tus tablas
    o_saldo  numeric(18,2))            <--Aquí va nuestro cálculo (debe - haber)
as
declare variable saldo_acumulado numeric(18,2);
begin
  saldo_acumulado = 0;
  For select fecha, debe, haber from cuotas where num_prestamo = '001-3241'
    into :o_fecha, :o_debe, :o_haber
  do
  begin
    o_saldo = saldo_acumulado + :o_debe - :o_haber;
    saldo_acumulado = :o_saldo ;
    suspend;
  end
  suspend;
end



Creo con un For Select bastaría para realizar lo que deseas, me disculpo si no sustituí correctamente mis campos  *-)

Más información: http://www.firebirds...-forselect.html

Esta característica amo de Firebird que extraño en MS SQL Server  :)


Saludos
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 23 April 2012 - 06:19 AM

Aqui lo hacemos como te comenta fredycc, un procedimiento almacenado que itera en un for y te acumula el saldo línea a línea, solo que con dos pequeñas "mejoras":

-Usamos un "execute sentence" dentro de nuestra SQL con lo que te ahorras crear explicitamente el procedure (aunque el resultado es el mismo).

-La clausula where se la pasamos como un parámetro al procedure, así como el saldo inicial por si no es 0 (un balance que incie a mitad de año tiene un saldo inical no nulo).

Pero la idea es esencialmente la misma.
  • 0

#7 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 posts
  • LocationOaxaca, México

Posted 23 April 2012 - 08:34 AM

:) a lo que responde Sergio, muy interesante  :o, este link podría sugerirte muchas ideas con execute sentence, ademas de mejoras en su ejecución si usas FB 2.5

En el apartado: Improved performance

http://www.firebirds...l-execstat.html

Saludos

  • 0

#8 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 30 April 2012 - 12:53 PM

gracias a todos por la ayuda.

Hoy retomo este tema pero aparentemente, con eso, lo resolvería.!

;)
  • 0

#9 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 15 May 2012 - 07:35 AM

Regreso con este tema dado que me surgió un problema colateral.  *-)

Este SP

begin
  SALIDA =0; SALIDA2 =0;
FOR SELECT
Consulta
  DO
  BEGIN
  if (:pendp is null) then
  pendp = 0;
  if (:pendd is null) then
  pendd = 0;

  SALIDA2 = SALIDA2 + :dolares;
  SALIDA = SALIDA + :pesos;
  suspend;
  END
suspend;
end


Me da, este resultado:

Imagen Enviada

El problema es que me duplica la ultima fila.

Por otro lado, la consulta sola, me da las filas correctas. (Sin duplicar.) lo que me sugiere me el problema este en el SP.


gracias!  :wink:
  • 0

#10 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 15 May 2012 - 08:24 AM


Resuelto

El segundo "suspend" es el que generaba ese fila.  ^o|

begin
  SALIDA =0; SALIDA2 =0;
FOR SELECT
Consulta
  DO
  BEGIN
  if (:pendp is null) then
  pendp = 0;
  if (:pendd is null) then
  pendd = 0;

  SALIDA2 = SALIDA2 + :dolares;
  SALIDA = SALIDA + :pesos;
  suspend;
  END
-- suspend; ESTE NO VA!
end

  • 0




IP.Board spam blocked by CleanTalk.