FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
sumar horas
hola, ojala y me pudieran ayudar a resolver mi problema...
hice un checador y necesito hacer reportes de las horas de trabajo de un empleado. tengo una tabla e paradox con los siguientes campos: clave entrada1 salida1 entrada2 salida2 total *nota: la primer salida es el receso la 2 entrada es la entrada del receso por ejemplo tengo los siguientes valores en esta tabla: clave fecha entrada1 salida1 entrada2 salida2 total 125 02/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 ¿como le hago para sacar el total de horas trabajadas en ese dia? y tambien necesito sumar los totales de por ejemplo dos dias, como le hago para sumar los totales sin que se recorran, por ejemplo para tratar de calular esto lo que hice fue darle valores a el campo total directamente. ejemplo supongamos que el campo total ya fue calculado y tenemos lo siguiente: clave_ fecha_____entrada1__salida1_entrada2__salida2__total___ 125 02/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 04:40:00 125 03/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 04:40:00 125 04/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 04:40:00 125 05/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 04:40:00 125 06/05/2004 14:00:00 16:00:00 16:20:00 19:00:00 04:40:00 ahora necesito sacar el total. esto fue lo que hice: for x:=0 to query1.RecordCount do begin //query1.recno:=x; hora:=hora+(Query1TOTAL.value); query1.next; end; edit3.Text:=timetostr(hora); y me aparece como resultado en el edit 4:00 y deberia de salir 23:40 pero si cambio el valor inicial de la 'x' a 1 me aparece 23:20 entonces no se que esta pasando y esto me urge. espero poder contar con su valiosa ayuda y asi aporvecho pedireles a todo este mundo de programcion mil disculpas por las faltas que cometi sin querer, espero comprendan que estoy empezando en este aunque no es escusa, la verdad si me senti mal, gracias por enseñarme a respetar y a leer, aunque no fue mi intencion ser irrespetuoso pero asi me senti el dia de hoy. "Luchar para aprender" Última edición por rober fecha: 03-06-2004 a las 23:44:58. Razón: me falto especificar algo |
#2
|
||||
|
||||
Me parece que lo mejor sería hacer una consulta SQL que se encargue de realizar las cuentas y así evitas tener que recorrer todos los registros.
El cómo se haga la consulta dependerá de la base de datos que uses ya que algunas disponen de más funciones que otras para manejar horas. En el peor de los casos, Paradox, podrías hacer algo como:
que te devolvería un único registro con un campo cuyo valor sería el número total de segundos. Una vez que leas este valor puedes entonces descomponerlo en sus partes y pasarlo a una variable TTime:
Para sacar el total de sólo unos días puedes añadir el rango de fechas a la condición WHERE. // Saludos |
#3
|
||||
|
||||
En vez de sumar las horas trabajadas te conviene usar un Timer que aumente cada un segundo una variable en 1.
Cuando el empleado ingresa, activas el timer, en el receso lo paras, luego lo activas cuando entra, y lo paras vuando sale. De esta forma te queda almacenado en la variable la cantidad de segundos que trabajo. En el evento OnTimer del Timer pones: seg:= seg+1; //Con esto se almacena la cantidad de segundo trabajados Para que te queden la cantidad de horas, minutos y segundos pones en el mismo evento: if seg>=60 then begin min:=min+1; seg:=0; end; if min>=60 then begin hor:=hor+1; min:=0; end; Para expresar la cantidad de horas trabajadas(usando TTable): Table1.FieldByName('Total').AsString:= IntToStr(hor)+':'+IntToStr(min)+':'+IntToStr(seg); Nunca use TQuery el codigo es para un TTable. Te queda a vos traducirlo. Espero que te sirva... |
#4
|
||||
|
||||
Cita:
// Saludos |
#5
|
|||
|
|||
ok muchas gracias
saludos
gracias lo intentare |
#6
|
|||
|
|||
El uso de un timer es muy impreciso , y muchisimo mas si se usa del modo que se ha sugerido, segun en que se esté usando el ordenador puedes tener un error desde un 5% hasta infinito. No es de recibo que un programa que controla a un empleado afirme que ha trabajado 3 horas cuando en realidad ha trabajado 4.
Lo mas sencillo es llamar a GetTickCount cuando se entra (da el tiempo que lleva encendido el equipo en milisegundos), volver a llamarlo cuando se sale y restar los dos valores. Al Entrar: Inicio:= GetTickCount Al Salir Fin:= GetTickCount; TiempoTotalEnMilisegundos:= TiempoTotalEnMilisegundos + (Fin - Inicio); Saludos |
#7
|
|||
|
|||
Cita:
|
|
|
|