GARANTIR DESCONTO

Fórum Contar dias uteis (Feriados) #318447

05/04/2006

0

Olá a todos,

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

Naelson

Responder

Posts

06/04/2006

Kkrisna

tenta está funcao ai

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;


Responder

Gostei + 0

06/04/2006

Naelson

Olá kkrisna,

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

tenta está funcao ai 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;



Responder

Gostei + 0

07/04/2006

Kkrisna

Para chamar esta funcao seria assim


qtd_diasuteis((Campo de data inicial), (campo de data final))


qualquer duvida pode mandar outro post


Responder

Gostei + 0

08/04/2006

Naelson

Olá,

Estou recebendo a seguinte mensagem.
Os campos que estou usando são do tipo data.

---------------------------
Project1
---------------------------
´Edital_DOE´ is not a valid date.
---------------------------
OK
---------------------------


Para chamar esta funcao seria assim qtd_diasuteis((Campo de data inicial), (campo de data final)) qualquer duvida pode mandar outro post



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


Responder

Gostei + 0

08/04/2006

Kkrisna

converte para data
>Edital_DOE = data inicial
>Resposta = data final

com o seguinte codigo

prazo := strtodate(Edital_DOE) - strtodate(Resposta);


Responder

Gostei + 0

08/04/2006

Naelson

Olá kkrisna,
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
----


converte para data >Edital_DOE = data inicial >Resposta = data final com o seguinte codigo prazo := strtodate(Edital_DOE) - strtodate(Resposta);



Responder

Gostei + 0

08/04/2006

Naelson

A função ´qtd_diasuteis´ anterior funciona beleza.
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..


Responder

Gostei + 0

09/04/2006

Naelson

Olá a todos,

Alguem poderia me ajudar.
Um abraço

Naelson

A função ´qtd_diasuteis´ anterior funciona beleza. 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..



Responder

Gostei + 0

10/04/2006

Naelson

Olá a todos, Alguem poderia me ajudar. Um abraço Naelson [quote:ed0d4d1356=´Naelson´]A função ´qtd_diasuteis´ anterior funciona beleza. 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..
[/quote:ed0d4d1356]


Responder

Gostei + 0

11/04/2006

Weber

Observe que a função pede a DATA ATUAL e o VENCIMENTO. Espera-se que a data atual seja maior que a data de vencimento, neste caso há diferença entre dias, caso contratio o resultado é zero.

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);


Responder

Gostei + 0

11/04/2006

Naelson

Olá Weber, parabens.
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




Observe que a função pede a DATA ATUAL e o VENCIMENTO. Espera-se que a data atual seja maior que a data de vencimento, neste caso há diferença entre dias, caso contratio o resultado é zero. 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);
[/img]


Responder

Gostei + 0

12/04/2006

Weber

O que ocorre Naelson é que você está tentando usar uma função para calcular dias uteis, e ela não foi feita para isto.
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.


Responder

Gostei + 0

12/04/2006

Naelson

Olá Weber,

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

O que ocorre Naelson é que você está tentando usar uma função para calcular dias uteis, e ela não foi feita para isto. 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.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar