Obtendo dias úteis

Delphi

28/09/2005

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


Celamar

Celamar

Curtidas 0

Respostas

Emilio

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;


GOSTEI 0
Celamar

Celamar

28/09/2005

Valeu cara, era isso mesmo que eu queria.
Soh me responte uma coisa?
Ele desconsidera os friados NACIONAIS isso né?


GOSTEI 0
Steve_narancic

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

Emilio

28/09/2005

é; infelizmente ele desconsidera feriados nacionais


GOSTEI 0
Emilio

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

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

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

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

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



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

Naelson

28/09/2005

Olá a todos,
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.
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;
[/quote:5187ded288]



GOSTEI 0
Naelson

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

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.
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;
[/quote:fad0ffcdd7][/quote:fad0ffcdd7]
:cry:


GOSTEI 0
POSTAR