Ir para conteúdo
Fórum Script Brasil
  • 0

Erro no cálculo de dias entre datas


Guest --MXVinícius --

Pergunta

Guest --MXVinícius --

Prezados tentei fazer a função da seguinte forma:

IF TPagarDataVencimento.AsString < DateToStr(Now) then
        begin
        TPagar.Edit;
TPagarSituacao.Value:= 'Pendente de pagamento';
        TPagar.Post;
end else begin
IF TPagarDataVencimento.AsString > DateToStr(Now) then
        vencimento:= TPagarDataVencimento.value;
        emissao:= TPagarDataEmissao.value;
        dias:= vencimento - emissao;
        ShowMessage('Você têm mais ' + FLoatTOStr(dias) + ' dias de prazo');
                TPagar.Edit;
        TPagarSituacao.Value:= 'Não vencida';
                TPagar.Post;
        end;
E também assim:
begin
        vencimento:= TPagarDataVencimento.value;
        emissao:= TPagarDataEmissao.value;
        dias:= vencimento - emissao;
        if dias > 0 then
        begin
        ShowMessage('Você têm mais ' + FLoatTOStr(dias) + ' dias de prazo');
                TPagar.Edit;
        TPagarSituacao.Value:= 'Não vencida';
                TPagar.Post;
                end  else begin
                TPagar.Edit;
        TPagarSituacao.Value:= 'Vencida';
                TPagar.Post;
                end;
        end;

Eu achei que estava funcionando mas fui surpreendido quanto testei com meses diferentes.

porque o código não está avaliando o mês.

Se eu coloco 30/11/2007 por exemplo ele avalia como tendo prazo de 8 dias.

Portanto, gostaria de ajuda com essa função se possível.

Abraço,

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

função para retornar a diferenca de dias entre duas datas

function DifDias(DataVenc:TDateTime; DataAtual:TDateTime): String;
Var Data: TDateTime;
      dia, mes, ano: Word;
begin
     if DataAtual < DataVenc then
        begin
           Result := 'A data data atual não pode ser menor que a data inicial';
        end
     else
        begin
            Data := DataAtual - DataVenc;
            DecodeDate( Data, ano, mes, dia);
            Result := FloatToStr(Data)+' Dias';
     end;
end;
colocando esta função no seu codigo fica assim:
IF TPagarDataVencimento.AsString < DateToStr(Now) then
    begin
         TPagar.Edit;
         TPagarSituacao.Value:= 'Pendente de pagamento';
         TPagar.Post;
    end
else 
    begin
        IF TPagarDataVencimento.AsString > DateToStr(Now) then
        vencimento:= TPagarDataVencimento.value;
        emissao:= TPagarDataEmissao.value;

        dias := DifDias(vencimento,emissao);

        ShowMessage('Você têm mais ' + FLoatTOStr(dias) + ' dias de prazo');
        TPagar.Edit;
        TPagarSituacao.Value:= 'Não vencida';
        TPagar.Post;
        end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olá eu utilizo da seguinte forma para descobrir os dias entre duas datas:

procedure TForm1.EdtDataFinalExit(Sender: TObject);
var v : extended;
begin
  v := strtodate(EdtDataInicial.text) - strtodate(EdtDataFinal.text);
  If StrToDate(EdtDataInicial.Text) > StrToDate(EdtDataFinal.Text) Then
  begin
    Application.MessageBox('A data inicial não pode ser maior que a data final!','Atenção',mb_IconExclamation +mb_ok);
    EdtDataInicial.SetFocus;
  end
  else
    EdtDias.text := Floattostr(Abs(v));
end;

No meu caso ele retorna quantos dias existem entre a data inicial e a data final, para mim resolveu, não sei se é o seu caso mas ai esta...

Qualquer coisa posta ai..

Abraços

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --MXVinícius --

Esse tipo de código preciso analizar o mês também, porque senão ele simplesmente avalia a diferença de dias como maior ou menor mesmo estando em um mês anterior ao mês atual.

Preciso que o programa avalie se por exemplo entre o dia 30/10/2007 e 05/11/2007 algum título venceu.

Link para o comentário
Compartilhar em outros sites

  • 0

o help do delphi já tem um pequeno exemplo

Procedure TForm1.Button1Click(Sender: TObject);

var
  Present: TDateTime;
  Year, Month, Day, Hour, Min, Sec, MSec: Word;
 begin
  Present:= Now;
  DecodeDate(Present, Year, Month, Day);
  Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month '
    + IntToStr(Month) + ' of Year ' + IntToStr(Year);
  DecodeTime(Present, Hour, Min, Sec, MSec);
  Label2.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour '
    + IntToStr(Hour);
