Cadastrar todos os domingos

03/02/2006

Galera como faço para cadastrar todos os domingos em uma tabela de feriados?

gostaria de selecionar um período por exemplo:

01/01/2006
31/12/2006

e ao clicar no botão ele preencher a minha tabela de feriados com todos os domingos (datas) existentes entre elas!


Paullsoftware

Respostas

03/02/2006

Cabelo

Use a função dayofweek, para saber qual o dia da semana da data corrente.. se for 1, então cadastra na tabela, senão incrementa a data..

assim :

v_range := v_data_final - v_data_inicial;
for v_i := 0 to round(v_range) - 1 do
begin
if dayofweek(v_data_inicial) = 1 then
begin
P_grava_data;
end;
v_data := v_data_inicial + 1;
end;


Responder Citar

03/02/2006

Aroldo Zanela

Colega,

Acho que isso é gastar espaço desnecessário em disco, pois você recupera essa informação por meio de função, mas uma solução é:
var dInicio, dTermino: TDateTime;
    I, X: Integer;
begin
  dInicio   := StrToDate(´01/01/2006´);
  dTermino  := StrToDate(´31/12/2006´);
  X := Trunc(dTermino - dInicio);
  for I := 1 to X do
  begin
    if DayOfWeek(dInicio+i)=1 then
      GravarDomingo(DateToStr(dInicio+i));
  end;
end;



Responder Citar

03/02/2006

Paullsoftware

Use a função dayofweek, para saber qual o dia da semana da data corrente.. se for 1, então cadastra na tabela, senão incrementa a data.. assim : v_range := v_data_final - v_data_inicial; for v_i := 0 to round(v_range) - 1 do begin if dayofweek(v_data_inicial) = 1 then begin P_grava_data; end; v_data := v_data_inicial + 1; end;


????
valeu a intensão, mais não entendi nada...
usando essa rotina consigo cadastrar todos os domingos do ano??

não entendi alguns pontos
sei que
[b:a1c43e4c81]v_range, v_data_final,v_data_inicial,_grava_data [/b:a1c43e4c81] podem ser variaveis do tipo ´DOUBLE´ mais ondem vc passa o valor para:
[b:a1c43e4c81] P_grava_data; [/b:a1c43e4c81]

ta meio vago!


Responder Citar

03/02/2006

Weber

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.

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&93;), -2))); //6.Santa
    cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados&91;0&93;),-47))); //Carnaval
    cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados&91;0&93;), 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&93; = FormatDateTime(´dd/mm´,dDtTemp) then
      begin
        for nY := 0 to cFeriados.Count -1 do
          if cFeriados&91;nY&93; = 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;



Responder Citar

03/02/2006

Paullsoftware

Valeu Weber, vou dar uma estudada!! :wink:


Responder Citar

03/02/2006

Cabelo

[quote:189b6a3248=´Cabelo´]Use a função dayofweek, para saber qual o dia da semana da data corrente.. se for 1, então cadastra na tabela, senão incrementa a data.. assim : v_range := v_data_final - v_data_inicial; for v_i := 0 to round(v_range) - 1 do begin if dayofweek(v_data_inicial) = 1 then begin P_grava_data; end; v_data := v_data_inicial + 1; end;


????
valeu a intensão, mais não entendi nada...
usando essa rotina consigo cadastrar todos os domingos do ano??

não entendi alguns pontos
sei que
[b:189b6a3248]v_range, v_data_final,v_data_inicial,_grava_data [/b:189b6a3248] podem ser variaveis do tipo ´DOUBLE´ mais ondem vc passa o valor para:
[b:189b6a3248] P_grava_data; [/b:189b6a3248]

ta meio vago![/quote:189b6a3248]

var v_range, v_data_final, v_data_inicial : TDateTime

P_Grava_Data; Rotina onde vc insere o domingo no BD... como vc está gravando ? Se for um campo do Tipo Date, vc passa o parâmetro nesta procedure para gravar a data que será o domingo....


Responder Citar

17/02/2006

Paullsoftware

ok valeu Cabelo...


Responder Citar

18/02/2006

Marco Salles

pode ser fazer assim tb :

function VerData(data:TDate):boolean;
begin
result:=((Trunc(Data) - 1) mod 7 = 0);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if  Verdata(strtodate(edit1.text)) then
  showmessage(´é domingo´)
else
  showmessage(´não é´);
end;



Responder Citar