Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

dias habiles

Estas en el tema de dias habiles en el foro de Visual Basic clásico en Foros del Web. holas hace unos dias postie una peticion de ayuda para mi dilema, y resulta que no lo he podido solucionar. el problema es el siguiente: ...
  #1 (permalink)  
Antiguo 25/04/2006, 13:18
Avatar de cadrogui  
Fecha de Ingreso: junio-2003
Mensajes: 875
Antigüedad: 20 años, 10 meses
Puntos: 5
dias habiles

holas hace unos dias postie una peticion de ayuda para mi dilema, y resulta que no lo he podido solucionar. el problema es el siguiente:

tengo 2 fechas dadas por un DTPicker las cuales son de un inicio y un final, resulta que las fechas son para cobrar por el arriendo de maquinarias, y para ello se deben descontar los festivos sabados y domingos, pero solo en algunos casos se descuentan los sabados, ya que en otros NO, he tratado de hacer algo pero la verdad es que nada me resulta, he probado con estos dos codigos que me encontre aqui:

Código:
Mes = "01"
    Anio = Mid(Format(MonthView1, "DD/MM/YYYY"), 7, 4)
    For j = 1 To 12
        For i = 1 To 31
            FechaStr = "0" & i & "/" & Mes & "/" & Anio
            dia = UCase(Format(FechaStr, "DDDD"))
            If IsDate(FechaStr) Then
                fecha = CDate(FechaStr)
                If dia = "SÁBADO" Or dia = "DOMINGO" Or fecha = "01/01/04" Then
                
                
                'No cuenta sabados ni domingos ni el 1 de enero que es feriado
                    
                    contador = contador
                Else
                    contador = contador + 1
                End If
            End If
        Next i
        Select Case Mes
            Case "01"
                Mes = "02"
            Case "02"
                Mes = "03"
            Case "03"
                Mes = "04"
            Case "04"
                Mes = "05"
            Case "05"
                Mes = "06"
            Case "06"
                Mes = "07"
            Case "07"
                Mes = "08"
            Case "08"
                Mes = "09"
            Case "09"
                Mes = "10"
            Case "10"
                Mes = "11"
            Case "11"
                Mes = "12"
        End Select
    Next j
    MsgBox " Dias Habiles en año " & Anio & " = " & contador
el otro:

Código:
Dim VTotal As Integer 
    mes = CStr(Cal.Month) 
    mes_actual = Mid(Format(Date, "DD/MM/YYYY"), 5, 1) 
    Cal.Day = 1 
    VTotal = 0 
    For i = 1 To 31 
        If mes = mes_actual Then 
            VTotal = VTotal + 1 
            dia = UCase(Format(Cal.Day, "DDDD")) 
            If dia = "SÁBADO" Or dia = "DOMINGO" Then 
                VTotal = VTotal - 1 
                MsgBox dia & "...." & Cal.Day 
            End If 
            mes = CStr(Cal.Month) 
            Cal.NextDay 
        End If 
    Next i 
    MsgBox "Dias habiles del mes: " & VTotal

por fa tirenme un cable ya que me tiene bastante frustrado esta situacion....


de antemano un millon de gracias.

pd: para saber la cantidad de dias entre las dos fechas lo hago asi:

Código:
entrega = fechaentrega.Value 'DTPicker
retiro = fecharetiro.Value        'DTPicker

total = DateDiff("d", entrega, retiro)

pd: lo que se me ocurre es un bucle que recorra desde la fecha inicial hasta la fecha final sumando y descontando los dias habiles y feriados, pero no se como hacerlo

para saber que dia es hoy ej: "SABADO", uso esto:

dia = UCase(Format(entrega, "DDDD")), despues se podria hacer algun IF ELSE para descontarlos..

salu2
__________________
La mejor manera de aprender es por medio de un aprendizaje significativo....

http://www.cocert.cl

Última edición por cadrogui; 25/04/2006 a las 13:27
  #2 (permalink)  
