Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL a access entre 2 fechas (https://www.clubdelphi.com/foros/showthread.php?t=81599)

juanma92 23-11-2012 21:04:03

Consultar valores de una tabla que no esten en otras dos tablas
 
Hola, que tal? Tengo un problema, quiero hacer una consulta que me devuelva valores que no se encuentren en otras 2 tabla. En una consulta anterior, usando el operador not in resolvi la operacion de que me devuelva los valores que no se encontraban en una tabla. Pero al querer usar 2 veces el not in no me deja. Le dejo como tengo la consulta hasta el momento, espero su respuesta, gracias

Select H.NroHabitacion,H.IdTipo
From Habitaciones H
Where (H.idHabitacion not in (Select R.IdHabitacion From ClienteReservaHabitacion R)) or (H.idHabitacion not in (Select O.IdHabitacion From ClienteOcupaHabitacion O) )
Order By H.IdTipo,H.NroHabitacion

Ñuño Martínez 26-11-2012 21:18:50

Esto no lo entiendo:
Cita:

Empezado por juanma92 (Mensaje 450355)
Pero al querer usar 2 veces el not in no me deja.

¿Quién no te deja? Es decir, ¿por qué no te deja? ¿Qué error se produce, si es que se produce?

Y, por cierto, para la próxima vez:

Casimiro Notevi 26-11-2012 22:35:09

Si por lo menos supiésemos lo que quiere hacer, por qué, qué campos, qué es cada uno, qué problema tiene, etc.

olbeup 27-11-2012 09:32:03

Cita:

Empezado por juanma92 (Mensaje 450355)
Hola, que tal? Tengo un problema, quiero hacer una consulta que me devuelva valores que no se encuentren en otras 2 tabla. En una consulta anterior, usando el operador not in resolvi la operacion de que me devuelva los valores que no se encontraban en una tabla. Pero al querer usar 2 veces el not in no me deja. Le dejo como tengo la consulta hasta el momento, espero su respuesta, gracias

Select H.NroHabitacion,H.IdTipo
From Habitaciones H
Where (H.idHabitacion not in (Select R.IdHabitacion From ClienteReservaHabitacion R)) or (H.idHabitacion not in (Select O.IdHabitacion From ClienteOcupaHabitacion O) )
Order By H.IdTipo,H.NroHabitacion

Hola juanma92,

Lo que tú quieres hacer es que te devuelva los registros que no estén en ClientesReservaHabitacion y también que no estén en ClientesOcupaHabitacion, pues en vez de or pon un and, no utilices alias, ya que estos no se utilizan en ningún lado.
Código SQL [-]
SELECT
    NROHABITACION, IDTIPO
  FROM Habitaciones
  WHERE IDHABITACION NOT IN
          (SELECT
               IDHABITACION
             FROM ClientesReservaHabitacion)
        AND IDHABITACION NOT IN
          (SELECT
               IDHABITACION
             FROM ClientesOcupaHabitacion)
  ORDER BY IDTIPO, NROHABITACION

juanma92 28-11-2012 22:19:11

Consulta SQL a access entre 2 fechas
 
Hola, como va? Tengo un problema, estoy haciendo un programa gestor de las reservas de un hotel. Al momento de hacer una nueva reserva me debe seleccionar las fechas en las que quiere la reserva y el tipo de habitacion, y al consultar le deben saltar todas las habitaciones libres de ese tipo y en esas fechas.
Yo tengo una tabla de HABITACIONES, y otra de RESERVAS, yo intente hacer con que me muestre todas las habitaciones de la tabla HABITACIONES del tipo que me indican y saque las que esten reservadas entre las fechas que me indican consultandolo en la tabla RESERVAS, pero esa subconsulta no me devuelve resultados si la hago adentro.(la probe aparte y tiraba resultados)

Les dejo como tengo la consulta a ver si me pueden ayudar. Gracias y saludos

Código SQL [-]
Select H.NroHabitacion,H.IdTipo,H.idHabitacion
From Habitaciones H
Where (H.IdTipo = :dato) and not (H.idHabitacion in (Select R.IdHabitacion 
                                                                       From ClienteReservaHabitacion R 
                                                                       Where (R.FechaIngreso BETWEEN :fecha1 and :fecha2) or 
                                                                                (R.FechaSalida BETWEEN :fecha1 and :fecha2))) 
Order By H.NroHabitacion

Faust 28-11-2012 23:23:39

Si la consulta funciona fuera del programa yo creo que la cosa está en como le mandas los parámetros y el valor...

Lo que noto es que usas dos parámetros duplicados en la consulta, te convendría hacer cuatro parámetros diferentes y además checar que la fecha inicial sea menor a la final...

Checa esto y después nos comentas

juanma92 29-11-2012 00:04:16

lo voy a probar
 
Buenisimo, ahora lo pruebo. Te cuento que lo que me decis que pruebe de la fecha final sea mayor a la inicial lo pruebo afuera del prrograma

Saludos

juanma92 29-11-2012 00:14:41

No funciono
 
Hola, probe poniendo mas parametros para que no hayan duplicados y no me devuelve nada la consulta. Nose que puede pasar. Te paso como quedo:
Código SQL [-]
Select H.NroHabitacion,H.IdTipo,H.idHabitacion
From Habitaciones H
Where (H.IdTipo = :dato) and not (H.idHabitacion in (Select R.IdHabitacion 
                                                                       From ClienteReservaHabitacion R 
                                                                       Where (R.FechaIngreso BETWEEN :fecha1 and :fecha2) or 
                                                                                (R.FechaSalida BETWEEN :fecha3 and :fecha4) )) 
Order By H.NroHabitacion
Espero que alguien tenga alguna solucion. Gracias

Casimiro Notevi 29-11-2012 00:17:28

¿Puedes poner la estructura de las tablas implicadas y exactamente qué campos necesitas y con qué filtro?

juanma92 29-11-2012 00:44:42

ayuda
 
Disculpa, como pongo la estructura? xq no se como hacerlo, soy nuevo. Gracias.

juanma92 29-11-2012 01:07:19

Nose si sera asi pero te lo paso
 
Nose si sera asi pero te paso las estructuras:
TABLA HABITACIONES
NroHabitacion - IdTipo - idHabitacion

TABLA ClIENTERESERVAHABITACION
IdCliente - IdHabitacion - FechaIngreso - FechaSalida - ValorReserva - Seña

TABLA CLIENTEOCUPAHABITACION
IdCliente - IdHabitacion - FechaIngreso - FechaSalida - ValorReserva - Seña

El fin es mostrar todas las habitaciones de la tabla habitaciones del tipo que me pasan por parametro y que esten libres entre dos fechas que me pasan por parametro para hacer la reserva. Es decir, de las habitaciones de la tabla habitaciones no debe mostrar ademas, las que esten reservadas o ocupadas en esas fechas(es decir filtrar por las fechas que me pasan y las fechas de ingreso y salida). En fin, los filtros se hacen por el IdTipo de la tabla habitaciones y por las fechas de ingreso y salida que estan en la tabla RESERVA y OCUPADOS. espero sepan entender. Gracias

olbeup 29-11-2012 08:31:03

Hola Juanma92

No se si has visto lo que te conteste en esta consulta, lo único que tienes que hacer es adaptarla a lo que quieres.

Un saludo

Casimiro Notevi 29-11-2012 12:13:04

Ya me parecía que me sonaba esa pregunta y ese select. He unido ambos hilos, por favor, si no has conseguido solucionar tu duda entonces no abras otro hilo, sigue en el que has creado primeramente. Gracias por tu colaboración.

Casimiro Notevi 29-11-2012 12:23:53

Creo que mejor lo haces con un stored procedure, le pasas las fechas que solicita el cliente y ahí lo procesas mejor.

¡Ops!, con access :eek:, creo que no puedes.

Entonces te aconsejo el "divide y vencerás?. Primero compruebas en la tabla de ocupadas y si está libre entonces compruebas en la tabla reservas. En dos pasos.
Más simple y claro.

juanma92 29-11-2012 12:39:01

Y como lo hago?
 
Y como hago para consultar en una y luego en otra? Si en delphi desp necesito comunicar a un dbgrid? Por eso lo hacia todo en una consulta

juanma92 29-11-2012 12:41:32

Hola olbeup, sisi lo vi, y lo hice asi y me salio. Gracias. Ahora en esta quise hacer algo parecido agregando parametros a cada una de las subconsultas y un parametro mas en el where. Pero no me devuelve nada

Casimiro Notevi 29-11-2012 13:51:12

Cita:

Empezado por juanma92 (Mensaje 450834)
Y como hago para consultar en una y luego en otra? Si en delphi desp necesito comunicar a un dbgrid? Por eso lo hacia todo en una consulta

Ah, bien, entonces creo que el problema es que hay que tener muy claro el concepto, a ver si lo he entendido: un cliente pide una habitación (o reserva) para entrar el 05.12.2012 y salir el 09.12.2012
Entonces hay que comprobar que tanto en reservadas como en ocupadas no estén entre esas fechas, bien.
Pienso que en lugar de buscar las ocupadas en esas fechas, hay que buscar las libres, por ejemplo, todas las que la fechaingreso sea mayor (¿o igual?) que la fecha salida de reservas/ocupadas serán válidas.
Y por el mismo motivo, todas las que fechasalida sea menor (¿o igual?) que fechaentrada de reservas/ocupadas también serán válidas.
Por supuesto, se supone que se controla que las fechas dadas por el cliente son correctas, fechaentrada < fechasalida

Suponemos que las fechas que ha pedido el cliente están en las variables de fecha: desdefecha, hastafecha
Código SQL [-]
select h.nrohabitacion
from habitaciones h
where h.habitacion not in (select r.idhabitacion
                           from clientereservahabitacion r
                           where r.fechasalida <= :desdefecha
                           or    r.fechaentrada >= :hastafecha)
and h.habitacion   not in (select o.idhabitacion
                           from clienteocupahabitacion o
                           where o.fechasalida <= :desdefecha
                           or    o.fechaentrada >= :hastafecha)
order by h.nrohabitacion
Creo que es eso lo que quieres.

Casimiro Notevi 29-11-2012 13:59:52

Creo que no, que tampoco es así.

juanma92 29-11-2012 14:22:29

claro
 
Claro, es algo asi, pero en la tabla reservas y ocupadas yo tengo solo habitaciones en uso, es decir que yo tengo que listar todas las habitaciones de la tabla Habitaciones, que no esten en las tablas Reservas o en ocupadas entre las fechas que me da y ademas que sean del tipo que me pide. Se entiende?

Casimiro Notevi 29-11-2012 14:29:14

Bien, pues le añades el tipo
Código SQL [-]
select h.nrohabitacion
from habitaciones h
where h.idtipo = :tipo
and h.habitacion not in (select r.idhabitacion
                         from clientereservahabitacion r
                         where r.fechasalida <= :desdefecha
                         or    r.fechaentrada >= :hastafecha)
and h.habitacion not in (select o.idhabitacion
                         from clienteocupahabitacion o
                         where o.fechasalida <= :desdefecha
                         or    o.fechaentrada >= :hastafecha)
order by h.nrohabitacion

juanma92 29-11-2012 14:45:47

Voy a probar
 
Bueno, voy a probar, pero algo asi lo tenia. Gracias. Te aviso

juanma92 29-11-2012 14:56:13

Sigue sin andar
 
Puse la consulta como me dijiste:
Código SQL [-]
Select H.NroHabitacion,H.IdTipo,H.idHabitacion
From Habitaciones H
Where H.IdTipo = :tipo
and (H.IdHabitacion not in (Select R.IdHabitacion
                         From ClienteReservaHabitacion R
                         Where R.FechaSalida <= :desdefecha
                         or    R.FechaIngreso >= :hastafecha)
or H.IdHabitacion not in (Select O.IdHabitacion
                         From ClienteOcupaHabitacion O
                         Where O.FechaSalida <= :desdefecha
                         or    O.FechaIngreso >= :hastafecha)
)
Order By H.NroHabitacion
Y sigue sin andar, no me devuelve nada.... Nose donde ppuede estar el problema, porque probe las subconsultas por separado, y todas andan, ahora bien cuando las junto no me devuelve nada :/ Te mando como les paso los parametros:

Código Delphi [-]
 dm.ConNuevaReserva.Close;
    dm.ConNuevaReserva.Parameters.ParamByName('tipo').Value :=
      DBLookupComboBox1.KeyValue;
    dm.ConNuevaReserva.Parameters.ParamByName('desdefecha').Value :=
      DateTimePicker1.Date;
    dm.ConNuevaReserva.Parameters.ParamByName('hastafecha').Value :=
      DateTimePicker2.Date;

Casimiro Notevi 29-11-2012 15:24:34

¿Has comprobado que hay datos válidos en la BD para que devuelva valores?

Casimiro Notevi 29-11-2012 15:25:28

De todas formas, esa no es la sentencia sql que yo te he puesto, tú has puesto and y or, yo he puesto and y and

juanma92 29-11-2012 15:26:45

Sisi, la tabla habitaciones tiene muchas habitaciones, y en cambio la tabla de reservas o ocupados estan casi vacias. Algunas habitaciones tiene q devolver. Y las fechas no coinciden ademas

Casimiro Notevi 29-11-2012 15:55:34

¿Puedes pasarlo algunos datos en formato csv (por ejemplo) para hacer pruebas?

juanma92 29-11-2012 16:26:25

te paso la BD?

Casimiro Notevi 29-11-2012 16:36:50

Cita:

Empezado por juanma92 (Mensaje 450868)
te paso la BD?

Es que yo no tengo nada para leer access, por eso decía de exportar a csv, dbf (puede que también lo lea), txt, etc. algún formato más o menos estandar.

juanma92 29-11-2012 16:48:04

1 Archivos Adjunto(s)
Te adjunto en un rar las tablas en txt

Casimiro Notevi 29-11-2012 17:46:15

Dime algunos ejemplos que hayas probado, tipo y fechas de ingreso y salida, para probar con los mismos datos que no te salen.

Casimiro Notevi 29-11-2012 17:59:34

He hecho una pruebecita con estos datos y funciona correctamente, creo.
Código SQL [-]
select h.nrohabitacion, h.idtipo, h.idhabitacion
from tbhabitaciones h
where h.idtipo = 1
and h.idhabitacion  in (select r.idhabitacion
                         from tbreservadas r
                         where r.fechasalida <= '01.12.2012'
                         or    r.fechaingreso >= '03.12.2012')
and h.idhabitacion  in (select o.idhabitacion
                         from tbocupadas o
                         where o.fechasalida <= '01.12.2012'
                         or    o.fechaingreso >= '03.12.2012')
order by h.nrohabitacion

juanma92 29-11-2012 22:07:12

Estuve mirando y yo tengo igual y no me devuelve nada. Salvo que entre los in va un or no un and xq en cualqiera de las tablas que este no qiero que aparesca. Con el and las saca las que estan en las dos si o si

Casimiro Notevi 29-11-2012 22:21:46

Cita:

Empezado por juanma92 (Mensaje 450911)
Estuve mirando y yo tengo igual y no me devuelve nada. Salvo que entre los in va un or no un and xq en cualqiera de las tablas que este no qiero que aparesca. Con el and las saca las que estan en las dos si o si

Pero date cuenta que yo no estoy buscando las fechas que puedan coincidier, sino las que no coinciden, por eso creo que debe ser AND.

Porque a mí si me devuelve registros.

Veamos, con los parámetros que yo he usado en el ejemplo que he puesto ahí, ¿no te devuelve nada?

olbeup 30-11-2012 08:55:34

Pues eso le dije yo que habilitara la SQL que le puse y también ¿para que quieres los alias si no los vas a utilizar?

Un saludo.

Casimiro Notevi 30-11-2012 12:23:14

Cita:

Empezado por olbeup (Mensaje 450940)
¿para que quieres los alias si no los vas a utilizar?

Los alias (desconozco access) sirven para que no exista confusión con los nombres de los campos de distintas tablas, tanto para el sistema como para nosotros mismos. En otros sistemas (desconozco access) es imprescindible cuando se realiza una sentencia donde intervienen más de una tabla, incluso obligatorio en algunos casos.
Además de que queda más claro para nosotros.

olbeup 03-12-2012 09:04:39

Casimiro notevi, sé cómo se utilizan los alias, las SQL's que ha puesto el compañero no las utiliza para nada, en access y en cualquier base de datos se utilizan los alias siempre y cuando al menos un campo estén en ambas DB, internamente el MS Access no utiliza alias sino las pones utiliza el nombre de la base de datos seguida del campo.

Si abres el programa MS Access y construyes una SQL sin alias y la ejecutas y después quieres ver la SQL, vera que MS Access te ha añadido el nombre de la base de datos y luego el campo.

Si quieres utilizar los alias aunque no los utilices, OK, pero es un gasto innecesario para mi.

Un saludo.

Casimiro Notevi 03-12-2012 10:50:23

Jamás he usado access, he puesto una sql estandar para todas las BD.


La franja horaria es GMT +2. Ahora son las 02:53:36.

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