Cadastrar todos os domingos

03/02/2006

0

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

Paullsoftware

Responder

Posts

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

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

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

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



Responder

03/02/2006

Paullsoftware

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


Responder

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

17/02/2006

Paullsoftware

ok valeu Cabelo...


Responder

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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar