• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Furriel

[vb.net 2003] Calendário

11 mensagens neste tópico

Olá a todos,

Estou a fazer uma aplicação em que preciso de saber o nº de uma determinada semana.

Em vez de o utilizador digitar o nº da semana, coloquei um calendário e ao clicar num determinado dia a textbox deveria ser automaticamente preenchida.

Já tentei de várias formas mas nenhuma delas resultou, alguém sabe como saber isso?

Desde já muito obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha, eu fiz um exemplo com uma aplication window em vb2005 express, não sei se funciona no 2003.

Criei uma form com um MonthCalendar e uma text box. O que faço é, ao escolher um dia no calendário, cálculo o número da semana correspondente a esse dia e apresento-o na text box.

Public Class Form1

    Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged

        Dim Data As Date

        Dim numsemana As Integer

        Data = Me.MonthCalendar1.SelectionStart

        numsemana = DatePart("ww", Data)

        Me.TextBox1.Text = numsemana.ToString

    End Sub

End Class

Espero que isto te ajude...

Já agora, a semana começa ao Domingo e não à Segunda. Digo isto porque aqui a fazer alguns testes verifiquei que  os números da semana calculados por mim não correspondiam aos números da semana que tenho num calendário de papel... isso devese a este facto, no VB a semana começar ao Domingo e no meu calendário de papel a semanar começa à Segunda, logo o número da semana de um domingo está incorrecto no calendário de papel... Coisas da vida. :biggrin:

----------------------------------------Modificado posteriormente-----------------------------------------

para resolver o problema da semana começar ao domingo ou segunda..., deves subtituir a linha

numsemana = DatePart("ww", Data)

por

numsemana = DatePart("ww", Data, FirstDayOfWeek.Monday)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Muito obrigado, funciona mas nos limites mostra a semana errada.

Tenta ver no Dezembro para Janeiro a partir dos anos 2008 e 2009

Mais uma vez obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei, no meu dá bem:

dos dias 22 a 28 de Dezembro de  2008 a semana é a 52, dos dias 29 a 31 de Dezembro de 2008 dá a semana 53 e depois do dia 1 ao dia 4 de Janeiro de 2009 já dá a semana 1 e do dia 5 ao dia 11 de Janeiro de 2009 já dá a semana 2...

Isto, claro está com a modificação que fiz à linha para que a semana comece à Segunda em vez de começar ao Domingo como disse acima.

numsemana = DatePart("ww", Data, FirstDayOfWeek.Monday)

Mas como disse, fiz isto no vb express 2005, não sei se o 2003 funciona de maneira diferente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esses resultados são os mesmo que me dão nessas datas. Mas tenta nos anos seguintes Dezembro 2009 Janeiro 2010.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No meu continua tudo OK,

De 21 a 27 de Dezembro de 2009 - semana 52

de 28 a 31 de Dezembro de 2009 - semana 53

de 1 a 3  de Janeiro de 2010 - semana 1

de 4 a 10 de Janeiro de 2010 - semana 2

A única alteração que fiz nas propriedades do calendário MonthCalendar1, e que não tem efeito no cálculo do número da semana, foi a alteração do FirstDayOfWeek para Monday porque dá mais jeito visualizar o inicio da semana como segunda uma vez que estamos a usar o inicio da semana como segunda no cálculo do número da semana, mas também já experimentei com essa propriedade como default (sunday) e funciona bem na mesma... (essa propriedade apenas afecta a visualização dos dias no calendario)

Nota, podes escolher o dia de inicio da semana que quiseres... se puseres por exemplo a Terça os valores certamente irão mudar. Eu só escolhi a Segunda porque me baseei no calendário de papel que tenho na secretária.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu também fiz como fizeste, coloquei a 2ª feira como inicio da semana.

Também me dão esses valores mas olha que isso não é normal.

Eu coloquei ao lado do calendário aquela barra opcional para aparecer o nº da semana e esses valores que te dão, e a mim também, não correspondem aos da semana do calendário.

Não percebo como é que existem semanas de 3 dias.

Devia ser do dia 28 de Dezembro de 2009 a 3 de Janeiro de 2010 a semana 53

e do dia 4 a 10 de Janeiro de 2010 a semana 1

O que achas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha, fiz uma pesquisa rápida e notei que existem convenções diferentes para calcular os números da semana num ano, lê a página do link abaixo.

http://www.allegro.com/papers/54.html

Vi depois que se colocares mais uma virgula na instrução DatePart , aparece mais uma opção como a que está abaixo e que pode tomar 4 valores.

