Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 04-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 04-06-2004
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 04-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 05-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
ok muchas gracias

saludos
gracias lo intentare
Responder Con Cita
  #6  
Antiguo 05-06-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 08-06-2004
AbcXxx AbcXxx is offline
Miembro
 
Registrado: jun 2003
Posts: 50
Poder: 21
AbcXxx Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 08-06-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 09-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 09-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
Question 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
Responder Con Cita
  #11  
Antiguo 09-06-2004
AbcXxx AbcXxx is offline
Miembro
 
Registrado: jun 2003
Posts: 50
Poder: 21
AbcXxx Va por buen camino
rober, que tipo de campo es clave?
si es entero te podria servir esto:

where clave=strtoint(edit1.text)
Responder Con Cita
  #12  
Antiguo 09-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
Post 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
Responder Con Cita
  #13  
Antiguo 09-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #14  
Antiguo 10-06-2004
rober rober is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
rober Va por buen camino
Question 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
Responder Con Cita
  #15  
Antiguo 10-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:19:23.


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