Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Duda existencial (https://www.clubdelphi.com/foros/showthread.php?t=63750)

rm_machado 01-03-2009 07:04:26

Duda existencial
 
Hola gente del foro, tengo un problema que necesito resolver y no se me ocurre como, como soy nuevo en Delphi quizas no sea tan complicado pero a mi se me escapa. Les voy a agradecer cualquier idea que me puedan tirar para solucionarlo.
Estoy haciendo un programa que sirve basicamente para dar turnos en un consultorio. Actualmente tengo en una ventana un calendario en donde al ir haciendo clic sobre las fechas y seleccionando previamente el medico me muestra en una tabla que turnos hay tomados. El problema esta en que ahora me piden que no aparezcan solamente los que estan tomados sino todos los que hay en el dia para que puedan ver a simple vista cuales quedan sin tomar. Es decir ahora figura la hora y el nombre del paciente pero si esta tomado el turno, sino el horario libre no se muestra. Como puedo hacer!!!

Mil gracias!!!

Galahad 01-03-2009 18:38:48

duda existencial
 
no dás información de que base de datos utilizas (paradox,interbase,firebird..), pero se me ocurre que la solución podría pasar por crear un algoritme que calcule las horas 'libres'. Partiendo de la base de que tienes un horario de trabajo, por ejemplo para simplificar de 9 a 14 horas, podrías crear un algoritmo que 'calculara' las horas libres simplemente comprobando los periodos 'libres' antes y después de las horas ocupadas. Simplemente tendrias que chequear que dicho periodo entre una consulta y otra fuese de un periodo mínimo que podría ser por ejemplo de 30 minutos.
Espero haberte ayudado, saludos...

rm_machado 02-03-2009 01:19:15

Gracias Levanteelx por tu respuesta. Uso tabalas Paradox. La duda es como haría eso. Necesitaría que me quede de la sgte manera
8 hs ---- Libre
8:30 hs ----- Nombre del paciente
9 hs ----- Libre
.
.
.
.
Hasta ahora lo que me muestra es solamente por ejemplo el turno de las 8:30 que esta asignado pero no los otros.

duilioisola 02-03-2009 13:00:43

No se como tienes organizadas las tablas, pero podrías rellenar todos los turnos para un día y mostrarlos.

Cuando alguien quiere un turno, en vez de insertar un registro, modificas el que corresponda con el día, la hora y el medico.

Para que la tabla no crezca muchísimo, puedes generar a principio de año todos los días y turnos para el año y a medida que va pasando el tiempo, puedes ir borrando los turnos que quedaron vacíos del útlimo mes.

Galahad 02-03-2009 13:24:29

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...

rm_machado 03-03-2009 06:17:09

Muchisimas pero muchisimas gracias a todos. Voy a probar esto que me dicen y les cuento.


La franja horaria es GMT +2. Ahora son las 01:02:07.

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