PDA

Ver la Versión Completa : Campos calculados, fórmula


mariajoiz
05-06-2003, 12:29:35
Hola, no tengo las ideas nada claras, a ver si me podeis ayudar un poco.

Tengo una tabla con campos para el nº de horas semanales, mensuales, bimensuales,etc. Necesito calcular el total de horas mediante una fórmula y almacenarlo después en un campo Total horas mensuales.
Debería ir calculándose si yo voy modificando los campos de la fórmula. Había pensado hacer un campo nuevo, de tipo calculado en la tabla y después pasar el valor al campo persistente de la tabla pero no me funciona.

Tengo que hacer la fórmula utilizando los campos de la tabla o los dbedits relacionados con esos campos?
Sería algo así?

Totalhorasmensuales.=(dbsemanales.value*4) + (dbquincenales.value *2)

gracias...

andres1569
05-06-2003, 12:43:22
Hola:

Si usas un sistema SQL, lo ideal es que tengas un campo calculado a nivel de tabla o que programes un trigger Before Insert y otro Before Update donde realizas esos cálculos. En tablas locales, eso lo consigues desde el evento BeforePost de la tabla en cuestión; el campo donde almacenas el nº de meses sería persistente en la base de datos (en la fórmula utilizas los valores de los campos de la tabla, no los de los DBEdits):


procedure Table1BeforePost;
begin
Table1.FieldByName(Totalhorasmensuales).AsInteger :=
Table1.FieldByName(Hsemanales).AsInteger * 4 +
Table1.FieldByName(Hquincenales).AsInteger *2;
end;


Un saludo

mariajoiz
05-06-2003, 13:43:33
Hola Andrés,

ya veo lo que dices, me imaginaba que era algo así, lo que pasa es que ahora me da un error:
[Error] Unit5.pas(550): Undeclared identifier: 'totalhorasmensuale'
y así con cada campo, y no entiendo por qué.

@-Soft
05-06-2003, 14:06:30
hola

me imagino que puede ser que no has colocado comillas simples
en las variables.

procedure Table1BeforePost;
begin
Table1.FieldByName('Totalhorasmensuales').AsInteger :=
Table1.FieldByName('Hsemanales').AsInteger * 4 +
Table1.FieldByName('Hquincenales').AsInteger *2;
end;

espero que te funcione.

saludos

andres1569
05-06-2003, 14:13:10
Hola:

Pues está claro, no hay ninguna variable con ese nombre, si desde Delphi has creado campos persistentes (¡ojo! persistentes para la aplicación, es decir creados en tiempo de diseño, no lo confundas con los campos persistentes de la base de datos), Delphi crea una variable de tipo TField o descendiente para acada uno de esos campos, te aparecerán dentro de la clase del DataModule o Form en qué esté la tabla, Delphi los nombra poniendo como prefijo el nombre de la tabla y luego el nombre del campo físico: TAClientesNumHorasSemanales. Si no los tienes como persistentes, mejor es que accedas desde el método FieldByName de la tabla, como te indico en mi mensaje anterior.

Un saludo

andres1569
05-06-2003, 14:16:37
Hola:

Acabo de leer el mensaje de @-soft; tiene razón, dejé de poner las comillas dentro del FieldByName, aunque el error que te da parece ser de compilación (el otro error te saltaría sólo al ejecutar), así que revisa ambas cosas.

Un saludo

mariajoiz
10-06-2003, 10:38:22
Hola...

casi funciona. Le faltaban las comillas, muchas gracias por la ayuda. Como necesito en mi fórmula :

Table1.FieldByName('Totalhorasmensuales').AsInteger :=
Table1.FieldByName('Hsemanales').AsInteger * 4 +
Table1.FieldByName('Hquincenales').AsInteger *2 +
Table1.FieldByName('bimensuales').AsInteger * 1/2 +
Table1.FieldByName('trimestrales').AsInteger * 1/3

y yo había declarado integer todos, ahora tengo el error
incompatible types integer - extended.
¿Tendría que declararlos float en access??

gracias de nuevo

andres1569
10-06-2003, 11:35:25
Hola:

Eso depende de si quieres almacenar un valor entero o un número de horas con parte fraccionaria. Si es lo primero, no hace falta que cambies el tipo de dato, sólo que pongas el TRUNC o ROUND en la operación:

Table1.FieldByName('Totalhorasmensuales').AsInteger := TRUNC(
Table1.FieldByName('Hsemanales').AsInteger * 4 +
Table1.FieldByName('Hquincenales').AsInteger *2 +
Table1.FieldByName('bimensuales').AsInteger * 1/2 +
Table1.FieldByName('trimestrales').AsInteger * 1/3);

mariajoiz
10-06-2003, 14:10:10
Gracias Andrés,

como necesitaba los decimales, lo he cambiado:

Table1.FieldByName('Totalhorasmensuales').Asfloat :=
Table1.FieldByName('Hsemanales').Asfloat * 4 +
Table1.FieldByName('Hquincenales').Asfloat *2 +
Table1.FieldByName('bimensuales').Asfloat * 1/2 +
Table1.FieldByName('trimestrales').Asfloat * 1/3;

Gracias...