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:
|
#8
|
|||
|
|||
Que se reinicie el ordenador es algo que afecta a cualquier sistema que utilices sea gettickcount o la hora o lo que se te ocurra.
Si se reinicia el ordenador el programa que controla el tiempo se cerrará con lo que se sumara al tiempo total el tiempo que estuviese el programa en ejecucion, y este tiempo total se guardará en algun sistema permanente como una base de datos, etc. Cuando el ordenador vuelva a arrancar y el programa de control vuelva a ejecutarse se volverá a contar un nuevo período de uso. Saludos |
#9
|
|||
|
|||
gracias
Muchas gracias a todos
ya lo logre, nadamas me faltan hacer algunos arreglos y listo pero si surgen ideas nuevas por favor pongalas. saludos |
#10
|
|||
|
|||
otra duda...
roman...
como le hago para que en vez de pedir los registros con clave=125, que me muestre todos los registros que sean iguala un valor asignado por el ususario. me omagino que debe de ser algo asi: select ... ... ... ... from tabla where clave=edit1.text pero ma sale error ayuda porfavor gracias saludos |
#11
|
|||
|
|||
rober, que tipo de campo es clave?
si es entero te podria servir esto: where clave=strtoint(edit1.text) |
#12
|
|||
|
|||
estoy dentro de un query
ya le puse eso, pero me sale error, no sera porque el codigo esta dentro strings de un query y a lo mejor noda mas me deja ejecutar unicamente comandos de sql y no de delphi.
gracias saludos |
#13
|
||||
|
||||
Cita:
Al anteponer ':' al identificador 'numero' estableces que será un parámetro y le asignas un valor así:
Desde luego, en lugar de 'numero' puedes ponerle cualquier nombre que desees al parámetro. // Saludos |
#14
|
|||
|
|||
gracias
oye pero esta ultima linea donde la pongo, en que parte del codigo de delphi
Query1.ParamByName('numero').AsInteger := StrToInt(Edit1.Text); al iniciar la forma, en un button, en donde saludos |
#15
|
||||
|
||||
Cita:
// Saludos |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|