 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jaquemate Lt Cmdr


Registrado: 30 Sep 2002Mensajes: 110
|
Publicado: Dom 04 Ene, 2004 9:58 pm Asunto: Campo calculado con el saldo |
|
|
Hola, tengo la siguiente tabla de SQL:
| Código: | create table APUNTES
(
ID_APUNTE integer not null,
FECHA date not null,
CONCEPTO varchar(100),
DEBE numeric(11,4),
HABER numeric(11,4)
);
|
Pues bien, quiero hallar el saldo de la tabla según la posición del apunte de forma que en la columna del debe sumaría valores y en la del haber los restaría. Esto quiero mostrarlo luego en un TDBGrid de la siguiente forma:
| Código: | DEBE HABER SALDO
---- ----- -----
100 null 100
025 null 125
null 005 120
null 020 100
|
Los valores del debe y del haber los tengo ya en la tabla, pero los del saldo no, y quisiera calcularlos en vez de guardarlo en la tabla como otro campo más. ¿Se podría hacer esto con una consulta SQL o con un campo calculado de C++builder?
Gracias y un saludo. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 04 Ene, 2004 10:56 pm Asunto: |
|
|
Debes crear un campo calculado dentro del SQL y poseteriormente en el evento OnDrawCell, aplicar el valor de que necesitas...
saludos y sientes algo de codigo ponlo y te puedo ayudar mejor... _________________
 |
|
| Volver arriba |
|
 |
jaquemate Lt Cmdr


Registrado: 30 Sep 2002Mensajes: 110
|
Publicado: Lun 05 Ene, 2004 12:49 am Asunto: |
|
|
Muchas gracias por tu respuesta, Cesar.
Verás, no puedo usar un campo calculado porque un campo calculado sólo puede usar valores del registro o fila en el que se encuentra, no de los otros registros. Y como verás, el saldo es un valor que se va acumulando según el registro en que se encuentre.
Al final lo he solucionado con un procedimiento almacenado de Firebird/Interbase, y eso que no tenía ni idea de la sintaxis de Firebird... Lo que hace un ratito de lectura:
| Código: | set term !! ;
create procedure
saldos
(
numero_cuenta integer
)
returns
(
id_apunte integer,
id_cuenta integer,
fecha date,
concepto varchar(100),
debe numeric(11,4),
haber numeric(11,4),
saldo numeric(11,4)
)
as
declare variable debe_haber smallint;
declare variable total numeric(11,4);
begin
saldo = 0;
for
select
id_apunte,
id_cuenta,
fecha,
concepto,
debe_haber,
total
from
apuntes
where
id_cuenta = :numero_cuenta
into
:id_apunte,
:id_cuenta,
:fecha,
:concepto,
:debe_haber,
:total
do
begin
if (:debe_haber = 0) then
begin
debe = :total;
haber = null;
saldo = saldo + :debe;
end
else
begin
debe = null;
haber = :total;
saldo = saldo - :haber;
end
suspend;
end
end !!
set term ; !!
|
Luego para hacer la consulta, sólo tengo que hacer:
| Código: | select * from saldos(1); // donde 1 es la cuenta número 1
|
Un saludo y gracias de nuevo por tu interés. |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Lun 05 Ene, 2004 9:47 am Asunto: |
|
|
Mira puedes usar esta sentencia SQL ya sea en un query donde modifiques el valor del registro interesado o bien puedes meterla en un procedimiento almacenado.
| Código: |
// He obviado id_apunte, pues no te sirve para nada y además no podrias
// meterlo y usar el group by pues entonces no tendría el efecto esperado
SELECT id_cuenta, SUM(debe) AS debe, SUM(haber) AS haber, (SUM(debe)-SUM(haber)) AS saldo
FROM apuntes
WHERE id_cuenta=num_cuenta
GROUP BY id_cuenta
|
num_apunte sería una variable de Builder en el caso de que lo hagas por medio de una consulta, o bien sería el parametro que se le pasará al procedimiento almacenado.
Sobre el procedimiento almacenado de abajo, quizás sea un poquito más eficiente el codigo de arriba metido en ese procedimiento almacenado pues ya se encarga el select de hacer las sumas y las diferencias. Además creo que no deberías devolver id_apunte, pues imagino que para una misma cuenta tendrás varios apuntes distintos, es decir, imaginate la cuenta 105, tiene el apunte 100, 150, 200, 250, si es así, entonces ¿que apunte vas a devolver? Es decir tiene sentido devolver el número de cuenta, pero no puedes devolver todos los apuntes, sino uno, luego es algo que no interesa, lo mismo sucede con la fecha y el concepto, pues hacen referencia a un apunte en concreto, y tu lo que quieres es el debe, el haber y el saldo de una cuenta, luego debes ignorar el apunte, la fecha y el concepto pues ellos solo saben de un apunte concreto.
En fin espero que haya podido ser de ayuda.
ciao, por cierto te recuerdo que hay un foro especifico para Bases de Datos. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Lun 05 Ene, 2004 10:14 am Asunto: |
|
|
Se me olvidó apuntar en mi anterior mensaje que puse el ejemplo para que solo calculara una cuenta concreta si quieres el saldo de todas las cuentas solo debes quitar la clausula WHERE, quedaría así:
| Código: |
SELECT id_cuenta, SUM(debe) AS debe, SUM(haber) AS haber, (SUM(debe)-SUM(haber)) AS saldo
FROM apuntes
GROUP BY id_cuenta
|
Esta Query la podrías asociar a un TDBGrid si quisieras tener listados todas los numeros de cuenta con sus respectivos saldos.
Ciao. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|