Como começar a semana no Domingo?
25/02/2006
0
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
Posts
25/02/2006
Marco Salles
use assim :
Showmessege(DatetoStr( StartOfAWeek(2005,1,1)-1);
que dá
14/03/2006
Carlosceuma
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.
14/03/2006
Martins
Se não for muito extensa, seria bem mais proveitoso para todos q vc publicasse aqui no tópico, ok!
valew!!
14/03/2006
Marco Salles
nada muito complicado... Acho que é isso que ele queria
20/03/2006
Carlosceuma
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;
21/03/2006
Carlosceuma
de já agradeço de montão.
21/03/2006
Marco Salles
01/01/2006 ????
To chamando assim :
23/03/2006
Carlosceuma
/// 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;
23/03/2006
Carlosceuma
testa este código aí e veja se dá certo conforme o esperado.
Clique aqui para fazer login e interagir na Comunidade :)