Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Campos calculados, fórmula (https://www.clubdelphi.com/foros/showthread.php?t=1149)

mariajoiz 05-06-2003 12:29:35

Campos calculados, fórmula
 
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):

Código:

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...


La franja horaria es GMT +2. Ahora son las 11:53:08.

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