Ver Mensaje Individual
  #1  
Antiguo 12-08-2016
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 235
Reputación: 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