Foros del Web » Programando para Internet » ASP Clásico »

Valida solo dias Habiles

Estas en el tema de Valida solo dias Habiles en el foro de ASP Clásico en Foros del Web. Hola a todos, tengo un problema para el calculo de dias habiles dada una fecha y una cantidad de dias, solo busco calcular los dias ...
  #1 (permalink)  
Antiguo 13/07/2010, 16:39
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 19 años, 5 meses
Puntos: 0
Valida solo dias Habiles

Hola a todos,
tengo un problema para el calculo de dias habiles dada una fecha y una cantidad de dias, solo busco calcular los dias de semana (independiente si son feriados) pero no me entrega el valor correcto.


fecha = "03/06/2010"
tomar = 10
separafecha = split(fecha,"/")

'saco cantidad de dias segun mes
Function trae_dias_de_meses(vAno)
Select Case (vAno)
Case "2010":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2011":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2012":
cant_dias="31,29,31,30,31,30,31,31,30,31,30,31"
Case "2013":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2014":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2015":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2016":
cant_dias="31,29,31,30,31,30,31,31,30,31,30,31"
Case "2017":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2018":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2019":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case "2020":
cant_dias="31,29,31,30,31,30,31,31,30,31,30,31"
Case "2021":
cant_dias="31,28,31,30,31,30,31,31,30,31,30,31"
Case else:
cant_dias="30,30,30,30,30,30,30,30,30,30,30,30"
End Select
trae_dias_de_meses = cant_dias
End Function

'trae cantidad de dias de los meses del año correspondiente.
vAnoMes = trae_dias_de_meses(separafecha(2))
vAnoMesArray = split(vAnoMes,",") 'guardo en arreglo cant. de dias de cada mes.
cant_dias_del_mes = vAnoMesArray(separafecha(1)-1) ' consulto cantidad de dias del mes que se pide la vacacion

'el primer ciclo calcula dias de fds desde el dia de inicio hasta los dias a tomar.
dia_partida = separafecha(0) 'asigno dia de inicio
mes_partida = separafecha(1)
anio_partida = separafecha(2)

cuenta_d = 0 ' contador para los dias, a fin de mes vuelve a 0
entra = 1 ' controla while
tomar = (tomar + cint(dia_partida)) - 1
festivos = 0

do while entra = 1
for n = dia_partida to (tomar)
muestrafecha = 1

'a la fecha inicial le suma dias para ver si son fds
suma_dia = dia_partida + cuenta_d
'response.Write(suma_dia) & "=" & dia_partida & "+" & cuenta_d &"<br>"

if (cint(cant_dias_del_mes) >= cint(suma_dia)) then
' aqui controlo en cambio de mes
mes_fecha = mes_partida
else
mes_fecha = mes_partida + 1
mes_partida = mes_fecha 'cambia mes partida cumplidos fdm
suma_dia = 1
cuenta_d = 0
end if

vfecha = suma_dia & "/" & mes_fecha & "/" & anio_partida 'response.Write(vfecha) & "<br>"
if (WeekDayName(WeekDay(vfecha)) = "sábado") or (WeekDayName(WeekDay(vfecha)) = "domingo") then
festivos = festivos + 1
muestrafecha = 0
end if

cuenta_d = cuenta_d + 1 'suma dias
if muestrafecha = 1 then
response.Write(vfecha) & "<br>"
end if
next
'response.Write(suma_dia & "=suma dias " & festivos & "=festivos -------<br>")

if festivos > 0 then
'cuenta_d = cuenta_d-1
dia_partida = suma_dia + 1
tomar = suma_dia + festivos
suma_dia = suma_dia - dia_partida
festivos = 0
'n = 0

response.Write(dia_partida & "&nbsp;nuevo dia partida---------------<br>")
response.Write(tomar & "&nbsp;nuevo tomar---------------<br><br>")
else
entra = 0
end if
loop

