Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-06-2003
mariajoiz mariajoiz is offline
Miembro
 
Registrado: may 2003
Ubicación: valencia
Posts: 13
Poder: 0
mariajoiz Va por buen camino
Question 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...
Responder Con Cita
  #2  
Antiguo 05-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 05-06-2003
mariajoiz mariajoiz is offline
Miembro
 
Registrado: may 2003
Ubicación: valencia
Posts: 13
Poder: 0
mariajoiz Va por buen camino
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é.
Responder Con Cita
  #4  
Antiguo 05-06-2003
Avatar de @-Soft
@-Soft @-Soft is offline
Miembro
 
Registrado: may 2003
Ubicación: Santo Domingo, Rep. Dom.
Posts: 200
Poder: 22
@-Soft Va por buen camino
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
__________________
Ivan Lora

http://www.arrobasoft.da.ru

Valientes son aquellas personas que triunfan donde otros fracasan.
Bienaventurado los que nada esperan porque jamas seran defraudados.
Responder Con Cita
  #5  
Antiguo 05-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 05-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 10-06-2003
mariajoiz mariajoiz is offline
Miembro
 
Registrado: may 2003
Ubicación: valencia
Posts: 13
Poder: 0
mariajoiz Va por buen camino
Thumbs up

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
Responder Con Cita
  #8  
Antiguo 10-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
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);
__________________
Guía de Estilo
Responder Con Cita
  #9  
Antiguo 10-06-2003
mariajoiz mariajoiz is offline
Miembro
 
Registrado: may 2003
Ubicación: valencia
Posts: 13
Poder: 0
mariajoiz Va por buen camino
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...
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 17:29:16.


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