Ver Mensaje Individual
  #5  
Antiguo 02-03-2009
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Reputación: 18
Galahad Va por buen camino
Duda existencial

como bien dice el compañero duidisola, no defines como tienes organizada la base de datos, pero bueno, me he creado un pequeño proyecto con una base de datos para simular como se podría hacer:

Parto de la base de que tenemos una base de datos a la que aquí llamo tconsultas, con dos campos que forman la tabla principal, dia + Hora, que definen las consultas confirmadas.

Este es el código, por supuesto es bastante mejorable , pero bueno , funcionar ,funciona..

Código:
unit foro2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Buttons, Mask;

type
  TForm3 = class(TForm)
    BitBtn1: TBitBtn;
    Tconsultas: TTable;
    ListBox1: TListBox;
    TconsultasFecha: TDateField;
    TconsultasHora: TTimeField;
    TconsultasPaciente: TStringField;
    edfecha: TMaskEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    function formateahora(Segundos: Integer): String;
    function conviertehora( nhora:integer ):ttime;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

const n_consulta = 30;          // duración de las consultas (en minutos)
      h_comienzo_jornada = 8;   // hora de comienzo de la jornada laboral
      h_fin_jornada = 14;       // hora de finalización de la jornada laboral

implementation

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);
var hora_control : integer;
begin
     tconsultas.open;
    // nos posicionamos en el dia a visualizar
    hora_control := h_comienzo_jornada*60*60; // en segundos
    // controlamos que la última visita sea la de fin_jornada - minutos última 
    // visita
    while (Hora_control <= ( (h_fin_jornada*60*60)-(n_consulta*60))   ) do
    begin
          // buscamos en la base de datos si la hora (hora_control) está libre.
          if tconsultas.findkey( [strtodate( edfecha.text),
                                  conviertehora(hora_control)]  ) then
             listbox1.items.add( formateahora( hora_control) +' --- si que tiene visita '+tconsultaspaciente.value ) else
             listbox1.items.add( formateahora( hora_control )+' --- libre ');
          // sumamos a la hora de control los minutos transcurridos.
          hora_control := hora_control + ( n_consulta * 60 );
    end;

end;

function tform3.formateahora(Segundos: Integer): String;
var
horas,
minutos: Integer;
dhora : tdatetime;
begin
  horas :=  Segundos div 3600;
  minutos := Segundos div 60 mod 60;
  dhora := encodetime( horas,minutos,0,0);
  Result:= formatdatetime('hh:mm', dhora );
end;
//
function tform3.conviertehora( nhora:integer ):ttime;
begin
  result := strtotime( formateahora(nhora)  );
end;



end.
El código se podría optimizar en el sentido de que se efectuan demasiados 'pinchazos' a la base de datos, es decir, se efectuan tantas búsquedas (Findkey) como intervalos existan en el día, lo cual es muy mejorable , pero como base puede servir.
Espero te pueda aportar un poco de luz este código a tu problema, saludos...
Responder Con Cita