xNosotros lo tenemos implementado mediante una tabla de DIAS NO HABILES, donde
estn cargadas las fechas no hbiles fijas ( 1 de enero, 6 de enero,
31 de diciembre, etc ) y el administrador del sistema ingresa las fechas no hbiles variables (feriados mviles, paros, etc. ) Para los sbados y domingos utilizamos la funcin DOW(fecha) Con sta informacin, pods desarrollar funciones de evaluacin:
Es_Feriado(fecha), y tambin que dada una fecha devuelva el siguiente da hbil: Next_Dia_Habil( fecha )
Podes uar la funcin DOW(fecha) que devuelve el NUMERO de da (creo x default
1=Domingo)
El algorimo a construir podr utilizar las siguientes
Funciones y operaciones.... DoW() = Day of Week de 1 a 7, 1 Domingo 7 Sabado. CantidadDeDias = FechFin - FechIni + 1 Idea: Suponiendo que contaras con cantidad de semanas exactas, entonces la cuenta seria Semanas = CantidadDeDias / 7 DiasHabiles = Semanas * 5 Lo unico que tienes que falta hacer, es transformar la fecha inicial en un Domingo, y la Final en Un sabado, y mirar en ese "corrimiento" cuantos dias sobran... por fuera,... es decir, si la fecha inicial era un viernes, un DoW=6, entonces Sab(7)-Vier(6) = 1 dia habil,... Si la Fecha Final era un Martes Dow()=3, la cuenta es Martes(3)-Domingo(1) = 2 dias habiles esto lo agregas a la cuenta de semanas * 5...
Mira, yo utilizo el siguiente procedimiento para determinar fechas de vencimiento a partir
de una fecha dada y sus dias de plazo, me vi en la necesidad de agregar una tabla donde indico los dias feriados, ya que tampoco debia tomarlos en cuenta para los plazos de vencimiento.
//parm(&zetfacfech ,&plazo ,&vencimient ) ; //&zetfacfech fecha inicial
//&plazo plazo en dias //&vencimient retorna con la fecha de vencimiento
&vencimient = &zetfacfech + &plazo
&flag = '0' &flag2 = '0' do while &flag = '0' &flag2 = '0' for each where Fer_fecha = &vencimient defined by Fer_descri msg('Este da es feriado',status) &flag2 = '1' endfor if dow(&vencimient ) = 7 msg('Es da sabado.',status) &flag2 = '1' else if dow(&vencimient ) = 1 msg('Es da domingo.',status) &flag2 = '1' endif endif if &flag2 = '1' &vencimient = &vencimient + 1 // si es feriado, sabado o domingo le agrego un da else &flag = '1' endif enddo