Como puede distribuir fechas de permisos en columnas de meses, teniendo en cuenta que los permisos son por rangos de fechas

Necesito realizar un reporte de días de inasistencia por meses teniendo en cuenta que los permisos pueden ser por un día o por varios días rango de fechas y muchas veces abarca dos meses Ejmp. 25/01/2016 al 12/02/2016.

1 respuesta

Respuesta
2

Podría ser más preciso si me dices como es la estructura de la tabla desde donde leeras los datos a mostrar en el informe.

Pero básicamente; considerando que tienes al menos 2 datos importantes en la tabla de inasistencia, tal que, Nombre de la Persona y fecha de inasistencia, llamemos por ejemplo (Nombre y Fechainas), y daremos a la tabla el nombre de Inasistencias; entonces:

Local dFecha1, dFecha2
&& Aqui ingreso así las fechas aunque lo más probable las 
&& leas desde un TextBox o la pases por valor.
dFecha1 = ctod("25/01/2016")
dFecha2 = ctod("12/02/2016")
Use Inasistencias
Select 0
Select Nombre, FechaInas ;
    From Insistencias ;
    Where Between(FechInas,dFecha1,dFecha2) ;
    Into Cursor csrResultado

Así ya tienes la información para crear el reporte.

La estructura y los datos son los siguientes, lo que necesito es distribuirlos en columnas de meses (ene, feb, mar, abr...... dic del año2016), por los días de inasistencia que corresponde a cada mes

ejemplo:

Asi deberia quedar

Se me ocurre que podrías crear una función o procedimiento con lo siguiente:

Lparameters dFecha1, dFecha2
CMeses = "Ene, Feb, Mar, Abr, Mar, May, Jun, Jul, Ago, Set, Oct, Nov, Dic"
Store 0 To nMesnum, nContar, nSumato
For nX=Val(Sys(11,dFecha1)) To Val(Sys(11,dFecha2))
    dNeofec = Ctod(Sys(10,nX))
    If nMesnum # Month(dNeofec)
        If nContar > 0
            Messagebox(cMesFec+"="+Transform(nContar),64,[Inasistencias])
        Endif
        nMesnum = Month(dNeofec)
        cMesFec = Getwordnum(cMeses,nMesnum,",")
        nSumato = nSumato + nContar
        nContar = 0
    Endif
    nContar = nContar + 1
Next
nSumato = nSumato + nContar
Messagebox(cMesFec+"="+Transform(nContar),64,[Inasistencias])
Messagebox("Total="+Transform(nSumato))

Prueba pasarle 2 fechas y solo te determinará por cada mes la cantidad de días de inasistencia; en el ejemplo te devolverá mensajes, cambia ésto para que se cargue en el campo correspondiente de tu tabla de inasistencias.

Exitos, cualquier cosa solo dime si necesitas más detalles.

Me olvidaba; el método práctico sería abrir tu tabla de Inasistencias (Inasis) y haces un Scan / EndScan y envías las fechas de cada registro a la función que te pasé para que ésta te indique las cantidades según el mes:

Por Ej.: y suponiendo que la función se llame "fContador"

Select 0
Use Inasis
Scan
    fContador(Pe_fini,Pe_ffin)
EndScan

EXCELENTE, me funciono gracias.

Me puedes indicar para que no considere datos de años anteriores al año solicitado en el ejemplo: solo los correspondiente al año 2016

Gracias

Disculpa pero me puedes indicar como hago para que se reemplace en cada uno de los meses de la tabla inasis.dbf.

Modifico el código para responderte las 2 consultas:

Lparameters dFecha1, dFecha2, nAnio
CMeses = "Ene, Feb, Mar, Abr, Mar, May, Jun, Jul, Ago, Set, Oct, Nov, Dic"
Store 0 To nMesnum, nContar, nSumato
For nX=Val(Sys(11,dFecha1)) To Val(Sys(11,dFecha2))
    dNeofec = Ctod(Sys(10,nX))
    If Year(dNeofec) # nAnio
        Loop
    Endif
    If nMesnum # Month(dNeofec)
        If nContar > 0
            ** Aquí Presupongo que Los campos Ene, Feb, etc. son numéricos.
            Replace Inasis.&cMesFec With nContar
        Endif
        nMesnum = Month(dNeofec)
        cMesFec = Getwordnum(CMeses,nMesnum,",")
        nSumato = nSumato + nContar
        nContar = 0
    Endif
    nContar = nContar + 1
Next
nSumato = nSumato + nContar
Replace Inasis.&cMesFec With nContar

Entonces cuando llames a la función para que devuelva solo cantidades correspondiente a un año en particular, aguegas el valor del año en formato numérico... mira el ejemplo:

Select 0
Use Inasis
Scan
    fContador(Pe_fini,Pe_ffin,2016)
EndScan

Espero que sea de utilidad; no olvides por favor valorar la pregunta así se cierra. Exitos.

Si te da problemas el comando replace; busca la siguiente línea:

cMesFec = Getwordnum(CMeses,nMesnum,",")

y la modificas así:

cMesFec = Alltrim(Getwordnum(CMeses,nMesnum,","))

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas