Solicitud de Calculo de Diferencias de Hora.

1,640 views
Skip to first unread message

stallman stallman

unread,
Apr 28, 2011, 8:14:26 PM4/28/11
to publice...@googlegroups.com
Buenas Tardes Señores!

- Perdonen la molestia y si no es mucho el Abuso quisiera Favor si alguien tiene un ejemplo de cómo puedo calcular la diferencia entre dos Horas ingresadas por un usuario; por ejemplo: como los que se utiliza para los parqueos de Autos:

- Hora Entrada: 10:00 am
- Hora Salida:   10:45 am

Resultado:  0 Horas, 45 minutos

* Les agradezco de antemano toda la ayuda.
Gracias

Walter R. Ojeda Valiente

unread,
Apr 28, 2011, 8:42:41 PM4/28/11
to publice...@googlegroups.com
Lo más sencillo que puedes hacer es convertir todo a minutos, luego divides por 60 (división entera, por supuesto). El cociente te dará las horas y el resto te dará los minutos.

HORAENTRADA = "10:00"
HORASALIDA  = "10:45"

HE = VAL(LEFT(HORAENTRADA, 2))
HS = VAL(LEFT(HORASALIDA , 2))

ME = VAL(RIGHT(HORAENTRADA, 2))
MS = VAL(RIGHT(HORASALIDA , 2))

TE = HE * 60 + ME     && Convierte a minutos
TS = HS * 60 + MS     && Convierte a minutos

CH = INT((TS - TE) / 60)     && Cantidad de horas
CM = TS - TE - CH * 60       && Cantidad de minutos, también se podría haber escrito: CM = (TS - TE) % 60

Saludos.

Walter.



Date: Thu, 28 Apr 2011 18:14:26 -0600
Subject: [vfp] Solicitud de Calculo de Diferencias de Hora.
From: stall...@gmail.com
To: publice...@googlegroups.com

stallman stallman

unread,
Apr 28, 2011, 9:03:22 PM4/28/11
to publice...@googlegroups.com
Muy amable Walter, muchas gracias.

- Entonces las variables las puedo declarar de la siguiente manera?:

PRIVATE HORAENTRADA AS Integer
PRIVATE HORASALIDA AS Integer
PRIVATE HE AS Integer
PRIVATE HS AS Integer
PRIVATE ME AS Integer
PRIVATE MS AS Integer
PRIVATE TE AS Integer
PRIVATE TS AS Integer
PRIVATE CH AS Integer
PRIVATE CM AS Integer

Walter R. Ojeda Valiente

unread,
Apr 28, 2011, 9:29:48 PM4/28/11
to publice...@googlegroups.com
¿Por qué PRIVATE? Mejor sería declararlas como LOCAL, salvo que debas usarlas en algún sub-procedimiento.

Saludos.

Walter.




Date: Thu, 28 Apr 2011 19:03:22 -0600
Subject: Re: [vfp] Solicitud de Calculo de Diferencias de Hora.
From: stall...@gmail.com
To: publice...@googlegroups.com

Walter R. Ojeda Valiente

unread,
Apr 28, 2011, 9:30:53 PM4/28/11
to publice...@googlegroups.com
Otra cosa, HORAENTRADA y HORASALIDA son de tipo caracter, no entero.

Saludos.

Walter.

stallman stallman

unread,
Apr 28, 2011, 10:40:24 PM4/28/11
to publice...@googlegroups.com
Ok, de acuerdo! Gracias.

Luis Maria Guayan

unread,
Apr 29, 2011, 10:19:24 AM4/29/11
to publice...@googlegroups.com
Te copio un mensaje antiguo:

Lo primero que hay que preguntarse es: ¿Que periodo de tiempo quieres restar? ¿Las horas corresponden al mismo día?

Si el periodo de tiempo es corto y las horas pertenecen al mismo día, puedes utilizar las sig. funciones:

*--------------------------------------------------------------------------
* FUNCTION Seg2Hor(nSegundos)
*--------------------------------------------------------------------------
* Transforma segundos a formato hhHH:MM:SS
* USO: Seg2Hor(nSegundos)
* EJEMPLO: Seg2Hor(35000)
* RETORNA: Caracter 'HH:MM:SS'
* AUTOR: LMG
*--------------------------------------------------------------------------
FUNCTION Seg2Hor(nSegundos)
LOCAL lnHoras, lnMinutos, lnSegundos
lnHoras = INT(nSegundos/3600)
lnMinutos = INT(((nSegundos-(lnHoras*3600))/60))
lnSegundos = MOD(nSegundos,60)
RETURN IIF(lnHoras<100,TRANSFORM(lnHoras,"@L 99"),TRANSFORM(lnHoras,"@L 9999")) +":"+ ;
TRANSFORM(lnMinutos,"@L 99")+":"+ ;
TRANSFORM(lnSegundos,"@L 99")
ENDFUNC