Antiguo 25/04/2006, 20:00
Avatar de jc_moty  
Fecha de Ingreso: septiembre-2005
Ubicación: Usulután, El Salvador
Mensajes: 477
Antigüedad: 18 años, 7 meses
Puntos: 1
Yo creo que se te ha complicado el asunto, porque no utilizas funciones de fecha que seguramente te facilitarian las cosas, funciones como: WeekDay, WeekdayName, Month, Year, Monthname y algunas otras que se me escapan; en fin aqui pongo un pequeño ejemplo de como como contar los dias habiles entre una fecha inicial y una final, ojo porque solo he tomado sabados y domingos como dias no habiles:
Código:
Dim dif, i As Integer
Dim fecha_inicial, fecha_final As String
fecha_inicial = "01/04/2006"
fecha_final = "30/04/2006"
dif = CDate(fecha_final) - CDate(fecha_inicial)
For i = 1 To dif
    If Weekday(CDate(fecha_inicial) + i, vbMonday) = 6 Or Weekday(CDate(fecha_inicial) + i, vbMonday) = 7 Then
        dif = dif - 1
    End If
Next i
MsgBox "Dias habiles = " & dif, vbInformation, "Resultado"
Espero te sirva
  #3 (permalink)  
Antiguo 27/04/2006, 18:51
Avatar de cadrogui  
Fecha de Ingreso: junio-2003
Mensajes: 875
Antigüedad: 20 años, 10 meses
Puntos: 5
un millon de gracias, cualquier otra duda les cuento....

salu2 y muchas gracias
__________________
La mejor manera de aprender es por medio de un aprendizaje significativo....

http://www.cocert.cl
  #4 (permalink)  
Antiguo 29/04/2006, 09:59
Avatar de cadrogui  
Fecha de Ingreso: junio-2003
Mensajes: 875
Antigüedad: 20 años, 10 meses
Puntos: 5
me asalta una duda, como puedo hacer para ingresar en una bd los dias festivos de cada mes o existe algun control de vb que segun el calendario del computador me diga que dias son los festivos????

salu2
__________________
La mejor manera de aprender es por medio de un aprendizaje significativo....

http://www.cocert.cl
  #5 (permalink)  
Antiguo 30/04/2006, 10:07
Avatar de jc_moty  
Fecha de Ingreso: septiembre-2005
Ubicación: Usulután, El Salvador
Mensajes: 477
Antigüedad: 18 años, 7 meses
Puntos: 1
Hasta donde yo se no existe ningun control que segun el calendario de la PC te diga cuales son los dias festivos; lo que podes hacer es crear una tabla, que contenga un campo de tipo fecha y en esa tabla metas todas las fechas festivas; por ejemplo: 01/01/2006; 25/12/2006; 01/05/2006; etc...
Y con un SQL haces una comparacion:
Código:
Set mirecordset = Conexion.Execute("SELECT fecha FROM festivos WHERE MONTH(fecha) = MONTH(DATE()) AND DAY(fecha) = DAY(DATE())") ' Ojo: solo nos interesa el mes y el dia, en ningun momento hay que comparar el año
If mirecordset.BOF=False And mirecordset.EOF=False Then
     Msgbox "Es Festivo"
