Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   sumar horas (https://www.clubdelphi.com/foros/showthread.php?t=11041)

rober 03-06-2004 23:40:45

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"

roman 04-06-2004 04:32:21

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:

Código SQL [-]
select
  sum(
    (
      3600*extract(hour from salida1) +
      60*extract(minute from salida1) +
      extract(second from salida1)
    )
    -
    (
      3600*extract(hour from entrada1) +
      60*extract(minute from entrada1) +
      extract(second from entrada1)
    )
  )
  +
  sum(
    (
      3600*extract(hour from salida2) +
      60*extract(minute from salida2) +
      extract(second from salida2)
    ) -
    (
      3600*extract(hour from entrada2) +
      60*extract(minute from entrada2) +
      extract(second from entrada2)
    )
  )
  as total
from
  tabla
where
  clave = 125

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:

Código Delphi [-]
var
  T, H, M, S: Integer;
  Time: TTime;

begin
  T := Query1['total'];

  H := T div 3600;
  M := (T mod 3600) div 60;
  S := (T mod 3600) mod 60;

  Time := EncodeTime(H, M, S, 0);
end;

Para sacar el total de sólo unos días puedes añadir el rango de fechas a la condición WHERE.

// Saludos

Sotrono 04-06-2004 04:33:24

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...

roman 04-06-2004 04:39:36

Cita:

Empezado por Sotrono
En vez de sumar las horas trabajadas te conviene usar un Timer que aumente cada un segundo una variable en 1.

Esta es buena idea sobre todo por aquello de que el empleado pueda alterar la hora de la pc. Lo único es que sólo funcionará si el "checador" está en cada máquina. Si por el contrario se trata de una sola pc en la que los empleados registran su entrada y salida entonces tendrá que pensarse otro mecanismo.

// Saludos

rober 05-06-2004 01:37:59

ok muchas gracias
 
saludos
gracias lo intentare

Mick 05-06-2004 23:08:50

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

AbcXxx 08-06-2004 01:04:37

Cita:

Originalmente publicado por Mick
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.
Esto seria correcto siempre y cuando no se reinicie el ordenador.

Mick 08-06-2004 10:31:23

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

rober 09-06-2004 00:56:55

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

rober 09-06-2004 01:05:42

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

AbcXxx 09-06-2004 17:34:30

rober, que tipo de campo es clave?
si es entero te podria servir esto:

where clave=strtoint(edit1.text)

rober 09-06-2004 22:55:54

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

roman 09-06-2004 23:25:33

Cita:

Empezado por rober
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.

La condición del WHERE debe verse así:

Código SQL [-]
where
  clave = :numero

Al anteponer ':' al identificador 'numero' estableces que será un parámetro y le asignas un valor así:

Código Delphi [-]
Query1.ParamByName('numero').AsInteger := StrToInt(Edit1.Text);

Desde luego, en lugar de 'numero' puedes ponerle cualquier nombre que desees al parámetro.

// Saludos

rober 10-06-2004 01:14:49

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

roman 10-06-2004 01:30:57

Cita:

Empezado por rober
oye pero esta ultima linea donde la pongo

En cualquier lugar con tal de que sea antes de ejecutar la consulta.

// Saludos


La franja horaria es GMT +2. Ahora son las 21:58:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi