Spanish (SOLUCIONADO) Consejos como armar Grilla Horaria

Piluso

Member
Licensed User
Buenas noches. Estoy creando una grilla horaria modificando el ejemplo de date picker (https://www.b4x.com/android/forum/threads/b4x-xui-anotherdatepicker.85160/)
y lo deje así...
Screenshot_20200519-214822.png

Inhabilité todos los botones de los horarios pasados cuando estoy trabajando con la fecha actual...
Screenshot_20200519-220602.png

Y ahora me falta resaltar los horarios que ya están ocupados. Para eso tengo una consulta a la tabla que me trae los horarios cargados en el día seleccionado, sin tirar error y devolviendo los resultados como quiero.
Mostrar Reservas:
Sub GetSelectedRecord (DiaElegido As String )
    Log(DiaElegido)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("SeleccionoDia", Array(DiaElegido))
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_Result(res As DBResult)       
        Log(res.Columns)
        For Each row() As Object In res.Rows
            DiaDD = DateTime.Date(row(3))
            DiaHH= DateTime.Date(row(4))
            HoraDD= DateTime.Time(row(5))
            HoraHH= DateTime.Time (row(6))
            Log( DiaDD)
            Log(DiaHH)
            Log(HoraDD)
            Log(HoraHH)
        Next
    Else
        Log("ERROR: " & j.ErrorMessage)
    End If
    j.Release
End Sub
Devolviendome para este caso 2 registros...
Captura.JPG

La consulta es la sgte. Como nunca se cuantos registros va a traer la consulta (pueden ser 0 o "n") yo queria crear una matriz que sea de la misma cantidad de registros que trae la consulta y pensaba usar la propiedad .count de VB que trae la cantidad de registros que devuelve una consulta y asignar cuando se recorren los registros de la consulta los cuatros valores a cada posición de nro de registro. Asi lo usaba yo pero no encuentro las propiedades para este caso y no sé como resolverlo. Aclaro que esa matriz la voy a usar para recorrer la grilla y pintar los botones necesarios para que esos horarios aparezcan como ocupados.
Si a alguien se le ocurre otra manera de correr la consulta para comparar y desabilitar los botones de la grilla u otra manera de manejarme, soy todo oídos.

Calculo que hay alguna documentación al respecto que no he leído, no supe buscar o me estoy salteando. Mi mente esta cansada así que lo voy a dejar por hoy. Los estaré leyendo mañana.

Saludos
 

IdasI4A

Active Member
Licensed User
Longtime User
No se si te he entendido bien.
Tu problema es saber las horas que estan ocupadas y que devuelve la consulta.
Puedes pensar al reves crear una matriz de las horas posibles, en tu caso y segun la imagen que veo, una matriz de 35 elementos (7x5).
En principio esta matriz puedes ser de booleans, Dim HorasOcupadas(35) as Boolean.
Antes de la lectura de los registros pones todos los elementos a False.
Segun vas leyendo las horas ocupadas, calculas el lugar que ocupa en la matriz y pones dicho elemento a true.
Así cuando acabes ya sabrás las horas que estan ocupadas y cuales no, recorriendo la matriz de HorasOcupadas

Para calcular el lulgar de la hora:
7:00 -> 0
7:30 -> 1
8:00 -> 2
....
00:00 ->34

Si lo ponemos en minutos:
7*60= 420 -> 0
7*60+30 =450 -> 1
8*60= 480 -> 2
...
24*60= 1440 ->34

Para calcular el indice una hora devuelta en a consulta (hh:mm) puedes hace (hh*60+mm-420)/30 para obtener el indice dela matriz de horasocupadas.

Espero que te sirva de ayuda
 

IdasI4A

Active Member
Licensed User
Longtime User
Otra solución es usar listas en vez de matrices, tiene la ventaja de no tener que definir por adelantado cuantos elementos va a tener.
 

josejad

Expert
Licensed User
Longtime User
Otra posible solución sería un mapa.
Puedes tener en el mapa por ejemplo, como key la hora, y como value "true" o "false" si está ocupada o no.

saludos,
 

Piluso

Member
Licensed User
Buenas Tardes. @IdasI4A Las horas ocupadas las conozco porque la consulta las devuelve bien. Lo que me falta hacer es reflejar esa info en la grilla de horas. Pero me diste un par de datos que voy a probar en un rato.
@José J. Aguilar como es eso del mapa. Lo busco como "map" aquí en el foro?
 

josejad

Expert
Licensed User
Longtime User
@José J. Aguilar como es eso del mapa. Lo busco como "map" aquí en el foro?
Si, si lo pones, arriba del todo pone Object documentation: Map

 

Piluso

Member
Licensed User
Buenas tardes vuelvo con esto.
Porque la hora 07:30 que esta en la BBDD definida como time me devuelve el valor en tics 81000000.
Y cuando yo paso por codigo el texto "19:30" (DateTime.TimeParse(bn.Text) a tics me devuelve 1590273000000.
Estoy tratando de trabajar con las librerias de dateutils y tener todo en long, tambien tengo creados los mapas como dijo Jose (que me ayudaron mucho). Pero quedo siempre trabado en lo mismo.
En algun momento habia leido aca en el foro como hacer los calculos a mano para pasar de tics a dia/hora pero no lo encuentro ahora.
 

Piluso

Member
Licensed User
Bueno bueno. Paso a cerrar este hilo. Como le di mil vueltas y no encontré solución, no me quedo otra que crear una tabla en la BBDD con los horarios. Y ahora si puedo jugar con las condiciones.
Screenshot_20200523-181450[1].png

Ahora a seguir adelante y ver que pasa cuando hay mas de una reserva horaria o alguna reserva de varios dias de duración. Pero eso es mas solucionable ahora que tengo todos las datos en el mismo formato. :cool::cool::cool:

Cuando este terminado lo posteo asi le queda de ejemplo a alguien que le pueda dar uso.
Saludos
 

Piluso

Member
Licensed User
@José J. Aguilar , @IdasI4A Bueno al final encontré lo que quería. ?

Como yo queria guardar los días desde, hasta y las horas desde, hasta "n" veces. Lo mas práctico que pude hacer (despues de armar y desarmar codigo por 2 semanas) es sacar la idea de este ejemplo(http://kio4.com/b4a/26Blisttypemap.htm).
B4X:
    Type PorDia(DDD As Long, DHH As Long,HDD As Long,HHH As Long)
    Dim Reserva As PorDia
    Dim Lista As List
Asi puedo sacar el dato que quiera cuando quiera y lo uso para validar.
 
Top