Como começar a semana no Domingo?

25/02/2006

0

Olá,
estou com um probleminha aqui sobre o comando que conta as semanas de um ano.
estou querendo que a semana contada começe no domingo e termine no sábado e não na segundo e termine no domingo como é identificados pelo comando DayOfTheWeek.

ele reconhece a contagem da semana começando na segunda feira, então:
1 = segunda-feira
2 = terça-feira
3 = quarta-feira
4 = quinta-feira
5 = sexta-feira
6 = sábado
7 = domingo.

só que eu queria que o comando reconhecesse assim;

1 = domingo
2 = segunda-feira
3 = terça-feira
4 = quarta-feira
5 = quinta-feira
6 = sexta-feira
7 = sábado

por exemplo:

se eu quero saber a data que está no começo da semana escolhida de um determinado ano ex:
semana 1 do ano de 2005 é dia 02/01/2005 - domingo;
porém, o comando identifica o começo da semana como segunda-feira e o resultado apresentado é dia 03/01/2005 - segunda feira.

teria como fazer as semanas começarem no domingo e não a segunda?

uso este comando.
Showmessege(DatetoStr( StartOfAWeek(2005,1,1));
de já , agradeço de montão.
:)


Carlosceuma

Carlosceuma

Responder

Posts

25/02/2006

Marco Salles

uso este comando. Showmessege(DatetoStr( StartOfAWeek(2005,1,1)); de já , agradeço de montão.


use assim :

Showmessege(DatetoStr( StartOfAWeek(2005,1,1)-1); 


que dá


Responder

14/03/2006

Carlosceuma

Olá marcos salles,
obrigado pela dica mas arrumei uma maneira que ficou muito bom.
faz certinho, de qualquer ano que queira e sem precisar armazenar a lista das semanas em tabela.
se quiseres uma cópia da rotina eu envio.
reforçando, agradeço de montão.


Responder

14/03/2006

Martins

Olá marcos salles, obrigado pela dica mas arrumei uma maneira que ficou muito bom. faz certinho, de qualquer ano que queira e sem precisar armazenar a lista das semanas em tabela. se quiseres uma cópia da rotina eu envio. reforçando, agradeço de montão.


Se não for muito extensa, seria bem mais proveitoso para todos q vc publicasse aqui no tópico, ok!


valew!!


Responder

14/03/2006

Marco Salles

Tranquilo martins

procedure TForm1.Button1Click(Sender: TObject); var ano,mes,dia:Word; NovaData,Data:TDate; Resto:Integer; begin Data:=Strtodate(Edit1.text); //Coloque oum ano qualquer decodedate(Data,ano,mes,dia); NovaData:=encodedate(ano,1,1); case (trunc(NovaData) mod 7) of 0:NovaData:=NovaData+1; 2:NovaData:=NovaData+6; 3:NovaData:=NovaData+5; 4:NovaData:=NovaData+4; 5:NovaData:=NovaData+3; 6:NovaData:=NovaData+2; end; Showmessage(´O Primeiro domingo do ano de: ´+Inttostr(ano)+ ´ é :´+Datetostr(NovaData)); end;


nada muito complicado... Acho que é isso que ele queria


Responder

20/03/2006

Carlosceuma

Olá Marcos Salles e Martins,
desculpas pela demora na resposta mas, eu estava viajando e cheguei ontem a noite e só agora pude entrar no forum.
vamos lá.
Marcos, valeu mesmo, é + / - isso, porém não é para encontrar o primeiro domingo de um determinado ano.
é o seguinte:
Exite um tipo de calendário obedecido por muitos orgãos e instituições públicas que é o ´calendário semanal´ onde a semana é que conta e que esta semana começe no domingo e termina do sábado, porém no delphi eu só conseguia que a semana começasse na segunda e terminasse no domingo seguinte, então tratei de fazer de uma forma para mudar isso.
Fiz uma função que diz qual o data ´dd/mm/aaaa´ que começa na semana escolhida através de parametros (semana, ano), ex:
quero saber qual a data inicial da semana (1) do ano (2005), dá como resultado (02/01/2005), esta é a primeira data da semana 1 de 2005, já a primeira data da semana (1) de (2004) é (04/01/2004), se fosse só utilizar os comandos [i:d0f2f1bbd6][b:d0f2f1bbd6]StartOfAWeek[/b:d0f2f1bbd6][/i:d0f2f1bbd6] , ele não seria esta data e sim 03/01/2005 e 05/01/2004, depois de concluir a função que retornava a data inicial da semana escolhida, fiz a funçaõ da data final desta semana, ou seja, a data do domingo e a do sábado desta semana.
até aí tudo bem mas, teve um outro problema a ser encontrado.
Cara, tem uns anos que o ano não tem só 52 semanas, tem anos que tem 53 semanas e acho que não tem nada haver com ano bisexto, aí que foi a complicação de mais dois dias pensando como resolver. rsrsrsrs.
enfim, vou postar aqui as duas funções e espero que seja útil para vocês.
Pessoal, sou leigo no assunto, espero que me desculpe se o código está feio, esquisito ou mal arrumado, só sei dizer que funcionou belezinha e outra coisa, como posso fazer para deixar uma cópia do executável e fonte disponível aqui no forum?
um super abraço e qualquer coisa, modifiquem ou aperfeçoe o código.


function Tfrm_notificar.datafinal(semana, ano: string): string;
var semanavlr,anovlr:integer;
data1,data2:string;
begin
if semana <> ´´ then semanavlr:=StrToInt(semana); /// combobox1
if ano <> ´´ then anovlr:=StrToInt(ano); ///combobox2

if WeeksInAYear(anovlr) = 53 then
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr+1,6));

