Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Campo calculado con el saldo

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Campo calculado con el saldo Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.