Fórum SUBTRAÇÃO DE TEMPO DE SERVIÇO #467617
22/01/2014
0
Edit6.Text := IntToStr(AnoT)+ ' Ano(s), '+ IntToStr(MesT)+ ' Mês(s), ' + IntToStr(DiaT)+' Dia(s)';
Porém estou precisando também calcular quanto tempo falta ainda para a pessoa aposentar que é 30 anos de serviço ou seja pega
30 ANOS 00 MES e 00 DIA e subtrai pelo resultado:
Edit6.Text := IntToStr(AnoT)+ ' Ano(s), '+ IntToStr(MesT)+ ' Mês(s), ' + IntToStr(DiaT)+' Dia(s)';
aí vai sair o tempo que ainda falta para aposentadoria, alguém pode me ajudar como subtrair o resultado de 30 anos 00 mês e 00 dia?
Paulo
Curtir tópico
+ 0Posts
22/01/2014
Marcos Saffran
obs.: considerei todos os meses com 30 dias
o procedimento não leva em conta anos bissextos
var
AnoC, MesC, DiaC : Integer; //valores calculados
AnoAux, MesAux, DiaAux : Integer; //variáveis auxiliares
AnoT, MesT, DiaT : Integer;
begin
if (MesT > 0) or (DiaT > 0) then
begin
AnoAux := AnoT + 1;
if DiaT > 0 then
begin
MesAux := MesT + 1;
DiaAux := 30 - DiaT;
end
else
MesAux := MesT;
end
else
begin
AnoAux := AnoT;
end;
AnoC := 30 - AnoAux;
MesC := 13 - MesAux;
DiaC := DiaAux;
end;Gostei + 0
22/01/2014
Paulo
obs.: considerei todos os meses com 30 dias
o procedimento não leva em conta anos bissextos
var
AnoC, MesC, DiaC : Integer; //valores calculados
AnoAux, MesAux, DiaAux : Integer; //variáveis auxiliares
AnoT, MesT, DiaT : Integer;
begin
if (MesT > 0) or (DiaT > 0) then
begin
AnoAux := AnoT + 1;
if DiaT > 0 then
begin
MesAux := MesT + 1;
DiaAux := 30 - DiaT;
end
else
MesAux := MesT;
end
else
begin
AnoAux := AnoT;
end;
AnoC := 30 - AnoAux;
MesC := 13 - MesAux;
DiaC := DiaAux;
end;Não entendi como fazer a subtração do tempo total que está no edit6 de 30 anos 00 meses e 00 dia e jogar no edit3
Gostei + 0
22/01/2014
Marcos Saffran
No final do procedimento você pode incluir a seguinte linha:
Edit3.Text := 'Faltam ' + IntToStr(AnoC)+ ' Ano(s), '+ IntToStr(MesC)+ ' Mês(es), ' + IntToStr(DiaC)+' Dia(s)';
Gostei + 0
22/01/2014
Thiago Irrazabal
Primeiramente declare essas propriedades no public da tua unit.
property DiasTrabalhados: Integer read GetDiasTrabalhados; property DiasParaAposentadoria: Integer read GetDiasParaAposentadoria; property DiasFaltantesParaAposentadoria: Integer read GetDiasFaltantesParaAposentadoria; property AnosFaltantes: Integer read GetAnosFaltantes; property MesesFaltantes: Integer read GetMesesFaltantes; property DiasFaltantes: Integer read GetDiasFaltantes;
Aperte o CTRL + SHIFT + C para criar os métodos "GET's".
No método GetDiasParaAposentadoria coloque isso:
Result := 30 * 360;
No método GetDiasTrabalhados coloque isso:
Result := (AnoT * 360) + (MesT * 30) + DiaT;
No método GetDiasFaltantesParaAposentadoria coloque isso:
Result := DiasParaAposentadoria - DiasTrabalhados;
No método GetAnosFaltantes coloque isso:
Result := DiasFaltantesParaAposentadoria div 360;
No método GetMesesFaltantes coloque isso:
Result := (DiasFaltantesParaAposentadoria div 30) - ((DiasFaltantesParaAposentadoria div 360) * 12);
No método GetDiasFaltantes coloque isso:
Result := 30 - DiaT;
Declare uma procedure chamada Calcula:
procedure Calcula;
Aperta o CTRL + SHIFT + C para criar ela e coloque isso:
AnoT := AnosFaltantes; MesT := MesesFaltantes; DiaT := DiasFaltantes; Edit6.Text := IntToStr(AnoT)+ ' Ano(s), '+ IntToStr(MesT)+ ' Mês(s), ' + IntToStr(DiaT)+' Dia(s)';
Depois é só chamar a procedure Calcula no click de algum botão.
Lembrando que eu usei o ano comercial para os cálculos, no caso o ano comercial tem 360 dias e cada mês tem 30 dias. Abraço
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
23/01/2014
Paulo
obs.: considerei todos os meses com 30 dias
o procedimento não leva em conta anos bissextos
var
AnoC, MesC, DiaC : Integer; //valores calculados
AnoAux, MesAux, DiaAux : Integer; //variáveis auxiliares
AnoT, MesT, DiaT : Integer;
begin
if (MesT > 0) or (DiaT > 0) then
begin
AnoAux := AnoT + 1;
if DiaT > 0 then
begin
MesAux := MesT + 1;
DiaAux := 30 - DiaT;
end
else
MesAux := MesT;
end
else
begin
AnoAux := AnoT;
end;
AnoC := 30 - AnoAux;
MesC := 13 - MesAux;
DiaC := DiaAux;
end;Não entendi como fazer a subtração do tempo total que está no edit6 de 30 anos 00 meses e 00 dia e jogar no edit3
ATÉ ESTA SAINDO O RESULTADO, MAIS NÃO MUITO EXATO.
VOU POSTAR O MEU CODIGO E SE VC PUDER ME AJUDAR:
procedure TForm1.BtnSomarClick(Sender: TObject);
Var
Ano, Mes, Dia, Ano1, Mes1, Dia1, Ano2, Mes2, Dia2, AnoA, MesA,
DiaA, TotalB, TotalA, AnoT, MesT, DiaT : Word;
Data1, Data2 :TDateTime;
Resultado : String;
begin
If DateTimePicker1.Date < DateTimePicker2.Date then
begin
Data1 := DateTimePicker1.Date;
Data2 := DateTimePicker2.Date;
end
else
begin
Data1 := DateTimePicker2.Date;
Data2 := DateTimePicker1.Date;
Resultado := 'Falta ';
end;
DecodeDate(Data1, Ano1, Mes1, Dia1);
DecodeDate(Data2, Ano2, Mes2, Dia2);
if Dia2 >= Dia1 Then
begin
Dia := Dia2 - Dia1;
end
else
begin
If Mes2 = 1 then
begin
Dia := Dia2 + 30 - Dia1;
Mes2 := Mes2 - 1;
Ano2 := Ano2 - 1;
end
else
begin
If Mes2 = 3 then
begin
Dia := Dia2 + 30 - Dia1;
Mes2 := Mes2 - 1;
end
else
begin
If (Mes2 = 5) or (Mes2 = 7) or (Mes2 = 10) or (Mes2 = 12) then
begin
Dia := Dia2 + 30 - Dia1;
Mes2 := Mes2 - 1;
end
else
begin
Dia := Dia2 + 30 - Dia1;
Mes2 := Mes2 - 1;
end;
end;
end;
end;
If Mes2 >= Mes1 then
begin
Mes := Mes2 - Mes1;
end
else
begin
Mes := Mes2 + 12 - Mes1;
Ano2 := Ano2 - 1;
end;
If Ano2 >= Ano1 then
begin
Ano := Ano2 - Ano1;
end
else
begin
Ano := 0;
end;
If Ano < 2 then
Resultado := Resultado + IntToStr(Ano) + ' Ano, '
else
Resultado := Resultado + IntToStr(Ano) + ' Anos, ';
If Mes < 2 then
Resultado := Resultado + IntToStr(Mes) + ' Mes, '
else
Resultado := Resultado + IntToStr(Mes) + ' Meses, ';
If Dia < 2 then
Resultado := Resultado + IntToStr(Dia) + ' Dia.'
else
Resultado := Resultado + IntToStr(Dia) + ' Dias.';
Edit1.Text := (Resultado);
//end {Foi retirado um End daqui, esse end não pode existir aqui}
// AÍ EU ADICIONEI MAIS 3 EDITS E MAIS 2 LABELS E ADICIONEI OS CODIGOS ABAIXO:
if EditAnoA1.Text <> '' then
AnoA := StrToInt(EditAnoA1.Text);
if EditAnoA2.Text <> '' then
AnoA := AnoA + StrToInt(EditAnoA2.Text);
if EditAnoA3.Text <> '' then
AnoA := AnoA + StrToInt(EditAnoA3.Text);
if EditAnoA4.Text <> '' then
AnoA := AnoA + StrToInt(EditAnoA4.Text);
if EditMesA1.Text <> '' then
MesA := StrToInt(EditMesA1.Text);
if EditMesA2.Text <> '' then
MesA := MesA + StrToInt(EditMesA2.Text);
if EditMesA3.Text <> '' then
MesA := MesA + StrToInt(EditMesA3.Text);
if EditMesA4.Text <> '' then
MesA := MesA + StrToInt(EditMesA4.Text);
if EditDiaA1.Text <> '' then
DiaA := StrToInt(EditDiaA1.Text);
if EditDiaA2.Text <> '' then
DiaA := DiaA + StrToInt(EditDiaA2.Text);
if EditDiaA3.Text <> '' then
DiaA := DiaA + StrToInt(EditDiaA3.Text);
if EditDiaA4.Text <> '' then
DiaA := DiaA + StrToInt(EditDiaA4.Text);
TotalB := (AnoA*360) + (MesA*30) + DiaA;
AnoA := TotalB div 360;
MesA := (TotalB - (AnoA*360))div 30;
DiaA := TotalB - ((AnoA*360)+(MesA*30));
//Tempo Averbado é jogado no Edit5
Edit5.Text := IntToStr(AnoA)+ ' Ano(s), ' + IntToStr(MesA) + ' Mês(s), '+ IntToStr(DiaA) + ' Dia(s) ';
totalA := (Ano*360) + (AnoA*360) + (Mes*30) + (MesA*30) + Dia + DiaA;
AnoT := TotalA div 360;
MesT := (TotalA - (AnoT*360))div 30;
DiaT := TotalA - ((Anot*360)+(MesT*30));
//Tempo Atual + Tempo Averbado = Total
Edit6.Text := IntToStr(AnoT)+ ' Ano(s), '+ IntToStr(MesT)+ ' Mês(s), ' + IntToStr(DiaT)+' Dia(s)';
end;
Gostei + 0
23/01/2014
William
Segue exemplo formulário
[img:descricao=Formulário]http://arquivo.devmedia.com.br/forum/imagem/269142-20140123-124434.jpg[/img]
Segue código
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime;
Tempo: integer);
var
vDiaA, vMesA, vAnoA, vDiaI, vMesI, vAnoI: word;
vDiasD, vMesesD, vAnosD, vDiaR, vMesR, vAnoR, vTemp: integer;
vDataTemp: TDateTime;
begin
// Calcula diferença entre os anos
vAnosD := YearsBetween(dataFinal, dataInicial);
// Fragmenta as datas em dia, mes e ano
DecodeDate(dataInicial, vAnoI, vMesI, vDiaI);
DecodeDate(dataFinal, vAnoA, vMesA, vDiaA);
// Calcula diferença entre os meses
vTemp := 0;
vTemp := vMesI - vMesA;
if vMesI > vMesA then
begin
vMesesD := vTemp - 12;
vMesesD := vMesesD * -1;
end
else
vMesesD := vTemp;
// Calcula diferença entre os dias
vDataTemp := StrToDate(IntToStr(vDiaI) + '/' + IntToStr(vMesA) + '/' + IntToStr(vAnoA));
vDiasD := DaysBetween(vDataTemp, dataFinal);
// Calcula quantidade de anos restantes
vAnoR := Tempo - vAnosD;
// Calcula quantidade de meses restantes
vMesR := 12 - vMesesD;
// Calcula quantidade de dias restantes
vDataTemp := StrToDate('01/' + IntToStr(vMesI) + '/' + IntToStr(vAnoI + Tempo));
vDiaR := DaysInMonth(vDataTemp) - vDiasD;
// Exibe o resultado no TMemo
mmResultado.Clear;
mmResultado.Lines.Add('Tempo de Serviço');
mmResultado.Lines.Add(IntToStr(vAnosD) + ' anos, ' + IntToStr(vMesesD) + ' meses e ' + IntToStr(vDiasD) + ' dias ');
mmResultado.Lines.Add(' ');
mmResultado.Lines.Add('Tempo restante ');
mmResultado.Lines.Add(IntToStr(vAnoR) + ' anos, ' + IntToStr(vMesR) + ' meses e ' + IntToStr(vDiaR) + ' dias ');
end;
Qualquer dúvida estou a disposição ...
Gostei + 0
23/01/2014
Paulo
Segue exemplo formulário
[img:descricao=Formulário]http://arquivo.devmedia.com.br/forum/imagem/269142-20140123-124434.jpg[/img]
Segue código
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime;
Tempo: integer);
var
vDiaA, vMesA, vAnoA, vDiaI, vMesI, vAnoI: word;
vDiasD, vMesesD, vAnosD, vDiaR, vMesR, vAnoR, vTemp: integer;
vDataTemp: TDateTime;
begin
// Calcula diferença entre os anos
vAnosD := YearsBetween(dataFinal, dataInicial);
// Fragmenta as datas em dia, mes e ano
DecodeDate(dataInicial, vAnoI, vMesI, vDiaI);
DecodeDate(dataFinal, vAnoA, vMesA, vDiaA);
// Calcula diferença entre os meses
vTemp := 0;
vTemp := vMesI - vMesA;
if vMesI > vMesA then
begin
vMesesD := vTemp - 12;
vMesesD := vMesesD * -1;
end
else
vMesesD := vTemp;
// Calcula diferença entre os dias
vDataTemp := StrToDate(IntToStr(vDiaI) + '/' + IntToStr(vMesA) + '/' + IntToStr(vAnoA));
vDiasD := DaysBetween(vDataTemp, dataFinal);
// Calcula quantidade de anos restantes
vAnoR := Tempo - vAnosD;
// Calcula quantidade de meses restantes
vMesR := 12 - vMesesD;
// Calcula quantidade de dias restantes
vDataTemp := StrToDate('01/' + IntToStr(vMesI) + '/' + IntToStr(vAnoI + Tempo));
vDiaR := DaysInMonth(vDataTemp) - vDiasD;
// Exibe o resultado no TMemo
mmResultado.Clear;
mmResultado.Lines.Add('Tempo de Serviço');
mmResultado.Lines.Add(IntToStr(vAnosD) + ' anos, ' + IntToStr(vMesesD) + ' meses e ' + IntToStr(vDiasD) + ' dias ');
mmResultado.Lines.Add(' ');
mmResultado.Lines.Add('Tempo restante ');
mmResultado.Lines.Add(IntToStr(vAnoR) + ' anos, ' + IntToStr(vMesR) + ' meses e ' + IntToStr(vDiaR) + ' dias ');
end;
Qualquer dúvida estou a disposição ...
deu o seguinte erro:
[Error] Unit1.pas(38): Incompatible types: 'TDateTime' and 'TDateTimePicker'
[Error] Unit1.pas(38): Incompatible types: 'TDateTime' and 'TDateTimePicker'
[Error] Unit1.pas(41): Incompatible types: 'TDateTime' and 'TDateTimePicker'
[Error] Unit1.pas(42): Incompatible types: 'TDateTime' and 'TDateTimePicker'
[Error] Unit1.pas(57): Incompatible types: 'TDateTime' and 'TDateTimePicker'
[Error] Unit1.pas(60): Undeclared identifier: 'Tempo'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
outra dúvida:
que componente é aquele onde está digitado 30?
Gostei + 0
23/01/2014
Marcos Saffran
Estou fundindo a cabeça aqui também, mas a diferença que deve dar, conforme os dados da imagem, é de 3 anos, 2 meses e 16 dias.
Gostei + 0
23/01/2014
William
Quanto a diferença pode até ser mesmo, montei esse código as pressas na hora do almoço ...
Gostei + 0
23/01/2014
William
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime;
Tempo: integer);
var
vDiaA, vMesA, vAnoA, vDiaI, vMesI, vAnoI: word;
vDiasD, vMesesD, vAnosD, vDiaR, vMesR, vAnoR, vTemp: integer;
vDataTemp: TDateTime;
begin
// Calcula diferença entre os anos
vAnosD := YearsBetween(dataFinal, dataInicial);
// Fragmenta as datas em dia, mes e ano
DecodeDate(dataInicial, vAnoI, vMesI, vDiaI);
DecodeDate(dataFinal, vAnoA, vMesA, vDiaA);
// Calcula diferença entre os meses
vTemp := 0;
vTemp := vMesI - vMesA;
if vMesI > vMesA then
begin
vMesesD := vTemp - 12;
vMesesD := vMesesD * -1;
end
else
vMesesD := vTemp;
// Calcula diferença entre os dias
vDataTemp := StrToDate(IntToStr(vDiaI) + '/' + IntToStr(vMesA) + '/' + IntToStr(vAnoA));
vDiasD := DaysBetween(vDataTemp, dataFinal);
// Calcula quantidade de anos restantes
vAnoR := (Tempo - vAnosD) -1;
// Calcula quantidade de meses restantes
vMesR := (12 - vMesesD) -1;
// Calcula quantidade de dias restantes
vDataTemp := StrToDate('01/' + IntToStr(vMesI) + '/' + IntToStr(vAnoI + Tempo));
vDiaR := DaysInMonth(vDataTemp) - vDiasD;
// Exibe o resultado no TMemo
mmResultado.Clear;
mmResultado.Lines.Add('Tempo de Serviço');
mmResultado.Lines.Add(IntToStr(vAnosD) + ' anos, ' + IntToStr(vMesesD) + ' meses e ' + IntToStr(vDiasD) + ' dias ');
mmResultado.Lines.Add(' ');
mmResultado.Lines.Add('Tempo restante ');
mmResultado.Lines.Add(IntToStr(vAnoR) + ' anos, ' + IntToStr(vMesR) + ' meses e ' + IntToStr(vDiaR) + ' dias ');
end;
Testa agora!!
Gostei + 0
25/01/2014
Paulo
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime;
Tempo: integer);
var
vDiaA, vMesA, vAnoA, vDiaI, vMesI, vAnoI: word;
vDiasD, vMesesD, vAnosD, vDiaR, vMesR, vAnoR, vTemp: integer;
vDataTemp: TDateTime;
begin
// Calcula diferença entre os anos
vAnosD := YearsBetween(dataFinal, dataInicial);
// Fragmenta as datas em dia, mes e ano
DecodeDate(dataInicial, vAnoI, vMesI, vDiaI);
DecodeDate(dataFinal, vAnoA, vMesA, vDiaA);
// Calcula diferença entre os meses
vTemp := 0;
vTemp := vMesI - vMesA;
if vMesI > vMesA then
begin
vMesesD := vTemp - 12;
vMesesD := vMesesD * -1;
end
else
vMesesD := vTemp;
// Calcula diferença entre os dias
vDataTemp := StrToDate(IntToStr(vDiaI) + '/' + IntToStr(vMesA) + '/' + IntToStr(vAnoA));
vDiasD := DaysBetween(vDataTemp, dataFinal);
// Calcula quantidade de anos restantes
vAnoR := (Tempo - vAnosD) -1;
// Calcula quantidade de meses restantes
vMesR := (12 - vMesesD) -1;
// Calcula quantidade de dias restantes
vDataTemp := StrToDate('01/' + IntToStr(vMesI) + '/' + IntToStr(vAnoI + Tempo));
vDiaR := DaysInMonth(vDataTemp) - vDiasD;
// Exibe o resultado no TMemo
mmResultado.Clear;
mmResultado.Lines.Add('Tempo de Serviço');
mmResultado.Lines.Add(IntToStr(vAnosD) + ' anos, ' + IntToStr(vMesesD) + ' meses e ' + IntToStr(vDiasD) + ' dias ');
mmResultado.Lines.Add(' ');
mmResultado.Lines.Add('Tempo restante ');
mmResultado.Lines.Add(IntToStr(vAnoR) + ' anos, ' + IntToStr(vMesR) + ' meses e ' + IntToStr(vDiaR) + ' dias ');
end;
Testa agora!!
Como executar essa procedure em um button?
sou novo no delphi e ainda não comecei criar procedures e funçao.
Gostei + 0
25/01/2014
William
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime; Tempo: integer);
Essa procedure recebe 3 parâmetros:
dataInicial (TDateTime) = Data que o funcionário entrou na empresa
dataFinal (TDateTime) = Data atual, ou seja, a data do dia em que vc executar esse programa
Tempo (Integer) = Tempo necessário para aposentar, no seu caso é 30 anos, mas deixei flexível vai que mude e seja 35 anos.
Como é uma procedure ela não retorna valor, então eu exibi o resultado dentro um TMemo.
Para chamar a procedure basta colocar no form uma componente TMemo, nomea-lo para mmResultado, e colocar um botão para disparar a procedure com o seguinte código:
CalculaTempo(StrtoDate('01/01/2000'), Date, 30);
Nesse exemplo estou supondo que o funcionário entrou na empresa na data 01/01/2000, passando a data atual e por último o tempo para aposentar 30.
Qualquer dúvida estou a disposição .
Gostei + 0
25/01/2014
Paulo
procedure TForm1.CalculaTempo(dataInicial, dataFinal: TDateTime; Tempo: integer);
Essa procedure recebe 3 parâmetros:
dataInicial (TDateTime) = Data que o funcionário entrou na empresa
dataFinal (TDateTime) = Data atual, ou seja, a data do dia em que vc executar esse programa
Tempo (Integer) = Tempo necessário para aposentar, no seu caso é 30 anos, mas deixei flexível vai que mude e seja 35 anos.
Como é uma procedure ela não retorna valor, então eu exibi o resultado dentro um TMemo.
Para chamar a procedure basta colocar no form uma componente TMemo, nomea-lo para mmResultado, e colocar um botão para disparar a procedure com o seguinte código:
CalculaTempo(StrtoDate('01/01/2000'), Date, 30);
Nesse exemplo estou supondo que o funcionário entrou na empresa na data 01/01/2000, passando a data atual e por último o tempo para aposentar 30.
Qualquer dúvida estou a disposição .
são vários funcionários, então as datas que os funcionários entraram na empresa são variáveis, no lugar do 01/01/2000 para dar certo no meu sistema teria que ser uma data variável, entendeu mais ou menos?
Gostei + 0
25/01/2014
William
E claro que pode puxar essa datas de um banco de dados usando um loop while, vai da criatividade !!
Gostei + 0
25/01/2014
Paulo
E claro que pode puxar essa datas de um banco de dados usando um loop while, vai da criatividade !!
Só que o meu sistema não tem banco de dados, a contagem é feita sem bd, simplesmente eu coloco a data de entrada a de saída e as averbações e sai o resultado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)