*--------------------------------------------------------------------------
* FUNCTION Hor2Seg(cHora)
*--------------------------------------------------------------------------
* Transforma HH:MM:SS a segundos transcurridos desde
* la medianoche
* USO: Hor2Seg('hh:mm:ss')
* EJEMPLO: Hor2Seg('12:45:00')
* RETORNA: numérico
* AUTOR: LMG
*--------------------------------------------------------------------------
FUNCTION Hor2Seg(cHora)
RETURN VAL(RIGH(cHora,2)) + ;
VAL(SUBSTR(cHora,4,2))*60 + ;
VAL(LEFT(cHora,2))*3600
ENDFUNC

Para realizar la resta deberias hacer:

cHora1 = "10:10:50"
cHora2 = "19:15:30"
? Seg2Hor(Hor2Seg(cHora2)-Hor2Seg(cHora1))

Si las horas pertenecen a distintos días, si o si deberás utilizar variables tipo FechaHora y obligar al usuario a ingresarlas. La resta de variables FechaHora te retorna la cantidad de segundos, que puedes transformar al formato HH:MM:SS con la funci n Seg2Hor()

tFH1 = DATETIME(2006,08,09,23,15,45)
tFH2 = DATETIME(2006,08,10,12,05,33)
? Seg2Hor(tFH2-tFH1)

Para mostrar solo la hora de una variable DateTime utiliza:

tFH1 = DATETIME(2006,08,09,23,15,45)
? TTOC(tFH1,2)

Revisa el siguiente artículo que allí está bastante detallado todo este asunto:

-- Trabajar con fechas y horas en Visual FoxPro --
http://www.portalfox.com/article.php?sid=1162

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

stallman stallman

unread,
Apr 29, 2011, 4:25:14 PM4/29/11
to publice...@googlegroups.com
Muchas Gracias Don Luis.
Te agradezco profundamente la labor altruista que ejerces cada día.
 
- Te comento que soy novato en éste ambiente y si pudieras explicarme algunas situaciones como las que te menciono te lo agradecería más:
 
1- Según visto en algunos foros, las funciones se construyen en los archivos llamados *.prg , es ésto sumamente necesario para su funcionalidad?
2- Las diferencias de periodos de tiempo que necesito calcular son diariamente y por lo general cortos, es posible que la función realice los cálculos manejando 12 horas y no 24?
3- Cómo asocio, envoco y utilizo la función dentro del Form y la relaciono con los distintos objetos para ponerla a trabajar (No se cómo se hace ésto)?
4- Las horas utilizadas no se necesita que lleven segundos, es necesario aun utilizar variables tipo DataTime?
 
* Las disculpas del caso si abuso de tu conocimiento o si causo atraso en tu importante labor.
 
Mil Gracias.

stallman stallman

unread,
Apr 30, 2011, 9:09:59 PM4/30/11
to publice...@googlegroups.com

Trento

unread,
May 1, 2011, 1:33:38 AM5/1/11
to Comunidad de Visual Foxpro en Español
Apoyando un poco de lo mucho que siempre nos ha apoyado Luis María:

1- Según visto en algunos foros, las funciones se construyen en los
archivos
llamados *.prg , es ésto sumamente necesario para su funcionalidad?

R1: Si es una función que no es específica a un sólo proceso de tu
sistema, SÍ.
Es conveniente, porque de esta manera la podrás utilizar en varios
procesos o incluso varios sistemas. En este caso, te recomiendo que
sea un .prg, el cuál podrás tener a la mano siempre que quieras.
Si fuera lo contrario, es decir, una función que se aplica única y
exclusivamente y a un proceso en particular, puedes optar porque sea
un .prg (como ya hemos visto) o bien incluirlo en dicho proceso. Eso
lo vimos, por ejemplo, con tu duda de los textbox y cómo creamos un
método en el formulario que únicamente sirve para devolver determinada
información.

