Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-03-2005
mambo5cu mambo5cu is offline
Registrado
 
Registrado: mar 2005
Posts: 2
Poder: 0
mambo5cu Va por buen camino
Calcular Campo calculado solo una vez

¿Cómo hacer para que el evento OncalclFields de un dataset sólo se dispare 1 vez, por ejemplo cuando abro el dataset, que se ejecute para cada uno de los artículos del dataset y ya nunca más se dispare?
Por ejemplo:

Si estoy tratando de mostrar un grid con un balance en el que el campo "saldo" lo calculo como el saldo de la ficha anterior + debe - haber, y el primero lo calculo a partir de un saldo inicial:

saldoinicial= 2
fecha debe haber saldo
01/01/01 10 7 5 ( 2+10-7)
02/01/01 20 0 25 (5+20-0)
03/01/01 30 5 50 (25+30-5)
.....
Responder Con Cita
  #2  
Antiguo 15-03-2005
diegoforever24 diegoforever24 is offline
Registrado
 
Registrado: nov 2004
Ubicación: Cartago, Colombia
Posts: 4
Poder: 0
diegoforever24 Va por buen camino
Thumbs up Campos Calculados

Que tal Amigo...

Ya comprendo tu problema. Pues mira, si tienes una bd con los campos (Fecha, debe, haber) y un campo calculado que es Saldo.

Si coincido con lo anterior, lo más seguro es que cada vez que se activa el OnCalcFields te hace un descuento adicional que no es el objetivo.

TE RECOMIENDO LO SIGUIENTES, pues a mi en la mayoría de los casos lo aplico.

Será crear un ciclo de tal manera que todos los campos sean locales (no calculados). y a la hora de involucrar el valor inicial (saldo inicial digitarlo en el primer registro.


Ejemplo:

Procedure Calculos;

var
NuevoSaldo:integer

begin


Tabla1.First // Ubicar la tabla en el primer registro.

NuevoSaldo:=tabla1Saldo.AsInteger;

Tabla1.Next; // para cambiar al siguiente registro
While not Tabla1.EOF do /// Mientras no sea fin de archivo en la tabla hacer
begin
tabla1Saldo.asInteger:=NuevoSaldo+tabla1debe.Asinteger-tabla1haber
NuevoSaldo:=NuevoSaldo+tabla1debe.Asinteger-tabla1haber
Tabla1.next;
end;

end;

//////////// Ubicar "calculos" en el evento OncalcFields o en otro momento, por ejemplo un botón Calcular, etc.

Espero que no te parezca muy complicado y te pueda servir. Así tengo funcionando varios programas con calculos similares, incluso fechas y utilizando Sql.

Saludos
Responder Con Cita
  #3  
Antiguo 16-03-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola a todos!

Me parece una buena opción la que menciona Diego, de hecho yo también lo he resuelto con algo similar.

Por otra parte, sólo para responder la pregunta original:

Cita:
¿Cómo hacer para que el evento OncalclFields de un dataset sólo se dispare 1 vez, por ejemplo cuando abro el dataset, que se ejecute para cada uno de los artículos del dataset y ya nunca más se dispare?
Bueno pues los DataSet tiene la propiedad AutoCalFields que cuando tiene el valor True, entonces el evento OnCalcFields se dispara en estos casos:
  1. Cuando se abre el DataSet.
  2. Cuando el DataSet es puesto en estado de edición (dsEdit)
  3. Cuando se cambia el foco de un control visual a otro, o de una columna a otra en un grid y se han hecho modificaciones en el registro.

Cuando la propriedad AutoCalcFields tiene el valor False en evento OnCalcFields se dispara sólo en estos casos:
  1. Cuando se abre el DataSet.
  2. Cuando el DataSet es puesto en estado de edición.
  3. Cuando un registro es cargado desde la base de datos.


Si pones la propiedad AutoCalcFields en False puedes reducir la frecuencia con la que se llama el evento, sin embargo no puedes evitar que se ejecute al menos en los tres casos que mencioné anteriormente.

Un saludo y seguimos en contacto.
Responder Con Cita
  #4  
Antiguo 16-03-2005
mambo5cu mambo5cu is offline
Registrado
 
Registrado: mar 2005
Posts: 2
Poder: 0
mambo5cu Va por buen camino
Gracias

Hola Diego,

Gracias por tu atención, pero el problema es que estoy trabajando con tablas muy grandes, y el tiempo de respuesta del sistema debe de ser muy pequeño por lo que estoy tratando de optimizar este cálculo. Yo analizaba esa variante del campo calculado porque me di cuenta que estos funcionan MUCHO más rápido que los campos normales si tengo que moverme a lo largo de toda la tabla calculando y actualizando el saldo para cada registro de la tabla.
Yo comencé por es variante, pero es incluso mucho más lenta que si lleno el campo ejecutando una consulta SQL determinada.

Gracias de todos modos por tu respuesta,
Saludos,
Félix




Cita:
Empezado por diegoforever24
Que tal Amigo...

Ya comprendo tu problema. Pues mira, si tienes una bd con los campos (Fecha, debe, haber) y un campo calculado que es Saldo.

Si coincido con lo anterior, lo más seguro es que cada vez que se activa el OnCalcFields te hace un descuento adicional que no es el objetivo.

TE RECOMIENDO LO SIGUIENTES, pues a mi en la mayoría de los casos lo aplico.

Será crear un ciclo de tal manera que todos los campos sean locales (no calculados). y a la hora de involucrar el valor inicial (saldo inicial digitarlo en el primer registro.


Ejemplo:

Procedure Calculos;

var
NuevoSaldo:integer

begin


Tabla1.First // Ubicar la tabla en el primer registro.

NuevoSaldo:=tabla1Saldo.AsInteger;

Tabla1.Next; // para cambiar al siguiente registro
While not Tabla1.EOF do /// Mientras no sea fin de archivo en la tabla hacer
begin
tabla1Saldo.asInteger:=NuevoSaldo+tabla1debe.Asinteger-tabla1haber
NuevoSaldo:=NuevoSaldo+tabla1debe.Asinteger-tabla1haber
Tabla1.next;
end;

end;

//////////// Ubicar "calculos" en el evento OncalcFields o en otro momento, por ejemplo un botón Calcular, etc.

Espero que no te parezca muy complicado y te pueda servir. Así tengo funcionando varios programas con calculos similares, incluso fechas y utilizando Sql.

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:10:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi