Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cintiadel

[Resolvido] quinto dia util do mes seguinte

Recommended Posts

preciso de uma funçao em vb onde ela me apresente o quinto dia util do mes seguinte.

ja consegui a funçao para verificar se o dia é util ou nao, mas n consigo fazer com q exiba o quinto dia util.

 

Dim dt As DateTime = DateTime.Now.AddMonths(1)
Public Shared Function diaUtil(ByVal dt As DateTime) As DateTime
		While True
			If dt.DayOfWeek = DayOfWeek.Saturday Then
				dt = dt.AddDays(2)
				Return diaUtil(dt)
			Else
				If dt.DayOfWeek = DayOfWeek.Sunday Then
					dt = dt.AddDays(1)
					Return diaUtil(dt)
				Else
					If Feriado(dt) = True Then
						dt = dt.AddDays(1)
						Return diaUtil(dt)
					Else
						Return dt
					End If
				End If
			End If
		End While
	End Function 'diaUtil

alguem sabe como posso exibir o quinto dia util num label???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta uma logica assim:

 

bool encontrouDia = false;
int mes = 2, dia = 0, qtd = 0;
while (qtd < 5)
{
	dia++;
	if (diaUtil(new DateTime(2009,mes,dia)))
		qtd++;
}

Ou seja, voce vai pulando dia a dia ate achar 5 dias uteis, no final do while q variavel dia vai ter o dia do quinto dia util.

A logica e mais ou menos esta, talvez precise ajustar alguma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas como associo isso com a funcao q verifica se o dia é util?

qual valor passo pra variavel???

pq mes igual a 2?

e depois o q eu coloco no meu label para exibir a data encontrada?

fiz da seguinte forma:

Public Shared Function quintodia(ByVal dt As DateTime) As DateTime
		Dim encontrouDia As Boolean = False
		Dim mes As Integer = 2
		Dim dia As Integer = 0
		Dim qtd As Integer = 0
		While qtd < 5
			dia += 1
			If diaUtil(New DateTime(2009, mes, dia)) Then
				qtd += 1
			End If
		End While
	End Function

	Public Shared Function diaUtil(ByVal dt As DateTime) As DateTime
		While True
			If dt.DayOfWeek = DayOfWeek.Saturday Then
				dt = dt.AddDays(2)
				Return diaUtil(dt)
			Else
				If dt.DayOfWeek = DayOfWeek.Sunday Then
					dt = dt.AddDays(1)
					Return diaUtil(dt)
				Else
					If Feriado(dt) = True Then
						dt = dt.AddDays(1)
						Return diaUtil(dt)
					Else
						Return dt
					End If
				End If
			End If
		End While
	End Function 'diaUtil

	Public Shared Function Feriado(ByVal dt As DateTime) As Boolean

		Dim conexao As New Data.SqlClient.SqlConnection("conexao")
		Dim comando As New Data.SqlClient.SqlCommand
		Dim drferiado As Data.SqlClient.SqlDataReader

		conexao.Open()
		comando.Connection = conexao
		comando.CommandText = "Select * from feriado where dtferiado = '" & dt.ToString("dd/MM/yyyy") & "'"
		drferiado = comando.ExecuteReader()

		If drferiado.Read() Then
			Return True
		Else
			Return False
		End If

		drferiado.Close()
		conexao.Close()

	End Function 'Feriado
tah dando erro : Value of type 'Date' cannot be converted to 'Boolean'.

na linha: if diaUtil(New DateTime(2009, mes, dia)) Then

Compartilhar este post


Link para o post
Compartilhar em outros sites

cintiadel,

 

Sobre o erro, é o seguinte:

Na linha abaixo, você está fazendo uma comparação (se o retorno for TRUE) com o retorno da sua função diaUtil()

If diaUtil(New DateTime(2009, mes, dia)) Then
O problema, é que você está retornando da função uma DATA e não um valor BOOLEANO (true/false).. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Não entendi bem oq você quer nesse IF, mas talvez já consiga resolver isso..

 

[]'s

 

 

Daniel Afonso

Compartilhar este post


Link para o post
Compartilhar em outros sites

cintiadel,

 

Sobre o erro, é o seguinte:

Na linha abaixo, você está fazendo uma comparação (se o retorno for TRUE) com o retorno da sua função diaUtil()

If diaUtil(New DateTime(2009, mes, dia)) Then
O problema, é que você está retornando da função uma DATA e não um valor BOOLEANO (true/false).. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Não entendi bem oq você quer nesse IF, mas talvez já consiga resolver isso..

 

[]'s

 

 

