FoxPro/Visual FoxPro - Identificar fechas especificas

 
Vista:

Identificar fechas especificas

Publicado por Miguel (11 intervenciones) el 02/01/2007 23:39:34
Tengo un problema que no puedo resolver, quiero identificar fechas ya cargadas previamente al sistema es para un sistemas de pagos las fechas que se cargarian serian Ejemplo: Fechas patrias que el sistema no deve contar como dias aviles y deven quedar guardadas en el sistema para su posterior utilizacion sin tener que actualizar el sistema anualmente.
Gracias po su atención prestada agradesco lo que puedan hacer por mi.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:Identificar fechas especificas

Publicado por Ernesto Hernandez (4623 intervenciones) el 03/01/2007 00:19:14
Función para determinar días hábiles en un periodo de fechas, no cuenta los sábados ni domingos ni días festivos ente semana.
Tiene una tabla para capturar los días festivos, si no captura información en esta tabla la función tendrá un error de calculo por tal razón hay que tener esta tabla con datos correctos y actuales y tener un campo índice principal de fecha.


FUNCTION diashab(fecha1,fecha2)
LOCAL num AS INTEGER
* validando entrada de fechas
IF (!EMPTY(EVALUATE('fecha1'))) AND (!EMPTY(EVALUATE('fecha2')))
* validando fechas
IF fecha1 < fecha2
* numero de dias habilies
num=0
* dias entre 2 fechas
dias=(fecha2-fecha1)+1
* para sumar un dia a la fecha inicial
feccom=fecha1
* habre la tabla con las fechas de dias festivos (libres)
IF !USED('diainabil')
rut_nom=LOCFILE('diainabil','dbf')
USE &rut_nom ALIAS diainabil IN 0 ORDER fechaini
ENDIF
SELECT diainabil
* contando los dias habiles
FOR i=1 TO dias
* contando sin incluir a sabados y domingos
IF !INLIST(DOW(feccom),1,7)
num=num+1
ENDIF
* restando las fechas de dias libres entre semana.
IF SEEK(feccom) AND INLIST(DOW(feccom),2,3,4,5,6)
num=num-1
ENDIF
*incrementa la fecha
feccom=feccom+1
ENDFOR
* retorna el numero de dias habiles entre esas fechas
USE IN diainabil
RETURN num
ELSE
* eror en fecha
RETURN .F.
ENDIF
ELSE
* error en tipo de datos
RETURN .F.
ENDIF
ENDFUNC


Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Identificar fechas especificas

Publicado por Francisco Chacon (2 intervenciones) el 20/01/2007 00:56:22
*Primero mil gracias por compartir tu funcion, he aqui algo modificada para ver si a *alguien mas le sirve:

*Lo que necesitava era que una función me regresara la cantidad de dias naturales en *base a los días hábiles. Modifcando un poco tu funcion logre el siguente codigo, el
*cual me regresa:
* 1) Los dias habiles que aplicare a una fecha dada,
* 2) la fecha final resultante al aplicar la cantidad de das habiles efectivos,
* 3) la cantidad de dias naturales resultantes
* 4) y la diferencia de días entre los días habiles y los naturales:

* para llamar el programa es Do nomPrograma With(fecha,cantidadDeDias)
* Eje: Do DiasNaturales WITH DATE(),10
* ojo, Tambien se necesita la tabla para los dias inhabiles

* Aqui esta el codigo que resulto de modificar tu funcion:

PARAMETERS Fec1,dias

CLOSE TABLES
CLEAR

b = DiasHab(Fec1,dias)

FUNCTION diashab(fecha1,dias)
LOCAL num AS INTEGER

* validando entrada de fechas
IF (!EMPTY(EVALUATE('fecha1'))) AND (!EMPTY(EVALUATE('dias')))
* numero de dias habilies
num=0
intTotDias = 0
feccom=fecha1
fecfin = fecha1
* habre la tabla con las fechas de dias festivos (libres)
IF !USED('diainabil')
rut_nom=LOCFILE('diainabil','dbf')
USE &rut_nom ALIAS diainabil IN 0 ORDER fechaini
ENDIF

