Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   if anidado o consulta con varias selecciones (https://www.clubdelphi.com/foros/showthread.php?t=84333)

DOS 06-10-2013 19:56:40

if anidado o consulta con varias selecciones
 
Hola, tengo que realizar la carga de un registro de una veterinaria, la cual debe discriminar si el veterinario ya tiene una reserva en el mismo día y horario, le avise que ese turno esta ocupado que elija otro horario.
La carga del dia se realiza a través de un DateTimePicker y la hora a través de dos combobox uno para la hora y otro para los minutos los cuales se asignan a una veriable 'Hora' del tipo datatime.
Les muestro una imagen de la pantalla de carga y la codificación, pense que se podria utilizar un if anidado o algo asi :
No le presten atención a las flechas


codificación boton nuevo
Código Delphi [-]
 // nuevo turno
procedure TForm20.BitBtn6Click(Sender: TObject);
begin
DBEdit4.SetFocus;
Table1.Open;
  Table1.Last;
    c:=Table1.FieldByName('Cod_turnovet').Asinteger;
    c:=c+1;
    Table1.insert;
    table1.edit;
    BitBtn6.Enabled:=False;
    BitBtn3.Enabled:=false;
    BitBtn2.Enabled:=true;
    BitBtn4.Enabled:=true;
    DBEdit2.Visible:=false;
    DateTimePicker1.Visible:=true;
end;

botón guarda nuevo
Código Delphi [-]
  // guarda turno
procedure TForm20.BitBtn4Click(Sender: TObject);
begin
cv:= ('Cod_vete').integer;
f:=('Fecha').datetime;
//comparo si el veterinario seleccionado es el mismo y si la fecha es la misma a alguna seleccionada
 if table1.FieldByName('Cod_vete').AsInteger = cv and table1.FieldByName('Fecha')= f;
  // Si hay horas y minutos seleccionados...
  if (ComboBox3.ItemIndex <> -1) and (ComboBox2.ItemIndex <> -1)  then
  begin
    table1.FieldByName('Cod_turnovet').AsInteger:=c;
    table1.FieldByName('Cod_propi').AsInteger:=Table3.FieldByName('Cod_prop').AsInteger;
    Table1.FieldByName('Hora').AsDateTime := EncodeTime(
      StrToInt(ComboBox3.Items[ComboBox3.ItemIndex]),     // Horas
      StrToInt(ComboBox2.Items[ComboBox2.ItemIndex]), //Minutos
      0, 0); // Segundos, ms
      hr:=('Hora').datetime;
      end;
          if not Table1.FieldByName('Hora').AsDateTime = hr then
          begin
     table1.Post;
        BitBtn5.Enabled:=True;
        BitBtn6.Enabled:=True;
        BitBtn4.Enabled:=false;
        BitBtn3.Enabled:=True;
        DateTimePicker1.Visible:=false;
        DBEdit2.Visible:=true;
        end
        else
          ShowMessage('Debe ingresar horas y minutos');
end;
Pero no funciona,que datos mas necesitan para pode ayudarme, gracias.

Caral 07-10-2013 00:28:35

Hola
Código Delphi [-]
procedure TForm20.BitBtn6Click(Sender: TObject);
begin
DBEdit4.SetFocus;
Table1.Open;
    c:=Table1.FieldByName('Cod_turnovet').Asinteger;
    c:=c+1;
    Table1.Append;
    BitBtn6.Enabled:=False;
    BitBtn3.Enabled:=false;
    BitBtn2.Enabled:=true;
    BitBtn4.Enabled:=true;
    DBEdit2.Visible:=false;
    DateTimePicker1.Visible:=true;
end;

Código Delphi [-]
procedure TForm20.BitBtn4Click(Sender: TObject);
begin
cv:= ('Cod_vete').integer;
f:=('Fecha').datetime;

//comparo si el veterinario seleccionado es el mismo y si la fecha es la misma a alguna seleccionada
 if (table1.FieldByName('Cod_vete').AsInteger = cv) and (table1.FieldByName('Fecha')= f) then
    begin
          // Si hay horas y minutos seleccionados...
          if (ComboBox3.ItemIndex <> -1) and (ComboBox2.ItemIndex <> -1)  then
          begin
          table1.FieldByName('Cod_turnovet').AsInteger:=c;
          table1.FieldByName('Cod_propi').AsInteger:=Table3.FieldByName('Cod_prop').AsInteger;
          Table1.FieldByName('Hora').AsDateTime := EncodeTime(
          StrToInt(ComboBox3.Items[ComboBox3.ItemIndex]),     // Horas
          StrToInt(ComboBox2.Items[ComboBox2.ItemIndex]), //Minutos
          0, 0); // Segundos, ms
          hr:=('Hora').datetime;
         end;
          if not Table1.FieldByName('Hora').AsDateTime = hr then
            begin
            table1.Post;
            BitBtn5.Enabled:=True;
            BitBtn6.Enabled:=True;
            BitBtn4.Enabled:=false;
           BitBtn3.Enabled:=True;
           DateTimePicker1.Visible:=false;
           DBEdit2.Visible:=true;
          end
        else
          ShowMessage('Debe ingresar horas y minutos');
end;
end;
Saludos

ecfisa 07-10-2013 00:31:03

Hola DOS.

No conozco la conformación de las tablas, nombres, tipos y relación entre los campos como para conocer todas las soluciones posibles.

Pero si deseas saber si un turno no está asignado a un veterinario en determinada fecha y hora de este modo tiene que funcionar:
Código Delphi [-]
function  TForm20.TurnoLibre(const cVet: Integer; const Fecha: TDate; Hora: TTime): Boolean;
begin
  with Query do  
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT COD_TURNO_VET FROM TABLA_TURNOS');
    SQL.Add('WHERE COD_VETE = :PVET AND FECHA = :PFECHA AND HORA = :PHORA');
    ParamByName('PVET').AsInteger := cVet;
    ParamByName('PFECHA').AsDate  := Fecha;
    ParamByName('PHORA').AsTime   := Hora;
    Open;
    Result := Query1.IsEmpty;
    Close;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm20.BitBtn4Click(Sender: TObject);
begin
  if TurnoLibre(CodigoVeterinario_Leido, Fecha_Leida, Hora_Leida) then 
  begin
    //El turno esta libre, guardar los datos, etc, etc...
    ...
  end  
  else
    ShowMessage('El turno está ocupado')

Saludos :)