if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr+1) = 53) then
begin
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;

if (WeeksInAYear(anovlr) <> 53) and (WeeksInAYear(anovlr-1) <> 53) and(WeeksInAYear(anovlr+1) <> 53) then
begin
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;


if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr-1) = 53) then
begin
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;

result := data2;
end;

function Tfrm_notificar.datainicial(semana, ano: string): string;
var semanavlr,anovlr:integer;
data1,data2:string;
begin
if semana <> ´´ then semanavlr:=StrToInt(semana); /// combobox1
if ano <> ´´ then anovlr:=StrToInt(ano); ///combobox2

if WeeksInAYear(anovlr) = 53 then
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr,7));

if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr+1) = 53) then
begin
if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+51,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
end;

if (WeeksInAYear(anovlr) <> 53) and (WeeksInAYear(anovlr-1) <> 53) and(WeeksInAYear(anovlr+1) <> 53) then
begin
if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+51,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
end;


if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr-1) = 53) then
begin
if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+52,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
end;

result := data1;
end;


Responder

21/03/2006

Carlosceuma

Alguém poderia me dizer como faço para dispor o executável e o fonte desse exemplo aqui no forum?
de já agradeço de montão.


Responder

21/03/2006

Marco Salles

pq que ao digitar semana = 53 e ano = 2005 esta retornando a data

01/01/2006 ????

To chamando assim :
procedure Tfrm_notificar.Button1Click(Sender: TObject); begin showmessage(frm_notificar.datainicial(edit1.Text,edit2.Text)); end;



Responder

23/03/2006

Carlosceuma

/// combobox1 = são os anos
/// combobox2 = são as semanas

faça o seguinte:
crie o formulário, coloque dois combobox e uma caixa de texto (edit).
ponha as função e o a procedure mudança.


no combobox1 que contem o ano, insira os anos, no intervalo que quiser, sugiro de 1999 até 2010...

e no combobox2 que tem as semanas, não ponha nada, a procedure mudança irá carregar as semanas
conforme o ano escolhido.
em seguida, no evento ´oncreate´ do Formulário principal, chame a procedure ´mudança´.

no evento ´onchange´ do combobox2, ponha:
´Edit1.Text:=semanas(ComboBox2.Text,ComboBox1.Text);´

no evento ´onchange´ do combobox1, ponha:
´mudanca;´
´ComboBox2Change(sender);´

aí, é só testar.
poste se tiver dúvidas ou se der certo.
o propósito desta funçaõ é retornar as datas inicial e final de cada semana
sendo que, as semanas começaram no domingo e terminarão no sábado, ao contrário
do comando StartofAWeek que retorna a semana iniciando na segunda e finalizando no domingo da outra semana
como padrão.

o outro problema que encontrei e resolvi, foi os anos que em as semanas são contandas com 53 semanas
e não 52 semanas.

a função WeeksInAYear retorna a quantidade de semana existentes no ano selecionado, porém,
no caledário que usamos, melhor, que é usado internacionalmente, tem os anos diferente com 53 semanas.
ex:
A função retorna que o ano 2004 tem 53 semanas, mas, no caledário interncional, utilizado
pelas organizações de saúde, diz que o ano de 2003 tem 53 e não o ano de 2004 e assim vai, sempre
um ano anterior e não o que a função WeekInAYear diz ser.

ok
espero ter contribuido para algo e não sei se o código está um pouco ruim, sou de primeira viagem
e fiz dentro do limite do pouco conhecimento que tenho em programação.
abraços a todos.
aí tá o código:
qualquer sujestão, alteração será bem vinda.



function TForm1.semanas(semana, ano: string): string;
var semanavlr,anovlr:integer;
data1,data2:string;
begin
if semana <> ´´ then semanavlr:=StrToInt(semana); /// combobox1
if ano <> ´´ then anovlr:=StrToInt(ano); ///combobox2

if WeeksInAYear(anovlr) = 53 then
begin
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr,7));
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr+1,6));
end;


if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr+1) = 53) then
begin

if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+51,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;

if (WeeksInAYear(anovlr) <> 53) and (WeeksInAYear(anovlr-1) <> 53) and(WeeksInAYear(anovlr+1) <> 53) then
begin
if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+51,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;


if (WeeksInAYear(anovlr) = 52) and (WeeksInAYear(anovlr-1) = 53) then
begin

if (semanavlr-1 = 0) then
data1:= DateToStr(StartOfAWeek(anovlr-1,semanavlr+52,7)) else
data1:= DateToStr(StartOfAWeek(anovlr,semanavlr-1,7));
if (semanavlr = 53) then
data2:= DateToStr(EndOfAWeek(anovlr+1,semanavlr-52,6)) else
data2:= DateToStr(EndOfAWeek(anovlr,semanavlr,6));
end;

result := data1 + ´ até ´+ data2;

end;


procedure TForm1.ComboBox2Change(Sender: TObject);
begin
Edit1.Text:=semanas(ComboBox2.Text,ComboBox1.Text);
end;

procedure TForm1.mudanca;
var
x,y:integer;
begin
x:=ComboBox2.ItemIndex;
ComboBox2.Clear;
for y:=1 to WeeksInAYear(StrToInt(ComboBox1.Text)+1) do ComboBox2.Items.Add(IntToStr(y));
ComboBox2.ItemIndex:=x;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mudanca;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
mudanca;
ComboBox2Change(sender);
end;


Responder

23/03/2006

Carlosceuma

Marcos,
testa este código aí e veja se dá certo conforme o esperado.


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