none
Calcular FechaFinal apartir de otra fecha segun dias sin sabado ni domingo ni feriados RRS feed

  • Pregunta

  • El codigo es:

    Public Function calcularEstimado(Optional ByVal fecha As Date = Nothing, Optional ByVal iTiempo As Integer = 0, Optional ByVal entregarSabado As Boolean = False) As Date
            Dim diaSemana As String = ""
            Dim iTiempoTransito As Integer = 0
            If iTiempo = 0 Then
                Integer.TryParse(cboDias.Text, iTiempoTransito)
            Else
                iTiempoTransito = iTiempo
            End If
            If iTiempoTransito > 0 Then
                If fecha = Nothing Then
                    dtpEstimado.Value = dtpFechaIngreso.Value
                Else
                    dtpEstimado.Value = fecha
                End If
    
                For i = 1 To iTiempoTransito
                    dtpEstimado.Value = dtpEstimado.Value.AddDays(1)
                    Dim bSiguienteDia As Boolean = False
                    diaSemana = (dtpEstimado.Value.ToString("dddd", New CultureInfo("es-ES")))
    
                    Select Case diaSemana
                        Case "domingo" : bSiguienteDia = True
                        Case "sábado"
                            'Aqui controlamos si la entrega de la mercancia puede ser sabado
                            If entregarSabado = True Then
                                bSiguienteDia = False
                            Else
                                bSiguienteDia = True
                            End If
                        Case Else
                            If chkDiasFestivos.Checked = True Then
                                'En esta parte controlamos los dias festivos que tenemos en la Tabla.
                                Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(dtpEstimado.Value)
                                If oDiaFestivo Is Nothing Then
                                    bSiguienteDia = False
                                    Exit For
                                Else
                                    bSiguienteDia = True
                                End If
                            End If
                    End Select
                    If bSiguienteDia Then
                        i -= 1
                    End If
                Next
            End If
            'Return dtpEstimado.Value
            Return Format(dtpEstimado.Value, "d")
        End Function
    Private Sub CalcularF()
            Me.dtpEstimado.Value = calcularEstimado(Format(Date.Now, "dd/MM/yyyy"))
        End Sub

    cboDias =15

    FechaInicial = 23/03/2018 por tanto deberia ser fechafinal 17/04/2018 porque 29 y 30 es feriado. sin sábados ni domingos

    Pero con el codigo marcando chkDiasFestivos sale 26/03/2018 y sin marcar sale 13/04/2018 

    Por tanto algo esta mal.


    sábado, 24 de marzo de 2018 3:12

Respuestas

  • Hola:
    Revisa el siguiente enlace.
    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/e4e39c22-24cc-4a12-b32f-75ea6787011c
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Javier Roque sábado, 24 de marzo de 2018 22:12
    sábado, 24 de marzo de 2018 21:02
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo
    Imports System.Data.SqlClient
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim liDias As Integer = CInt(DateDiff("d", Me.DateTimePicker1.Value, Me.DateTimePicker2.Value))
            Dim ldtFecha As Date
            Dim liNumDias As Integer = 0
            '
            For liCiclo As Integer = 0 To liDias
                ldtFecha = DateAdd(DateInterval.Day, liCiclo, Me.DateTimePicker1.Value)
                If ldtFecha.DayOfWeek = DayOfWeek.Saturday Or ldtFecha.DayOfWeek = DayOfWeek.Sunday Then
                    Continue For
                End If
                If lF_bEsFestivo(ldtFecha) = True Then
                    Continue For
                End If
                liNumDias += 1
            Next
            MessageBox.Show("Nº de Dias Laborables: " & liNumDias.ToString)
        End Sub

        Private Function lF_bEsFestivo(ByVal vdFecha As Date) As Boolean
            Dim lsQuery As String = "Select Count(*) From fiesta Where f_fiesta=@FFestivo"
            Try
                Using loConexion As New SqlConnection("TU_CADENA_DE_CONEXION")
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@FFestivo", vdFecha.Date))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        Return CBool(IIf(liResultado = 0, False, True))
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bEsFestivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return False
        End Function
    End Class

    P.D.
    Usa una tabla llamada fiesta que contiene un campo llamado f_fiesta

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Javier Roque domingo, 25 de marzo de 2018 22:37
    domingo, 25 de marzo de 2018 11:03

