Con el siguiente ejemplo se obtiene la fecha en la que finaliza una plazo hábil determinado por la fecha de inicio y el número de días que deben transcurrir. Para calcular la mencionada fecha se tienen en cuenta tanto sábados como domingos, como los días festivos que se añadan a la tabla que contiene la base de datos.

El día que proporciona la función es el día siguiente a la finalización del plazo, no el último día del plazo.

Descargar. Access 2000

Como respuesta a una de las peticiones de Fatiga (realizada en los comentarios) añado una nueva versión del ejemplo anterior. En esta nueva versión se añaden las siguientes modificaciones:

  • En el caso de que el primer día del plazo sea inhábil muestra una etiqueta en el formulario que avisa de este hecho.
  • El primer día del cómputo es la fecha de inicio, y no el día siguiente. Así si la fecha de inicio es el día 17/11/2008 y el plazo de días es 5, el resultado es el 21/11/2008 y no el 22/11/2008 o siguiente hábil.

Descargar. Access 2000

Siguiendo con las peticiones de Fetiga dejo un nuevo ejemplo basado en los anteriores en los en un informe se muestra la fecha del primer día hábil.

Descargar. Access 2000

25 Responses to “Plazo de días hábiles”

  1. Fatiga Says:

    Buenísimo!!! Muchas gracias! Anduvo muy bien. Sos un genio.

    Gracias de nuevo.

  2. Fatiga Says:

    Ya en tren de abusar, junté en mi base este bunísimo ejemplo, con la posibilidad de abrir un calendario anual para quien quiera asegurarse de que la cuenta está bien hecha. Como calendario anual conseguí el más común de la red, hecho por un tal Olaz, al cual le hice algunas adaptaciones.
    Él pone una “cadena de datos”, cuya carga es día por día y bastante complicada, para marcar sobre el calendario los días inhábiles.
    Mi intención entonces es la de tratar de aunar criterios, y usar para los dos formularios una sola tabla en la que estén los inhábiles.
    En tu ejemplo vos ponés una tabla para eso. ¿Se podrá usar la misma tabla para que el calendario marque los inhábiles?
    Desde ya, muchas gracias.

  3. lumbanico Says:

    No sé como estará estructurada la tabla del ejemplo de Olaz, si me la ‘pasas’ le echo un vistazo para ver si se puede.

  4. Fatiga Says:

    Maestro: te hago otra consulta. ¿Cómo hago para elegir la ubicación en la pantalla en la que quiero que se abra el formulario?
    Probé algunas modificaciones en las propiedades de formulario pero no pude evitar que siempre se abriera en el centro.
    Gracias

  5. lumbanico Says:

    En el evento Form_Open prueba con el siguiente código:
    ‘Me.Move Left:=10, Top:=10′. También puedes modificar el tamano del formulario añadiendo los parámetros: ‘Width:=0, Height:=0′.

  6. Fatiga Says:

    Excelente una vez más. Muchas gracias.

  7. Fatiga Says:

    Maestro: después de mucho y excelente uso del programa para calcular los días hábiles, por lo cual te estoy enormemente agradecido, me apareció un problema que por más que le doy vueltas no lo puedo solucionar.

    El programa toma solo días hábiles para calcular y, al hacer el cálculo, comienza a contar desde el siguiente día hábil al que uno carga en TFInicio. Así, si TFInicio es inhábil, el programa tomará el valor de TFInicio como el del primer día hábil siguiente y comenzará a contar desde el segundo día hábil.

    Sin embargo, cuando el día cargado en TFInicio es inhábil, necesito que el programa me lo avise y que comience el cómputo en el primer día hábil siguiente y no en el segundo.

    Por si no fui claro, va el ejemplo. Agrego 5 días a TFInicio.

    TFInicio: 15/11/08 (sábado = inhábil), el programa cuenta como TFInicio = 17/11/08 (lunes) y suma 5 = 24/11/08.

    Debería ser:

    TFInicio: 15/11/08 (sábado = inhábil), TFInicio = 15/11/08 (sabado) y suma 5 (a contar desde el lunes 17/11) = 21/11/08.

    Y a eso agregarle un text box que con una leyenda avisara que TFInicio es inhábil.

    Desde ya muchas gracias.

  8. Fatiga Says:

    Buenísimo. Muchas gracias por la atención y la rapidez. Ahora tengo un problema y una pregunta.
    La pregunta. En el módulo basFecha dice: While a < p – 1
    Sin embargo, no encontré la definición de p. ¿a qué se refiere?

    El problema (que ahora voy a tratar de solucionar investigando los cambios que le hiciste) es que si TFInicio es hábil, lo toma como primer día de cómputo. Pero supongo que con un If y el código anterior, se tiene que solucionar.

    De nuevo, muchas gracias. Yo no soy ni un aficionado al access y sin embargo, gracias a gente como vos he podido hacer una base bastante completa que es de muchísima ayuda.

  9. lumbanico Says:

    P es el número de días del plazo, y es una variable que se le pasa a la función, junto con la fecha de inicio, desde el evento OnClick del botón del formulario.

  10. Fatiga Says:

    Gracias.

  11. Fatiga Says:

    Maestro: busqué la variable p, en el evento OnClick del botón del formulario, pero no la encontré.

    Por otra parte, traté de crear un if para que el programa tomara While A < p o While A < p – 1, según si la fecha de inicio es hábil o no, y no me lo acepta.

    Tengo algún otro camino alternativo?

    Muchas gracias.

  12. Fatiga Says:

    En tren de abusar (y después de haber hecho montones de pruebas sin éxito), estoy intentando darle una vuelta más de tuerca al formulario, para conseguir que por separado calcule la cantidad de días hábiles existentes entre dos fechas.
    Encontré ejemplos de esto en la red, pero usan distintas tablas y yo quiero mantener los días inhábiles en una sola (tblFes).
    En mis intentos llegué a lograr que descontara los inhábiles, pero no pude hacer que no contara los sábados y domingos.
    Creo que el formulario así completado, puede ser de utilidad a mucha más gente.
    Por cualquier ayuda, desde ya, muchas gracias.

  13. Daniel Says:

    Muy bueno tu ejemplo, ahora abusando de tu sabiduria te paso un problema.
    En una base de datos access 2003 en la que genero turnos de atención tanto de manera periódica como irregular necesito calcular la fecha final a partir de determinado día hábil en los siguientes casos:
    lunes miercoles y viernes
    martes y jueves osegún el caso alterando esos ordenes ya que algunas personas pueden atenderse los lunes y viernes y no los miercoless etc…..
    desde ya muchas gracias

  14. Daniel Says:

    aclaración de consulta , solo necesito que me lo muestre en el formulario para que me calcule una fecha final (por ejemplo atendiendo 10,5, o x sesiones los lunes miercoles y viernes, o jueves y sabado, o …)
    ya que los turnos los genero con una adaptación que hice la “agenda de recursos” y necesito establecer la fecha final salteando (o no) algunos dias ademas de los sabados domingos y feriados completando la cantidad de dias de sesiones determinadas.
    desde ya muchas gracias

  15. lumbanico Says:

    No acabo de entender bien qué es lo que pretendes. Me ayudaría mucho si me expusieses algún ejemplo con datos.
    Saludos.

  16. Daniel Says:

    Hola , desde ya muy agradecido por la pronta respuesta.
    Tengo hecha una base de datos en access 2003 para mi sra que es fisiatra, y debe atender a sus pacientes una cantidad “x” de sesiones para la rehabilitacion (normalmente son 10 o 5 sesiones y en algunos casos puede variar en mas o menos cantidad), en la mayoria de los casos los tratamientos tienen dias salteados de descanso ej: lun-mie-vie (donde los dias de descanso son los martes y jueves) -sabados y domingo no se hacen tratamientos-, o mar-jue (donde los dias de descanso son los lun mier vie).
    Ejemplo: un paciente con 10 sesiones de tratamiento comenzando lunes 6/4/09 (atendiendose de lun a vier termina el 21/4/09 -al saltear los festivos de jueves y viernes santo-, si se atiende lun-mier-vie termina el 29/4/09 – al saltear el viernes santo- ), si comienza el miercoles 8/4/09 ( l – v finaliza 22/4/09 -al saltear viernes santo-, l -m – v – finaliza 1/5/09 -salteando viernes santo-) ,o si comienza viernes 17/4/09 (l-v finaliza 1/5/09, l-m-v finaliza 8/5/09) y para martes y jueves ….
    En resumen solo necesito calcular (mediante formulario) la fecha final a partir de una fecha x dada la cantidad de sesiones y la modalidad de dias de atención
    Espero haber podido explicar semejante lio

  17. Daniel Says:

    perdon, en el caso que comience viernes 17/4/09 (l-v (de lunes a viernes sin saltear dias)finaliza el 30/4/09

  18. Daniel Says:

    Tengo Unformulario Llamado Generar cuyos datos provienen de: 2 tablas relacionadas programa con Tbl recurso y Tbl programa con Tbl detalles de programa
    SELECT [Detalles de programa].*, Programa.* FROM Programa INNER JOIN [Detalles de programa] ON Programa.IdPrograma=[Detalles de programa].IdPrograma;
    *******************
    Codigo del boton generar
    ****************
    Private Sub Aceptar_Click()
    On Error GoTo Aceptar_Click_Error
    Dim dbl30Minutes As Double
    Dim dblTimeIncr As Double
    Dim dblCurrentTime As Double
    Dim dblBeginTime As Double
    Dim dblEndTime As Double

    Dim intCurrentTime As Integer ‘used to test times in aTimeSlots array
    Dim intBeginTime As Integer
    Dim intEndTime As Integer

    Dim dblCurrentDate As Date
    Dim dblBeginDate As Date
    Dim dblEndDate As Date

    Dim fSkipDay As Boolean ‘flags used to track various states
    Dim fSkipTime As Boolean
    Dim fPreviousRecs As Boolean

    Dim lngResourceID As Long
    Dim lngScheduleId As Long
    Dim strCriteria As String
    If IsNull(Me![HoraInicio]) Or IsNull(Me![HoraFin]) Then
    MsgBox “Debe especificar las horas de inicio y fin para generar una planificación.”
    DoCmd.GoToControl “HoraInicio”
    Exit Sub
    End If
    If Me![HoraInicio].ListIndex >= Me![HoraFin].ListIndex Then
    MsgBox “La fecha final debe ser posterior a la fecha inicial.”
    DoCmd.GoToControl “HoraInicio”
    Exit Sub
    End If
    If Me![FechaInicio] > Me![FechaFin] Then
    MsgBox “La fecha final no puede ser anterior a la fecha inicial.”
    DoCmd.GoToControl “HoraInicio”
    Exit Sub
    End If
    DoCmd.Hourglass True
    lngResourceID = Me![IdRecurso]
    dbl30Minutes = TimeSerial(2, 30, 0) – TimeSerial(2, 0, 0)
    dblBeginTime = Me![HoraInicio].ListIndex * dbl30Minutes
    dblEndTime = Me![HoraFin].ListIndex * dbl30Minutes
    dblTimeIncr = dbl30Minutes * Me![AumentoTiempo].Column(0) ‘column 0 contains the number of 30 minute time segments in the time increment

    Set dbs = CurrentDb()
    Set rstSchedule = dbs.OpenRecordset(”Programa”, dbOpenDynaset)
    Set rstScheduleDtl = dbs.OpenRecordset(”Detalles de programa”)

    dblBeginDate = Me![FechaInicio]
    dblEndDate = Me![FechaFin]
    dblCurrentDate = dblBeginDate

    While dblCurrentDate (dblEndTime + 0.01) ‘the .01 adds a few minutes to deal with small number precision issues
    End If
    dblCurrentDate = dblCurrentDate + 1
    Wend
    DoCmd.Close acForm, “Generar”
    rstSchedule.Close
    rstScheduleDtl.Close
    dbs.Close
    Aceptar_Click_Exit:
    DoCmd.Hourglass False
    Exit Sub
    Aceptar_Click_Error:
    MsgBox Err.Description
    Resume Aceptar_Click_Exit
    End Sub
    ******************
    TODO ESTO FUNCIONA PERFECTO. desde el form Generar (CADA PACIENTE está CARGADO EN LA TABLA “RECURSOS”COMO RECURSO) y mediante el codigo al apretar el boton generar me guarda en las Tbl Programas y Detalles de programa me queda el detalle de las sesiones perfectamente almacenado.
    MI PROBLEMA ES CALCULAR LA FECHA FINAL
    Desde hace tiempo vengo probando lo que vos sugerís, pero siempre hay que corregir algo a mano , ya sea porque , me paso algún día , me falta o cae el día final un sábado domingo o feriado.

    EL FORMULARIO que tengo es :
    cuadro de texto que ingresas la fecha de inicio (mediante un control calendar MSCAL.Calendar.7 le igreso clickeando el botón de la fecha correspondiente sin tener que escribir a mano la fecha)
    Tengo 7 casillas de verificación donde tido los días de atencion (si tildo lunes mier vier saltea los demas , , también hice una tabla festivos para saltear los festivos con su correspondiente codigo y talba)
    Tengo 2 cuadros de texto donde pongo hora inicial y el incremento de tiempo -lo que dura la sesion que es de 1hora por defecto-
    Y por ultimo el cuadro de texto donde coloco la fecha final .
    todo esto funciona de maravilla cuando yo cargo los datos .
    Sucede , que probé con un cuadro de lista donde en una tabla “sesiones” calculo segun sea el caso para comenzar un lunes con 5 sesiones, va facil porque le agrego 10 dias a la fecha del lunes inicial, etc….. -pero esto no me funciona bien en todos los casos y es bastante molesto andar buscando apretar segun que dia se comience -.
    Como sabrás no es lo mismo comenzar 5 sesiones (lun-mier-vier) un lunes o 5 sesiones un viernes (vier-lun-mier), ni hablar cuando hay que tener en cuenta festivos.
    Conclusión: necesito que a partir de indicar que necesito “x” sesiones según la modalidad teniendo en cuenta los dias de la semana de tratamiento (yo sumo al calculo las casillas de verificación que son utilizadas en el codigo del botón multiplicandolos por -1 para poder para sumarlos a la fecha inicial+los dias que se atiende y poder saltear los dias que no se atiende, para que la fecha final los tenga contemplados)
    Daniel
    Pd si querés te envío x mail la mbd para que veas es lo que hice.

  19. Eduardo Says:

    Amigos no es la mejor solución para el manejo de días hábiles, aún dista mucho de ser una aplicación práctica, tengo un módulo en vba/vb para elaborar calendarios con festivos, por ej, el de Colombia, en donde algunos festivos son trasladados al siguiente lunes.

  20. lumbanico Says:

    Estimado Eduardo, sería de gran utilidad para todos que aportases algún ejemplo con ese módulo que indicas.

    Gracias.

  21. Fatiga Says:

    Lumbánico: Hola, tengo una nueva necesidad sobre el uso de este codigo, que no se si se puede adaptar.
    Necesito imprimir un informe que lleve la fecha del primer día hábil a contar desde el momento en que lo imprimo. Es decir, no importa cuando lo imprima, siempre me tiene que poner la fecha del primer día hábil siguiente.
    Trato de usar la función de IPublica que vos definis, pero me devuelve error.
    ¿Puedo desde el informe usar IPublica para eso?
    Desde ya, muchas gracias.

  22. lumbanico Says:

    Hola Fatiga, acabo de postear un ejemplo que creo que cumple con tus espectativas.

    Saludos.

  23. Fatiga Says:

    Gracias. Pero estuve mirando y no lo encuentro.

  24. lumbanico Says:

    Está al final de este post, justo antes de los comentarios. Puedes descargarlo desde http://lumbanico.googlepages.com/DiasHabiles_3.rar

  25. Fatiga Says:

    Excelente, como siempre. Había entendido que era un nuevo post en otro lado. Ya lo vi y ya lo usé. Perfecto. Muchas gracias.


Leave a Reply