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

  • Pregunta

  • Cuando le doy click a un boton este muestra la fecha actual en un textbox1

    Pero segun un laboratorio me da 3 dias, entonces debo calcular la fecha maxima en un textbox2.

    En otro textbox3 tengo que calcular cuantos dias van desde la fecha textbox1 hasta la actual del sistema.

    Como hacer eso entiendo que usan datediff adddate pero no sale.

    Me podrian ayudar por favor

    Gracias





    miércoles, 14 de marzo de 2018 20:42

Respuestas


  • 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

    ***************************************************************************

    J. Carlos Herrero:

    A esto le modifique el resultado y sale bien

    a este resultado tengo que ponerle 

    MessageBox.Show("Nº de Dias Laborables: " & liNumDias.ToString)-1

    Puedo hacer eso es correcto? bueno en mi caso lo muestro en txt no mje 

    txtDiast.Text = liNumDias.ToString - 1

    Pero si el resultado debe salir negativo alli me da problemas cuando hay excendentes

    DateTimePicker1= 19/02/2018

    DateTimePicker2= 15/02/2018

    Resultado debe ser -4 pero me sale -1

    LO que da que este caso es al reves

     Dim liDias As Integer = CInt(DateDiff("d", Me.DateTimePicker2.Value, Me.DateTimePicker1.Value))

    Estaba haciendo ponerle if pero cuando llegue al ejemplo salio error

    Saludos y Gracias quien responda


    • Editado Javier Roque domingo, 25 de marzo de 2018 17:21
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 19:52
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:09
    • Marcado como respuesta Javier Roque domingo, 25 de marzo de 2018 22:37
    domingo, 25 de marzo de 2018 17:11