DOS 07-10-2013 01:20:21

Gracias caral, tira un error [Error] Unit20.pas(215): Record, object or class type required en la asignacion
hr:=('Hora').datetime;
hr esta declarada como variable global Tdatetime, es increible siempre tiene que surgir una complicacion, no puede simplemente correr.:mad:

Caral 07-10-2013 02:18:34

Hola
hr es una variable que pusiste ahí, si no es global entonces donde esta la declaración ?, para que la pusiste?
Saludos

DOS 07-10-2013 03:37:31

Aca la declare
Código Delphi [-]
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form20: TForm20;
  c,h1,m1,s,cv:integer;
  h,m:string;
  hr:Tdatetime;
  f:Tdate;

implementation
La puse para asignar la hora y minutos elegidos por el usuario y que luego la compare con la base de datos para saber si el mismo veterinario ya había utilizado ese turno u horario.
las tablas relacionadas son las siguiente ecfisa
Turnos veterinaria
Cod_turnovet//calve principal integer
Cod_vete//relacionado con veterinario integer
Cod_propi//relacionado con el propietario integer
Cod_masc//relacionado con la mascota integer
Fecha//del turno Datetime
Hora//del turno Datetime

Mascota
Cod_mascota//clave principal integer
Cod_prop//relacionado con el propietario integer
Cod_tamaño//relacionado con tipos de tamaños integer
NombreM//nombre de la mascota
Fecha_nac //datetime
Raza //string
Color etc. //string

Propietario
Cod_prop//clave principal integer
Cod_loc//relacionado con localidades integer
ApellidoP//string
NombreP//string
Direccion etc.//string