Esses valoes é que definem a convenção que vais utilizar. A que em principio deves querer, para que fique igual ao número da semana dado pelo calendário é a que escrevo abaixo mas tens que ver porque fiz poucos testes.

numsemana = DatePart("ww", Data, FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays)

A convenção utilizada pelo calendário também deve dar para mudar mas como não sei como...

----------------------------------- Modificado------------------------------------------------------------------

Olha, andei para aqui a espreitar e descobri mais umas coisitas:

Como já disse existem várias normas para calcular o número  das semanas.

Os americanos convencionaram que a primeira semana começa no dia 1 de janeiro, mesmo que essa semana só tenha um dia, portanto o dia 31 de dezembro corresponde à semana 53 por exemplo e o dia 1 corresponde à semana 1 independentemente do dia da semana a que calhe.

Já nós usamos a convenção ISO8601 que indica que a primeira semmana do ano deve ter no minimo 4 dias do ano novo nessa semana, senão a semana 1 começa só no dia 4 de janeiro (é o caso de dezembro de 2009 para janeiro de 2010) sendo que os dias da primeira semana são considerados como dias da semana 53 do ano anterior.

Existem outros ainda que dizem que a primeira semana do ano deve estar completa, ou seja ter todos os dias, e os dias da semana incompleta são considerados como dias da semana 53.

Estas convenções têm a ver com o número máxomo de semanas que um ano pode ter. Geralmente dizemos que um ano tem 52 semanas, Com a norma ISO8601 isso é verdade, mas com a norma americana o ano de 2000 por exemplo teve 54...

Além disso estive ainda a investigar e descobri outra maneira de atingir os mesmos resultados que ponho abaixo só para escolheres a que gostas mais. Eu particularmente acho a maneira te mostrei a anteriormente melhor mas tu é que sabes e a maneira nova mostra como podes ter informação não só do gregoriano mas também de outros calendários tal como o jacobiano.

Uma boa ideia é colocares o cursor do rato sobre o código das funções (por exemplo sobre a palavra CalendarWeekRule) e carregar em F1 porque isso mostra uma descrição do comando e no exemplo que te indique (CalendarWeekRule)i tem um exemplo muito detalhado da diferença entre normas...

Para o código a seguir, apenas acrescentei ao form mais uma tex box. A primeira texbox continua a mostrar o resultado obtido como já vimos atrás e a segunda mostra o resultado obtido com a nova função.

Imports System.Globalization

Public Class Form1

    Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged

        Dim Data As Date

        Dim numsemana As Integer

        Data = Me.MonthCalendar1.SelectionStart

        numsemana = DatePart("ww", Data, FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays)

        Me.TextBox1.Text = numsemana.ToString

        ' Gets the Calendar instance associated with a CultureInfo.

        Dim myCI As New CultureInfo("en-US") ' Com esta culture info a semana1 começa no dia 1

        Dim myCal As Calendar = myCI.Calendar

        ' Gets the DTFI properties required by GetWeekOfYear.

        'Dim myCWR As CalendarWeekRule = myCI.DateTimeFormat.CalendarWeekRule

        'Dim myFirstDOW As DayOfWeek = myCI.DateTimeFormat.FirstDayOfWeek

        'As duas linhas acima poderiam ser declaradas como se mostra abaixo se não quisermos

        'usar a propriedade CultureInfo que não há para "pt"

        Dim myCWR As CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek

        Dim myFirstDOW As DayOfWeek = DayOfWeek.Monday

        Me.TextBox2.Text = myCal.GetWeekOfYear(Data, myCWR, myFirstDOW)

    End Sub

End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca pensei que existissem anos com 54 semanas, agora é que coisas se complicaram mais :cheesygrin:

Fiz alguns testes com as opções que apareciam ao colocar a virgula e cheguei a conclusão que o melhor é usar o código que usaste, embora às vezes tenha o "problema" de ter semanas com 2, 3 ou 4 dias.

Mais uma vez obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, é chato.

Vê a modificação que fiz à resposta acima, pode ser que esclareças mais umas coisitas.

E era bom que fizesses a tal busca no help pela paravra CalendarWeekRule que, pelo menos no meu explica bem essas diferenças todas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Não percebi muito bem o código que fizeste, isto porque não consegues escolher uma data, pois não tens um calendário associado.

Estive a ler no Help do MSDN e usando o FirstWeekOfYear.FirstFullWeek deixo de ter problemas pois a semana não é interrompida a meio, todos os dias da semana. seg, ter, qua, qui, sex, sab, dom, pertencem à mesma semana.

Obrigado mais uma vez ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora