Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2009
rm_machado rm_machado is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
rm_machado Va por buen camino
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!!!
Responder Con Cita
  #2  
Antiguo 01-03-2009
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
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...
Responder Con Cita
  #3  
Antiguo 02-03-2009
rm_machado rm_machado is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
rm_machado Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 02-03-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #5  
Antiguo 02-03-2009
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 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
  #6  
Antiguo 03-03-2009
rm_machado rm_machado is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
rm_machado Va por buen camino
Muchisimas pero muchisimas gracias a todos. Voy a probar esto que me dicen y les cuento.
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
Ayuda con duda existencial poliburro La Taberna 19 30-07-2007 09:30:39
duda con BDE ercrizeporta Conexión con bases de datos 3 29-05-2007 12:20:46
Duda existencial MaMu OOP 3 27-09-2006 15:37:40
duda existencial nightynvid La Taberna 2 05-09-2006 14:12:20
Duda Existencial (datamodule) vipernet Conexión con bases de datos 5 08-06-2006 20:15:30


La franja horaria es GMT +2. Ahora son las 11:18:57.


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