PDA

Ver la Versión Completa : Calcular Campo calculado solo una vez


mambo5cu
15-03-2005, 20:10:48
¿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)
.....

diegoforever24
15-03-2005, 23:30:09
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 :)

Héctor Randolph
16-03-2005, 03:34:12
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:


¿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:


Cuando se abre el DataSet.
Cuando el DataSet es puesto en estado de edición (dsEdit)
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:


Cuando se abre el DataSet.
Cuando el DataSet es puesto en estado de edición.
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.

mambo5cu
16-03-2005, 22:38:59
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




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 :)