Todas las respuestas

  • Hace mucho hice algo así.  Pero me parece que es más sencillo de lo que veo en su función.  Honestamente, no le revisé casi nada.

    Recuerdo que hice esto:

    1. Tomo fecha inicial y los días que deseo.
    2. Esos días que deseo, los divido por 5 (7 días por semana menos sábado y domingo).  Esto me da el total de semanas a adicionar, sin contar feriados.  También me interesa el módulo (%).
    3. Fecha inicial + (total de semanas a adicionar) + módulo = fecha final.
    4. Busco en base de datos o en términos generales, un proveedor de feriados, aquellos feriados que se encuentren entre ]fecha inicial, fecha final] que no sean sábado o domingo porque esos ya los excluí.  Por cada uno, adiciono un día a la fecha final.
    5. Si fecha final es sábado o domingo, la muevo al lunes.


    Jose R. MCP
    Code Samples


    sábado, 24 de marzo de 2018 18:10
    Moderador
  • Interesante voy a ver que logro con su explicacion.
    sábado, 24 de marzo de 2018 18:27
  • Hola:
    Revisa el siguiente enlace.
    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/e4e39c22-24cc-4a12-b32f-75ea6787011c
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Javier Roque sábado, 24 de marzo de 2018 22:12
    sábado, 24 de marzo de 2018 21:02
  • Hola gracias tengo un problema alli esta con access que no uso; cambiando algunas cosas nose si esta bien me sale un error que marca pide return en esta parte

    Private Function lF_bEsFestivo(ByVal vdFecha As Date) As Boolean
            Try
                Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                    Dim tb As New String("Select Count(*) From DiasFestivos Where Fecha=@FFestivos")
                    Dim cmdp As New SqlCommand(tb, cnx)
                    cmdp.Parameters.AddWithValue("@FFestivos", vdFecha)
                    cnx.Open()
                    Dim liResultado As Integer = CInt(cmdp.ExecuteScalar())
                    Return CBool(IIf(liResultado = 0, False, True))
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bEsFestivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Function

    o quizas he colocado mal el codigo espero me ayudes para probar.

    Gracias


    sábado, 24 de marzo de 2018 21:51
  • Bueno le añadi Return True probe y funciono.

    J. Carlos Herrero Me ayudarias a calcular los dias pensé que había salido pero no funciona bien.

    Como calcular dias transcurridos entre 2 fechas parece que me suma los diasfestivos porque tengo 3 dias festivos 28/03,29/03,01/04 cuando debe salir 15 sale 18

    Gracias




    sábado, 24 de marzo de 2018 22:01
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo
    Imports System.Data.SqlClient
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim liDias As Integer = CInt(DateDiff("d", Me.DateTimePicker1.Value, Me.DateTimePicker2.Value))
            Dim ldtFecha As Date
            Dim liNumDias As Integer = 0
            '
            For liCiclo As Integer = 0 To liDias
                ldtFecha = DateAdd(DateInterval.Day, liCiclo, Me.DateTimePicker1.Value)
                If ldtFecha.DayOfWeek = DayOfWeek.Saturday Or ldtFecha.DayOfWeek = DayOfWeek.Sunday Then
                    Continue For
                End If
                If lF_bEsFestivo(ldtFecha) = True Then
                    Continue For
                End If
                liNumDias += 1
            Next
            MessageBox.Show("Nº de Dias Laborables: " & liNumDias.ToString)
        End Sub

        Private Function lF_bEsFestivo(ByVal vdFecha As Date) As Boolean
            Dim lsQuery As String = "Select Count(*) From fiesta Where f_fiesta=@FFestivo"
            Try
                Using loConexion As New SqlConnection("TU_CADENA_DE_CONEXION")
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@FFestivo", vdFecha.Date))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        Return CBool(IIf(liResultado = 0, False, True))
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bEsFestivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return False
        End Function
    End Class

    P.D.
    Usa una tabla llamada fiesta que contiene un campo llamado f_fiesta

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Javier Roque domingo, 25 de marzo de 2018 22:37
    domingo, 25 de marzo de 2018 11:03
  • Respondeme en el otro hilo para no mezclar las preguntas por favor

    Como calcular dias transcurridos entre dos fechas en textbox sin sabados y domingos ni feriados

    Gracias
    domingo, 25 de marzo de 2018 17:13