Te voy a dar unas directrices, porque de Firebird no conozco demasiado, aunque sé que se puede hacer, no sé exactamente cómo.
1.- Crea una procedure con dos parámetros
Código SQL
[-]create procedure saldo_inicial( pcuenta, año )
variable saldo_inicial
select sum(debe)-Sum(haber) into saldo_inicial
from Saldos where cuenta = pcuenta and fecha < 01/01/año
return saldo_inicial
Con esto consigues el saldo al 1 de enero. Si en el asiento de apertura tienes el saldo, no necesitarías hacerlo.
2.- utiliza el case o lo que corresponda en tu motor de BBDD
Código SQL
[-]select cuenta, saldo_inicial ( cuenta, 2007) as saldo_inicial,
sum( case month(fecha ) =1 then debe-haber else 0 ) as enero,
sum( case month(fecha ) = 2then debe-haber else 0 ) as febrero,
sum( case month(fecha ) = 3 then debe-haber else 0 ) as marzo,
...
sum( case month(fecha ) =12 then debe-haber else 0 ) as Diciembre
form Saldos
where fecha between 01/01/2007 and 31/12/2007
GROUP BY CUENTA
Esto te devuelve
Cuenta, saldo inicial, Enero, Febrero, ... Diciembre
por cada cuenta si no lo filtras
y a partir de ahí, lo que quieras. La verdad es que queda bastante elegante.
Observa que he escrito el código 'a pelo' y que seguro tiene errores.
En un post similar puse un ejemplo que funciona.
http://www.clubdelphi.com/foros/show...+enero+febrero
Suerte y un saludo