Foros Club Delphi

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

BlueSteel 04-04-2008 00:40:07

se me ocurrio realizar lo sgte

Código Delphi [-]
   i : Integer;
   Ent1, Ent2, Ent3 : TTime;
   Sal1, Sal2, Sal3 : TTime;
begin
     i:= 1;
     For i:=1 to Marcado.RowCount-1 Do
         Begin
               If Marcado.Rows[i][2] = ' ' Then Ent1 := StrToTime('0') Else Ent1 := StrToTime(Marcado.Rows[i][2]);
               If Marcado.Rows[i][3] = ' ' Then Sal1 := StrToTime('0') Else Sal1 := StrToTime(Marcado.Rows[i][3]);
               If Marcado.Rows[i][4] = ' ' Then Ent2 := StrToTime('0') Else Ent2 := StrToTime(Marcado.Rows[i][4]);
               If Marcado.Rows[i][5] = ' ' Then Sal2 := StrToTime('0') Else Sal2 := StrToTime(Marcado.Rows[i][5]);
               If Marcado.Rows[i][6] = ' ' Then Ent3 := StrToTime('0') Else Ent3 := StrToTime(Marcado.Rows[i][6]);
               If Marcado.Rows[i][7] = ' ' Then Sal3 := StrToTime('0') Else Sal3 := StrToTime(Marcado.Rows[i][7]);
               Marcado.Rows[i][8] := IntToStr(MinutesBetween(Sal1,Ent1)+ MinutesBetween(Sal2,Ent2)+ MinutesBetween(Sal3,Ent3));
         End;

pero igual me esta dando el sgte error

el problema de esto es que hay dias en que no se marca tarjeta... u otras personas marcan solo 2 veces al día.. y otros 4 o 6 veces al día segun corresponda...



raised exception class EConvertError with message "' is not a valid time'.

Bueno..igual seguiré intentando...

Salu2

jhonny 04-04-2008 00:47:52

Mira, seguramente te servirá el siguiente ejemplo que acabo de probar:

- Coloca dos TDateTimePicker en el Form, sus propiedades Kind en dtkTime y un botón con el siguiente código en su OnClick:

Código Delphi [-]
ShowMessage(FormatDateTime('HH:MM:SS', DateTimePicker2.Time-DateTimePicker1.DateTime));

Y Listo, veras como funciona de bonito sin complicarte tanto la vida ;).

BlueSteel 04-04-2008 01:19:49

Cita:

Empezado por Caral (Mensaje 277484)
Hola
Ahora veo lo que estas haciendo, es algo asi.
Saludos


Si tienes razon... el problema es que los datos los capturo de un reloj control biometrico de estos

entonces los datos que capturo son del sgte formato

Código:


1 01005 20080218 1519
1 02003 20080218 1525
1 01012 20080218 1525
0 01012 20080218 1526
1 06012 20080218 1533
1 06014 20080218 1535
1 02001 20080218 1537
0 02010 20080218 1538
0 02011 20080218 1538
1 02019 20080218 1544
1 01012 20080218 1749
0 06012 20080218 1821
0 06014 20080218 1822

donde :

la primera columna es el tipo de entrada
0 -> salida
1 -> entrada

la segunda columna es la ficha del trabajador
la tercera columna es la fecha
la cuarta columna es la hora

entonces eso lo traspaso a un tabla de SQL... (Horario) y se me almacena de la sgte forma

Hor_Numero -> Numero autoincremental
Per_Nro -> ficha del trabajador
Hor_Tipo -> Tipo de marcado (1 Entrada / 0 Salida )
Hor_Fecha -> Fecha y hora de marcado

para rescatar los datos de un trabajador en especifico realizo una consulta así.. ej. Ficha 1015

Código SQL [-]
Select Per_Nro, Hor_Tipo, 
       CONVERT(Char(10), Hor_Fecha, 103) As Fecha, 
       CONVERT(Char(8), Hor_Fecha, 108) As Hora
From Horario
Where Per_Nro=1015
Order By Fecha, Hora

