PDA

Ver la Versión Completa : Calculo de Años


jrcosta75
20-02-2004, 14:16:43
Necesito calcular los anos transcurridos entre el año de compra de una producto el cual lo introdusco a una tabla mediante un dbedit, y la fecha actual que posee la computador.
Ejemplo:
AÑo de compra: 1999
Año actual : 2004
Resultado: 5
Precisaria que si se puede me pasen todo el codigo completo del calculo. Desde ya muchas gracias.
Aclaración: trabajo en Delphi 5 entreprice y con tablas paradox 7

__cadetill
20-02-2004, 14:24:53
Me suena que hay una función, pero como no tengo el Delphi delante....


var
D, M, AIni, AFin : Word;
begin
DecodeDate(AFin, M, D, Date);
DecodeDate(AIni, M, D, TablaCampoFecha.AsDateTime);
ShowMessage('Diferencia de años : ' + IntToStr(AFin - AIni));
end;


PD: Frases como esta

Precisaria que si se puede me pasen todo el codigo completo del calculo

no suelen gustar. Así que te aconsejo no ponerlas. Aquí se ayuda, pero no se trabaja para nadie ;)

jrcosta75
20-02-2004, 21:17:38
CADETILL UTILICE EL SIGUIENTE CODIGO :

procedure TModeloDatos.TblMuebleCalcFields(DataSet: TDataSet);
Var

D, M, AIni, AFin : Word;
Begin
DecodeDate(AFin, M, D, Date);
AIni:=ModeloDatos.TblMueble.FieldValues['Añocompra'];
ShowMessage('Diferencia de años : ' + IntToStr(AFin - AIni));
end;


PARA CALCULAR LOS ANOS TRANSCURRIDOS ENTRE EL AÑO DE COMPRA DE UN PRODUCTO Y EL ACTUAL Y ME DA EL SIGUIENTE ERROR:

[Error] ModDat.pas(104): Types of actual and formal var parameters must be identical
[Fatal Error] CStock.dpr(15): Could not compile used unit 'ModDat.pas'

Y NO SE COMO ARREGLARLO
Saludos, jrcosta75

DarkByte
20-02-2004, 21:34:24
procedure TForm1.Button1Click(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('07/09/1969'));
end;

Te da la edad en años. Ese procedure está en el truco 628 de trucomanía

__cadetill
20-02-2004, 22:33:53
se supone que


ModeloDatos.TblMueble.FieldValues['Añocompra']

es de tipo DateTime, no?
Pues entonces has de hacer lo que te proponia en el mensaje anterior


var
D, M, AIni, AFin : Word;
begin
DecodeDate(AFin, M, D, Date);
DecodeDate(AIni, M, D, ModeloDatos.TblMueble.FieldValues['Añocompra']);
ShowMessage('Diferencia de años : ' + IntToStr(AFin - AIni));
end;

maruenda
20-02-2004, 23:39:09
que ocurre si compro algo el 31/12/03 y lo vendo el 01/01/04. ?
que resultado debe dar? deberia dar 0 años. no? creo que no habria querestar solo los años, sino tener en cuenta toda la fecha. :confused:

DarkByte
21-02-2004, 11:28:28
manrueda... yo intento poner mi granito de arena conforme a mis conocimientos (o capacidad de búsqueda de información), es verdad lo que dices, debería de dar la fecha completa, el caso es que no se :d

eduarcol
21-02-2004, 14:52:17
function Edad(FecNac, FecAct: tDateTime): Integer;
var
nAnoAct, nMesAct, nDiaAct: word;
nAnoNac, nMesNac, nDiaNac: word;
Edad: Integer;
begin
//Calcula la edad en años
//Desglosa la Fecha
DecodeDate(FecNac, nAnoNac, nMesNac, nDiaNac);
DecodeDate(FecAct, nAnoAct, nMesAct, nDiaAct);
//Verifica una fecha
if FecNac = 0 then
begin
Result := 0;
Exit;
end;
//Edad en años
Edad := nAnoAct - nAnoNac;
//Calculo del mes
if nMesAct = nMesNac then
begin
//Para el Dia
if nDiaAct < nDiaNac then Edad := Edad - 1;
end
else if nMesAct < nMesNac then Edad := Edad - 1;
//Devuelve el valor
Result := Edad;
end;


para el qiue la necesite es unafuncion que devuelve la edad exacta en años tomando en cuenta hasta el dia.

FecNac: Fecha de Nacimiento
FecAct: Fecha Actual o fecha a la cual se quiere calcular la edad

Cualquier duda pregunten, esta funcion esta 100% operativa

maruenda
21-02-2004, 15:09:10
darkbyte, no tenia intencion de infravalorar tus conocimientos . Seguro que son superiores a los mios. solamente que anoche viendo esta pregunta se me ocurrio que podria tener esa pega. Que ademas es muy comun , no solo en programacion sino en cualquier ambito de la vida, cuando calculamos el tiempo transcurrido entre dos fechas. Solo di mi punto de vista. Espero no ofender a nadie. Aqui estamos para aprender y compartir conocimientos, ya que 4 ojos ven mas que 2. Son muchas las veces que alguien de este foro me ha ayudado con algun problema, o me ha aclarado alguno duda. un :) saludo.

marcoszorrilla
21-02-2004, 15:32:47
Me alegro de la aclaración hecha pues DarkByte es un asiduo coloborador del Club, por otra parte añadir que si restamos 2 fechas es decir dos variables del tipo Tdate, obtenemos días:

