Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Actualizar campo edad (https://www.clubdelphi.com/foros/showthread.php?t=83722)

jafera 19-07-2013 19:31:19

Actualizar campo edad
 
Buenas de nuevo.

Para finalizar los updates correspondientes a la tabla que nos ha dado la murga en mi último post, necesito realizar un update que me coloque en un campo vacio la edad de la persona sabiendo su fecha de nacimiento.

Si yo ejecuto este código:

Código SQL [-]
 
SELECT
  DATA_NAIX,
  EXTRACT( YEAR FROM DATA_NAIX)
FROM CTR0003;

me devuelve el año de nacimiento para cada registro, pero este dato no quiero guardarlo en la tabla, lo que quiero guardar es la edad de la persona por año natural, el que tiene 50 años los tiene desde el 1 de enero hasta el 31 de diciembre, con lo que necesitaria un update que me hiciera esta labor despues de importar la tabla que tantos quebraderos de cabeza me dio.

Necesito algo dinámico en cuanto al año en curso ya que no voy a estar año tras año variando el valor del año del que restar y he pensado en una variable año que tengo para otros menesteres en el programa.

Mi duda es como puedo armar este update?

Algo así como update tabla set edat = variable año-extract año de la fecha de nacimiento.

De nuevo gracias por vuestro apoyo

Josep

Casimiro Noteví 19-07-2013 21:05:40

Puedes usar un campo calculado, algo así:

Código SQL [-]
create table usuarios (
  codigo int not null,
  nombre varchar(64),
  fechanacimiento date,
  edad computed by (extract(year from 'now' - fechanacimiento)),
  primary key codigo
)

fjcg02 19-07-2013 21:12:19

Volviendo a la carga, yo personalmente haría una store procedure que dadas dos fechas (una la de nacimiento y otra la de cuando quieras calcular la edad) te devuelva los años.

Así te valdría para calcular la edad de un corredor a día de hoy, para saber la edad de cuando corrió una carrera determinada, etc, etc.

La puedes usar en selects en otros procedimientos, ...

Saludos

radenf 19-07-2013 23:31:31

Cita:

Empezado por jafera (Mensaje 464155)
Necesito algo dinámico en cuanto al año en curso ya que no voy a estar año tras año variando el valor del año del que restar y he pensado en una variable año que tengo para otros menesteres en el programa.

Estimado jafera :

Yo utilizo siempre esta función, que alguien que no recuerdo, alguna vez publicó en el foro:

Código Delphi [-]
procedure TForm1.DBEdit1Change(Sender: TObject);
function Edad(FechaNacimiento:string):integer;
var
iTemp,iTemp2,Nada:word;
Fecha:TDate;
begin
Fecha:=StrToDate(FechaNacimiento);
DecodeDate(Date,itemp,Nada,Nada);
DecodeDate(Fecha,itemp2,Nada,Nada);
if FormatDateTime('mmdd',Date) <
FormatDateTime('mmdd',Fecha) then Result:=iTemp-iTemp2-1
else Result:=iTemp-iTemp2;
end;
begin
Label1.Caption:=intToStr(Edad (EditFecha.Text));
end;

Utiliza la propiedad OnChange del DBEdit en el que visualizas la fecha y te entrega en años la edad actualizada en el Label1

Ojalá te sirva
Salu2

radenf 20-07-2013 00:00:41

Corrijo la última línea del código, debiendo ser:

Código Delphi [-]
Label1.Caption:=intToStr(Edad (DBEdit1.Text));

Perdón y Salu2

jafera 20-07-2013 13:48:28

Hola a todos de nuevo.

Gracias por vuestras repuestas y vuestro tiempo.

Igual no me expresé bien, no quiero calcular la edad en el formulario de entrada de corredores, esto ya lo hago y funciona.

Lo d guardar la ya lo hago en la tabla de las carreras, así siempre se que edad y categoris tenía el corredor en el momento de celebrarse la carrera.

Lo que necesito es hacer un update masivo despues de hacer la importacion de datos del txt que me reste del año actual el año de la fecha de nacimiento y asi tengo la edad, sin importar dia ni mes.

Saludos

Josep

Casimiro Noteví 20-07-2013 17:14:28

De la forma que te he dicho lo hace automáticamente siempre.

jafera 20-07-2013 18:01:00

Gracias de nuevo, pero me da error al crear la tabla con el campo computed.

Me dice expression evaluation no supported.

Esta es la creacion de la tabla

Código SQL [-]
 
CREATE TABLE "CTR0003"
(
  "DORSAL" INTEGER,
  "DORSAL2" INTEGER,
  "COGNOM1" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "COGNOM2" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "NOM" VARCHAR(20) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODI_CAT" INTEGER,
  "NACIO" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "LLICENCIA" VARCHAR(14) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "DNI" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODIUCI" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODI_CLUB" INTEGER,
  "CLUB" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "ABR_CLUB" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "PUBLICITAT" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "SEXE" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "FEDERAT" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "DATA_NAIX" DATE,
  "EDAT" COMPUTED BY (EXTRACT(YEAR FROM 'NOW' - DATA_NAIX)),
  "CATEGORIA" VARCHAR(5) CHARACTER SET ISO8859_1 COLLATE ES_ES
);

Mi Firebird es 1.5

Saludos

Josep

Casimiro Noteví 20-07-2013 19:18:49

Cita:

Empezado por jafera (Mensaje 464193)
Me dice expression evaluation no supported.
"EDAT" COMPUTED BY (EXTRACT(YEAR FROM 'NOW' - DATA_NAIX)),

¿El campo data_naix es date o timestamp?, ¿estás usando dialecto 1 ó 3?
Prueba a crearlo después, algo así como:

Código SQL [-]
alter table CTR0003 add edat computed by (extract(year from ('now'-data_naix)))

Ah, creo que olvidaste el paréntesis después del from, no recuerdo si era así, te hablo de memoria.

jafera 20-07-2013 19:35:54

Pues tampoco, me sigue dando el mismo error

Ya lo dejo para el lunes, que mañana tengo que montar la piscina en casa

Saludos

Josep

Casimiro Noteví 20-07-2013 22:59:32

También puedes crear un trigger en el afterupdate de la tabla, algo así:
Código SQL [-]
create trigger trg_CTR0003_au for CTR0003 active after update position 0
as
begin
  new.edad = extract( year from new.fechanacimiento) - extract( year from 'now') 
end

Repito, echa un vistazo a la documentación o algún ejemplo, escribo de memoria.

jafera 22-07-2013 19:46:44

Hola de nuevo.

He hecho unas pruebas y en el IBConsole me funciona (poniendo el valor 2013 en lugar de parámetro) pero con código no.

Consulta sql que funciona bien en IBConsole;
Código SQL [-]
 
UPDATE CTR0003 SET EDAT =:A-(EXTRACT (YEAR FROM DATA_NAIX))

Le paso el valor del parámetro A:
Código Delphi [-]
 
SQLEdat.Close;
SQLEdat.UnPrepare;
SQLEdat.ParamByName('A').AsInteger:=F_ModulDades.a;
SQLEdat.Prepare;
SQLEdat.Open;

Y la respuesta es SQLEdat: Parameter 'A' not found.

Que estoy haciendo mal?

Gracias

jafera 24-07-2013 10:51:06

Solucionado

Buenas a todos.

He encontrado la solución a la evaluación de la fórmula, al final la sentencia sql ha quedado así:
Código SQL [-]
 
UPDATE CTR0003 SET EDAT =((EXTRACT(YEAR FROM DATE 'NOW'))-(EXTRACT(YEAR FROM DATA_NAIX)))
WHERE EDAT IS NULL

Buscando en los hilos he encontrado que delante de 'NOW' se tenia que poner DATE para que evaluara la fecha.

Si sirve de ejemplo para alguien más pues contento que estaré.

Saludos

Josep


La franja horaria es GMT +2. Ahora son las 22:44:21.

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