con el siguiente codigo... traspaso los datos a un StringGrid... con el sgte formato:

Dia Semana / Fehca / ent 1 / sal 1 / ent 2 / sal 2 / ent 3 / sal 3 / total hras

el sgte codigo me genera un StringGrid de x Fila segun el rango de fecha que se haya señalado.. y además, me va agregando la el dia de la semana y la fecha en la primera y segunda columna del stringgrid

Código Delphi [-]
     Marcado.RowCount :=  Trunc(vFecH.Date - vFecD.Date)+2;
     i:= 1;
     For i:=1 to Marcado.RowCount-1 Do
         Begin
         Marcado.rows[i][0] := FormatDateTime('ddd', (Trunc(vFecD.Date-1)+i));
         Marcado.rows[i][1] := DateToStr(Trunc(vFecD.Date-1)+i);
         End;

despues si ejecuto este codigo me empieza a buscar segun la ficha ingresada y segun la fecha de la columna fecha del StringGrid.. los datos y los va distribuyendo dentro del StringGrid

Código Delphi [-]
     i:= 1;
     For i:=1 to Marcado.RowCount-1 Do
         Begin
              Datos.AQ_Horario.First;
              While Not Datos.AQ_Horario.Eof Do
              Begin
                   if Datos.AQ_Horario['Fecha'] = StrToDAte(Marcado.Rows[i][1]) Then
                   If Datos.AQ_Horario['Hor_Tipo'] = 0 Then
                      Begin
                           if Marcado.Rows[i][3] = '' Then
                              Marcado.Rows[i][3] := Datos.AQ_Horario['Hora']
                           Else
                           if Marcado.Rows[i][5] = '' Then
                              Marcado.Rows[i][5] := Datos.AQ_Horario['Hora']
                           Else
                              Marcado.Rows[i][7] := Datos.AQ_Horario['Hora'];
                      End
                   Else
                      Begin
                           if Marcado.Rows[i][2] = '' Then
                              Marcado.Rows[i][2] := Datos.AQ_Horario['Hora']
                           Else
                           if Marcado.Rows[i][4] = '' Then
                              Marcado.Rows[i][4] := Datos.AQ_Horario['Hora']
                           Else
                              Marcado.Rows[i][6] := Datos.AQ_Horario['Hora'];
                      End;
                   Datos.AQ_Horario.Next;
              End;
         End;

eso me entrega un resultado como el de la sgte imagen



como veras pueden haber dias que no tenga nada de marcado.. otros que solo han marcado 4 veces.. y otros seis veces...

Salu2:p:D

PS: estube revisando tu programa.. me parece genial.. pero tu de antemano le pides si marca 1, 2 , 3 o 4...

gonza_619 18-11-2010 15:37:53

bueno mi pregunta es , como hora pero con segundos siempre en 00 sin tener q cambiarlo utilizando un dtpicker?, yo en la propiedad format del dtpicker coloq: HH:mm pero al gaurdar simpre em guarda con segundos en 52 y quisisera q lo guarde en 00 simpre, gracias a todos

jachguate 18-11-2010 23:11:54

Revisá la hora con la que inicia el componente. Seguramente esta tiene los 52 segundos (1:14:52), como el usuario solo puede cambiar horas y minutos, esto queda constante.

Otra opción es que trunques "a mano" los segundos que pueda traer... por ejemplo:

Código Delphi [-]
uses DateUtils;

function TruncateSeconds(const AValue: TDateTime): TDateTime;
begin
  Result := AValue - SecondOf(AValue) / SecsPerDay;
end;

Podrías probar la función así:

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
begin
  Label1.Caption := DateTimeToStr(Now) + ' => ' + DateTimeToStr(TruncateSeconds(Now));
  Label2.Caption := DateTimeToStr(DatePicker1.DateTime) + ' => ' + DateTimeToStr(TruncateSeconds(DatePicker1.DateTime));
end;

Saludos.


La franja horaria es GMT +2. Ahora son las 19:22:33.

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