Bucle Do While

150 views
Skip to first unread message

Anibal Alexander Carucí

unread,
Apr 13, 2021, 12:22:17 PM4/13/21
to Comunidad de Visual Foxpro en Español
Saludos estimados amigos, estoy tratando de realizar un horarios para citas medicas
hora inicial , hora final e intervalo, uso esta rutina, pero tengo un problema en momentos me funciona perfectamente pero en ocasiones aleatorias se queda colgado el bucle y genera el horario infinitamente, agradecido de su tiempo y si pueden orientarme el por qué del comportamiento i/o otra forma de atacar el procedimiento, gracias
Ejemplo
formato de hora en 12 h

hora inicio: 8:00
hora fin: 12:00
intervalo: 30

8:00 am - 8:30 am
8:30 am - 9:00 am
9:00 am - 9:30 am...
así sucesivamente

Hra_Inicio = thisform.txt_HI.Value 
Hra_Final = Thisform.txt_HF.Value 

***separamos la hora de Inicio en hora,minutos y segundos de la variable de entrada
xhora=SUBSTR(Hra_Inicio,1,2) 
xmin=SUBSTR(Hra_Inicio,4,2) 
xseg = SUBSTR(Hra_Inicio,7,2)
***separamos la hora Final en hora,minutos y segundos de la variable de entrada
xhoraF=SUBSTR(Hra_Final,1,2) 
xminF=SUBSTR(Hra_Final,4,2)  
xsegF = SUBSTR(Hra_Final,7,2)


Intervalo = VAL(thisform.txt_Intervalo.Value )

IF Intervalo = 0  then
   MESSAGEBOX("Debe indicar el Intervalo..",0+16,"Mensaje del Sistema")
   RETURN
ENDIF
  
 lcCodMedico = thisform.codmedico 
 lcCodTurno = thisform.codturno 
 lcDiaHoy = DATE()

*** convertimos la hora de inicio en formato de HORA
 tFHora = DATETIME(YEAR(DATE()),MONTH(DATE()),DAY(DATE()),VAL(xhora),VAL(xmin),VAL(xseg))
 resultado = TTOC(tFHora+0*60,2)
 
*** convertimos la hora Final en formato de HORA 
 tFHoraF = DATETIME(YEAR(DATE()),MONTH(DATE()),DAY(DATE()),VAL(xhoraF),VAL(xminF),VAL(xsegF))
 resultadoF = TTOC(tFHoraF+0*60,2)

** inicio del bucle para generar los intervalos

DO WHILE CTOT(resultado) <= CTOT(resultadoF) AND LASTKEY() <> 27
            tFHora = DATETIME(YEAR(DATE()),MONTH(DATE()),DAY(DATE()),VAL(xhora),VAL(xmin),VAL(xseg))
            **sumanos el intervalo solicitado por el usuario
            resultado = TTOC(tFHora+0*60,2)
           *se inserta el registro en la tabla
INSERT INTO tb_horarios VALUES(xCodHorario,;
lcCodMedico,;
resultado,;
0,;
lcCodTurno,;
lcDiaHoy,;
"1")
         
    ** separamos en hora,minuto y segundo la nueva hora ya con el intervalo sumado para acumular y sumar el siguiente intervalo
    resultado = TTOC(tFHora+Intervalo*60,2)
            xhora=SUBSTR(resultado,1,2)
            xmin=SUBSTR(resultado,4,2)
            xseg = SUBSTR(resultado,7,2)
           
ENDDO

Santiago Scheppmann León

unread,
Apr 13, 2021, 1:02:11 PM4/13/21
to publice...@googlegroups.com
Hola, no entiendo porque te complicas tanto, debes generar 1 tabla de fechas de calendario, 1er registro = 01/01/2021, 2do registro = 02/01/2021, etc etc.
Los campos son : campo1 = horario1 (de 8.00am a 8.20am), campo2 = campo2 = horario2 (de 8.25am a 8.45am),..., campo32 = feriado/domingo = si o no.
tabla de consultorios, campo1 = horarioX, campo2 = cupos horarioX (disponibles y tomados) , etc etc. 
Tabla de citas: paciente +  consultorio + horarioX. 
Por allí tengo todo el detalle, lo que te puse es a la memoria. 


--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/02992e30-0685-43e3-8a55-031fcb3a4724n%40googlegroups.com.

Luis Maria Guayan

unread,
Apr 13, 2021, 1:03:41 PM4/13/21
to Comunidad de Visual Foxpro en Español
Te aconsejo que siempre que tengas que trabajar con fechas y/u horas, uses variables DATETIME y evites tantas conversiones ya que según tengas configurado SET DATE, SET HOURS te pueden retornar valores ambiguos.

Mira este ejemplo que simple que sería:

ldDesde = DATETIME(2021,04,13,08,00,00)
ldHasta = DATETIME(2021,04,13,12,00,00)
lnIntervalo = 30 * 60 && en segundos

DO WHILE ldDesde < ldHasta
  lcIni = TTOC(ldDesde, 2)
  lcFin = TTOC(ldDesde + lnIntervalo, 2)
  ? lcIni + " a " + lcFin
  ldDesde = ldDesde + lnIntervalo
ENDDO

También te recomiendo leer este artículo que tiene algunos conceptos y funciones que te pueden ayudar.


Luis María Guayán
Tucumán, Argentina
_______________________________

Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

Anibal Alexander Carucí

unread,
Apr 13, 2021, 7:03:08 PM4/13/21
to Comunidad de Visual Foxpro en Español
Gracias por sus recomendaciones! bien recibidas siempre...
Reply all
Reply to author
Forward
0 new messages