Array
(
)

Como começar a semana no Domingo?

Carlosceuma
   - 25 fev 2006

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.
:)


Marco Salles
   - 25 fev 2006


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


use assim :

#Código

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


que dá


Carlosceuma
   - 14 mar 2006

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.


Martins
   - 14 mar 2006


Citação:
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!!


Marco Salles
   - 14 mar 2006

Tranquilo martins


Citação:
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


Carlosceuma
   - 20 mar 2006

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 StartOfAWeek , 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;


Carlosceuma
   - 21 mar 2006

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.


Marco Salles
   - 21 mar 2006

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

01/01/2006 ????

To chamando assim :

Citação:
procedure Tfrm_notificar.Button1Click(Sender: TObject);
begin
showmessage(frm_notificar.datainicial(edit1.Text,edit2.Text));
end;



Carlosceuma
   - 23 mar 2006

/// 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;


Carlosceuma
   - 23 mar 2006

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