Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calculo de Años (https://www.clubdelphi.com/foros/showthread.php?t=7598)

jrcosta75 20-02-2004 14:16:43

Calculo de Años
 
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....

Código:

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
Cita:

Empezado por jrcosta75
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

Calculo de anio
 
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

Código:

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

Código:

ModeloDatos.TblMueble.FieldValues['Añocompra']
es de tipo DateTime, no?
Pues entonces has de hacer lo que te proponia en el mensaje anterior

Código:

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

pregunta
 
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

Código:


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

sin animo de ofender
 
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:
Código:

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

Cita:

Empezado por maruenda
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 ;)
Cita:

Empezado por maruenda
Seguro que son superiores a los mios.

Eso lo dudo :)
Cita:

Empezado por maruenda
solamente que anoche viendo esta pregunta se me ocurrio que podria tener esa pega.

Has hecho lo correcto, pues para eso está el foro...
Cita:

Empezado por maruenda
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é
Cita:

Empezado por maruenda
un :) saludo.

Otro para tí...
;) :)

buitrago 24-02-2004 06:13:56

Aqui encontrarás unas Units que son una maravilla
 
http://fundementals.sourceforge.net/

jrcosta75 24-02-2004 21:47:39

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

Código:

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

Código:

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.


La franja horaria es GMT +2. Ahora son las 15:14:46.

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