end;
vou te passar algumas funções, pode ser que seja util para voce
Function SomaMes (dData : TDateTime; xMeses : Integer; lCorrido : boolean) : TDateTime; 
var 
Ano, Mes, Dia : word; 
DataAux : TDateTime; 
begin 
DecodeDate(dData, Ano, Mes, Dia); 
Mes := Mes + xMeses; 
Ano := Ano + (Mes DIV 12); 
Mes := Mes mod 12; 
DataAux := MenorDataValida (Ano, Mes, Dia); 
if not lCorrido Then 
DataAux := DataAux - 1; 
SomaMes := DataAux; 
end;
unit FaCDate;
{** Criada em 24/07/1999 - Baseada em necessidades genericas de tratamento de datas ** Autor : Fabio Camara}
interface
 uses
  Forms, Dialogs, Messages, WinProcs, SysUtils, Classes,
  Graphics, ExtCtrls, Controls;

Type {Tipos criados}
  TSemestre = record
  Mes, Ano : Word;
  end;
  Semestre = array[0..5] of TSemestre;

function ReturnSixMonth(Actual:TDateTime):Semestre;
function NameMonth(Mes:Word;Abrev:Boolean):string;
function DataExtenso(Data:TDateTime): string;
function DataValida(StrD: string): boolean;
function PrimeiroDiaUtil(Data:TDateTime):TDateTime;
function IsWeekEnd(dData : TDateTime) : boolean;

implementation

function ReturnSixMonth(Actual:TDateTime):Semestre;
{Retorna 6 meses atrás da data enviada, de mes em mes}
var
  d,m,y : word;
  i : byte;
  Data : TDateTime;
begin
  for i := 6 downto 1 do begin
  Data := Actual - (30 * i);
  DecodeDate(Data,y,m,d);
  Result[i].Mes := m;
  Result[i].Ano := y;
  end;
end;

function NameMonth(Mes:Word;Abrev:Boolean):String;
{Retorna o nome de um mês abreviado ou não}
const
  NameL : array [1..12] of String[9] = ('JANEIRO','FEVEREIRO','MARÇO','ABRIL',
'MAIO','JUNHO','JULHO','AGOSTO',
'SETEMBRO','OUTUBRO','NOVEMBRO',
'DEZEMBRO');
begin
  if (Mes in [1..12]) then
  if Abrev then
  Result := Copy(NameL[Mes],1,3)
  else
  Result := NameL[Mes];
end;

function DataExtenso(Data:TDateTime): String;
{Retorna uma data por extenso}
var
  NoDia : Integer;
  DiaDaSemana : array [1..7] of String;
  Meses : array [1..12] of String;
  Dia, Mes, Ano : Word;
begin
{ Dias da Semana }
  DiaDasemana [1]:= 'Domingo';
  DiaDasemana [2]:= 'Segunda-feira';
  DiaDasemana [3]:= 'Terçafeira';
  DiaDasemana [4]:= 'Quarta-feira';
  DiaDasemana [5]:= 'Quinta-feira';
  DiaDasemana [6]:= 'Sexta-feira';
  DiaDasemana [7]:= 'Sábado';
{ Meses do ano }
  Meses [1] := 'Janeiro';
  Meses [2] := 'Fevereiro';
  Meses [3] := 'Março';
  Meses [4] := 'Abril';
  Meses [5] := 'Maio';
  Meses [6] := 'Junho';
  Meses [7] := 'Julho';
  Meses [8] := 'Agosto';
  Meses [9] := 'Setembro';
  Meses [10]:= 'Outubro';
  Meses [11]:= 'Novembro';
  Meses [12]:= 'Dezembro';
  DecodeDate (Data, Ano, Mes, Dia);
  NoDia := DayOfWeek (Data);
  Result := DiaDaSemana[NoDia] + ', ' +
  IntToStr(Dia) + ' de ' + Meses[Mes]+ ' de ' + IntToStr(Ano);
end;

function DataValida(StrD: string): Boolean;
{Testa se uma data é valida}
begin
  Result := true;
  try
  StrToDate(StrD);
  except
  on EConvertError do Result:=False;
  end;
end;

function PrimeiroDiaUtil(Data:TDateTime):TDateTime;
{Retorna data do primeiro dia Util do mes, de uma data informada}
var Ano, Mes, Dia : word;
DiaDaSemana : Integer;
begin
  DecodeDate (Data, Ano, Mes, Dia);
  Dia := 1;
  DiaDaSemana := DayOfWeek(Data);
  if DiaDaSemana in [1,7] then
  Dia := 2;
  Result := EncodeDate(Ano, Mes, Dia);
end;