procedure TForm1.Button1Click(Sender: TObject);
var
dIni,dFin:Tdate;
nDias:Double;
begin
dIni:=Date - 10;
dFin:=Date;
nDias:=dFin - dIni;
ShowMessage(FormatFloat(',0.0000',n));
end;


En cuanto al ejemplo que propones, creo que habría que matizar, un bien adquirido el dia 20-08-1999 al día de hoy de 2004 no tendría 5 años y esto sería importante por ejemplo si pretendemos calcular la amortización del mismo.

Lo que propongo como solución sería restar los 2 fechas y dividirlas entre 365 si es que es posible es decir si el resultante fuera > 365

Un Saludo.

Ruben_Cu
21-02-2004, 17:51:51
Hola a todos, en este caso yo propondría utilizar una de las funciones que tenemos en los utilitarios de fechas (unit DateUtils), de forma general podemos usar el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:='Han transcurrido '+FloatToStr(YearSpan(date,ModeloDatos.TblMueble.FieldByName('Añocompra').AsDateTime)+ 'años';
end;

Por supuesto propongo un TLabel pero pudiera ser en mensaje como propuso Cadetill.
Esta función devuelve los años con fracciones y solventa el caso de periodos menores de uno vale para el asunto señalado por Marcos para amortizaciones.
Si se trabaja con otras funciones de este grupo se pudiera llegar a mostrar los años, meses y días transcurridos quedando mas elegante la presentación.
Saludos

DarkByte
21-02-2004, 19:48:02
darkbyte, no tenia intencion de infravalorar tus conocimientos .
Jeje, que yo sepa nunca lo has hecho, me alegra que me corrijan, pues así veo cuales de mis teorías son erróneas y me ayuda a mejorar, por lo tanto quedo agradecido a los que me corrijen. Aquí tienes tú y todos los del foro un amigo para cuando lo necesitéis ;)
Seguro que son superiores a los mios.
Eso lo dudo :)
solamente que anoche viendo esta pregunta se me ocurrio que podria tener esa pega.
Has hecho lo correcto, pues para eso está el foro...
Aqui estamos para aprender y compartir conocimientos, ya que 4 ojos ven mas que 2.
Pues claro!!, para eso está el foro!! :) , yo estoy aquí por lo mismo, aunque no puedo compartir mucho... pues no tengo el qué
un :) saludo.
Otro para tí...
;) :)

buitrago
24-02-2004, 06:13:56
http://fundementals.sourceforge.net/

jrcosta75
24-02-2004, 21:47:39
Probe de todas formas para calcular los anos transcurridos y no hay forma me da error

PUSE:

procedure TForm10.BitBtn1Click(Sender: TObject);
Var
d,m,Aini,Afin:Word;
begin
Decodedate(Date,Afin,m,d,);
Decodedate(ModeloDatos.TblMueble.FieldValues['Fechcomp'],Aini,m,d,);
ShowMessage('Diferencia de años:'+IntToStr(Afin-Aini));
end;

Y ME DIO EL SIGUIENTE ERROR

[Error] Unit10.pas(105): Too many actual parameters
[Error] Unit10.pas(106): Too many actual parameters
[Fatal Error] CStock.dpr(15): Could not compile used unit 'Unit10.pas'

TAMBIEN PUSE:

procedure TForm10.BitBtn1Click(Sender: TObject);
Var
d,m,Aini,Afin:Word;
begin
Decodedate(Afin,m,d,Date);
Decodedate(Aini,m,d,ModeloDatos.TblMueble.FieldValues['Fechcomp']);
ShowMessage('Diferencia de años:'+IntToStr(Afin-Aini));

end;

Y ME DIO EL SIGUIENTE ERROR

[Error] Unit10.pas(105): Types of actual and formal var parameters must be identical
[Error] Unit10.pas(106): Types of actual and formal var parameters must be identical
[Fatal Error] CStock.dpr(15): Could not compile used unit 'Unit10.pas'

NO SE COMO HACERLO NECESITO AYUDA
GRACIAS.

guillotmarc
24-02-2004, 22:05:43
Con solo darle a F1 verás que la sintaxis correcta es la primera. Para que te funcione, prueba a no poner paréntesis de más.


procedure TForm10.BitBtn1Click(Sender: TObject);
Var d,m,Aini,Afin:Word;
begin
Decodedate(Date,Afin,m,d);
Decodedate(ModeloDatos.TblMueble.FieldValues['Fechcomp'],Aini,m,d);
ShowMessage('Diferencia de años:'+IntToStr(Afin-Aini));
end;

marcoszorrilla
24-02-2004, 22:14:24
procedure TForm10.BitBtn1Click(Sender: TObject);
Var
d,m,Aini,Afin:Word;
begin
Decodedate(Date,Afin,m,d,);//La coma sobra
Decodedate(ModeloDatos.TblMueble.FieldValues['Fechcomp'],Aini,m,d,);
ShowMessage('Diferencia de años:'+IntToStr(Afin-Aini));
end;

Un Saludo.

guillotmarc
24-02-2004, 22:26:01
donde dije paréntesis de más, digo diego, digo quise decir comas de más. :)

marcoszorrilla
24-02-2004, 22:32:36
Escribimos casi al mismo tiempo Marc, cuando he enviado mi mensaje aún no estaba el tuyo.

Donde dije Diego no digo nada.

Un Saludo.