2- Las diferencias de periodos de tiempo que necesito calcular son
diariamente y por lo general cortos, es posible que la función realice
los
cálculos manejando 12 horas y no 24?

R2: Sería bueno que mostraras cómo ingresan el dato de hora tus
usuarios (ya, que no es respuesta sino sugerencia)

3- Cómo asocio, envoco y utilizo la función dentro del Form y la
relaciono
con los distintos objetos para ponerla a trabajar (No se cómo se hace
ésto)?

R3: Si la definiste como .prg, tanto Walter como Luis María ya te han
dado ejemplos

HORAENTRADA = "10:00"
cHora1 = "10:10:50" && Imagina que cualquier de éstos es el valor
de txtHoraInicio

HORASALIDA = "10:45"
cHora2 = "19:15:30" && Y cualquiera de éstos el de txtHoraTermino

4- Las horas utilizadas no se necesita que lleven segundos, es
necesario aun
utilizar variables tipo DataTime?

R4: Si como dices, pertences al mismo día, no es necesario.


Saludos.

stallman stallman

unread,
May 1, 2011, 2:07:07 AM5/1/11
to publice...@googlegroups.com
Muy amable y servicial estimado Trento.

Muchas gracias por las respuestas, creo no tener más dudas con respecto a éste.

Saludos.

German Montini

unread,
May 1, 2011, 3:38:53 AM5/1/11
to publice...@googlegroups.com
Hola, Estoy experimentando de hacer un sistema con visual foxpro, y conexión con mysql, el tema es que estoy viendo como hacer el form de busqueda de algún registro de una tabla que contiene registros maestros, querria saber si la conexión la hago en esa pantalla?, traigo todos los registros que coincidan con el campo de busqueda?.
 Muchas Gracias.
Germán Montini
Analista de sistemas
Tucumán - Argentina.

Douglas Sánchez Guillén

unread,
May 1, 2011, 12:01:21 PM5/1/11
to publice...@googlegroups.com
Hola n mi caso yo utilizo un form,  e la parte de arriba pongo   referenica cheques, beneficiario 

esas tres columnas las muestro en una grid,

una etiqueta Buscar por + el caption de optiongroup,   textbox     en interativechege pongo el codigo

if op1.op1 =1
varcodigo =   '%' this.valuer +'%'
text to ccadena noshow
   select * from tabla where cheque like  ?varcodigo 
endtext
endif

if op1.op1 =1
varcodigo =   '%' this.valuer +'%'
text to ccadena noshow
   select * from tabla where beneficiario like  ?varcodigo 
endtext
endif
r1 = sqlexec(nhandle, ccadena,'tmpresult')

saludes espero te sirva la ideita, si quieres un ejemplo concreto y no entiendes avisame y te paso un form de ejemplo.

saludes.

--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Walter R. Ojeda Valiente

unread,
May 1, 2011, 2:00:05 PM5/1/11
to publice...@googlegroups.com
Hola Germán

No, lo conveniente es que la conexión la abras al empezar tu aplicación y la cierres al finalizar tu aplicación.

La excepción a esa regla es si la conexión será por Internet y tiene frecuentes caídas. En este caso lo recomendable es conectarse-efectuar la operación-desconectarse.

Por otro lado, cuando traigas registros desde el Servidor es buena práctica traer la menor cantidad posible. En general, más de 100 ya es mucho y el límite máximo aceptado en la buena programación Cliente/Servidor es de 200. Si llegas a traer más de 200 estás programando mal, no has entendido Cliente/Servidor.

Puedes leer el siguiente documento, llamado "Visual FoxPro y Firebird SQL.PDF" para aclarar algunos conceptos:

http://www.mediafire.com/?nb74e3oaf9g9l4j

Y si quieres ver una aplicación demo con los programas fuente y la documentación que muestra en forma práctica como usar Cliente/Servidor puedes descargar SQL_DEMO desde:

http://www.mediafire.com/?dugbqkqt4tx6bdl

Saludos.

Walter.




From: gmon...@hotmail.com
To: publice...@googlegroups.com
Subject: [vfp] Busqueda de registros
Date: Sun, 1 May 2011 04:38:53 -0300

German Montini

unread,
May 2, 2011, 11:19:15 AM5/2/11
to publice...@googlegroups.com
Walter, realmente te agradezco, bajé el demo, y leí el archivo pdf, muy buen explicado, muchas gracias.
Germán Montini
Analista de sistemas
Tucumán - Argentina
Reply all
Reply to author
Forward
0 new messages