Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 13
DOS Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 07-10-2013
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 07-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 07-10-2013 a las 00:34:13.
Responder Con Cita
  #4  
Antiguo 07-10-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 13
DOS Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 07-10-2013
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
hr es una variable que pusiste ahí, si no es global entonces donde esta la declaración ?, para que la pusiste?
Saludos
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 07-10-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 13
DOS Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 14-11-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 13
DOS Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 15-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
Archivos Adjuntos
Tipo de Archivo: zip DOS.zip (5,1 KB, 12 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 25-11-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 13
DOS Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 25-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-11-2013 a las 19:51:50.
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
consulta SQL varias tablas pmtzg SQL 0 02-02-2012 06:05:03
Consulta con varias tablas marilinspi SQL 4 30-10-2007 22:40:48
almacenar multiples selecciones en sql vivys27 SQL 4 02-10-2007 16:26:24
consulta de varias tablas elprimo Tablas planas 3 03-01-2007 10:23:15
¿Selecciones iguales? ixMike Varios 5 17-07-2006 19:12:52


La franja horaria es GMT +2. Ahora son las 21:50:29.


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