none
Ajuda Regra quinto dia útil c#

    Question

  • Galera, boa noite

    Preciso de uma ajuda com essa regra. Por favor

    Hoje tive um probleminha que parou de funcionar a minha aplicação.

    Tenho a seguinte regra.

                    var dia = DateTime.Today.Day;
                    var Mes = DateTime.Today.Month;
                    Mes = Mes + 1;
                    var ano = DateTime.Today.Year;
    
                    if (Mes == 13)
                    {
                        Mes = 1;
                        ano = ano + 1;
                    }
                    var proximoMes = DateTime.Today.ToString(dia + "/" + Mes + "/" + ano);
    
                    if (dtTrabalho > Agendamento.RetornaQuintoDiaUtil(Convert.ToDateTime(proximoMes)))
                    {
                            ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('Agendamento só pode ser realizado, até o 5º dia útil do mês seguinte.');", true);
                            return;
                    }
    
    
      private static DateTime RetornaQuintoDiaUtil(DateTime Data)
            {
                Int32 primeiroDiaUtil = RetornaPrimeiroDiaUtil(Data);
                Int32 auxDiasUteisLocalizados = 1;
                Int32 auxContadorDiaVerificados = 1;
                var dia = DateTime.Today.Day;
                var Mes = DateTime.Today.Month;
                Mes = Mes + 1;
                var ano = DateTime.Today.Year;
                if (Mes == 13)
                {
                    Mes = 1;
                    ano = ano + 1;
                }
                var proximoMes = DateTime.Today.ToString(dia + "/" + Mes + "/" + ano);
                DateTime quintoDiaUtil = Convert.ToDateTime(proximoMes);
                DateTime mes = DateTime.Now.AddMonths(1);
                DateTime dataPrimeiroDiaUtil = new DateTime(Data.Year, Data.Month, primeiroDiaUtil);
    
                while (auxDiasUteisLocalizados < 5)
                {
                    quintoDiaUtil = dataPrimeiroDiaUtil.AddDays(auxContadorDiaVerificados);
    
                    if (VerificaDiaUtil(quintoDiaUtil))
                    {
                        auxDiasUteisLocalizados++;
                    }
    
                    auxContadorDiaVerificados++;
                }
    
                return Convert.ToDateTime(quintoDiaUtil);
            }
            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 dt)
            {
    
                String strConn = ConfigurationManager.AppSettings["SQLServerConnection"].ToString();
                string sqlFeriado = "";
    
                sqlFeriado += "SELECT DataFeriado FROM  tblFeriado ";
                sqlFeriado += "WHERE DataFeriado = '";
                sqlFeriado += dt.ToString("dd/MM/yyyy") + "'";
    
                SqlConnection objConnFeriado;
                SqlCommand cmdFeriado = new SqlCommand();
    
                objConnFeriado = new SqlConnection(strConn);
                objConnFeriado.Open();
                cmdFeriado.Connection = objConnFeriado;
    
                cmdFeriado.CommandText = sqlFeriado;
                SqlDataReader objDRFeriado = cmdFeriado.ExecuteReader();
    
                if (objDRFeriado.Read())
                    return true;
                else
                    return false;
                
                objDRFeriado.Close();
                objConnFeriado.Close();
                objDRFeriado.Dispose();
                objConnFeriado.Dispose();
            }
    

    Nessa minha regra, está fazendo a contagem de um mês pra frente, mais a contagem dos dias úteis, o que ocorreu hoje, ele fez a busca do dia 31/09/13 que não existe, que ocasionou as exception. Alguém saberia me dizer como eu poderia mudar isso em meu código para que não aconteça novamente?

    Obrigado!!

    Sunday, September 01, 2013 1:56 AM