Daniel Afonso

esse if foi o exemplo q me deram acima, mas n to sabendo aplicar

tudo q eu quero é exibir o quinto dia util do mes seguinte em um label, so n sei como fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você postou sua função de DiaUtil eu achei que era uma função onde você passava uma data e ela retornava se é um dia util ou não.

Altere essa função para fazer isso, ou seja, retornar um booleano indicando se é útil ou não.

O mês = 2 ali eu fiz só um exemplo, essa variável você vai preencher de alguma forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você postou sua função de DiaUtil eu achei que era uma função onde você passava uma data e ela retornava se é um dia util ou não.

Altere essa função para fazer isso, ou seja, retornar um booleano indicando se é útil ou não.

O mês = 2 ali eu fiz só um exemplo, essa variável você vai preencher de alguma forma.

mas como eu calculo o quinto dia util do mes seguinte?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cintia tem um porem neste problema

 

a existencia de feriados no inicio do mes

 

tem feriados que nao tem dia certo para cair

 

entao levando-se em conta apenas sabado e domingo fica mais simples pois voce apenas precisa pegar o dia 1º do mes seguinte e verificar o dia da semana e com base na resposta soma-se dias no mesmo para encontrar o 5º dia util

 

Exemplo

 

Dia 1º é............5º dia Util

 

Segunda...........Sexta Dia 5

Terça...............Segunda Dia 7

Quarta...........Terça Dia 7

Quinta...........Quarta Dia 7

Sexta...........Quinta Dia 7

Sabado...........Sexta Dia 7

Domingo...........Sexta Dia 6

 

Resumindo

 

5º Dia util ignorando feriados será

 

Dia 5 se o mes iniciar na segunda feira

Dia 6 so o mes iniciar no domingo

Dia 7 nos demais casos

Compartilhar este post


Link para o post
Compartilhar em outros sites

cintia tem um porem neste problema

 

a existencia de feriados no inicio do mes

 

tem feriados que nao tem dia certo para cair

 

entao levando-se em conta apenas sabado e domingo fica mais simples pois voce apenas precisa pegar o dia 1º do mes seguinte e verificar o dia da semana e com base na resposta soma-se dias no mesmo para encontrar o 5º dia util

 

Exemplo

 

Dia 1º é............5º dia Util

 

Segunda...........Sexta Dia 5

Terça...............Segunda Dia 7

Quarta...........Terça Dia 7

Quinta...........Quarta Dia 7

Sexta...........Quinta Dia 7

Sabado...........Sexta Dia 7

Domingo...........Sexta Dia 6

 

Resumindo

 

5º Dia util ignorando feriados será

 

Dia 5 se o mes iniciar na segunda feira

Dia 6 so o mes iniciar no domingo

Dia 7 nos demais casos

e como faço isso na minha aplicaçao???

estou com dificuldade em passar o parametro correto para a função e como monta-la

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser abranger tudo terá que ter um cadastro de feriado, para poder validar.

 

Abraços...

eu já tenho esse cadastro de uma olhada no código q eu postei alguns tópicos acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao tem que colcocar esta verificacao na logica tambem

 

va mostrando as evolucoes nos seus codigos e mostrando onde estao suas duvidas

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao tem que colcocar esta verificacao na logica tambem

 

va mostrando as evolucoes nos seus codigos e mostrando onde estao suas duvidas

n consigo passar o quinto dia util, só o quinto dia, esse tah sendo o maior problema

Public Shared Function diaUtil(ByVal dt As DateTime) As DateTime
		Dim dia As Integer = 1

		While dia < 5
			dia += 1
		End While

		dt = dia & "/" & Now.AddMonths(1).Month & "/" & Now.Year
		While True
			If dt.DayOfWeek = DayOfWeek.Saturday Then
				dt = dt.AddDays(2)
				Return diaUtil(dt)
			Else
				If dt.DayOfWeek = DayOfWeek.Sunday Then
					dt = dt.AddDays(1)
					Return diaUtil(dt)
				Else
					If Feriado(dt) = True Then
						dt = dt.AddDays(1)
						Return diaUtil(dt)
					Else
						Return dt
					End If
				End If
			End If
		End While

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz da seguinte forma e deu certo:

 

Dim dt As Date = 1 & "/" & Now.AddMonths(1).Month & "/" & Now.Year
		Dim proxvenc As Date

		Select Case Weekday(dt)
			Case 1 'Domingo
				proxvenc = DateAdd("d", 5, dt)
			Case 2 'Segunda
				proxvenc = DateAdd("d", 4, dt)
			Case Else
				proxvenc = DateAdd("d", 6, dt)
		End Select

