Jump to content

Utilizar Funções


Chamuanza
 Share

Recommended Posts

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.