Veterinario
Cod_vet//clave principal integer
Cod_loc//relacionado localidades integer
ApellidoV//string
NombreV//string
Direccion etc.//string

Voy a probar tu solucion tambien, a ver si la puedo aplicar
Muchas gracias a ambos.

DOS 14-11-2013 20:16:41

Hola, la verdad es que todavia estoy tratando de encontrarle la vuelta a esto y no logro solucionarlo, se muy bien que ustedes nunca tiran una respuesta concisa, sino van guiando el camino(y esta muy bien), hasta que les toca alguien bruto como yo que despues del segundo intento ustedes se aburren y no le prestan mas atencion.
he estado trando de darle una vuelta de tuerca al trabajo despues de tanto tiempo y se que estoy a un pasito pero no encuentro tierra firme y como siempre o falta el codigo de algo o no esta la relacion de las tablas, bueno en el post anterior esta la relacion de las tablas y en el archivo que subo, esta todo absolutamente todo, tal vez de esa manera le sea mas facil a cualquiera que lo vea( se ponen las tres carpetas en C:\)
Les recuerdo que el tema es el mismo, crear un turno en la veterinaria, verificando que el VETERINARIO seleccionado, no tenga reservado el mismo dia y horario otro turno.
Muchas gracias a cualquiera que me pueda ayudar.^\||/
https://www.dropbox.com/s/yukzpzdh43d3x4y/ITM3.rar

ecfisa 15-11-2013 01:44:17

1 Archivos Adjunto(s)
Hola DOS.

Yo creo que la solución pasa por una consulta similar a la que te mencioné en el mensaje #3. De todos modos, ese código es sólo una guía ya que en mi opinión la tabla turnos tendría que tener dos campos de hora: de inicio y fin del turno.

Estuve mirando en tus mensajes anteriores para ver con que gestor trabajas y parece que es BDE, te soy sincero no es mi fuerte. Pero te adjunto un ejemplo, a modo de guía, que incluye una tabla "TABLA_TURNOS.DB" que es similar a la que declaras en el mensaje #6 pero tiene un campo mas para la finalización del turno.

Incorporé dos veterinarios, dos fechas y distintos horarios para la prueba, el código de veterinario lo seleccionas con un TSpinEdit y el día y hora mediante dos TDateTimePicker.

Espero te dé alguna idea, saludos :)

DOS 25-11-2013 01:26:07

ecfisa disculpa que no haya contestado antes pero estoy con parciales y se me complica un poco, desde ya te agradezco tu ayuda, pero el problema no lo estoy teniendo en consultar si un turno esta o no ocupado, sino que no me guarde un nuevo turno en alguno que ya este reservado.
el problema lo tengo al guardar :(

ecfisa 25-11-2013 01:50:09

Hola DOS.

Pero en definitiva, primero tenes que saber si el turno está libre u ocupado para luego permitir o no el guardado... Es decir que con muy poco trabajo se puede modificar el código del adjunto anterior para hacer algo como por ejemplo:
Código Delphi [-]
function TForm1.IsTurnFree(const Vet: Integer; const Fecha: TDate; const Hora: TTime): Boolean;
begin
  with qryTmp do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT COD_TURNOVET FROM TABLA_TURNOS');
    SQL.Add('WHERE COD_VETE = :PVET AND FECHA = :PFECHA');
    SQL.Add('AND HORA_INI <= :PHORA AND HORA_FIN >= :PHORA');
    ParamByName('PVET').AsInteger:= Vet;
    ParamByName('PFECHA').AsDate := Fecha;
    ParamByName('PHORA').AsTime  := Hora;
    Open;
    Result := IsEmpty;
  end;
end;

// Guardar un turno
procedure TForm1.btnGuardarClick(Sender: TObject);
begin
  if not IsTurnFree(SpinEdit1.Value, dtpFecha.Date,dtpHora.Time) then
    ShowMessage('Turno ocupado')
  else
  begin
     // Guardar el turno...
  end;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 21:17:55.

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