Todas las respuestas

  • Hola:
    En un Form con 3 datetimepicker, copia y pega el siguiente código

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.dtpF1.Value = DateSerial(2016, 3, 3)
            Me.dtpF2.Value = DateAdd(DateInterval.Day, 3, Me.dtpF1.Value)
            Me.dtpF3.Value = Date.Today
            Dim liDifDias As Integer = CInt(DateDiff(DateInterval.Day, Me.dtpF1.Value, Me.dtpF3.Value))
            Me.Label1.Text = "Diferencia de dias: " & liDifDias.ToString
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Propuesto como respuesta Pablo Rubio domingo, 25 de marzo de 2018 15:46
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 15:46
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 17:08
    • Votado como útil Javier Roque domingo, 25 de marzo de 2018 17:08
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 19:52
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:08
    miércoles, 14 de marzo de 2018 22:06
  • Las fecha son como numerous enteros para un sistema asi que convierte el dato del textox a date y resta las fechas

    Dim fecha_1 As Date = String.Format("{0:MM\/dd\/yyyy}", txtfecha1.Text)
    
    Dim fecha_2 As Date = String.Format("{0:MM\/dd\/yyyy}", txtfecha2.Text)
    

    dim Fecha_3 as date = Fecha_1 - Fecha_2

    txtFecha3.text =  String.Format("{0:MM\/dd\/yyyy}", Fecha_3)

    
    

    miércoles, 14 de marzo de 2018 22:10
  • Necesariamente debe ser dtp? porque mmm estaba colocando en textobox no visibles solo que tome los valores al presionar guardar y con esos textbox msotrados se pueda tener el calculo y verse en el dgv luego

    pero la diea es ver el tiemp oque transcurre en el dgv creo que eso va tener k ser un timer no?

    miércoles, 14 de marzo de 2018 22:48
  • Esperen no entendi porque diferencia? 

    Si fecha de ingreso ? 12/03/2018  y tengo 3 dias segun laboratorio entonces la fecha max estimado de entrega es 15/03/2018

    cuantos dias van transcurriendo? desde el 12/03/2018 a la fecha actual del sistema van 2 si llega a 3 tengo un estado si se pasa 3 otro estado y si esta en el tiempo tengo otro estado y colores 

    eso intento hacer lo que me hablan es de 3 fechas mmm

    y diferencia entre ellos 

    12/03/2018                               15/03/2018   la diferencia es 3 pero bueno no quiero la diferencia sino el tiempo que va trasncurriendo del 12/03/2018 con la hora del sistema.

    Estoy usando textbox uno llamado txtfechaingresolab, txtfechamax cbodias y txtdias trasncurridos

    Saludos


    • Editado Javier Roque miércoles, 14 de marzo de 2018 22:57
    miércoles, 14 de marzo de 2018 22:56
  • Javier no tienes por que tener 3 textbox, si tienes la fecha de ingreso y la fecha del dia muy bien puedes hacer eso que buscas, recuerda que te dije que las fechas son como numerous enteros que puedes sumar y restar

    miércoles, 14 de marzo de 2018 23:59
  • Ok; pero necesito dias transcurridos no dif de dias (fechas) porque si suponemos tengo 01/03/2018 y la fecha max es 10/03/2018 la diferencia es 9 lo cual no necesito pero los dias trasncurridos del 01 al actual hoy 14 van 13 trasncurridos eso es lo que necesito. 
    Otro dato tengo la fecha inicial necesito calcular la fecha final segun los dias que cada laboratorio maneja suponiendo uno es 3. Addday(3) ? Ejemplos pls
    jueves, 15 de marzo de 2018 0:18
  • Efrain tengo este error_:

    La conversión de la cadena "(0:dd/mm/yyyy)" en el tipo 'Date' no es válida.si pongo llaves sale igual no uso c# es vbasic 2012

    jueves, 15 de marzo de 2018 1:52
  • No tengo ninguno solo en realidad son fechas que yo debo obtenery a partir de eso recien calcular para registrar
    jueves, 15 de marzo de 2018 3:45
  • Yo me hice esta función y me funciona bien.

       Public Function calcularFechaEntrega(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(txtTiempoTransito.Text, iTiempoTransito)
          Else
             iTiempoTransito = iTiempo
          End If
          If iTiempoTransito > 0 Then
             If fecha = Nothing Then
                dtpFechaEntrega.Value = dtpFechaSalida.Value
             Else
                dtpFechaEntrega.Value = fecha
             End If
    
             For i = 1 To iTiempoTransito
                dtpFechaEntrega.Value = dtpFechaEntrega.Value.AddDays(1)
                Dim bSiguienteDia As Boolean = False
                diaSemana = (dtpFechaEntrega.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 chkDiasFestivosFEntrega.Checked = True Then
                         'En esta parte controlamos los dias festivos que tenemos en la Tabla.
                         Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(dtpFechaEntrega.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 dtpFechaEntrega.Value
       End Function
    
    un saludo

    • Marcado como respuesta Javier Roque jueves, 15 de marzo de 2018 14:36
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 3:09
    jueves, 15 de marzo de 2018 13:24
  • OK y que es  txtTiempoTransito y dtpFechaSalida pues en mi caso uso Fecha de Ingreso y Fecha Maxima cboDias que es los dias segun laboratorio el plazo maximo para calcular la fechamax. el txtTiempoTransito  ingresas algun valor? 

    Con esa funcion calcular la fecha maxima? sin contar sabado ni domingo?

    If chkDiasFestivosFEntrega.Checked = True Then
                                'En esta parte controlamos los dias festivos que tenemos en la Tabla.
                                Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(dtpFechaEntrega.Value)
                                If oDiaFestivo Is Nothing Then
                                    bSiguienteDia = False
                                    Exit For
                                Else
                                    bSiguienteDia = True
                                End If
                            End If

    No tengo ninguna tabla con los dias festivos tiempotransito supongo en mi caso viene hacer mi cbodias?

    Y fecha de salida para mi sera fecha que ingreso? supongo aqui son muestras de laboratorio que ingresan segun el laboratorio cada quien maneja sus dias entonces calculo sus dias el problema es los dias sabado y domingos no deben tomarse quitando esos dias festivos como tu lo haces porque no es algo que necesite  estaria bien.

    Muestrame tu tabla dias festivos pues creo que me sera util tenerlo para luego ver aunque supongo tu tabla es como un calendario donde escoges los dias festivos pero y para el proximo año tambien aplica? solo aplicaria no tomar navidad año nuevo los demas algunos si trabajan esos dias festivos otros no 

    Probare





    jueves, 15 de marzo de 2018 14:27
  • Bueno, el tema está en que la fecha "dtpFechaEntrega.Value" es la fecha de la cual partimos para 
    obtener la fecha resultante.

    de momento omite lo de la fecha de salida(eso es interno de mi formulario)

    En "iTiempoTransito" son los días que sumaremos a la fecha inicial.

    Ejemplo: dtpFechaEntrega.Value = '15/03/2018'
             iTiempoTransito = 3 días

    Entramos en el bucle para recorrer los 3 días.
    For i = 1 To iTiempoTransito
             i = 1 -> dtpFechaEntrega.Value = dtpFechaEntrega.Value.AddDays(1)  - > 16/03/2018
             i = 2 -> dtpFechaEntrega.Value = dtpFechaEntrega.Value.AddDays(1)  - > 17/03/2018      
             i = 3 -> dtpFechaEntrega.Value = dtpFechaEntrega.Value.AddDays(1)  - > 18/03/2018

    Pongo el test "bSiguienteDia" inicialmente a False.
    Obtengo el nombre del dia (dtpFechaEntrega.Value.ToString("dddd", New CultureInfo("es-ES"))).
    y compruebo: si es el dia es Domingo, pongo a True el test para pasar a la fecha siguiente.
                 si el dia es Sabado compruebo si hay que entregar la mercancia en Sabado.
                 si es otro dia: compruebo (en mi caso) si la fecha cae en un dia festivo.
        Si el test bSiguienteDia = True, es porque hay que buscar un dia mas, por lo tanto
        se le resta 1 al bucle para que se posicione en el mismo intervalo

        i =1 -> ( i -= 1 = 0)

        i =2 -> ( i -= 1 = 1)

        i = 3 -> ( i -= 1 = 2), etc...

    y compruebe una 
        nueva fecha.

    al final la función devuelve la fecha + los dias que hayan pasado los filtros. 
       18/03/2018 (si no hay ninguna fiesta, Domingo o Sabado)

    la Tabla de dias festivos se compone:
    idDia - autonumerico
    Fecha - Date
    Observaciones - nvarchar(50) 

    para cada año reviso los días festivos que tiene y actualizo la tabla.



    • Editado rbs61 jueves, 15 de marzo de 2018 18:44
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 15:47
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 17:08
    jueves, 15 de marzo de 2018 18:36
  • Bueno ya he solucionado todo eso he tomado valores que tengo en mi form pero respecto al calculo de los dias festivos no sean considerados eso no entendi la tabla yo no tengo una tabla dias festivos me puedes dar algun ejemplo para crearlo segun mi pais.
    jueves, 15 de marzo de 2018 20:54
  • por ejemplo en mi tabla de días festivos tengo los siguientes días:

    id_____Fecha__________Observaciones.

    1         01/01/2018            Inicio del año.

    2         19/03/2018            Festividad de San Jose.

    3         30/03/2018            Viernes Santo.

    Si en el calculo de la fecha cae en un día festivo pongo a True el test para pasar a la fecha siguiente.

     

    • Editado rbs61 jueves, 15 de marzo de 2018 22:52
    jueves, 15 de marzo de 2018 22:51
  • Por favor podria proporcionarme el codigo  sobre clDiaFestivo es una clase? para poder adaptarlo se lo agradeceria mucho.

    Saludos y Gracias

    martes, 20 de marzo de 2018 3:36
  • Esta es la clase de los días festivos.: (Decir que me ayudo mucho un generador de clases realizado por ' ©Guillermo 'guille')

    Option Strict On
    Option Explicit On
    '
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    '
    Public Class clDiaFestivo
       Private _idDiaFestivo As System.Int32
       Private _Fecha As System.DateTime
       Private _Descripcion As System.String
       '
       ' Este método se usará para ajustar los anchos de las propiedades
       Private Function ajustarAncho(cadena As String, ancho As Integer) As String
          Dim sb As New System.Text.StringBuilder(New String(" "c, ancho))
          ' devolver la cadena quitando los espacios en blanco
          ' esto asegura que no se devolverá un tamaño mayor ni espacios "extras"
          Return (cadena & sb.ToString()).Substring(0, ancho).Trim()
       End Function
       '
       ' Las propiedades públicas
       ' TODO: Revisar los tipos de las propiedades
       Public Property idDiaFestivo() As System.Int32
          Get
             Return _idDiaFestivo
          End Get
          Set(value As System.Int32)
             _idDiaFestivo = value
          End Set
       End Property
       Public Property Fecha() As System.DateTime
          Get
             Return _Fecha
          End Get
          Set(value As System.DateTime)
             _Fecha = value
          End Set
       End Property
       Public Property Descripcion() As System.String
          Get
             Return ajustarAncho(_Descripcion, 100)
          End Get
          Set(value As System.String)
             _Descripcion = value
          End Set
       End Property
       '
       Default Public Property Item(index As Integer) As String
          ' Devuelve el contenido del campo indicado en index
          ' (el índice corresponde con la columna de la tabla)
          Get
             If index = 0 Then
                Return Me.idDiaFestivo.ToString()
             ElseIf index = 1 Then
                Return Me.Fecha.ToString()
             ElseIf index = 2 Then
                Return Me.Descripcion.ToString()
             End If
             ' Para que no de error el compilador de C#
             Return ""
          End Get
          Set(value As String)
             If index = 0 Then
                Try
                   Me.idDiaFestivo = System.Int32.Parse("0" & value)
                Catch
                   Me.idDiaFestivo = System.Int32.Parse("0")
                End Try
             ElseIf index = 1 Then
                Try
                   Me.Fecha = System.DateTime.Parse(value)
                Catch
                   Me.Fecha = System.DateTime.Now
                End Try
             ElseIf index = 2 Then
                Me.Descripcion = value
             End If
          End Set
       End Property
       Default Public Property Item(index As String) As String
          ' Devuelve el contenido del campo indicado en index
          ' (el índice corresponde al nombre de la columna)
          Get
             If index = "idDiaFestivo" Then
                Return Me.idDiaFestivo.ToString()
             ElseIf index = "Fecha" Then
                Return Me.Fecha.ToString()
             ElseIf index = "Descripcion" Then
                Return Me.Descripcion.ToString()
             End If
             ' Para que no de error el compilador de C#
             Return ""
          End Get
          Set(value As String)
             If index = "idDiaFestivo" Then
                Try
                   Me.idDiaFestivo = System.Int32.Parse("0" & value)
                Catch
                   Me.idDiaFestivo = System.Int32.Parse("0")
                End Try
             ElseIf index = "Fecha" Then
                Try
                   Me.Fecha = System.DateTime.Parse(value)
                Catch
                   Me.Fecha = System.DateTime.Now
                End Try
             ElseIf index = "Descripcion" Then
                Me.Descripcion = value
             End If
          End Set
       End Property
       '
       ' Campos y métodos compartidos (estáticos) para gestionar la base de datos
       '
       ' La cadena de conexión a la base de datos
       Private Shared cadenaConexion As String = cnn
       ' La cadena de selección
       Public Shared CadenaSelect As String = "SELECT * FROM tbDiasFestivos"
       '
       Public Sub New()
       End Sub
       Public Sub New(conex As String)
          cadenaConexion = conex
       End Sub
       '
       ' Métodos compartidos (estáticos) privados
       '
       ' asigna una fila de la tabla a un objeto clDiaFestivo
       Private Shared Function row2clDiaFestivo(r As DataRow) As clDiaFestivo
          ' asigna a un objeto clDiaFestivo los datos del dataRow indicado
          Dim oclDiaFestivo As New clDiaFestivo
          '
          oclDiaFestivo.idDiaFestivo = System.Int32.Parse("0" & r("idDiaFestivo").ToString())
          Try
             oclDiaFestivo.Fecha = DateTime.Parse(r("Fecha").ToString())
          Catch
             oclDiaFestivo.Fecha = DateTime.Now
          End Try
          oclDiaFestivo.Descripcion = r("Descripcion").ToString()
          '
          Return oclDiaFestivo
       End Function
       '
       ' asigna un objeto clDiaFestivo a la fila indicada
       Private Shared Sub clDiaFestivo2Row(oclDiaFestivo As clDiaFestivo, r As DataRow)
          r("Fecha") = oclDiaFestivo.Fecha
          r("Descripcion") = oclDiaFestivo.Descripcion
       End Sub
       '
       ' crea una nueva fila y la asigna a un objeto clDiaFestivo
       Private Shared Sub nuevoclDiaFestivo(dt As DataTable, oclDiaFestivo As clDiaFestivo)
          ' Crear un nuevo clDiaFestivo
          Dim dr As DataRow = dt.NewRow()
          Dim oc As clDiaFestivo = row2clDiaFestivo(dr)
          '
          oc.idDiaFestivo = oclDiaFestivo.idDiaFestivo
          oc.Fecha = oclDiaFestivo.Fecha
          oc.Descripcion = oclDiaFestivo.Descripcion
          '
          clDiaFestivo2Row(oc, dr)
          '
          dt.Rows.Add(dr)
       End Sub
       '
       ' Métodos públicos
       '
       ' devuelve una tabla con los datos indicados en la cadena de selección
       Public Shared Function Tabla() As DataTable
          Return Tabla(CadenaSelect)
       End Function
       Public Shared Function Tabla(sel As String) As DataTable
          ' devuelve una tabla con los datos de la tabla tbDiasFestivos
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("clDiaFestivo")
          '
          Try
             da = New SqlDataAdapter(sel, cadenaConexion)
             da.Fill(dt)
          Catch
             Return Nothing
          End Try
          '
          Return dt
       End Function
       '
       Public Shared Function Buscar(sWhere As String) As clDiaFestivo
          ' Busca en la tabla los datos indicados en el parámetro
          ' el parámetro contendrá lo que se usará después del WHERE
          Dim oclDiaFestivo As clDiaFestivo = Nothing
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("clDiaFestivo")
          Dim sel As String = "SELECT * FROM tbDiasFestivos WHERE " & sWhere
          '
          da = New SqlDataAdapter(sel, cadenaConexion)
          da.Fill(dt)
          '
          If dt.Rows.Count > 0 Then
             oclDiaFestivo = row2clDiaFestivo(dt.Rows(0))
          End If
          Return oclDiaFestivo
       End Function
       '
       Public Function Actualizar() As String
          Dim sel As String = "SELECT * FROM tbDiasFestivos WHERE idDiaFestivo = " & Me.idDiaFestivo.ToString()
          Return Actualizar(sel)
       End Function
    
       Public Function Actualizar(ByVal sel As String) As String
          ' En caso de error, devolverá la cadena empezando por ERROR.
          Dim cnn As SqlConnection
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("clDiaFestivo")
          '
          cnn = New SqlConnection(cadenaConexion)
          da = New SqlDataAdapter(sel, cnn)
          da.MissingSchemaAction = MissingSchemaAction.AddWithKey
          '
          Dim cb As New SqlCommandBuilder(da)
          da.UpdateCommand = cb.GetUpdateCommand()
          '
          Try
             da.Fill(dt)
          Catch ex As Exception
             Return "ERROR: " & ex.Message
          End Try
          '
          If dt.Rows.Count = 0 Then
             ' crear uno nuevo
             Return Crear()
          Else
             clDiaFestivo2Row(Me, dt.Rows(0))
          End If
          '
          Try
             da.Update(dt)
             dt.AcceptChanges()
             Return "Actualizado correctamente"
          Catch ex As Exception
             Return "ERROR: " & ex.Message
          End Try
       End Function
       '
       Public Function Crear() As String
          Dim cnn As SqlConnection
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("clDiaFestivo")
          '
          cnn = New SqlConnection(cadenaConexion)
          da = New SqlDataAdapter(CadenaSelect, cnn)
          da.MissingSchemaAction = MissingSchemaAction.AddWithKey
          '
          Dim cb As New SqlCommandBuilder(da)
          da.InsertCommand = cb.GetInsertCommand()
          '
          Try
             da.Fill(dt)
          Catch ex As Exception
             Return "ERROR: " & ex.Message
          End Try
          '
          nuevoclDiaFestivo(dt, Me)
          '
          Try
             da.Update(dt)
             dt.AcceptChanges()
             Return "Se ha creado un nuevo clDiaFestivo"
          Catch ex As Exception
             Return "ERROR: " & ex.Message
          End Try
       End Function
       '
       Public Function Borrar() As String
          Dim sel As String = "SELECT * FROM tbDiasFestivos WHERE idDiaFestivo = " & Me.idDiaFestivo.ToString()
          Return Borrar(sel)
       End Function
       Public Function Borrar(sel As String) As String
          ' Borrar el registro al que apunta esta clase
          Dim cnn As SqlConnection
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("clDiaFestivo")
          '
          cnn = New SqlConnection(cadenaConexion)
          da = New SqlDataAdapter(sel, cnn)
          da.MissingSchemaAction = MissingSchemaAction.AddWithKey
          '-------------------------------------------
          Dim cb As New SqlCommandBuilder(da)
          da.DeleteCommand = cb.GetDeleteCommand()
          '
          da.Fill(dt)
          '
          If dt.Rows.Count = 0 Then
             Return "ERROR: No hay datos"
          Else
             dt.Rows(0).Delete()
          End If
          '
          Try
             da.Update(dt)
             dt.AcceptChanges()
             Return "Borrado satisfactoriamente"
          Catch ex As Exception
             Return "ERROR: " & ex.Message
          End Try
       End Function
       '
       '
       '┌─────────────────────────────────────────────────────────────┐
       '└──│  F U N C I O N E S    P E R S O N A L I Z A D A S     │──┘
       '   └───────────────────────────────────────────────────────┘
       ''' <summary>
       ''' Devuelve el objeto con los datos del registro
       ''' </summary>
       ''' <param name="id">Identificador del cual se obtiene los datos</param>
       ''' <returns></returns>
       ''' <remarks></remarks>
       Public Shared Function GetClase(ByVal id As Integer) As clDiaFestivo
          GetClase = Nothing
          Try
             sWhere = String.Format("idDiaFestivo = {0}", id)
             GetClase = Buscar(sWhere)
          Catch ex As Exception
             GetClase = Nothing
          End Try
          Return GetClase
       End Function
    
       Public Shared Function GetDiaFestivo(ByVal fecha As Date) As clDiaFestivo
          GetDiaFestivo = Nothing
          Dim fila As DataRow = Nothing
          Dim sFecha As String = fecha.ToShortDateString
          Dim da As SqlDataAdapter
          Dim dt As New DataTable("tbDiasFestivos")
          Dim sel As String = String.Format("SELECT * FROM tbDiasFestivos WHERE Fecha = '{0}'", sFecha)
          Try
             da = New SqlDataAdapter(sel, cadenaConexion)
             da.Fill(dt)
             '
             If dt.Rows.Count > 0 Then
                fila = dt.Rows(0)
                GetDiaFestivo = GetClase(CInt(fila("idDiaFestivo")))
             End If
          Catch ex As Exception
             Exit Try
          End Try
          Return GetDiaFestivo
       End Function
    
    End Class
    

    espero te sirva.

    un saludo.

    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 20:17
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:55
    martes, 20 de marzo de 2018 9:36
  • Gracias Esta parte

    Public Shared Function GetClase(ByVal id As Integer) As clDiaFestivo
            GetClase = Nothing
            Try
                sWhere = String.Format("Id = {0}", id)
                GetClase = Buscar(sWhere)
            Catch ex As Exception
                GetClase = Nothing
            End Try
            Return GetClase
        End Function

    sWhere

    martes, 20 de marzo de 2018 13:00
  • Ah vale, esta variable la tengo en un modulo publico.

    puedes hacerla privada dentro de la misma función.

    • Editado rbs61 martes, 20 de marzo de 2018 13:02
    martes, 20 de marzo de 2018 13:02
  • Tabien uso un modulo variales y respecto a

       Private Shared cadenaConexion As String = cnn

    Suelo usar pero en este caso como lo adapto 

    Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())

    martes, 20 de marzo de 2018 13:14
  • cnn es otra de las variable publica del modulo.

    dentro de la configuración de la aplicación tengo descrita la cadena de conexión a la Base de Datos. (My.Settings) 

    Public cnn As String = My.Settings.cnnBBDD

    realmente se podría utilizar directamente. 

    Private Shared cadenaConexion As String = My.Settings.cnnBBDD

    Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings(cnxString))

    Using cnx As New SqlConnection(My.Setting.cnnBBDD)

      o en mi caso

    Using cnx As New SqlConnection(cnn)

    • Editado rbs61 martes, 20 de marzo de 2018 13:35
    martes, 20 de marzo de 2018 13:24
  • ah ok yo lo tengo en app.config
    martes, 20 de marzo de 2018 13:29
  • que curioso probando el 29 y 30 este mes es feriado si yo pruebo que que ingreso el 27 a 3 dias entonces porque me da valor 28?  si  deberia ser, 03/04/2018 
    martes, 20 de marzo de 2018 13:37
  • cnn es otra de las variable publica del modulo.

    dentro de la configuración de la aplicación tengo descrita la cadena de conexión a la Base de Datos. (My.Settings) 

    Public cnn As String = My.Settings.cnnBBDD

    realmente se podría utilizar directamente. 

    Private Shared cadenaConexion As String = My.Settings.cnnBBDD

    Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings(cnxString))

    Using cnx As New SqlConnection(My.Setting.cnnBBDD)

      o en mi caso

    Using cnx As New SqlConnection(cnn)

    No te entendi
    martes, 20 de marzo de 2018 13:47
  • simplemente que puedes utilizar cualquiera de las formas de conexión que te he indicado. Pero puedes utilizar la que mejor te convenga.

    Pon un punto de interrupción en la función y síguela paso a paso para ver en que momento no te calcula bien la fecha.

    • Editado rbs61 martes, 20 de marzo de 2018 13:53
    martes, 20 de marzo de 2018 13:52
  • Buneo he colocado los using en cada parte que hay algo de la cadena de conexion pero hay una parte como esta que no coge.

    Private Shared cadenaConexion As String = cnn
    Public Function Actualizar(ByVal sel As String) As String
            Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                ' En caso de error, devolverá la cadena empezando por ERROR.
                Dim cnn As SqlConnection
                Dim da As SqlDataAdapter
                Dim dt As New DataTable("clDiaFestivo")
                '
                cnn = New SqlConnection(cadenaConexion)
                da = New SqlDataAdapter(sel, cnx)
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey
                '
                Dim cb As New SqlCommandBuilder(da)
                da.UpdateCommand = cb.GetUpdateCommand()
                '
                Try
                    da.Fill(dt)
                Catch ex As Exception
                    Return "ERROR: " & ex.Message
                End Try
                '
                If dt.Rows.Count = 0 Then
                    ' crear uno nuevo
                    Return Crear()
                Else
                    clDiaFestivo2Row(Me, dt.Rows(0))
                End If
                '
                Try
                    da.Update(dt)
                    dt.AcceptChanges()
                    Return "Actualizado correctamente"
                Catch ex As Exception
                    Return "ERROR: " & ex.Message
                End Try
            End Using
        End Function
    Si quito el 
    Dim cnn As SqlConnection

    Me da error readonly de cadenaconexion

    martes, 20 de marzo de 2018 14:02
  • Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())

    tiene que ser sin las comillas, puesto que cnxString es una variable.

    Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings(cnxString)

    martes, 20 de marzo de 2018 14:11
  •  Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                If contador_para_guardar = 1 Then
                    Try
                        cnx.Open()
                        Dim textosqIngresar As New String(CType("Insert into MuestraPreserv (Codigo,Abreviatura,Detalle)values(@b,@c,@d)", Char()))
                        Dim cmda As New SqlCommand(textosqIngresar, cnx)
    ....

    como siempre lo he usado asi.,

    el app.config 

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <connectionStrings>
        <add name="cnxString" connectionString="Data Source=XXXXX;Initial Catalog=BD;Integrated Security=True"
        providerName="System.Data.SqlClient" />
      </connectionStrings>
    </configuration>

    martes, 20 de marzo de 2018 14:14
  • Como suelo utilizar varias cadenas de conexión, estas las tengo definidas en las propiedades del proyecto -> configuración:

    Nombre: cnnBBDD 

    Tipo: Cadena de conexion

    Ámbito : Aplicación

    Valor: (cadena de conexión a la Base de datos)

    y para utilizarla:

    Using cnx As New SqlConnection(My.Setting.cnnBBDD)


    martes, 20 de marzo de 2018 16:43
  • Respecto a eso si lo instalo en otro equipo de otra ciudad entonces tendre que entrar primero alli modiciar segun su equipo? Xk en el app.config uso el exe.config del instalador y sin entrar al visual solo modifico el nombre del equipo y ya.

    En ese caso funciona igual o debo entrar al prpgrama modficar y volver a generar el setup?

    martes, 20 de marzo de 2018 19:17
  • en el app.config tiene la cadena:

    <connectionStrings>
            <add name="WindowsApplication1.My.MySettings.cnnBBDD" connectionString="Data Source = xxxxx;Initial Catalog=xxxxx;User ID=xxxxxx;Password=xxxxxx"
                providerName="System.Data.SqlClient" />
        </connectionStrings>

    la cual también la puedes modificar manualmente.

    esta entrada se crea automaticamente al crear la variable en las propiedades de la aplicación.


    • Editado rbs61 martes, 20 de marzo de 2018 22:00
    martes, 20 de marzo de 2018 21:47
  • Me refiero que eso no entro al programa visual studio porque en donde instalo no existe entonces solo ingreso a la carpeta de instalacion busco el archivo exe.config click derecho editar y cambio segun el nombre del equipo a eso me refiero es rapido entonces sobre lo que tu me indicas arriba es asi o en tu caso tengo que entrar a las propiedades del proyecto para cambiar luego volver a generar el setup? 

    Porque en mi caso no solo edito en notepad y listo corre.

    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 20:17
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:55
    martes, 20 de marzo de 2018 22:23
  • 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

    miércoles, 21 de marzo de 2018 6:49
  • JavierRC, puedes hacerlo como lo haces hasta ahora, editando el exe.config y cambiando el nombre del equipo.

    También puedes obtener el nombre del equipo desde el programa y componer la cadena de conexión

    Dim conexion as string = Environment.MachineName & "\sqlexpress"

    (esto ultimo no lo he probado, porque no he tenido necesidad de ello).

    miércoles, 21 de marzo de 2018 7:26
  • Pero en el caso de diasfestivos yo me refiero a las declaraciones. Esa parte tengo problemas donde declaras una conexion eso me confunde para adaptarlo a lo que uso.
    jueves, 22 de marzo de 2018 5:32
  • Si en la clase tienes problemas con la cadena de conexión (cnn) puedes sustituirla por:

    Private Shared cadenaConexion As String = My.Setting.cnnBBD

    y donde pone "Funciones personalizadas" es donde añado las funciones exclusivas para la clase.


    • Editado rbs61 jueves, 22 de marzo de 2018 11:05
    jueves, 22 de marzo de 2018 8:37
  • Ok Comprendo.

    Pero esto me lleva a decirte si yo cambio el config.exe ese tambien se cambia o me dara problemas? donde capaz dira no encuentra la base de datos.

    y Antes de Crear mi instalador hacer las modificaciones respecto a equipo al cual voy instalar.?

    Puedo entender hacer lo que me dices pero me preocupa el tema de que cuando lo lleve a otro equipo este no corra porque tengo fijo un valor en las propiedades que no puedo modificar desde un block de notas sin requerir el programa visual studio y cambiar eso. En el otro equipo es solo un equipo basico office  y mas na instalo modifico el config.exe mas nada la linea

    <add name="cnxString" connectionString="Data Source=user01-PC;Initial Catalog=BD1;Integrated Security=True"

    por ejmplo en ese caso donde dice user01-PC solo eso toco si el equipo donde instalo se llama laboratorio-pc eso pongo o si es una ip solo esa parte en negrita es lo unico que toco de esa linea.

    Mi preocupacion es que si hago lo que me indicas en lineas arriba propiedades al yo empaquetar hacer el setup con install shield esa propiedad ya es fija interno al llevarlo a otro equipo como lo modifico respecto a la conexion de ellos.

    jueves, 22 de marzo de 2018 13:22
  • Por lo que me dices, yo probaría a crear la cadena de conexión dentro del programa de la siguiente forma:

    Dim conexion as string = Environment.MachineName & "\sqlexpress"

    de esta forma la conexión siempre será el nombre del equipo + instancia del servidor

    ejemplo:

    si el equipo es rafa, la conexión será "rafa\sqlexpress"

    si el equipo es javier, la conexión será "javier\slqexpress"

    si la base de datos esta instalada en un servidor:

    será: "servidor\sqlexpress"

    de esta forma, no importa donde instales el programa (ya te digo, que esto no lo he probado).

    Lo de modificar el exe.config, para otros equipos, no puedo indicarte ya que no he tenido esta necesidad.

    Seria probar y ver los resultados que da.




    • Editado rbs61 jueves, 22 de marzo de 2018 13:55
    jueves, 22 de marzo de 2018 13:46
  • Chevere suena bien eso.

    Ya lo pruebo por cierto el tema arriba dice calcular dias transcurridos bien se calcula la fecha sin sabdos ni domingos pero sel contador de dias si me incluye los dias sabado y domingos y feriados la funcion calcular fecha entrega en tu caso bien. Pero calcular cuantos dias pasaron que lo hago aca:

    Private Sub CalcularDias()
            'Calcular Dias Transcurridos
            Dim liDifDias As Integer = CInt(DateDiff(DateInterval.Day, Me.dtpFechaIngreso.Value, Me.dtpFechaIEClie.Value))
            Me.txtDiast.Text = liDifDias.ToString
        End Sub

    Eso cuenta con todo como omito tampoco cuente sábado ni domingos ni feriados correspondientes en caso de haberlo. De que forma lo manejas tu para adaptar mi código a ello. o que añado al que ya tengo.

    Disculpa la molestia ayer presente mi avance y eso fue una de las observaciones.


    jueves, 22 de marzo de 2018 14:18
  • En el caso de la diferencia entre fecha sin contar sábados, domingos, y días festivos, lo que yo haría seria un bucle desde la fecha mayor hasta la fecha menor e ir contando las fechas que sean laborables.

    Utilizaría un bucle Do...Loop

    Do While until <condicion>
      ....
      ...
    Loop
    
     o 
    
    Do
       ...
       ...
    Loop While until <condicion>
    en la primera opción antes de entrar en el bucle valora la condición, en la segunda opción entra en el bucle y al final valora la condición.

    Por lo tanto...

    dim dFecha as date = "10/03/2018"
    Dim dias as integer = 0
    ' dtpFechaEntrega.Value seria la fecha mayor
    Do
       diaSemana = (dtpFechaEntrega.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 chkDiasFestivosFEntrega.Checked = True Then
                       'En esta parte controlamos los dias festivos que tenemos en la Tabla.
                        Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(dtpFechaEntrega.Value)
                        If oDiaFestivo Is Nothing Then
                           bSiguienteDia = False
                        Else
                           bSiguienteDia = True
                        End If
                    End If
                End Select
       End Select
       If bSiguienteDia = False
          dias +=1
       End If
       dtpFechaEntrega.Value = dtpFechaEntrega.Value.AddDays(-1)
       
    Loop While until dtpFechaEntrega.Value >= dFecha

    Este código no lo he probado, pero mas o menos seria la idea.

    espero que te sirva.




    • Editado rbs61 jueves, 22 de marzo de 2018 16:53
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 20:17
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:55
    jueves, 22 de marzo de 2018 15:25
  • Ok. yo estaba haciendo algo asi pero no me arroja nada en el textbox y bueno creo k no esta considerando los sabados y domingos

    Sub DiasHab()
    
            Dim Cant As Integer = 0
            Dim Ini As DateTime = dtpFechaIngreso.Value
            Dim Fin As Date = dtpFechaIEClie.Value
            Dim listaDiasFestivos As List(Of DateTime) = ListDiasFectivos()
    
            While Ini <> Fin
                If Not listaDiasFestivos.Contains(Ini) Then
                    Cant = Cant + 1
                End If
                Ini = Ini.AddDays(1)
            End While
         
    
            TextBox1.Text = Cant.ToString
    
        End Sub

    Public Function ListDiasFectivos() As List(Of DateTime)
            Dim listaDiasFestivos As New List(Of DateTime)()
    
            Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
    
                Dim sql As String = "SELECT Fecha FROM DiasFestivos"
                Dim cmd As New SqlCommand(sql, cnx)
    
                Dim reader As SqlDataReader = cmd.ExecuteReader()
    
                While reader.Read()
                    listaDiasFestivos.Add(Convert.ToDateTime(reader("Fecha")))
    
                End While
            End Using
    
            Return listaDiasFestivos
        End Function

    jueves, 22 de marzo de 2018 16:16
  • Si no me equivoco y por lo que veo en la función "ListDiasFectivos() As List(Of DateTime)" estas poniendo en una lista los días que son festivos y cuando vuelves de la función buscas la fecha dentro de la lista y si no esta entonces incrementas la variable "Cant". Pero.. ¿Donde compruebas si es sábado o domingo?.

    Luego en el While "Ini <> Fin", ¿Que pasa cuando Ini sea igual a Fin, no comprueba esa fecha?

    No se..., creo que la función que te he indicado en el mensaje anterior es mas claro (por lo menos para mi. A medida que va leyendo la fecha hacia atrás realiza las comprobaciones necesarias).



    • Editado rbs61 jueves, 22 de marzo de 2018 16:51
    jueves, 22 de marzo de 2018 16:47
  • Crees poder poner esa parte completa ya que me sobra select case y respecto al until sale no declarado.

    Estado probando los dias festivos mas curisoso es esto. si digo que la fecha es hoy y marco el check dias festivos la fecha estimada sale 23/03/2018 cuando deberia salir 16/04

    Porque 29 y 30 es feriado. y segun a 15 dias pero si desmarco sale 12/04 pero aqui no toma los dias feriados.

    Que extraño.

    jueves, 22 de marzo de 2018 21:57
  • Hola Javier, te pongo la función completa y funcionando.

          Dim fechaIni As Date = CDate("14/03/2018")
          Dim fechaFin As Date = CDate("20/03/2018")
          Dim dias As Integer = fDiffFechasLaborables(fechaIni, fechaFin)
    
       Public Function fDiffFechasLaborables(ByVal fechaInicio As Date, ByVal fechaFinal As Date) As Integer
          Dim dias As Integer = 0
          Dim fecha As Date = fechaInicio
          Dim diaSemana As String
          Dim bDiaLaboral As Boolean = True
          Do
             diaSemana = (fecha.ToString("dddd", New CultureInfo("es-ES")))
             Select Case diaSemana
                Case "domingo" : bDiaLaboral = False
                Case "sábado" : bDiaLaboral = False
                Case Else
                   Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(fecha)
                   If oDiaFestivo IsNot Nothing Then
                      bDiaLaboral = False
                   Else
                      bDiaLaboral = True
                   End If
             End Select
             If bDiaLaboral = True Then
                dias += 1
             End If
             fecha = fecha.AddDays(1)
          Loop While fecha <= fechaFinal
          Return dias
       End Function

    como vera he realizado la función para que vaya leyendo las fecha de inicio a final (y no de final a inicio), el resultado del ejemplo que te pongo es de 4 días laborables puesto que no contempla ni los sábado, ni domingos ni tampoco el día 19 que para mi es un día festivo.

    un saludo

    viernes, 23 de marzo de 2018 7:26
  • Perdón con tanta cosas esta funcion me calcular la fecha  Y/o los dias transcurridos
    viernes, 23 de marzo de 2018 12:29
  • Esta función solo calcula los días laborables transcurridos entre dos fecha.

    viernes, 23 de marzo de 2018 13:00
  • OK justo estaba viendo que si da eso que mencionas pero aun veo que me cuenta sabados y domingos

    Es necesario poner  ya que fechaini viene hacer un dtp1 y fechafin es otro dtp 

    y creo que no me esta tomando los valores claro k yo no e puesto las fechas se que es ejemplo y no me esta tomando valores quien es fecha ini y quien fin creo eeso pasa

    Dim fechaIni As Date = CDate("14/03/2018")
    Dim fechaFin As Date = CDate("20/03/2018")

    He colocado tambien fechas para comprobar lo que me menciona pero esto es asi:

    en un combo tengo dias supongamos

    CboDias=3

    FechaIngreso= 23/03/2018                            FechaEstimado= 28/03/2018 (Calculada sin sab ni dom))

    FechaEntregaCliente= 27/03/2018 esta la digito

    Por tanto los dias trancurridos me sale 4 pero esta tomando sabado y domingo cuando debe salir 3 aun no se si cumple festivos

    Si yo digo fechaIni = dtpFechaIngreso.Text me sale referencia no establecida como instancia de un objeto aun si pongo value o text en que estoy mal?

    Pues creo que en ese caso no deberia tomar fechaini sino al dtpFechaIngreso directamente no?

    viernes, 23 de marzo de 2018 13:12
  • Si FechaIngreso esta declarada como Date entonces FechaIngreso = dtp1.value

    Si FechaEntregaCliente esta declarada como Date entonces FechaEntregaCliente = CDate(txtFecha.text)

    Llamada a la función: Dim dias As Integer = fDiffFechasLaborables(FechaIngreso, FechaEntregaCliente)

    comprueba si en la fecha final has puesto "FechaEstimado"
    • Editado rbs61 viernes, 23 de marzo de 2018 13:47
    viernes, 23 de marzo de 2018 13:46
  • Dim fechaIni As Date = dtpFechaIngreso.Value
    Dim fechaFin As Date = CDate(txtFechaIEClie.Text)
    Dim dias As Integer = fDiffFechasLaborables(fechaIni, fechaFin)

    Error al cargar form:

    Dim fechaIni As Date = dtpFechaIngreso.Value

    Referencia a objeto no establecida como instancia de un objeto.


    viernes, 23 de marzo de 2018 13:54
  • Vale, prueba a poner CDate(dtpFechaIngreso.value)
    viernes, 23 de marzo de 2018 14:00
  • Sucede lo mismo los dtp son un gran problema
    viernes, 23 de marzo de 2018 14:07
  • prueba con esto:

    Dim fechaIni As Date = CDate(dtp.Value.Day & "/" & dtp.Value.Month & "/" & dtp.Value.Year)

    Ahh.... comprueba que la propiedad "Format" del dtp sea igual a "Short"
    • Editado rbs61 viernes, 23 de marzo de 2018 14:16
    viernes, 23 de marzo de 2018 14:14
  • nada igual yo que que mejor lo convierto en textbox y me evito problemas. Aunque modificando todo eso sale el mismo error caray!

    Ya lo regrese todo a dtp hasta ver como solucionar eso.

    Si con esto resulta solo me faltaria el calculo estimado de fecha incluyendo feriados que aun no me sale.



    viernes, 23 de marzo de 2018 14:18
  • Bueno son ambos valores lo que salta ese error pues borre uno y paso al otro
    viernes, 23 de marzo de 2018 14:47
  • Tu imagen entonces no concuerda bien porque del 23 al 27 hay 4 dias
    viernes, 23 de marzo de 2018 14:58
  • Si pero el día 19 lo tengo como festivo, por lo tanto son 3 días.
    viernes, 23 de marzo de 2018 15:24
  • Si FechaIngreso esta declarada como Date entonces FechaIngreso = dtp1.value

    Si FechaEntregaCliente esta declarada como Date entonces FechaEntregaCliente = CDate(txtFecha.text)

    Llamada a la función: Dim dias As Integer = fDiffFechasLaborables(FechaIngreso, FechaEntregaCliente)

    comprueba si en la fecha final has puesto "FechaEstimado"
    Me referia a este ejemplo
    viernes, 23 de marzo de 2018 16:04
  • Ah, perdon.

    el 23/03/2018 - Viernes (1 día)

    el 24/03/2018 - sábado 

    el 25/03/2018 - domingo

    el 26/03/2018 - lunes (2 días)

    el 27/03/2018 - martes (3 días)

    no sé, yo cuento 3 días...

    en la función los sábados no cuentan como laborables. Para saber si hay que contar como laborable o no, habría que añadirle a la función otro parámetro (bSabadoLaborable as boolean)

    Dim fechaIni As Date = CDate("14/03/2018") Dim fechaFin As Date = CDate("20/03/2018") Dim dias As Integer = fDiffFechasLaborables(fechaIni, fechaFin) Public Function fDiffFechasLaborables(ByVal fechaInicio As Date, ByVal fechaFinal As Date, ByVal sabadoLaborable as Boolean) As Integer Dim dias As Integer = 0 Dim fecha As Date = fechaInicio Dim diaSemana As String Dim bDiaLaboral As Boolean = True Do diaSemana = (fecha.ToString("dddd", New CultureInfo("es-ES"))) Select Case diaSemana Case "domingo" : bDiaLaboral = False Case "sábado" If sabadoLaborable = true bDiaLaboral = True Else bDiaLaboral = False End if

    'También podría ser de esta otra forma:

    bDiaLaboral = sabadoLaborable Case Else Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(fecha) If oDiaFestivo IsNot Nothing Then bDiaLaboral = False Else bDiaLaboral = True End If End Select If bDiaLaboral = True Then dias += 1 End If fecha = fecha.AddDays(1) Loop While fecha <= fechaFinal Return dias End Function




    • Marcado como respuesta Javier Roque viernes, 23 de marzo de 2018 20:29
    • Editado rbs61 sábado, 24 de marzo de 2018 12:31
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 3:08
    viernes, 23 de marzo de 2018 19:39
  • Bien el contador de dias sale ya lo comprobe incluyendo dias festivos si es que lo hay sin necesidad de check dias festivos comprobe 15 dias solo que la fecha aun no me sale pero he supuesto que es asi y si esta bien.

    Ahora solo me falta calcular la fecha estimada con los laborales aun no me sale, pero de preferencia seria sin usar ese check dias festivos pues que lo considere igual como el contador de dias aveces uno se olvida del check

    Con respecto a ese problema inicial del cdate() bueno no los considere e hice el calculo asi.

     Private Sub CalcularDias()
            Fechaclie = CDate(txtFechaIEClie.Text)
            Dim dias As Integer = fDiffFechasLaborables(Me.dtpFechaIngreso.Value, Fechaclie)
            txtDiast.Text = dias
    end sub
    Arriba si declare dim fechaclie as date nada mas.

    Ahora falta calcular la fecha estimada.
    viernes, 23 de marzo de 2018 20:19
  • para el calculo de una fecha estimada teniendo la fecha de inicio y los días, te puede servir la función primera ("CalcularFechaEntrega").

    aquí (txtDias.Text = dias) te faltaría poner "txtDias.Text = dias.ToString" o también "txtDias.Text = Cstr(dias)".

    Otra forma seria:

    txtDiast.Text = fDiffFechasLaborables(Me.dtpFechaIngreso.Value, Fechaclie).ToString


    • Editado rbs61 sábado, 24 de marzo de 2018 12:38
    sábado, 24 de marzo de 2018 12:36
  • Ok Gracias ya he abierto otra pregunta respecto a la fecha haber si se soluciona solo eso me falta luego ya testear y ver como va todo.

    Como Calcular Fecha Estimado de Entrega

    sábado, 24 de marzo de 2018 15:47
  • Perdona te moleste luego de lograr calcular la fecha probe nuevamente los dias y no sale me sale uno 2 dias de mas creo  o 1 dia de mas algo asi.

    Algo no esta tomando podrias echarle un ojo perdon que te moleste.

     Private Sub CalcularDias()
            Fechaclie = CDate(txtFechaIEClie.Text)
            Dim dias As Integer = fDiffFechasLaborables(Me.dtpFechaIngreso.Value, Fechaclie).ToString
            txtDiast.Text = dias.ToString
        End Sub
    Public Function fDiffFechasLaborables(ByVal fechaInicio As Date, ByVal fechaFinal As Date) As Integer
            Dim dias As Integer = 0
            Dim fecha As Date = fechaInicio
            Dim diaSemana As String
            Dim bDiaLaboral As Boolean = True
            Do
                diaSemana = (fecha.ToString("dddd", New CultureInfo("es-ES")))
                Select Case diaSemana
                    Case "domingo" : bDiaLaboral = False
                    Case "sábado" : bDiaLaboral = False
                    Case Else
                        Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(fecha)
                        If oDiaFestivo IsNot Nothing Then
                            bDiaLaboral = False
                        Else
                            bDiaLaboral = True
                        End If
                End Select
                If bDiaLaboral = True Then
                    dias += 1
                End If
                fecha = fecha.AddDays(1)
            Loop While fecha <= fechaFinal
            Return dias
        End Function

    Saludos

    del 23/03 con 15 dias al  17/04/2018 pues hay 15 y ami me arroja 18  osea 28,29,01 son feriados entonces esta sumandose eso 3 ,

    (29 y 30 feriados) y el 01/04 es feriado casualmente cae domingo probablemente esta tomando algo de ese feriado y agregando uno mas eso seria problema.

    Probando otro ejemplo muestro grafico esta agregando 2 de mas en ocasiones coincide pero mayormente no y cuando calculo los dias se queda pensando y cuelga el form unos 4 segundos aprox.


    sábado, 24 de marzo de 2018 22:43
  • Vuelvo a colocar este post porque pense haberlo logrado el objetivo pero testeando con distintos dias me di cuenta que no cuando es 3 dias 5 dias se suma 1 mas y cuando son cantidades mas largas 15 a mas se suma mas dias bueno segun la tabla y si casualmente tengo feriados tambien cae domingo al parecer da problemas y claro quizas no deberia tomarlo en la tabla no lo se..

    Tengo esto.

    Private Sub CalcularDias()
            Fechaclie = CDate(txtFechaIEClie.Text)
            Dim dias As Integer = fDiffFechasLaborables(Me.dtpFechaIngreso.Value, Fechaclie)
            txtDiast.Text = dias.ToString
        End Sub
    
        Public Function fDiffFechasLaborables(ByVal fechaInicio As Date, ByVal fechaFinal As Date) As Integer
            Dim dias As Integer = 0
            Dim fecha As Date = fechaInicio
            Dim diaSemana As String
            Dim bDiaLaboral As Boolean = True
            Do
                diaSemana = (fecha.ToString("dddd", New CultureInfo("es-ES")))
                Select Case diaSemana
                    Case "domingo" : bDiaLaboral = False
                    Case "sábado" : bDiaLaboral = False
                    Case Else
                        Dim oDiaFestivo As clDiaFestivo = clDiaFestivo.GetDiaFestivo(fecha)
                        If oDiaFestivo IsNot Nothing Then
                            bDiaLaboral = False
                        Else
                            bDiaLaboral = True
                        End If
                End Select
                If bDiaLaboral = True Then
                    dias += 1
                End If
                fecha = fecha.AddDays(1)
            Loop While fecha <= fechaFinal
            Return dias
        End Function

    Ejemplo: Si cbodias=15 

    FechaIngreso = 23/03/2017 y FechaEntregaCliente=16/04/2018 y la FechaEstimado=17/04/2018

    Entonces son txtdias=14 dias el codigo me da = 17 

    El calculo depende de FechaIngreso  y FechaEntregaCliente.

    Mi tabla es asi: Pasa por 3 feriados 29,30,01 casualmente este ultimo es domingo.

    Algo esta mal.

    Ademas del codigo que tengo cuando coloco la fechacliente se demora y medio cuelga el form hasta que sale el resultado en txtdias motivo no se lo tengo en lostfocus o debo usar textchange?

    Saludos


    domingo, 25 de marzo de 2018 3:20
  • La secuencia de este post me lo han contestado en este otro post en la ultima parte va casi 90% bien pero cuando las fechas son al reves eh ai el dilema. Es decir cuando FechaInicio > FechaFin

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



    domingo, 25 de marzo de 2018 14:20

  • 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

    ***************************************************************************

    J. Carlos Herrero:

    A esto le modifique el resultado y sale bien

    a este resultado tengo que ponerle 

    MessageBox.Show("Nº de Dias Laborables: " & liNumDias.ToString)-1

    Puedo hacer eso es correcto? bueno en mi caso lo muestro en txt no mje 

    txtDiast.Text = liNumDias.ToString - 1

    Pero si el resultado debe salir negativo alli me da problemas cuando hay excendentes

    DateTimePicker1= 19/02/2018

    DateTimePicker2= 15/02/2018

    Resultado debe ser -4 pero me sale -1

    LO que da que este caso es al reves

     Dim liDias As Integer = CInt(DateDiff("d", Me.DateTimePicker2.Value, Me.DateTimePicker1.Value))

    Estaba haciendo ponerle if pero cuando llegue al ejemplo salio error

    Saludos y Gracias quien responda


    • Editado Javier Roque domingo, 25 de marzo de 2018 17:21
    • Marcado como respuesta Pablo Rubio domingo, 25 de marzo de 2018 19:52
    • Desmarcado como respuesta Javier Roque domingo, 25 de marzo de 2018 20:09
    • Marcado como respuesta Javier Roque domingo, 25 de marzo de 2018 22:37
    domingo, 25 de marzo de 2018 17:11
  • Hola:

    Antes de hacer los calculos tienes que validar que la segunda fecha sea mayor o igual que la primera fecha .

    En vez de
    DateTimePicker1= 19/02/2018
    DateTimePicker2= 15/02/2018

    ¿porque no pones?
    DateTimePicker1= 15/02/2018
    DateTimePicker2= 19/02/2018

    Un saludo desde Bilbo
    Carlos
    domingo, 25 de marzo de 2018 18:54
  • porque no se da el caso si el laboratorio no entrego a tiempo los analisis entonces llegaron tarde pero la fecha max es 15/02 llegaron recien el 19/02 por lo tanto registro esa fecha y obtengo los dias que demoraron -4 eso necesito se calcule el codigo que me has mostrado solo queda hasta -1

    es un formulario q se controla los dias si esta a tiempo si se paso el tiempo todo se registra
    domingo, 25 de marzo de 2018 20:01
  • Hola:

    "Digo yo" que la diferencia de dias entre 15/02/2018 y 19/02/2018 es igual a la diferencia de dias entre 19/02/2018 y 15/02/2018.
    En el primer caso es de 3 dias laborable, en el segundo caso es de -3 dias laborables.
    Se hace el calculo con la fecha inicial como la menor y la fecha final, la mayor.
    Si se da el caso que la fecha inicial es la mayor, al resultado se le multiplica por -1.

    P.D.
    Yo no "veo" como es que la fecha inicial es mayor que la fecha final, salvo en la peliculas que viajan al pasado

    Un saludo desde Bilbo
    Carlos

    lunes, 26 de marzo de 2018 20:56
  • Ok pero el codigo no calcula los negativos solo se queda -1.

    Si te dicen que lleves un control para ver los tiempos y que tienes que registrar todas las fechas si un colaborador se tardo y entrego el resultado cuando tu estimado maximo de entrega era el 15/02 pero se demoraron y recien llego el 19/02 esa fecha tienes que registrarlo por tanto tienes que calcular cuantos hay entre 19/02 y el 15/02 descontando sabd y domin =-2 ese es el motivo lo que quiere decir tardanza de 2 dias


    lunes, 26 de marzo de 2018 21:54