mas preciso verificar se é feriado de acordo com a minha tabela?

como faço??? abaixo esta a função feriado:

Public Shared Function Feriado(ByVal dt As DateTime) As Boolean

	   Dim conexao As New Data.SqlClient.SqlConnection("conexao")
		Dim comando As New Data.SqlClient.SqlCommand
		Dim drferiado As Data.SqlClient.SqlDataReader

		conexao.Open()
		comando.Connection = conexao
		comando.CommandText = "Select dtferiado from feriados2 where dtferiado = '" & dt.ToString("dd/MM/yyyy") & "'"
		drferiado = comando.ExecuteReader()

		If drferiado.Read() Then
			Return True
		Else
			Return False
		End If

		drferiado.Close()
		conexao.Close()

	End Function 'Feriado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí está um exemplo completo (modularizado, em C#, só faltando comentários):

 

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
	class Program
	{
		static void Main(string[] args)
		{
			Console.Write(RetornaQuintoDiaUtil(DateTime.Now));
			Console.Read();
		}

		private static string RetornaQuintoDiaUtil(DateTime Data)
		{
			Int32 primeiroDiaUtil = RetornaPrimeiroDiaUtil(Data);

			Int32 auxDiasUteisLocalizados = 1;
			Int32 auxContadorDiaVerificados = 1;
			DateTime quintoDiaUtil = DateTime.Now;
			DateTime dataPrimeiroDiaUtil = new DateTime(Data.Year, Data.Month, primeiroDiaUtil);

			while (auxDiasUteisLocalizados < 5)
			{
				quintoDiaUtil = dataPrimeiroDiaUtil.AddDays(auxContadorDiaVerificados);

				if (VerificaDiaUtil(quintoDiaUtil))
				{
					auxDiasUteisLocalizados++;
				}

				auxContadorDiaVerificados++;
			}

			return quintoDiaUtil.Day.ToString();
		}

		private static int RetornaPrimeiroDiaUtil(DateTime Data)
		{
			DateTime primeiroDiaMes = new DateTime(Data.Year, Data.Month, 1);

			while (!VerificaDiaUtil(primeiroDiaMes))
			{
				primeiroDiaMes = primeiroDiaMes.AddDays(1f);
			}

			
			return primeiroDiaMes.Day;
		}

		private static bool VerificaDiaUtil(DateTime DiaMes)
		{
			if (DiaMes.DayOfWeek == DayOfWeek.Saturday || DiaMes.DayOfWeek == DayOfWeek.Sunday ||
				VerificaFeriado(DiaMes))
			{
				return false;
			}

			return true;
		}

		private static bool VerificaFeriado(DateTime DiaMes)
		{
			//Código para verificar se uma data passada como parâmetro é feriado de acordo com banco 
			//de dados ou WebService
			return false;
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpe mas n consegui entender qual das variaveis devo jogar na function feriado.

por exemplo dia 01/05 foi feriado por tanto o quinto dia util do mes de maio foi dia 08/05

como devo fazer para q ele retorne essa data?

Compartilhar este post


Link para o post
Compartilhar em outros sites

RetornaQuintoDiaUtil(new DateTime(2009, 05, 01))

Sugiro que você coloque este código no VS e vai debugando e aprendendo com ele, ficou bem completinho :)

Mais alguns retoques aqui e ali e poderia ir para o repositório.

Compartilhar este post


Link para o post
Compartilhar em outros sites

RetornaQuintoDiaUtil(new DateTime(2009, 05, 01))

Sugiro que você coloque este código no VS e vai debugando e aprendendo com ele, ficou bem completinho :)

Mais alguns retoques aqui e ali e poderia ir para o repositório.

Não posso deixar o ano e o mes fixo, como posso mudar pra q ele me exiba o ano atual, e o proximo mes?

ja na função tem q usar o mes seguinte como base para os calculos, pq o que eu preciso é o quinto dia util do mes seguinte.

Dim dt As String
		dt = RetornaQuintoDiaUtil(New Date(2009, 5, 1))
		lbl_msg_superior.Text =  dt

 

tive q alterar na função RetornaQuintoDiaUtil a linha:

Return quintoDiaUtil.Day.ToString()
para

Return quintoDiaUtil.Day.ToString() & "/" + quintoDiaUtil.Month.ToString() & "/" & quintoDiaUtil.Year.ToString()
pq estava retornando só o dia e eu preciso da data completa

não sei onde devo colocar AddMonth(1) e q retornar no label?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.