Fórum Contar dias uteis (Feriados) #318447
05/04/2006
0
Mais uma vez venho solicitar o auxilio de voces.
Encontrei esta função do (WEBER), e gostaria de saber como eu faço para chama-la (como eu executo), tipo;
edit1.text = data1.text - data2.text;
campo1 = campo2 - campo1
Preciso contar os dias uteis entre duas datas, OK.
como chamar esta função.
Desde já agradeço
Um abraço
Naelson
-----------
Fiz uma função que retorna a diferença entre dias descontando se o dia do vencimento é sábado, domingo ou feriado.
Talvez de para aproveitar em seu código.
Código:
function CalcDiasVencto(DtAtual, DtVencto: ShortString): Integer;
var
dDtTemp: TDateTime;
function VerFeriados(DtAtual, DtVencto: ShortString): Boolean;
var
Ano, Mes, Dia: Currency;
c,n,k,i,j,l: Currency;
cFeriados: TStringList;
dDtTemp: TDateTime;
nI, nY: Integer;
begin
Ano := StrToInt(Trim(Copy(DtAtual,7,4)));
c := Trunc(Ano / 100);
n := Ano - (19 * Trunc(Ano / 19));
k := Trunc((c - 17) / 25);
i := c - Trunc((c/4)) - Trunc((c-k)/3) + (19*n) + 15;
i := i - (30*Trunc(i/30));
i := i - (Trunc(i/28)*(1-Trunc(i/28))*Trunc(29/(i+1))*Trunc((21-n)/11));
j := Ano + Trunc(Ano / 4) + i + 2 -c + Trunc(c/4);
j := j - (7*Trunc(j/7));
l := i - j;
Mes := 3 + Trunc((l+40)/44);
Dia := l + 28 - (31*Trunc(Mes/4));
cFeriados := TStringList.Create;
cFeriados.Add(FormatDateTime(´dd/mm´,StrToDate(CurrToStr(Dia)+´/´+CurrToStr(Mes)))); //Pascoa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), -2))); //6.Santa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]),-47))); //Carnaval
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), 60))); //Corpus Crhist
cFeriados.Add(´01/01´); //Ano Novo
cFeriados.Add(´21/04´); //Tiradentes
cFeriados.Add(´01/05´); //Trabalho
cFeriados.Add(´07/09´); //Indenpencia
cFeriados.Add(´12/10´); //N.Senhora
cFeriados.Add(´02/11´); //Finados
cFeriados.Add(´15/11´); //Replublica
cFeriados.Add(´25/12´); //Natal
cFeriados.Add(´10/05´); //Aniversario de Maringa
cFeriados.Add(´15/08´); //Padroeira de Maringa
dDtTemp := StrToDate(DtAtual);
dDtTemp := IncDay(dDtTemp, -1);
while dDtTemp >= StrToDate(DtVencto) do //domingos e sabado
if (DayOfWeek(dDtTemp) = 7) or (DayOfWeek(dDtTemp) = 1) then
begin
cFeriados.Add(FormatDateTime(´dd/mm´,dDtTemp));
dDtTemp := IncDay(dDtTemp, -1);
end
else
Break;
Result := False;
dDtTemp := StrToDate(DtVencto);
for nI := 0 to cFeriados.Count -1 do
if cFeriados[nI] = FormatDateTime(´dd/mm´,dDtTemp) then
begin
for nY := 0 to cFeriados.Count -1 do
if cFeriados[nY] = FormatDateTime(´dd/mm´,IncDay(StrToDate(DtAtual), -1)) then
begin
Result := True;
Break;
end;
if Result then
Break;
end;
cFeriados.Free;
end;
begin
Result := DaysBetween(StrToDate(DtAtual), StrToDate(DtVencto));
if StrToDate(DtAtual) <= StrToDate(DtVencto) then
Result := 0
else
begin
dDtTemp := StrToDate(DtVencto);
while StrToDate(DtAtual) > dDtTemp do
begin
if VerFeriados(DtAtual,DateToStr(dDtTemp)) then
begin
Result := Result - 1;
dDtTemp := IncDay(dDtTemp, 1);
end
else
Break;
end;
end;
end;
Naelson
Curtir tópico
+ 0Posts
06/04/2006
Kkrisna
function TForm.qtd_diasuteis(dataini,
datafin: string): integer;
var a,b,c:tdatetime;
ct,s:integer;
begin
if StrToDate(DataFin) < StrtoDate(DataIni) then begin
Result := 0;
exit;
end;
ct := 0;
s := 1;
a := strtodate(dataFin);
b := strtodate(dataIni);
if a > b then begin
c := a;
a := b;
b := c;
s := 1;
end;
a := a + 1;
while (dayofweek(a)<>2) and (a <= b) do begin
if dayofweek(a) in [2..6] then begin
inc(ct);
end;
a := a + 1;
end;
ct := ct + round((5*int((b-a)/7)));
a := a + (7*int((b-a)/7));
while a <= b do begin
if dayofweek(a) in [2..6] then begin
inc(ct);
end;
a := a + 1;
end;
if ct < 0 then begin
ct := 0;
end;
result := s*ct;
end;
Gostei + 0
06/04/2006
Naelson
Obrigado pela atenção. A minha dificuldade está em como colocar o código para chamar esta função.
Qual o procedimento para calcular os dias entre duas datas, usando esta função.
Um abraço
Naelson
Gostei + 0
07/04/2006
Kkrisna
qtd_diasuteis((Campo de data inicial), (campo de data final))
qualquer duvida pode mandar outro post
Gostei + 0
08/04/2006
Naelson
Estou recebendo a seguinte mensagem.
Os campos que estou usando são do tipo data.
---------------------------
Project1
---------------------------
´Edital_DOE´ is not a valid date.
---------------------------
OK
---------------------------
Campos da tabela:
>[b:d1382704f1]Edital_DOE[/b:d1382704f1] = data inicial
>[b:d1382704f1]Resposta [/b:d1382704f1]= data final
>[b:d1382704f1]Prazo[/b:d1382704f1] = dias
>prazo := Edital_DOE - Resposta;
Um abraço
Naelson
Gostei + 0
08/04/2006
Kkrisna
>Edital_DOE = data inicial
>Resposta = data final
com o seguinte codigo
prazo := strtodate(Edital_DOE) - strtodate(Resposta);
Gostei + 0
08/04/2006
Naelson
Obrigado pela atenção.
o código ficou assim.
qtd_diasuteis((Edital_DOE.Field.AsString), (Resposta.Field.AsString));
Table1PrazoRetornoAR.AsInteger := qtd_diasuteis((Edital_DOE.Field.AsString), (Resposta.Field.AsString));
um abraço.
Naelson
----
Gostei + 0
08/04/2006
Naelson
Agora eu queria tentar usar esta função, pois ela permite que eu cadastre outros feriados (Feriados locais), mais ela me retorna ´0´ como resultado, poderiam me dar uma mão.
obrigado
Um abraço
Naelson
---
function CalcDiasVencto(DtAtual, DtVencto: ShortString): Integer;
var
dDtTemp: TDateTime;
function VerFeriados(DtAtual, DtVencto: ShortString): Boolean;
var
Ano, Mes, Dia: Currency;
c,n,k,i,j,l: Currency;
cFeriados: TStringList;
dDtTemp: TDateTime;
nI, nY: Integer;
begin
Ano := StrToInt(Trim(Copy(DtAtual,7,4)));
c := Trunc(Ano / 100);
n := Ano - (19 * Trunc(Ano / 19));
k := Trunc((c - 17) / 25);
i := c - Trunc((c/4)) - Trunc((c-k)/3) + (19*n) + 15;
i := i - (30*Trunc(i/30));
i := i - (Trunc(i/2*(1-Trunc(i/2)*Trunc(29/(i+1))*Trunc((21-n)/11))));
j := Ano + Trunc(Ano / 4) + i + 2 -c + Trunc(c/4);
j := j - (7*Trunc(j/7));
l := i - j;
Mes := 3 + Trunc((l+40)/44);
Dia := l + 28 - (31*Trunc(Mes/4));
cFeriados := TStringList.Create;
cFeriados.Add(FormatDateTime(´dd/mm´,StrToDate(CurrToStr(Dia)+´/´+CurrToStr(Mes)))); //Pascoa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), -2))); //6.Santa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]),-47))); //Carnaval
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), 60))); //Corpus Crhist
cFeriados.Add(´01/01´); //Ano Novo
cFeriados.Add(´21/04´); //Tiradentes
cFeriados.Add(´01/05´); //Trabalho
cFeriados.Add(´07/09´); //Indenpencia
cFeriados.Add(´12/10´); //N.Senhora
cFeriados.Add(´02/11´); //Finados
cFeriados.Add(´15/11´); //Replublica
cFeriados.Add(´25/12´); //Natal
cFeriados.Add(´10/05´); //Aniversario de Maringa
cFeriados.Add(´15/08´); //Padroeira de Maringa
dDtTemp := StrToDate(DtAtual);
dDtTemp := IncDay(dDtTemp, -1);
while dDtTemp >= StrToDate(DtVencto) do //domingos e sabado
if (DayOfWeek(dDtTemp) = 7) or (DayOfWeek(dDtTemp) = 1) then
begin
cFeriados.Add(FormatDateTime(´dd/mm´,dDtTemp));
dDtTemp := IncDay(dDtTemp, -1);
end
else
Break;
Result := False;
dDtTemp := StrToDate(DtVencto);
for nI := 0 to cFeriados.Count -1 do
if cFeriados[nI] = FormatDateTime(´dd/mm´,dDtTemp) then
begin
for nY := 0 to cFeriados.Count -1 do
if cFeriados[nY] = FormatDateTime(´dd/mm´,IncDay(StrToDate(DtAtual), -1)) then
begin
Result := True;
Break;
end;
if Result then
Break;
end;
cFeriados.Free;
end;
begin
Result := DaysBetween(StrToDate(DtAtual), StrToDate(DtVencto));
if StrToDate(DtAtual) <= StrToDate(DtVencto) then
Result := 0
else
begin
dDtTemp := StrToDate(DtVencto);
while StrToDate(DtAtual) > dDtTemp do
begin
if VerFeriados(DtAtual,DateToStr(dDtTemp)) then
begin
Result := Result - 1;
dDtTemp := IncDay(dDtTemp, 1);
end
else
Break;
end;
end;
end;
--
Como eu chamo a função:
procedure TForm1.RespostaExit(Sender: TObject);
begin
CalcDiasVencto((Edital_DOE.Field.AsString), (Resposta.Field.AsString));
Table1PrazoRetornoAR.AsInteger := CalcDiasVencto((Edital_DOE.Field.AsString), (Resposta.Field.AsString));
end;
mais o retorno é zero..
Gostei + 0
09/04/2006
Naelson
Alguem poderia me ajudar.
Um abraço
Naelson
Gostei + 0
10/04/2006
Naelson
Gostei + 0
11/04/2006
Weber
No seu caso basta inverter a forma de se passar valores para a função:
Table1PrazoRetornoAR.AsInteger := CalcDiasVencto(Resposta.Field.AsString,Edital_DOE.Field.AsString);
Gostei + 0
11/04/2006
Naelson
Era isso mesmo, inverti os campos e funcionou.
O problema agora é que o resultado retornado. Pois me retorna os dias corridos, sem descontar os ´sabados, domingos e feriados. O que pode estar acontecendo, segue o fonte do project.
------
unit Unit1a;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBTables, DateUtils, wwdbdatetimepicker,
Mask, DBCtrls;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
Table1OficioNum: TStringField;
Table1OficioAno: TStringField;
Table1CodAutoridade: TStringField;
Table1Protocolo: TStringField;
Table1NotificacaoID: TAutoIncField;
Table1TCNum: TStringField;
Table1TCano: TStringField;
Table1TCSigla: TStringField;
Table1Nome: TStringField;
Table1OrgaoCod: TStringField;
Table1OrgaoDescricao: TStringField;
Table1Processo: TStringField;
Table1Prazo: TStringField;
Table1Edital_DOE: TDateField;
Table1AR_Rec_Origem: TDateField;
Table1Resposta: TDateField;
Table1Prorrogacao: TDateField;
Table1Revelia: TDateField;
Table1Observacao: TStringField;
Table1Cargo: TStringField;
Table1Titulo: TStringField;
Table1SubTitulo: TStringField;
Table1Notificado: TStringField;
BitBtn1: TBitBtn;
Label1: TLabel;
Edital_DOE: TDBEdit;
Label2: TLabel;
Resposta: TDBEdit;
Label4: TLabel;
DBEdit1: TDBEdit;
Table1PrazoRetornoAR: TStringField;
Label5: TLabel;
DBEdit3: TDBEdit;
procedure RespostaExit(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function CalcDiasVencto(DtAtual, DtVencto: ShortString): Integer;
implementation
{$R *.dfm}
function CalcDiasVencto(DtAtual, DtVencto: ShortString): Integer;
var
dDtTemp: TDateTime;
function VerFeriados(DtAtual, DtVencto: ShortString): Boolean;
var
Ano, Mes, Dia: Currency;
c,n,k,i,j,l: Currency;
cFeriados: TStringList;
dDtTemp: TDateTime;
nI, nY: Integer;
begin
Ano := StrToInt(Trim(Copy(DtAtual,7,4)));
c := Trunc(Ano / 100);
n := Ano - (19 * Trunc(Ano / 19));
k := Trunc((c - 17) / 25);
i := c - Trunc((c/4)) - Trunc((c-k)/3) + (19*n) + 15;
i := i - (30*Trunc(i/30));
i := i - (Trunc(i/2*(1-Trunc(i/2)*Trunc(29/(i+1))*Trunc((21-n)/11))));
j := Ano + Trunc(Ano / 4) + i + 2 -c + Trunc(c/4);
j := j - (7*Trunc(j/7));
l := i - j;
Mes := 3 + Trunc((l+40)/44);
Dia := l + 28 - (31*Trunc(Mes/4));
cFeriados := TStringList.Create;
cFeriados.Add(FormatDateTime(´dd/mm´,StrToDate(CurrToStr(Dia)+´/´+CurrToStr(Mes)))); //Pascoa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), -2))); //6.Santa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]),-47))); //Carnaval
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), 60))); //Corpus Crhist
cFeriados.Add(´01/01´); //Ano Novo
cFeriados.Add(´21/04´); //Tiradentes
cFeriados.Add(´01/05´); //Trabalho
cFeriados.Add(´07/09´); //Indenpencia
cFeriados.Add(´12/10´); //N.Senhora
cFeriados.Add(´02/11´); //Finados
cFeriados.Add(´15/11´); //Replublica
cFeriados.Add(´25/12´); //Natal
cFeriados.Add(´10/05´); //Aniversario de Maringa
cFeriados.Add(´15/08´); //Padroeira de Maringa
dDtTemp := StrToDate(DtAtual);
dDtTemp := IncDay(dDtTemp, -1);
while dDtTemp >= StrToDate(DtVencto) do //domingos e sabado
if (DayOfWeek(dDtTemp) = 7) or (DayOfWeek(dDtTemp) = 1) then
begin
cFeriados.Add(FormatDateTime(´dd/mm´,dDtTemp));
dDtTemp := IncDay(dDtTemp, -1);
end
else
Break;
Result := False;
dDtTemp := StrToDate(DtVencto);
for nI := 0 to cFeriados.Count -1 do
if cFeriados[nI] = FormatDateTime(´dd/mm´,dDtTemp) then
begin
for nY := 0 to cFeriados.Count -1 do
if cFeriados[nY] = FormatDateTime(´dd/mm´,IncDay(StrToDate(DtAtual), -1)) then
begin
Result := True;
Break;
end;
if Result then
Break;
end;
cFeriados.Free;
end;
begin
Result := DaysBetween(StrToDate(DtAtual), StrToDate(DtVencto));
if StrToDate(DtAtual) <= StrToDate(DtVencto) then
Result := 0
else
begin
dDtTemp := StrToDate(DtVencto);
while StrToDate(DtAtual) > dDtTemp do
begin
if VerFeriados(DtAtual,DateToStr(dDtTemp)) then
begin
Result := Result - 1;
dDtTemp := IncDay(dDtTemp, 1);
end
else
Break;
end;
end;
end;
//d;
procedure TForm1.RespostaExit(Sender: TObject);
begin
CalcDiasVencto((Resposta.Field.Value), (Edital_DOE.Field.Value));
//Table1PrazoRetornoAR.AsInteger := CalcDiasVencto(Resposta.Field.Value,Edital_DOE.Field.Value);
Table1PrazoRetornoAR.AsInteger := CalcDiasVencto((Resposta.Field.AsString), (Edital_DOE.Field.AsString));
Table1Prazo.AsInteger := CalcDiasVencto((Resposta.Field.AsString), (Edital_DOE.Field.AsString ));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
table1.open;
table1.edit;
Table1Edital_DOE.Text := ´01/03/2006´;
Table1Resposta.Text := ´30/03/2006´;
end;
end.
------
Um abraço
Naelson
Gostei + 0
12/04/2006
Weber
Vou tentar explicar para que serve a função.
Vamos dizer que hoje seja 10/04/2006 - Segunda-Feira
Um titulo com data de vencimento em 08/04/2006 tem quantos dias de juros? Zero, pois dia 08 foi sábado.
Um titulo com data de vencimento em 07/04/2006 tem quantos dias de juros? Tres, pois dia 07 foi sexta feira.
A função não foi feita para apresentar os dias úteis, e sim para dar a quantidade de dias vencido.
Gostei + 0
12/04/2006
Naelson
Obrigado pela atenção, desculpe ter tomado o seu tempo, e de outros colegas, é que procuro esta função faz tempo, e imaginei ser possível esta.
Um abraço,
Naelson
Obs. Continuo procurando...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)