'dia_final = dia_partida + tomar + vfds ' sumo: dia de partida de fecha, los dias a tomar y los fines de semana
if suma_dia < 10 then
dia = "0" & suma_dia
else
dia = suma_dia
end if

if (len(mes_fecha) < 2) then
mes = "0" & mes_fecha
else
mes = mes_fecha
end if

'armo la fecha final
vfecha_final = dia & "/" & mes & "/" & anio_partida
response.Write("<br>" & vfecha_final) & "---------final---------<br>"

al momento de terminar el 1er while, pierdo el puntero y no logro recuperarlo, es posible cambiar el while... esto podria hacerlo haciendo que la variable de for no se ingremente cuando la fecha sea sabado o domingo...

saludos y se agradese desde ya cualquier ayuda.

Última edición por bitshoot; 14/07/2010 a las 07:42 Razón: mejor lectura
  #2 (permalink)  
Antiguo 14/07/2010, 06:02
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Valida solo dias Habiles

Hola

He intentado leerlo, pero me ha perdido con tantas operaciones. Intenta en la medida de lo posible optimizar el código y encerrarlo en los tags para una mejor lectura

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #3 (permalink)  
Antiguo 14/07/2010, 07:47
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Valida solo dias Habiles

amigo gracias por tu respuesta, resulta que no puedo organizar el codigo, no me deja, alinea todo a la izquierda, trate de resaltar los comentarios, pero si lo copias y ejecutas no debes tenes problemas

de todo el codigo el while es donde esta el problema, pasa la primera vez por el for bien, luego al hacer loop y pasar nuevamente se pierden las variables de inicio y fin de for.
  #4 (permalink)  
Antiguo 14/07/2010, 08:37
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 2 meses
Puntos: 146
Respuesta: Valida solo dias Habiles

Todo ese código es para obtener el número de días hábiles entre dos fechas?

Me llamó la atención que tuvieras que poner el número de días por mes al año en un Case, ¿no te era más sencillo poner una fórmula de 1 linea?
  #5 (permalink)  
Antiguo 14/07/2010, 08:57
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Valida solo dias Habiles

En realidad si, pero desconocia esa formula, de todas formas una vez teniendo la tarea lista luego la puedo optimizar.

De todas formas necesito obtener la cantidad de dias del mes que esta calculando para que el contador vuelva a uno y cambie de mes.

gracias por el aporte.

Última edición por bitshoot; 14/07/2010 a las 08:59 Razón: mejorar respuesta
  #6 (permalink)  
Antiguo 14/07/2010, 10:07
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 2 meses
Puntos: 146
Respuesta: Valida solo dias Habiles

Ok, pero en lo particular, me gustaría ayudarte con otro código diferente al que usas, ya que lo siento algo rebuscado, para ello necesito que me expliques por favor qué es lo que necesitas obtener exactamente.

Cita:
tengo un problema para el calculo de dias habiles dada una fecha y una cantidad de dias, solo busco calcular los dias de semana (independiente si son feriados) pero no me entrega el valor correcto.
Vuelvo a preguntar, ¿solo deseas obtener el número de días hábiles entre dos fechas o es algo más?
  #7 (permalink)  
Antiguo 14/07/2010, 10:13
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Valida solo dias Habiles

si, solo eso, una fecha y una cantidad de dias, por ejemplo 01/01/2010 y 20 (días)
me debe entregar fecha fin 29/01/2010 ya que no debe contar los fines de semana... solo eso.

y gracias por el tiempo.

Última edición por bitshoot; 14/07/2010 a las 10:14 Razón: agradecer
  #8 (permalink)  
Antiguo 14/07/2010, 11:03
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 2 meses
Puntos: 146
Respuesta: Valida solo dias Habiles

A ver que te parece esta primera aproximación, así a lo rápido creo que es lo que necesitas, pero pruébalo bien:

