Trabajando con calculo de fechas con diferentes campos.

Tengo una BD en Access. En un formulario declaro si el documento es CONTRATO o SUPLEMENTO (ver columna C/S en imagen). Cuando declaro C (contrato) le di formato a otros campos para que se coloreen color gris con el fin de ayudar visualmente al operario ya que esos campos no se utilizan en caso de que el registro sea =C y vaya directamente a la columna G ESP. PPLS.

En caso de que el registro sea =S los campos tiene asignado un comportamiento similar pero en el campo FE SS. ¿Qué necesito lograr?

Que en caso que el registro sea =C la fecha el campo G ESP PPLS se reste a la fecha del campo FE SS y me muestre el número de días (sin contar fines de semana) en un campo (x ejemplo he puesto número a azar enmarcado en negro =15)

Y que si el registro es =S la fecha el campo G ESP PPLS se reste a la fecha del campo ENTRADA en color azul y me muestre el número de días (sin contar fines de semana) en un campo (x ejemplo he puesto número a azar enmarcado en negro =8)

2 respuestas

Respuesta
1

Pruebe con este código y adáptelo de acuerdo con sus necesidades

Private Sub C_S_AfterUpdate()
    If Me.C_S = "C" Then
        ' Cálculo de días hábiles entre G_ESP_PPLS y FE_SS
        Dim fecha_G_ESP_PPLS As Date
        Dim fecha_FE_SS As Date
        Dim dias_habiles As Integer
        fecha_G_ESP_PPLS = Me.G_ESP_PPLS
        fecha_FE_SS = Me.FE_SS
        ' Aquí realizamos el cálculo de los días hábiles entre las dos fechas
        dias_habiles = CalcularDiasHabiles(fecha_G_ESP_PPLS, fecha_FE_SS)
        ' Actualizamos el campo de número de días
        Me.NumeroDias = dias_habiles
        ' También podrías colorear el campo o hacer otros cambios visuales aquí
    ElseIf Me.C_S = "S" Then
        ' Cálculo de días hábiles entre G_ESP_PPLS y ENTRADA
        Dim fecha_G_ESP_PPLS As Date
        Dim fecha_ENTRADA As Date
        Dim dias_habiles As Integer
        fecha_G_ESP_PPLS = Me.G_ESP_PPLS
        fecha_ENTRADA = Me.ENTRADA
        ' Aquí realizamos el cálculo de los días hábiles entre las dos fechas
        dias_habiles = CalcularDiasHabiles(fecha_G_ESP_PPLS, fecha_ENTRADA)
        ' Actualizamos el campo de número de días
        Me.NumeroDias = dias_habiles
        ' También podrías colorear el campo o hacer otros cambios visuales aquí
    End If
End Sub
Function CalcularDiasHabiles(fechaInicio As Date, fechaFin As Date) As Integer
    Dim dias_habiles As Integer
    Dim fecha_actual As Date
    fecha_actual = fechaInicio
    dias_habiles = 0
    ' Recorremos los días entre las fechas y contamos los días hábiles
    Do While fecha_actual <= fechaFin
        If Weekday(fecha_actual, vbMonday) <= 5 Then ' Verificamos si es día de semana (Lunes = 2, ..., Viernes = 6)
            dias_habiles = dias_habiles + 1
        End If
        fecha_actual = fecha_actual + 1
    Loop
    CalcularDiasHabiles = dias_habiles
End Function
Respuesta
1

Para evitar problemas con la entrada de datos, óptaria por habilitar o deshabilitar los campos en función del tipo seleccionado en el combo, unido a un adecuado manejo de los puntos de tabulación se lleva al usuario de la mano.

EL calculo de fechas ¿para qué restar fechas, que se obtiene o donde se aplica?

Creo que basta con calcular los días hábiles (dato discutible) entre ambas fechas, en principio se considerara que no existen 'fiestas que guardar' y se descansa solo el sábado y el domingo
(Para ser mas exactos se necesitará una tabla con los festivos nacionales y locales).

Para el calculo de los días hábiles entre fechas propongo esta función:

Public Function CTDia(FechaEnt As Date, FechaSal As Date) As Long
Dim xx As Date
For xx = FechaEnt To FechaSal
CTDia = CTDia + Abs(Weekday(xx, 2) < 6)
Next xx
End Function

Se utilizara como origen de datos para el cuadro de texto y los parámetros serian

En el caso de 'C':
= CTdia([FE SS]; [G ESP PPLS]) 
El otro:
= CTdia([Entrada]; [G ESP PPLS]) 

Si el formulario es continuo, este campo debería guardarse, si es independiente (calculado), su valor se repetirá en todos al ritmo del registro activo.

Hola me hablas de algo que me despierta el interés y creo me ayudaría mucho. Te refieres a que para evitar problemas con la entrada de datos, se puede optar por habilitar o deshabilitar los campos en función del tipo seleccionado en el combo. ¿Cómo se hace esto? La verdad lo prefiero a estar coloreando campos a través de la opción dar formato.

Los cuadros de texto admiten en tiempo de ejecución el cambio de algunas de sus propiedades, en particular esta (Me[nombre del objeto].Enabled = True/False) es una de ellas y al no estar activa no recibe el foco y se muestra como difusa (si se activa su propiedad Bloqueado se mostrara de nuevo 'normal').

Otra de sus propiedades, es el 'orden de tabulación' que si se utiliza de forma correcta (se tiene en cuenta el orden de entrada deseado) le puede ser muy útil a operador.

Para modificar que se utilicen unos u otros campos en función del dato seleccionado en el combo, se puede hacer asi en el evento del combo (utilizare en el ejemplo el evento 'al cambiar' al combo le llame TIPO y a los cuadros de texto... lo que me permitió Access como nombres de objetos):

Private Sub Tipo_Change()
Me.G_ESP_PPLS.Enabled = Me.Tipo = "S"
Me.FE_SS.Enabled = Me.Tipo = "C"
End Sub

Se puede hacer para cada campo que se necesite manipular y si su orden de tabulación es el correcto ira al campo que le corresponda y 'saltara' a los no accesibles (si los 'alternativos' están uno a continuación del otro en su orden de tabulación, no hay nada mas que modificar) .

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas