Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Exclamation Funcion para obtener los minutos entre 2 Horas

Saludos amigos, resulta que estoy haciendo un modulo para controlar la asistencia de docentes en un Centro Pre Universitario, este modulo permitirá calcular los salarios de dichos docentes.

Tengo una tabla con los horarios del Docente:

Código SQL [-]
CREATE TABLE `horario` (
  `id_horario` int(11) NOT NULL,
  `iddocente_fk` int(11) DEFAULT NULL,
  `idcurso_fk` int(11) DEFAULT NULL,
  `id_dia` smallint(6) DEFAULT NULL,
  `hora_ini` time DEFAULT NULL,
  `hora_fin` time DEFAULT NULL,
  PRIMARY KEY (`id_horario`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Y Tengo una tabla para registrar las asistencias de los docentes:

Código SQL [-]
CREATE TABLE `doc_asistencia` (
  `id_asistdocente` int(11) NOT NULL,
  `iddocenteOrig_fk` int(11) DEFAULT NULL,
  `iddocenteReemplazante_fk` int(11) DEFAULT NULL,
  `idcurso_fk` int(11) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  `nombreDia` varchar(15) DEFAULT NULL,
  `hora_entrada` time DEFAULT NULL,
  `hora_salida` time DEFAULT NULL,
  `mindif_entrada` int(11) DEFAULT NULL,
  `mindif_salida` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_asistdocente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Como puede verse aqui: Necesito grabar la hora de entrada tomando la hora del equipo y calcular la diferencia en minutos de la hora tomada del sistema con la hora de inicio de su horario, ejemplo:

Hora del Sistema: 14:02:00
Hora de Inicio Horario Docente: 14:00:00

La rutina debería arrojar -2 min (negativo) dado que se esta registrando pasados dos minutos de su hora de ingreso. Mientras que:

Hora del Sistema: 13:57:00
Hora de Inicio Horario Docente: 14:00:00

La rutina debería arrojar 3 min (positivo).

Intente usando la función HourSpan() pero no arroja el valor negativo como deseo: Aqui les muestro mi rompecabezas de codigo:

Código Delphi [-]
procedure TfrmAsistDocentes.lstHorarioActivoClick(Sender: TObject);
var
  horaIni, horaFin, horaActual: string;
  posPunto, difMinutos:integer;
begin
  if lstHorarioActivo.ItemIndex<>-1 then
  begin
    posPunto:=pos('.',lstHorarioActivo.Items[lstHorarioActivo.ItemIndex]);
    idHorarioSelected:=StrToInt(Copy(lstHorarioActivo.Items[lstHorarioActivo.ItemIndex],0,posPunto-1));
    dm.q_HorarioXID.Close;
    dm.q_HorarioXID.Params[0].AsInteger:=idHorarioSelected;
    dm.q_HorarioXID.Open;

    if(length(dm.q_HorarioXID.FieldByName('hora_ini').AsString)>0)then
    begin
      horaIni:=dm.q_HorarioXID.FieldByName('hora_ini').AsString;
      horaFin:=dm.q_HorarioXID.FieldByName('hora_fin').AsString;
      horaActual:=TimeToStr(Now);
     // if StrToTime(horaActual)-StrToTime(horaIni)>0 then
        difMinutos:=HourSpan(StrToTime(horaActual),StrToTime(horaIni));
      //else
      //  difMinutos:=MinutesBetween(StrToTime(horaActual),StrToTime(horaIni))*-1;

      if difMinutos>=0 then
        lblDifMinutos.Font.Color:=clBlue
      else
        lblDifMinutos.Font.Color:=clRed;
      lblDifMinutos.Caption:=IntToStr(difMinutos) + ' min.';
      if difMinutos>5 then
        btnRegistrarAsistDoc.Enabled:=False
      else
        btnRegistrarAsistDoc.Enabled:=True;
    end;
  end;

end;

Les agradecería mucho apoyo con este problema, pues ya me quede sin ideas.

Un Abrazo
Responder Con Cita
  #2  
Antiguo 12-08-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Saludos,

Yo lo haría así:
Código Delphi [-]
var
  difMinutos: Extended;
...
Código Delphi [-]
  if not dm.q_HorarioXIDhora_ini.IsNull then
  begin
    difMinutos := Time() - dm.q_HorarioXIDhora_ini.AsDateTime; // TO-DO: Cambiar Time() por consulta a la bd trayendo CURRENT_TIMESTAMP.

    if difMinutos >= 0 then
    begin
      lblDifMinutos.Font.Color := clBlue;
    end
    else
    begin
      lblDifMinutos.Font.Color := clRed;
    end;

    lblDifMinutos.Caption := FormatDateTime('-hh:nn:ss.zzz', difMinutos);

    btnRegistrarAsistDoc.Enabled := (difMinutos > 5);
  end;
Pero como no sé qué versión de Delphi, ni qué componentes de acceso a base datos usa, pues puedo estar muy equivocado.

De todas maneras, espero que le sirva para guiarse.
-
__________________
"constructive mind, destructive thoughts"

Última edición por TOPX fecha: 12-08-2016 a las 22:34:58. Razón: Formato.
Responder Con Cita
  #3  
Antiguo 12-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Detalles

Gracias TOPX, aqui te doy detalles de mi plataforma de desarrollo:

Delphi: 10.1 Berlin
Data Access: UniDAC 6.2.8

La pantalla con el codigo que me suministraste:

https://s10.postimg.org/ceslputeh/scr.jpg

Pero no puedo interpretar el resultado que obtuve.

Te agradecería tu ayuda amigo.

Saludos
Responder Con Cita
  #4  
Antiguo 12-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Detalles

Gracias TOPX, aqui te doy detalles de mi plataforma de desarrollo:

Delphi: 10.1 Berlin
Data Access: UniDAC 6.2.8

La pantalla con el codigo que me suministraste:

https://s10.postimg.org/ceslputeh/scr.jpg

Pero no puedo interpretar el resultado que obtuve.

Aqui esta el codigo:

Código Delphi [-]
procedure TfrmAsistDocentes.lstHorarioActivoClick(Sender: TObject);
var
  horaIni, horaFin, horaActual: string;
  posPunto:integer;
  difMinutos:extended;
begin
  if lstHorarioActivo.ItemIndex<>-1 then
  begin
    posPunto:=pos('.',lstHorarioActivo.Items[lstHorarioActivo.ItemIndex]);
    idHorarioSelected:=StrToInt(Copy(lstHorarioActivo.Items[lstHorarioActivo.ItemIndex],0,posPunto-1));
    dm.q_HorarioXID.Close;
    dm.q_HorarioXID.Params[0].AsInteger:=idHorarioSelected;
    dm.q_HorarioXID.Open;

    if(length(dm.q_HorarioXID.FieldByName('hora_ini').AsString)>0)then
    begin
      if radEntrada.Checked then
        difMinutos:=Time() - dm.q_HorarioXID.FieldByName('hora_ini').AsDateTime;

      if radSalida.Checked then
        difMinutos:=Time() - dm.q_HorarioXID.FieldByName('hora_fin').AsDateTime;

      if difMinutos>=0 then
        lblDifMinutos.Font.Color:=clBlue
      else
        lblDifMinutos.Font.Color:=clRed;
      lblDifMinutos.Caption:=FormatDateTime('-hh:nn:ss.zzz', difMinutos) + ' min.';
      if difMinutos>5 then
        btnRegistrarAsistDoc.Enabled:=False
      else
        btnRegistrarAsistDoc.Enabled:=True;
    end;
  end;

end;

Te agradecería tu ayuda amigo.

Saludos
Responder Con Cita
  #5  
Antiguo 12-08-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Ciertamente, 15:44:32 - 14:40:00 no da 00:44:21.

Pero, la diferencia con lo esperado es muy poca, así que sospecho que
  • ese reloj con números verdes y la hora del equipo no están sincronizados, ó
  • la operación de resta se hizo veinte minutos antes
.
-

Fe de erratas:
Código Delphi [-]
btnRegistrarAsistDoc.Enabled := not (difMinutos > 5);
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #6  
Antiguo 12-08-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Un programa básico para guiarse:
Label1 tiene la hora actual
Edit1 tiene la hora a restar
Label2 tiene horas, minutos y segundos resultantes
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  dif: Extended;
begin
  dif := Time() - StrToTime(Edit1.Text);
  Label2.Caption := FormatDatetime('hh:nn:ss', dif);

  if dif < 0 then
  begin
    Label2.Caption := '- ' + Label2.Caption;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := TimeToStr(Time()) + ' menos ';
end;

end.
Código Delphi [-]
object Form1: TForm1
  ClientHeight = 243
  ClientWidth = 527
  object Label1: TLabel
    Left = 56
    Top = 88
    Width = 31
    Height = 13
    Caption = 'Label1'
  end
  object Label2: TLabel
    Left = 384
    Top = 88
    Width = 31
    Height = 13
    Caption = 'Label2'
  end
  object Edit1: TEdit
    Left = 144
    Top = 85
    Width = 121
    Height = 21
    TabOrder = 0
    Text = '11:11:10'
  end
  object Button1: TButton
    Left = 288
    Top = 83
    Width = 75
    Height = 25
    Caption = '='
    TabOrder = 1
    OnClick = Button1Click
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
    Left = 256
    Top = 128
  end
end
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #7  
Antiguo 12-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Fuentes

Amigo TOPX te muestro la pantalla donde se puede ver que el reloj y el sistema estan sincronizados:



Y el codigo fuente del proyecto con el script de la BD en MySQL.

http://www.mediafire.com/download/rh...Asistencia.zip

Me comentas estimado amigo

Un Abrazo
Responder Con Cita
  #8  
Antiguo 12-08-2016
santus santus is offline
Miembro
 
Registrado: ene 2006
Posts: 130
Poder: 19
santus Va por buen camino
Hola.
Tal vez esto te sea mas sencillo:

http://docwiki.embarcadero.com/Libra...MinutesBetween

Ten en cuenta que solo devuelve números positivos. Deberías preguntar cual fecha es mayor e invertir los parámetros si es necesario.

Saludos.
__________________
"El ordenador nació para resolver problemas que antes no existían." Bill Gates.
Responder Con Cita
  #9  
Antiguo 16-08-2016
bitbow bitbow is offline
Miembro
 
Registrado: jul 2006
Posts: 366
Poder: 18
bitbow Va camino a la fama
Mmm por que no lo haces todo dentro de la base de datos con un procedimiento almacenado, que ahi evalue los horarios en base a una tabla maestra, en caso de que lo sigas manejando con delphi trata los time o datetime como flotantes y realizas las comparaciones.

Saludos.
__________________
¡Ni como ayudarte Niño!!
bitbow
Responder Con Cita
  #10  
Antiguo 18-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
ok

Cita:
Empezado por bitbow Ver Mensaje
Mmm por que no lo haces todo dentro de la base de datos con un procedimiento almacenado, que ahi evalue los horarios en base a una tabla maestra, en caso de que lo sigas manejando con delphi trata los time o datetime como flotantes y realizas las comparaciones.

Saludos.
Gracias bitbow por tu apreciacion, la tomare en cuenta, un saludo
Responder Con Cita
  #11  
Antiguo 18-08-2016
gguerrini gguerrini is offline
Miembro
 
Registrado: feb 2006
Ubicación: Cordoba , Argentina
Posts: 14
Poder: 0
gguerrini Va por buen camino
Y si lo pasas a todo a minutos...

Buenas Buenas
Capaz que no comprendí la dificultad del problema, no sería más fácil llevar todo a minutos, después lo restas y listo
14:00 = 14*60+00 = 840
14:02 = 14*60+02 = 842
840 – 842 = -2
Existen todas las funciones en Delphi, para extraer horas, minutos y segundos. Si lo llevas tos a segundos, tenes mas precisión. Ojala que te sirva. 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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
calculo de diferencia entre dos horas y minutos gonza_619 Varios 1 22-05-2010 20:35:31
Cantidad de Minutos entre 2 Horas con el DateTimePicker ANDRES86 OOP 11 02-07-2007 23:11:19
MinuteSpan... minutos entre horas mjjj Varios 1 25-06-2007 17:28:59
Funcion para pasar de minutos a horas Asshole Varios 1 13-06-2005 13:23:27
Calcular Horas y minutos entre dos TTime Delphos Varios 4 26-01-2004 17:10:14


La franja horaria es GMT +2. Ahora son las 08:45:35.


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