domingo, julio 29, 2007

Firebird Stored Procedures

Trabajando con los procedimientos almacenados de firebird. Algo interesante es la posibilidad de tener columnas con acumulados en los procedimientos, algo que no es facil de lograr con MS SQL Server (a menos que se usen tablas temporables o variables de tipo tabla). Y la posibilidad de ejecutar procedimientos por cada registro.

Este es un ejemplo de un procedimiento que regresa un dataset con los movimientos de una cuenta, mostrando el saldo en cada registro.

CREATE PROCEDURE EDO_CTA(DESDE DATE)
RETURNS(
FECHA DATE,
CONCEPTO VARCHAR(50),
ENTRADA DECIMAL(15, 2),
SALIDA DECIMAL(15, 2)
SALDO DECIMAL(15, 2)
)
AS
BEGIN
--Obtenemos el saldo inicial
EXECUTE PROCEDURE GET_SALDO_INICIAL(:DESDE)
RETURNING_VALUES :SALDO;

FOR SELECT
FECHA, CONCEPTO, ENTRADA, SALIDA
FROM
MOVIMIENTOS_CUENTA
WHERE
FECHA > :DESDE
INTO
:FECHA, :CONCEPTO, :ENTRADA, :SALIDA
DO BEGIN
SALDO = SALDO + ENTRADA - SALIDA;
SUSPEND;
END
END;


Esto ira calculando el saldo por cada registro.

2 comentarios:

  1. Justito lo que estaba buscando.. pero.. como seria la store procedure de get_saldo_inicial? tengo dudas en la sintaxis, no estoy muy ducho.
    Muchas gracias, Juan

    ResponderEliminar
  2. El código mostrado es solo un ejemplo para mostrar el punto, un procedimiento real tendría que tomar en cuantas muchas otras cosas (como el numero de cuenta por ejemplo).

    En el caso del procedimiento GET_SALDO_INICIAL pudiera realizarse haciendo un query a una tabla de saldos al día o como una suma de entradas menos las salidas, es decir hay varias posibilidades. La sintaxis seria similar al procedimiento EDO_CTA del ejemplo.

    ResponderEliminar