cintiadel 0 Denunciar post Postado Maio 6, 2009 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
Oenning 0 Denunciar post Postado Maio 6, 2009 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
cintiadel 0 Denunciar post Postado Maio 7, 2009 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 'Feriadotah 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
daniel.cafonso 0 Denunciar post Postado Maio 7, 2009 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)) ThenO 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 0 Denunciar post Postado Maio 7, 2009 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)) ThenO 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 aplicartudo 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
Oenning 0 Denunciar post Postado Maio 7, 2009 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
cintiadel 0 Denunciar post Postado Maio 7, 2009 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
Mário Monteiro 179 Denunciar post Postado Maio 7, 2009 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
cintiadel 0 Denunciar post Postado Maio 7, 2009 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
quintelab 91 Denunciar post Postado Maio 7, 2009 Se quiser abranger tudo terá que ter um cadastro de feriado, para poder validar. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Maio 7, 2009 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
Mário Monteiro 179 Denunciar post Postado Maio 7, 2009 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
cintiadel 0 Denunciar post Postado Maio 8, 2009 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
quintelab 91 Denunciar post Postado Maio 8, 2009 Não posso testar seu código agora, de uma olhada nesse link que fez exatamente isso: http://www.vbweb.com.br/dicas_visual.asp?Codigo=2180 Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Maio 8, 2009 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
Juliano.net 2 Denunciar post Postado Maio 8, 2009 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
cintiadel 0 Denunciar post Postado Maio 11, 2009 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
Oenning 0 Denunciar post Postado Maio 12, 2009 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
cintiadel 0 Denunciar post Postado Maio 12, 2009 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 completanão sei onde devo colocar AddMonth(1) e q retornar no label? Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Maio 12, 2009 Se não pode passar a data chapada, passe suas variáveis, o Oenning só postou um exemplo. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites