Obtendo dias úteis
Alguem tem alguma função já pronta ou alguma idéia de como obter os dias úteis dentro de um intervalo de datas?
Exemplo:
12/10/2000 a 13/11/2000 = xxx dias úteis
Obrigada
Exemplo:
12/10/2000 a 13/11/2000 = xxx dias úteis
Obrigada
Celamar
Curtidas 0
Respostas
Emilio
28/09/2005
tente usar esta função
function DifDateUtil(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;
function DifDateUtil(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
Celamar
28/09/2005
Valeu cara, era isso mesmo que eu queria.
Soh me responte uma coisa?
Ele desconsidera os friados NACIONAIS isso né?
Soh me responte uma coisa?
Ele desconsidera os friados NACIONAIS isso né?
GOSTEI 0
Steve_narancic
28/09/2005
estive analizando o codigo acima e acredito que ele não desconsidera os feriados apenas finais de semana
GOSTEI 0
Emilio
28/09/2005
é; infelizmente ele desconsidera feriados nacionais
GOSTEI 0
Emilio
28/09/2005
uma maneira de fazer considerar os feriados nacionais seria fazer um array com as datas dos feriados e antes de calcular os dia verificar se tem algum item do array que esta dentro do intervelo de data, e se tiver é fazer o resultado da função -1, no caso de um feriado no intervalo
GOSTEI 0
Rjun
28/09/2005
Essa função considera os feriados nacionais. Você também pode passar um StringList junto com os parâmetros, contendo os feriados moveis, estaduais e municipais.
function DiasUteis(DataInicial, DataFinal: TDateTime; FeriadoMovel: TStringList): integer; var Feriados: TStringList; DiaMes: string; begin result := 0; if DataInicial > DataFinal then Exit; // Carrega feriados nacionais fixos Feriados := TStringList.Create; try Feriados.Add(´1/1´); Feriados.Add(´21/4´); Feriados.Add(´1/5´); Feriados.Add(´7/9´); Feriados.Add(´12/10´); Feriados.Add(´2/11´); Feriados.Add(´15/11´); Feriados.Add(´25/12´); while (DataInicial <= DataFinal) do begin DiaMes := IntToStr(DayOf(DataInicial)) + ´/´ + IntToStr(MonthOf(DataInicial)); if (DayOfTheWeek(DataInicial) in [1..5]) and (Feriados.IndexOf(DiaMes) = -1) and (FeriadoMovel.IndexOf(DiaMes) = -1) then result := result + 1; DataInicial := DataInicial + 1; end; finally FreeAndNil(Feriados); end; end;
GOSTEI 0
Naelson
28/09/2005
Olá a todos,
Estou precisando de uma função desta, mais estou tendo dificuldade no código para ativar a função.
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
Estou precisando de uma função desta, mais estou tendo dificuldade no código para ativar a função.
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
Essa função considera os feriados nacionais. Você também pode passar um StringList junto com os parâmetros, contendo os feriados moveis, estaduais e municipais.
function DiasUteis(DataInicial, DataFinal: TDateTime; FeriadoMovel: TStringList): integer; var Feriados: TStringList; DiaMes: string; begin result := 0; if DataInicial > DataFinal then Exit; // Carrega feriados nacionais fixos Feriados := TStringList.Create; try Feriados.Add(´1/1´); Feriados.Add(´21/4´); Feriados.Add(´1/5´); Feriados.Add(´7/9´); Feriados.Add(´12/10´); Feriados.Add(´2/11´); Feriados.Add(´15/11´); Feriados.Add(´25/12´); while (DataInicial <= DataFinal) do begin DiaMes := IntToStr(DayOf(DataInicial)) + ´/´ + IntToStr(MonthOf(DataInicial)); if (DayOfTheWeek(DataInicial) in [1..5]) and (Feriados.IndexOf(DiaMes) = -1) and (FeriadoMovel.IndexOf(DiaMes) = -1) then result := result + 1; DataInicial := DataInicial + 1; end; finally FreeAndNil(Feriados); end; end;
GOSTEI 0
Naelson
28/09/2005
Estou precisando de uma função desta, mais estou tendo dificuldade no código para ativar a função.
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
Essa função considera os feriados nacionais. Você também pode passar um StringList junto com os parâmetros, contendo os feriados moveis, estaduais e municipais.
function DiasUteis(DataInicial, DataFinal: TDateTime; FeriadoMovel: TStringList): integer; var Feriados: TStringList; DiaMes: string; begin result := 0; if DataInicial > DataFinal then Exit; // Carrega feriados nacionais fixos Feriados := TStringList.Create; try Feriados.Add(´1/1´); Feriados.Add(´21/4´); Feriados.Add(´1/5´); Feriados.Add(´7/9´); Feriados.Add(´12/10´); Feriados.Add(´2/11´); Feriados.Add(´15/11´); Feriados.Add(´25/12´); while (DataInicial <= DataFinal) do begin DiaMes := IntToStr(DayOf(DataInicial)) + ´/´ + IntToStr(MonthOf(DataInicial)); if (DayOfTheWeek(DataInicial) in [1..5]) and (Feriados.IndexOf(DiaMes) = -1) and (FeriadoMovel.IndexOf(DiaMes) = -1) then result := result + 1; DataInicial := DataInicial + 1; end; finally FreeAndNil(Feriados); end; end;
GOSTEI 0
Naelson
28/09/2005
Olá a todos,
Alguem poderia me ajudar...
Um abraço a todos os colegas.
Naelson
Alguem poderia me ajudar...
Um abraço a todos os colegas.
Naelson
Estou precisando de uma função desta, mais estou tendo dificuldade no código para ativar a função.
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
[quote:5187ded288=´Rjun´]Essa função considera os feriados nacionais. Você também pode passar um StringList junto com os parâmetros, contendo os feriados moveis, estaduais e municipais.
[/quote:5187ded288]function DiasUteis(DataInicial, DataFinal: TDateTime; FeriadoMovel: TStringList): integer; var Feriados: TStringList; DiaMes: string; begin result := 0; if DataInicial > DataFinal then Exit; // Carrega feriados nacionais fixos Feriados := TStringList.Create; try Feriados.Add(´1/1´); Feriados.Add(´21/4´); Feriados.Add(´1/5´); Feriados.Add(´7/9´); Feriados.Add(´12/10´); Feriados.Add(´2/11´); Feriados.Add(´15/11´); Feriados.Add(´25/12´); while (DataInicial <= DataFinal) do begin DiaMes := IntToStr(DayOf(DataInicial)) + ´/´ + IntToStr(MonthOf(DataInicial)); if (DayOfTheWeek(DataInicial) in [1..5]) and (Feriados.IndexOf(DiaMes) = -1) and (FeriadoMovel.IndexOf(DiaMes) = -1) then result := result + 1; DataInicial := DataInicial + 1; end; finally FreeAndNil(Feriados); end; end;
GOSTEI 0
Naelson
28/09/2005
Olá a todos,
Alguem poderia me ajudar...
Esta função é de 3 paramtetros e eu não sei fazer a chamada, só sei com 2 parametros, alguem poderia me ajudar.
Um abraço a todos os colegas.
Naelson
:cry:Alguem poderia me ajudar...
Esta função é de 3 paramtetros e eu não sei fazer a chamada, só sei com 2 parametros, alguem poderia me ajudar.
Um abraço a todos os colegas.
Naelson
Olá a todos,
Alguem poderia me ajudar...
Um abraço a todos os colegas.
Naelson
[quote:fad0ffcdd7=´Naelson´]Estou precisando de uma função desta, mais estou tendo dificuldade no código para ativar a função.
estou usando:
procedure TForm1.RespostaExit(Sender: TObject);
begin
DiasUteis((Edital_DOE.Field.AsInteger), (Resposta.Field.AsInteger)) ;
Table1PrazoRetornoAR.AsInteger := DiasUteis((Edital_DOE.Field.AsDateTime), (Resposta.Field.AsDateTime));
end;
Mas me retorna:
Not enough actual parameters
O que pode estar acontencedo. Ou existe outra chamada para esta função.
Um abraço a todos
FELIZ PASCOA..
Naelson
[quote:fad0ffcdd7=´Rjun´]Essa função considera os feriados nacionais. Você também pode passar um StringList junto com os parâmetros, contendo os feriados moveis, estaduais e municipais.
[/quote:fad0ffcdd7][/quote:fad0ffcdd7]function DiasUteis(DataInicial, DataFinal: TDateTime; FeriadoMovel: TStringList): integer; var Feriados: TStringList; DiaMes: string; begin result := 0; if DataInicial > DataFinal then Exit; // Carrega feriados nacionais fixos Feriados := TStringList.Create; try Feriados.Add(´1/1´); Feriados.Add(´21/4´); Feriados.Add(´1/5´); Feriados.Add(´7/9´); Feriados.Add(´12/10´); Feriados.Add(´2/11´); Feriados.Add(´15/11´); Feriados.Add(´25/12´); while (DataInicial <= DataFinal) do begin DiaMes := IntToStr(DayOf(DataInicial)) + ´/´ + IntToStr(MonthOf(DataInicial)); if (DayOfTheWeek(DataInicial) in [1..5]) and (Feriados.IndexOf(DiaMes) = -1) and (FeriadoMovel.IndexOf(DiaMes) = -1) then result := result + 1; DataInicial := DataInicial + 1; end; finally FreeAndNil(Feriados); end; end;
GOSTEI 0