SELECT diainabil
salir = .f.
intDias = 0

DO WHILE !salir
intDias = intDias + num
num = 0
FOR I = 1 TO dias
fecfin = fecfin + 1
intTotDias = intTotDias + 1
* contando sin incluir a sabados y domingos
IF !INLIST(DOW(feccom),1,7)
num=num+1
ENDIF
* restando las fechas de dias libres entre semana.
IF SEEK(feccom) AND INLIST(DOW(feccom),2,3,4,5,6)
num=num-1
ENDIF
*incrementa la fecha
feccom=feccom+1
ENDFOR

IF dias - num <= 0
salir = .t.
ELSE
dias = dias - num
ENDIF
ENDDO

intDias = intDias + num

* retorna el numero de dias habiles entre esas fechas
USE IN diainabil
? "Dias abiles a aplicar: " + ALLTRIM(STR(intDias))
? "Fecha inicial: " + DTOC(fecha1) + " --> Fecha final: " + DTOC(fecfin)
? "Dias naturales aplicados: " + ALLTRIM(STR(intTotDias))
? "Diferencia entre abiles y naturales: " + ALLTRIM(STR(ABS(intDias - intTotDias)))

RETURN intTotDias
ELSE
* error en tipo de datos
RETURN .F.
ENDIF
ENDFUNC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Identificar fechas especificas

Publicado por Francisco Chacon (2 intervenciones) el 20/01/2007 01:41:21
* Rectificacion del codigo, tenia un pequeño erro

PARAMETERS Fec1,dias
SET ESCAPE ON
CLOSE TABLES
CLEAR

b = DiasHab(Fec1,dias)

FUNCTION diashab(fecha1,dias)
LOCAL num AS INTEGER

* validando entrada de fechas
IF (!EMPTY(EVALUATE('fecha1'))) AND (!EMPTY(EVALUATE('dias')))
* numero de dias habilies
num=0
intTotDias = 0
feccom=fecha1
fecfin = fecha1
* habre la tabla con las fechas de dias festivos (libres)
IF !USED('diainabil')
rut_nom=LOCFILE('diainabil','dbf')
USE &rut_nom ALIAS diainabil IN 0 ORDER fechaini
ENDIF

SELECT diainabil
salir = .f.
intDias = 0

DO WHILE !salir
intDias = intDias + num
num = 0

FOR I = 1 TO dias
fecfin = fecfin + 1
intTotDias = intTotDias + 1

* contando sin incluir a sabados y domingos
*IF !INLIST(DOW(feccom+1),1,7)

* contando sin incluir domingos
IF !INLIST(DOW(feccom+1),1)
num=num+1
ENDIF

* restando las fechas de dias libres entre semana sin incluir el sabado.
*IF SEEK(feccom+1) AND INLIST(DOW(feccom+1),2,3,4,5,6)

* restando las fechas de dias libres entre semana incluyendo el sabado.
IF SEEK(feccom+1) AND INLIST(DOW(feccom+1),2,3,4,5,6,7)
num=num-1
ENDIF
*incrementa la fecha
feccom=feccom+1
ENDFOR

IF dias - num <= 0
salir = .t.
ELSE
dias = dias - num
ENDIF
ENDDO

intDias = intDias + num

* retorna el numero de dias habiles entre esas fechas
USE IN diainabil
? "Ma16-Mi17-Ju18-Vi19-Sa20-Do21-Lu22-MaF23-Mi24-JuF25-Vi26-Sa27-Do28-Lu29-Ma30-Mi31-Ju01-Vi02-Sa03"
? "Dias abiles a aplicar: " + ALLTRIM(STR(intDias))
? "Fecha inicial: " + DTOC(fecha1) + " --> Fecha final: " + DTOC(fecfin)
? "Dias naturales aplicados: " + ALLTRIM(STR(intTotDias))
? "Diferencia entre abiles y naturales: " + ALLTRIM(STR(ABS(intDias - intTotDias)))

RETURN intTotDias
ELSE
* error en tipo de datos
RETURN .F.
ENDIF
ENDFUNC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar