Chamuanza Posted July 27, 2014 at 08:46 PM Report Share #563529 Posted July 27, 2014 at 08:46 PM Um bem aja a todos Tenho alguma dificuldade em trabalhar com funções (estou em fase de aprendizagem) e gostaria de uma ajuda/exemplo. Tenho este código que colhi aqui no forum e não sei como aplicar as funções // Module ModFeriados 'Dias Feriados Public Function DiaFeriado(ByVal Data As Date) As String Dim Dia As Integer = Data.Day Dim Mes As Integer = Data.Month Dim Ano As Integer = Data.Year 'Festas moveis If Data.Date = Carnaval(Ano).Date Then Return "E" '"Entrudo/Carnaval" If Data.Date = SextaFeiraSanta(Ano).Date Then Return "S" '"Sexta-Feira Santa" If Data.Date = Pascoa(Ano).Date Then Return "P" '"Páscoa" If Data.Date = CorpoDeDeus(Ano).Date Then Return "S" '"Corpo de Deus" 'Feriados e dias Santos Fixos If Dia = 1 And Mes = 1 Then Return "S" '"Ano Novo" If Dia = 25 And Mes = 4 Then Return "F" '"Dia da Liberdade" If Dia = 1 And Mes = 5 Then Return "F" '"Dia do Trabalhador" If Dia = 10 And Mes = 6 Then Return "F" '"Dia de Portugal" If Dia = 15 And Mes = 8 Then Return "S" '"Assunção de Maria" If Dia = 5 And Mes = 10 Then Return "F" '"Implantação da República" If Dia = 1 And Mes = 11 Then Return "S" '"Todos os Santos" If Dia = 1 And Mes = 12 Then Return "F" '"Restauração da Independência" If Dia = 8 And Mes = 12 Then Return "S" '"Imaculada Conceição" If Dia = 25 And Mes = 12 Then Return "N" '"Natal" 'Feriados Locais 'If Dia = 1 And Mes = 7 Then Return "R" '"Feriado Regional(Madeira)" 'If Dia = 21 And Mes = 8 Then Return "M" '"Feriado Municipal(Funchal)" 'etc... Return "" 'Dia Util" End Function 'Festas Moveis Public Function Carnaval(ByVal Ano As Integer) As Date Dim D As Date = Pascoa(Ano) Return DateSerial(Ano, D.Month, D.Day - 47) End Function Public Function SextaFeiraSanta(ByVal Ano As Integer) As Date Dim D As Date = Pascoa(Ano) Return DateSerial(Ano, D.Month, D.Day - 2) End Function Public Function Pascoa(ByVal Ano As Integer) As Date Dim A As Integer = Ano Mod 19 Dim B As Integer = CInt(Int(Ano / 100)) Dim C As Integer = Ano Mod 100 Dim D As Integer = CInt(Int(B / 4)) Dim E As Integer = B Mod 4 Dim F As Integer = CInt(Int((B + 8) / 25)) Dim G As Integer = CInt(Int((B - F + 1) / 3)) Dim H As Integer = (19 * A + B - D - G + 15) Mod 30 Dim I As Integer = CInt(Int(C / 4)) Dim J As Integer = C Mod 4 Dim L As Integer = (32 + 2 * E + 2 * I - H - J) Mod 7 Dim M As Integer = CInt(Int((A + 11 + H + 22 * L) / 451)) Dim Mes As Integer = CInt(Int((H + L - 7 * M + 114) / 31)) Dim Dia As Integer = 1 + ((H + L - 7 * M + 114) Mod 31) Return DateSerial(Ano, Mes, Dia) End Function Public Function CorpoDeDeus(ByVal Ano As Integer) As Date Dim D As Date = Pascoa(Ano) Return DateSerial(Ano, D.Month, D.Day + 60) End Function End Module como heide aplicar o retorno da função Pascoa por exemploo para este código a fim de marcar no calendario o simbolo de P // Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'exibe o mês atual comboBoxMonth.Text = DateTime.Now.Month.ToString() 'obtem a cultura do windows CurrentCulture = Globalization.CultureInfo.CurrentCulture.Name 'exibe o nome completo do mes atual labelMonth.Text = Application.CurrentCulture.DateTimeFormat.GetMonthName(Convert.ToInt32(comboBoxMonth.Text)) 'obtem o numero de dias do mes e ano selecionado My.Application.ChangeCulture("en-za") Dim Dayz As Int32 = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) 'exibe o ano atual no textbox textBoxYear.Text = DateTime.Now.Year.ToString() 'chama a função verificaDia verificaDia() For i As Int32 = 1 To Dayz ndayz += 1 lblDayz = New Label() lblDayz.Name = "B" & i lblDayz.Text = i.ToString() lblDayz.TextAlign = ContentAlignment.MiddleCenter lblDayz.BorderStyle = BorderStyle.Fixed3D ' Call FeriadosFixos() If i = DateTime.Now.Day Then lblDayz.BackColor = Color.Yellow ElseIf ndayz = 1 Then lblDayz.BackColor = Color.Red Else lblDayz.BackColor = Color.Aquamarine End If lblDayz.Font = label31.Font lblDayz.SetBounds(x, y, 37, 27) x += 42 If ndayz = 7 Then x = 0 ndayz = 0 y += 29 End If panel1.Controls.Add(lblDayz) Next 'retorna os valores padrão x = 0 ndayz = 0 y = 0 End Sub Link to comment Share on other sites More sharing options...
nelsonr Posted July 27, 2014 at 09:33 PM Report Share #563532 Posted July 27, 2014 at 09:33 PM Boas, a meu ver, para tornares isso mais simples, devias usar uma data para identificar o dia no ciclo. E incrementavas um dia para cada ciclo. dataAtual = dataAtual.AddDays(1) Assim conseguias comparar mais facilmente os feriados If Pascoa(2014) = dataCiclo Then End If Link to comment Share on other sites More sharing options...
Chamuanza Posted July 28, 2014 at 06:01 PM Author Report Share #563584 Posted July 28, 2014 at 06:01 PM Oi nelsonr obrigado desde já pela atenção prestada. Não entendo a tua dica, se puderes esplanar mais, agradecia. Link to comment Share on other sites More sharing options...
nelsonr Posted July 29, 2014 at 08:23 AM Report Share #563611 Posted July 29, 2014 at 08:23 AM Estás a usar um valor inteiro no ciclo dos dias do mês (For i As Int32 = 1 To Dayz). Seria mais fácil teres uma variável do tipo data que tivesse o primeiro dia do mês. Antes do next, avançavas a data um dia. Tendo essa variável da data, consegues facilmente comparar com o resultado das funções dos feriados (visto retornarem uma data). Ou então... deixas estar como tens agora, mas no inicio do For, crias uma variável da data com algo assim Dim dataCiclo as DateTime = New DateTime(DateTime.Now.Year, Convert.ToInt32(comboBoxMonth.Text), 1).AddDays(i-1) E usas essa data para comparar com o retorno das funções dos feriados If Pascoa(DateTime.Now.Year) = dataCiclo Then End If Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now