Answers

  • Adicione algumas regras:

    1 - mêses 1,3,5,7,8,10,12 pode ter de 1 a 31 dias 

    2 - mes 2 (fevereiro) você pega o ano e pergunta no método do DateTime DateTime.IsLeapYear se retornar falso não é ano bissexto então vai de 1 a 28 e se for bissexto de 1 a 29. 

    3 - mês restantes são de 1 a 30 dias

    Faltou isso para não acontecer o erro nessa rotina montada por você! mas, já visto que o próprio Struct DateTime faz todo esse processo só tendo a obrigatoriedade de definir sábado domingo e feriados!!! Dá uma estudada no DateTime!


    Fúlvio Cezar Canducci Dias


    Sunday, September 01, 2013 2:07 PM

All replies

  • Adicione algumas regras:

    1 - mêses 1,3,5,7,8,10,12 pode ter de 1 a 31 dias 

    2 - mes 2 (fevereiro) você pega o ano e pergunta no método do DateTime DateTime.IsLeapYear se retornar falso não é ano bissexto então vai de 1 a 28 e se for bissexto de 1 a 29. 

    3 - mês restantes são de 1 a 30 dias

    Faltou isso para não acontecer o erro nessa rotina montada por você! mas, já visto que o próprio Struct DateTime faz todo esse processo só tendo a obrigatoriedade de definir sábado domingo e feriados!!! Dá uma estudada no DateTime!


    Fúlvio Cezar Canducci Dias


    Sunday, September 01, 2013 2:07 PM
  • Fúlvio, boa tarde.

    Obrigado pelas dicas.

    Dei uma melhorada no meu código ficou assim.

    Abs,

      DateTime dt = DateTime.Now;
                   // dt = dt.AddMonths(1);
                    if (dtTrabalho.Value.Date > Agendamento.RetornaQuintoDiaUtil(dt.AddMonths(1)).Date)
                    {
                        ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('Agendamento só pode ser realizado, até o 5º dia útil do mês seguinte.');", true);
                        return;
                    }
    
         private static DateTime RetornaQuintoDiaUtil(DateTime Data)
            {
                Int32 primeiroDiaUtil = RetornaPrimeiroDiaUtil(Data);
                Int32 auxDiasUteisLocalizados = 1;
                Int32 auxContadorDiaVerificados = 1;
    
                DateTime quintoDiaUtil = Convert.ToDateTime(Data);
                DateTime dataPrimeiroDiaUtil = new DateTime(Data.Year, Data.Month, primeiroDiaUtil);
    
                while (auxDiasUteisLocalizados < 5)
                {
                    quintoDiaUtil = dataPrimeiroDiaUtil.AddDays(auxContadorDiaVerificados);
    
                    if (VerificaDiaUtil(quintoDiaUtil))
                    {
                        auxDiasUteisLocalizados++;
                    }
                    auxContadorDiaVerificados++;
                }
    
                return Convert.ToDateTime(quintoDiaUtil);
            }
            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 dt)
            {
                //Código para verificar se uma data passada como parâmetro é feriado de acordo com banco 
                //de dados.
    
                String strConn = ConfigurationManager.AppSettings["SQLServerConnection"].ToString();
                string sqlFeriado = "";
    
                sqlFeriado += "SELECT DataFeriado FROM  tblFeriado ";
                sqlFeriado += "WHERE DataFeriado = '";
                sqlFeriado += dt.ToString("dd/MM/yyyy") + "'";
    
                SqlConnection objConnFeriado;
                SqlCommand cmdFeriado = new SqlCommand();
                bool bRetorno = false;
    
                using (objConnFeriado = new SqlConnection(strConn))
                {
                    objConnFeriado.Open();
                    cmdFeriado.Connection = objConnFeriado;
    
                    cmdFeriado.CommandText = sqlFeriado;
                    SqlDataReader objDRFeriado = cmdFeriado.ExecuteReader();             
    
                    if (objDRFeriado.Read())
                        bRetorno = true;
                }
    
                return bRetorno;
            }

    Tuesday, September 03, 2013 3:48 PM