Código ASP:
Ver original
  1. <&#37;
  2.        
  3. if Request("FechaInicial") <> "" and Request("NumDias") <> "" Then
  4.    fFechaInicial    = CDate(Request("FechaInicial"))
  5.    iDiasIncrementar = CInt(Request("NumDias"))
  6.  
  7.    fFechaFinal      = DateAdd("d", iDiasIncrementar, CDate(Request("FechaInicial")))
  8.    iDiasEntreFechas = DateDiff("d", fFechaInicial, fFechaFinal)
  9.      iDiasNoHabiles   = FinesDeSemana(fFechaInicial, fFechaFinal)
  10.      fFechaResultante = DateAdd("d", iDiasEntreFechas+iDiasNoHabiles, fFechaInicial)
  11.      
  12.    if FinesDeSemana(fFechaInicial, fFechaResultante) > 0 Then
  13.       fFechaResultante = DateAdd("d", iDiasEntreFechas+FinesDeSemana(fFechaInicial, fFechaResultante), fFechaInicial)
  14.      End If
  15.    
  16.      Response.Write "Fecha Inicial: " & Request("FechaInicial") & "<br>"
  17.      Response.Write "Dias hábiles a considerar: " & Request("NumDias") & "<br>"
  18.      Response.Write "<hr><br>"
  19.    Response.Write "Total de dias " & iDiasEntreFechas & "<br>"
  20.    Response.Write "Total de dias no hábiles: " & iDiasNoHabiles & "<br>"
  21.    Response.Write "Fecha resultante: " & fFechaResultante & "<br>"
  22.      Response.Write "<hr><br>"
  23. End If
  24.  
  25. Function FinesDeSemana(FechaIni, FechaFin)
  26.     aux = DateDiff("ww", FechaIni, FechaFin, vbSaturday) + DateDiff("ww", FechaIni, FechaFin, vbSunday)
  27.     If Weekday(FechaIni, vbSunday) = 1 Then aux = aux + 1 End if
  28.     If Weekday(FechaIni, vbSaturday) = 1 Then aux = aux + 1 End If
  29.     FinesDeSemana = aux
  30. End Function
  31. %>
  32. <form>
  33. Fecha Inicial: <input type="text" name="FechaInicial" value="01/01/2010"><br>
  34. Dias h&#225;biles: <input type="text" name="NumDias" value="20"><br>
  35. <input type="submit" value="Calcular">
  36. </form>
  #9 (permalink)  
Antiguo 14/07/2010, 11:22
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Valida solo dias Habiles

Mostro, excelente... que manera de simplificar el codigo.. eso me pasa por llegar y hacer las cosas sin investigar antes...

un millon mostro.
  #10 (permalink)  
Antiguo 14/07/2010, 12:16
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 2 meses
Puntos: 146
Respuesta: Valida solo dias Habiles

no pues gracias, no se que signifique mostro, pero espero que sea bueno
  #11 (permalink)  
Antiguo 14/07/2010, 13:07
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
Respuesta: Valida solo dias Habiles

Si, es algo bueno
__________________
...___...
  #12 (permalink)  
Antiguo 11/08/2010, 07:47
 
Fecha de Ingreso: agosto-2010
Mensajes: 1
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Valida solo dias Habiles

hola Myakire, soy nuevo en esto de programación y me enviaron un proyecto donde necesito ese codigo, pero no se en que lengueje esta escrito, sera que no me puedes hachar una mano con eso?? yo se manejar mas o menos PHP HTML Y JAVASCRIPT, sera que no me puedes hechar la mano??????gracias
  #13 (permalink)  
Antiguo 11/08/2010, 07:52
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Valida solo dias Habiles

Cita:
Iniciado por cainblack Ver Mensaje
hola Myakire, soy nuevo en esto de programación y me enviaron un proyecto donde necesito ese codigo, pero no se en que lengueje esta escrito, sera que no me puedes hachar una mano con eso?? yo se manejar mas o menos PHP HTML Y JAVASCRIPT, sera que no me puedes hechar la mano??????gracias
Adivina adivinanza ¿en qué foro has posteado?
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: dias, habiles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.