End if
Este ejemplo es con ADO y una BD de Access.
Aplicandolo al ejemplo anterior queda asi:
Código:
' Ojo: Agrega la referencia Microsoft ActiveX Data objects 2.6
' Menu Proyecto->Referencias->Seleccionar Microsoft ActiveX Data objects 2.6
' Objetos de ADO
Dim mirecordset As Recordset
Dim conexion As Connection
'
Dim dif, i As Integer
Dim fecha_inicial, fecha_final As String
' Para inicializar el objeto Connexion
Set conexion = New Connection
' La Base de datos tiene que estar en la carpeta del proyecto
conexion.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data source = " & App.Path & "\BD.mdb;Persist Security Info=False;"
conexion.Open
'
fecha_inicial = "01/04/2006"
fecha_final = "02/05/2006"
dif = CDate(fecha_final) - CDate(fecha_inicial)
For i = 1 To dif
    If Weekday(CDate(fecha_inicial) + i, vbMonday) = 6 Or Weekday(CDate(fecha_inicial) + i, vbMonday) = 7 Then
        dif = dif - 1
    Else
        ' la consulta a la fecha correspondiente
        Set mirecordset = conexion.Execute("SELECT fecha FROM festivos WHERE MONTH(fecha) = " & Month(CDate(fecha_inicial) + i) & " AND DAY(fecha) = " & Day(CDate(fecha_inicial) + i)) 
        ' Ojo: solo nos interesa el mes y el dia, en ningun momento hay que comparar el año
        ' si la consulta devolvio registros
        If mirecordset.BOF = False And mirecordset.EOF = False Then
            ' restamos un dia            
            dif = dif - 1
        End If
    End If
Next i
MsgBox "Dias habiles = " & dif, vbInformation, "Resultado"
Ojo: Segun este ejemplo:
Nombre de la base de datos: BD.mdb
Nombre de la tabla: Festivos
Nombre del unico campo en la tabla: Fecha
Tipo de datos del campo fecha: Fecha/Hora
Saludos

Última edición por jc_moty; 30/04/2006 a las 10:15
  #6 (permalink)  
Antiguo 19/12/2006, 07:47
 
Fecha de Ingreso: febrero-2005
Mensajes: 12
Antigüedad: 19 años, 3 meses
Puntos: 0
AYUDAME PORFA FECHA SIGUIENTE Y dias habiles

Dim mirecordset As Recordset

Dim conexion As Connection

'

Dim dif, i As Integer

Dim fecha_inicial, fecha_final_un_dia_mas_mientra_nosea_sab_dom_fer As String

' Para inicializar el objeto Connexion

Set conexion = New Connection

' La Base de datos tiene que estar en la carpeta del proyecto

conexion.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data source = " & App.Path & "\BD.mdb;Persist Security Info=False;"

conexion.Open

'

fecha_inicial = "01/12/2006"

fecha_final_un_dia_mas_mientra_nosea_sab_dom_fer = "08/12/2006"



Por favor ayudame estoy tratando de desarrollar un pequeño for que me tiene loco. Necesito que le pregunte a la fecha final… lo siguiente.



Cuando me valla a dar la fecha fina me debe dar una fecha que no sea sabado ni domingo y tampoco feriado entonces:



Ejemplo 1:



Fecha fina "08/12/2006" es dia viernes, luego viene sabado y domingo que son dias feriado en este caso la fecha que debe darme es el dia lunes "11/12/2006" mientra esta no sea un dia festivo, si en dado caso el lunes "11/12/2006" es un dia festivo el dia que me deberia dar es el martes mientra no sea un dia festivo ya sabemos que este dia festivo son los que se encuentra en la base de dato.



En pocas palabras lo que necesito es que me de la fechas "dd/mm/yyyy" del dia siguiente mientra la fecha no sea sabado, domingo y feriado.



Y luego continuo con el codigo de abajo.





dif = CDate(fecha_final_un_dia_mas_mientra_nosea_sab_dom _fer) - CDate(fecha_inicial)

For i = 1 To dif

If Weekday(CDate(fecha_inicial) + i, vbMonday) = 6 Or Weekday(CDate(fecha_inicial) + i, vbMonday) = 7 Then

dif = dif - 1

Else

Set mirecordset = conexion.Execute("SELECT fecha FROM festivos WHERE MONTH(fecha) = " & Month(CDate(fecha_inicial) + i) & " AND DAY(fecha) = " & Day(CDate(fecha_inicial) + i))

If mirecordset.BOF = False And mirecordset.EOF = False Then

dif = dif - 1

End If

End If

Next i



MsgBox "Dias habiles = " & dif, vbInformation, "Resultado"
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:23.