function IsWeekEnd(dData : TDateTime) : boolean;
{Verifica se uma data informada cai em um final de semana}
begin
  if DayOfWeek(dData) in [1,7] then
  result := true
  else
  result := false;
end;
end.
[code]

Função que devolve tempo decorrido em uma string

Function NumDiasExtenso(NumDias:integer):string;
var
Anos, Meses, Dias : integer;
sAnos, sMeses, sDias : string;
begin
{ --- Calcula o número de anos --- }
Anos := 0;
while NumDias >= 365 do
begin
Anos := Anos + 1;
NumDias := NumDias - 365;
end;
if Anos > 1 then
sAnos := ' anos,'
else
sAnos := ' ano,';
{ --- Calcula o número de meses --- }
Meses := 0;
while NumDias >= 30 do
begin
Meses := Meses + 1;
NumDias := NumDias - 30;
end;
if Meses > 1 then
sMeses := ' meses e '
else
sAnos := ' mês e ';
{ --- O Número de dias é a sobra --- }
Dias := NumDias;
if sDias > 1 then
sDias := 'dias'
else
sDias := 'dia';
Return := Inttostr(Anos)+sAnos+inttostr(Meses)+sMeses+inttostr(Dias)+sDias;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --MXVinícius --

Prezados,

E amigos Jonas.

Obrigado pelas respostas.

Com esse exemplo do Help do Delphi vou tentar trabalhar aqui.

Parece que é por aí.

Um forte abraço e muito obrigado a vocês.

Link para o comentário
Compartilhar em outros sites

  • 0
Esse tipo de código preciso analizar o mês também, porque senão ele simplesmente avalia a diferença de dias como maior ou menor mesmo estando em um mês anterior ao mês atual.

Preciso que o programa avalie se por exemplo entre o dia 30/10/2007 e 05/11/2007 algum título venceu.

MXVinícius, lá no seu primeiro post, o principal problema deve-se ao fato de você estar convertendo para texto as datas no if. você deveria utilizar o formato datetime. Tente mudar

if TPagarDataVencimento.AsDateTime < Date then

e o outro

if TPagarDataVencimento.AsDateTime > Date then

Experimente alterar e ver como ele se comporta.

Não avaliei sua lógica, mas com esta alteração você vai poder comparar corretamente as datas.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, '--MXVinícius --'!

Você informou no início deste post que tentou fazer conforme abaixo:

begin
   vencimento:= TPagarDataVencimento.value;
   emissao:= TPagarDataEmissao.value;
   dias:= vencimento - emissao;
   if dias > 0 then
   begin
      ShowMessage('Você têm mais ' + FLoatTOStr(dias) + ' dias de prazo');
      TPagar.Edit;
      TPagarSituacao.Value := 'Não vencida';
      TPagar.Post;
   end  
   else 
   begin
      TPagar.Edit;
      TPagarSituacao.Value:= 'Vencida';
      TPagar.Post;
   end;
end;
Porém o Delphi não realiza direito este tipo de cálculo entre datas.
dias:= vencimento - emissao;
Mas ele fornece uma função na Unit DateUtils que pode soluciona este problema. É a função descrita abaixo.
Unit DateUtils Category datetime routines Delphi syntax: function DaysBetween(const ANow, AThen: TDateTime): Integer; C++ syntax: extern PACKAGE int __fastcall DaysBetween(const System::TDateTime ANow, const System:: TDateTime AThen); Description Call DaysBetween to obtain the difference, in days, between two TDateTime values. DaysBetween counts only whole days. Thus, DaysBetween reports the difference between Dec 31, 1999 11:59 PM and Jan 1, 2000 11:58 PM as 0 because the difference is one minute short of an entire day.
Então eu modifiquei seu código para aceitar esta função e ficou assim.
begin
   dias:= DaysBetween(TPagarDataVencimento.value, TPagarDataEmissao.value);
   TPagar.Edit;
   if dias > 0 then
   begin
      ShowMessage('Você têm mais ' + FLoatTOStr(dias) + ' dias de prazo');
      TPagarSituacao.Value := 'Não vencida';
   end  
   else 
      TPagarSituacao.Value := 'Vencida';
   TPagar.Post;
end;

Espero que ajude.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, sim a função existe e faz isto.

mas...

Porém o Delphi não realiza direito este tipo de cálculo entre datas.

dias:= vencimento - emissao;

eu devo discordar desta afirmação.

Desde que as variáveis Vencimento e Emissao sejam do tipo TDateTime (que é na verdade um Double), que a variável dias seja um tipo compatível e sabendo que a parte inteira deste Double representa a quantidade de dias decorridos desde 12/30/1899, então, a subtração de um do outro tem que resultar no número de dias decorrido entre as mesmas.

no help sobre TDateTime:

(...)

The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

(...)

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...