Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - gatoher

Páginas: 1 2 3 [4] 5
61
Tengo una duda sobre una explicación que no llego a comprender sobre las listas genéricas, a ver;

List<Object> es de tipo Collection<Object> por que tienen el mismo parámetro. Pero List<String> no es de tipo List<Object> ya que son distintos parametros aunque String es subtipo de Object.

Hasta aqui es comprensible pero a pone este ejemplo;

public class void main (String [] args)
{

List<String> ls = new ArrayList<String>(); // Lista de string

List<Object> lo = ls;  // Ahora las dos listas hacen referencia a ls

lo.add(new Employee()); // Añadimos un Employee a la lista
String s = ls.get(0); //Error

¿Por que ha dejado añadir un objeto Employee? Hay dos referencias de distinto tipo a un objeto, no lo llego a entender,¿ si en lugar de Object fuera Integer? Si hubiera hecho esto;

Object x = lo.get(0); // ¿Daría error?


62
Aprender a programar desde cero / Re:Genericos y código Legazy
« en: 28 de Agosto 2014, 23:47 »
Pues si Dongo, tiene toda la lógica del mundo que haya un iterator genérico. La verdad q ni se me había pasado por la cabeza.  :o

Gracias

63
Aprender a programar desde cero / Re:Genericos y código Legazy
« en: 28 de Agosto 2014, 22:52 »
Mirando lo más chocante que esto se puede hacer;

Código: [Seleccionar]
   Integer p = a.get(0); // a es una lista segura, sino sí habría que hacer casteo

Pero dentro del iterator es lo que no entiendo:

Código: [Seleccionar]
while (it.hasNext()){
                 Integer p = it.next(); // Sigue pidiendo casteo

64
Aprender a programar desde cero / Genericos y código Legazy java
« en: 28 de Agosto 2014, 22:37 »
Estoy viendo el tema de los genéricos y me ha surgido una duda.
A ver yo hago este array;

Código: [Seleccionar]
List<Integer> x = new ArrayList<Integer>();

Y mando el array a un método
Código: [Seleccionar]
prueba que va intentar esto;

Código: [Seleccionar]
private void prueba(List<Integer> a){ //Si elimino la parametrización la variable text entra
     
            int pri = 0;
            Integer obj = 55;
            String text = "hola";


    //        a.add(text); error es un String
            a.add(obj);
            a.add(pri);
           
            Iterator it = x.iterator();
           
            while (it.hasNext()){
               
               obj = (Integer) it.next();
               pri = (int) it.next();
            }
     

¿Mi pregunta es, por que obj que es un objeto Integer  lo tengo que castear? ¿Y pri? No debería el auboxing hacerlo por si solo.

65
Hola Dogo, ayer ya no puede responderte, estaba liado haciendo cosas en casa  >:(
Bueno he visto como haces para llenar el Table, te pogo como lo tengo yo:

Clase Conexion"para todo el proyecto":

Código: [Seleccionar]
/**
     * Metodo para conectarnos a la base de datos
     * @throws java.sql.SQLException
     */
   
    public void conecta () throws SQLException{
     
       
        try {
        //Registramos el driver
        String driver="com.mysql.jdbc.Driver";
        //Class.forName metodo de la clase DriverManager
        Class.forName(driver).newInstance();
         //Abrimos la conexion con la base de datos
        System.out.println("Conectando con la base de datos");
        String jdbcUrl = "jdbc:mysql://localhost:3306/reservas";
        //objeto de tipo connection, hay varios metodos getConnection
         //creamos una conexion con la base de datos
         conn = DriverManager.getConnection(jdbcUrl,"root","");
         System.out.println("Conexión establecida con la Base de datos...");
       
        }catch( SQLException error){
            Throwable fillInStackTrace = error.fillInStackTrace();
            JOptionPane.showMessageDialog(null, "Error al intentar conectar con la base de datos."+ fillInStackTrace);
        } catch (Exception error){
            JOptionPane.showMessageDialog(null, "Error al cargar el driver.");
           
            error.fillInStackTrace();
        }
       
    }
   
   
   /**
    * Metodo que prepara la sentencia y
    * dice como va a ser el resultSet
    * @throws java.sql.SQLException
    */
    public void crearSentencia() throws java.sql.SQLException{
     
        sentencia=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        System.out.println("\nSentencia creada con éxito.");
    }   
   
    /**
     * Metodo que cierra la sentencia, resulset y
     * la conexion
     * @throws java.sql.SQLException
     */
    public void cerrarConexion() throws java.sql.SQLException{
        if(rs !=null){
            rs.close();
        }
        if(sentencia !=null){
            sentencia.close();
        }
        if(conn!=null){
            conn.close();
        }
        System.out.println("\nConexión cerrada con éxito.");
    }
   
     /**
      * Metodo que nos devuelve un resultSet
      * con todos los datos que devuelve la base.
      *
      * @param sql String con la select a ejecutar
      * @throws java.sql.SQLException
      */
    public void ejecutaSQL(String sql) throws java.sql.SQLException{
     
        rs= sentencia.executeQuery(sql);
    }
   
   
    /**
     * Metodo que recibe una select y
     * actualiza, inserta o borra en la bbdd.
     * Si tiene exicto develve las filas que han sido modificadas,
     * sino devuelve un -1.
     * @param sql String a ejecutar en la base de datos.
     * @return  Retorna un entero para saber las filas modificadas,
     * se usa para dejar los campos vacios en el formulario.
     * @throws java.sql.SQLException
     */
    public int updateSQL(String sql) throws java.sql.SQLException  {
        int upd = -1;
       
        try {
           
             upd = sentencia.executeUpdate(sql);
             }
        catch (SQLException e ) {
            JOptionPane.showMessageDialog(null, "Hemos tenido un problema en el updateSQL" + e.getMessage());
            upd = -1;
        }
        System.out.println("el valor de upd es=> " + upd);
        return upd;
    }
   
   
    //+ los metodos get y set


Luego para llenar el JTable, de paso al final he dejado asi el método, he modificado algo tú select:

Código: [Seleccionar]
/**
     * Metodo para buscar en el table model
     *las habitaciones disponibles en las fechas indicadas
     * @param fechaInicio
     * @param fechaSalida
     * @param buscar Recibe un String para ser ejecutado en el MySql
     * @return Devuelve un TableModel
     */
    public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql="";
   
        // SQL saber habitaciones libres
        sql = "select idhabitacion, numero,piso,descripcion,caracteristicas,precio_diario,estado,tipo_habitacion\n "
                + "from habitacion where estado='Disponible'  and idhabitacion\n"
                + "not in(select idhabitacion from reserva\n"
                + "where "
                + "'" + fechaInicio + "' not  between fecha_ingreso and  fecha_salida \n"
                + "or\n"
                + "'" + fechaSalida + "' not  between fecha_ingreso and fecha_salida\n"
                + "or\n"
                + "'" + fechaInicio + "' <fecha_ingreso\n"
                + "and\n"
                + "'" + fechaSalida + "' > fecha_ingreso \n"
                + "or\n"
                + "'" + fechaSalida + "' >fecha_salida \n"
                + "and\n"
                + "'" + fechaInicio + "' < fecha_salida)\n";
       
       //Básicamente si te fijas creo dos  array, uno para las cabeceras otro para los datos "claro el problema que no es dinámico y si un día modifico algun dominio de la tabla hay que venir y modificar el script"
       
//Declaro y instancio un modelo a null       
        DefaultTableModel modelob = null;
//Array para los titulos
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
//Array par los datos
        String[] registro = new String [8];
        //Uso el propio constructor del Modelo, primero aun a nulo y el segundo parametro el array de los titulos
        modelob = new DefaultTableModel(null,titulos);
        try{
         
//Conecto bbdd
 
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql);
        while (conn.getRs().next()){
           
                registro[0] = conn.getRs().getString("idhabitacion");
                registro[1] = conn.getRs().getString("numero");
                registro[2] = conn.getRs().getString("piso");
                registro[3] = conn.getRs().getString("descripcion");
                registro[4] = conn.getRs().getString("caracteristicas");
                registro[5] = conn.getRs().getString("precio_diario");
                registro[6] = conn.getRs().getString("estado");
                registro[7] = conn.getRs().getString("tipo_habitacion");
               
                totalRegistro = totalRegistro + 1;
                System.out.println("el total registros es " +totalRegistro);
                modelob.addRow(registro); // Añado como primer parametro al modelo el array de con los datos
        }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
 
           return modelob; //Retorno modelo
     
    }   

//Creo que esta forma es más sencilla y limpia aunque tiene la pega que no es dinámica la tuya si.


Bueno Dongo también puedes observa que te he modificado la select, primero he quitado esta parte de la línea:

STR_TO_DATE('" + fechaInicio + "', '%d-%m-%Y')

No me hace falta ya que la fecha se introduce con un JDateChooose y no hace falta cambiar el orden. La segunda es que tú habías comparado  < y > con la fecha de reserva y esa fecha yo no la utilizo para este fin.

Pero me has dejado con la duda de que te pregunte sobre las select anidada, por que no te da el error de que la subselect devuelve mas de una fila. No lo entiendo, mira este ejemplo sencillo:

Código: [Seleccionar]
select idhabitacion from habitacion where (select idhabitacion from habitacion where idhabitacion > 2)
La subselect me debería devolver  o más idhabitaciones, estan en la misma columna claro, pero me responde:
Código: [Seleccionar]
12:24:18 select idhabitacion from habitacion where (select idhabitacion from habitacion where idhabitacion > 2) Error Code: 1242. Subquery returns more than 1 row 0.032 sec


¿Por que a tu select que devuelve más de una fila la subselect no te lo hace?

66
Vale Dongo, he probado lo que me has pasado y parece que funciona. Yo pensaba que una subconsulta solo podía devolver un valor, solo un unico valor de una unica fila y columna. Vamos un valor escalar.

Tu has hecho una subconsulta que te devuelve varios valores. A mi muchas veces me devuelve el siguiente error:

SQL Error: Subquery returns more than 1 row

A ver por eso todo el lio que yo comenteba/hacia de crear un array con las habitaciones que estaban ocupadas en Reservas, y luego como he comentado no sabia que hacer con esas id, y intentaba hacer un bucle.

67
Una prueba rápida que he hecho y parece funcionar bien, "OJO, he hecho una reserva para todas y cada una de las habitaciones con null en todos los campos" ;


Código: [Seleccionar]

 public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql="";
   
        // SQL saber habitaciones libres
        sql ="Select distinct ha.idhabitacion,numero,piso,descripcion,caracteristicas,precio_diario,ha.estado,tipo_habitacion  "
                + " from reserva re, habitacion ha " +"\n" +
        " where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"' < re.fecha_ingreso \n" +
        "and '"+fechaSalida+"' < re.fecha_ingreso or '"+fechaInicio+"' > fecha_salida and "
        + "ha.estado='Disponible' ";       
        System.out.println("La sql habitaciones libres vale=>" + sql);
       
        DefaultTableModel modelob = null;
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
       
        modelob = new DefaultTableModel(null,titulos);
        try{
           
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql);
        while (conn.getRs().next()){
           
                registro[0] = conn.getRs().getString("idhabitacion");
                registro[1] = conn.getRs().getString("numero");
                registro[2] = conn.getRs().getString("piso");
                registro[3] = conn.getRs().getString("descripcion");
                registro[4] = conn.getRs().getString("caracteristicas");
                registro[5] = conn.getRs().getString("precio_diario");
                registro[6] = conn.getRs().getString("estado");
                registro[7] = conn.getRs().getString("tipo_habitacion");
               
                totalRegistro = totalRegistro + 1;
                System.out.println("el total registros es " +totalRegistro);
                modelob.addRow(registro);
        }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
 
           return modelob;
    }   
                   




68
A mi lo mas sencillo que se me ha ocurrido es crear una reserva para cada habitacion = null
todos los campos en la tabla reserva, de esa forma puedo hacer;

select idhabitacion,numero,piso,descripcion,caracteristicas,precio_diario,estado,tipo_habitacion
from habitacion ha, reserva re where ha.idhabitacion=re.idhabitacion and fecha-entrada
+ todas las posiblidades.  :o


Es la unica forma que veo que puedo hacerlo, pero para ello como comento tengo que hacer una reserva inicial de toddas las habitaciones en la tabla reserrvas,dejandolo todo a null para poder comparar las fechas, con las reservas que si "son autenticas".

No me parece elegante la verdad, pero bueno.   :-\

69
Holo Dogo, tú olvidate del JTable. Mira yo puedo hacer esto;

Select numero_habitacion,estado,color  from habitacion where idhabitacion= 5, and idhabitacion=10 etc,etc

Es sencillo. Bien, tú ahora tienes una variable que es un Array con id de habitaciones, que es lo que tú has conseguido en el método.

¿Como haces la select, utilizando las variables que hay en el Array?

70
Hola Dogo, gracias por el interes que estas mostrando, te lo agradezco. He visto el método con la select y parece que va funcionar, pero mi poblema es que no se que hacer con ese Array de habitaciones disponibles.

Vamos para que quede claro, si me devuelve 2id de habitaciones libres 1,5,20, 30" no se luego como hacer para seleccionar esas id de la tabla habitaciones. "Hay que pensar que esas id van a ir cambiando, son dinamicas". Ese era mi problema de un principio más que el saber que habitaciones eran las que estaban libres.

Mira te pongo la clase como la tengo yo, al final esta el método que debe devolver el modelo con Table de las habitaciones disponibles;

Código: [Seleccionar]

mport Datos.Habitacion;
import Datos.Reservas;
import Presentacion.frmEscritorio;
import java.awt.HeadlessException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author carlos
 */
public class LReservas {

    Conexion conn = new Conexion();
    Reservas obj;
    public int totalRegistro = 0;

    /**
     * Metodo para buscar en el table model
     *
     * @param buscar Recibe un String para ser ejecutado en el MySql
     * @return Devuelve un TableModel
     */
    public DefaultTableModel mostrar(String buscar) {
       
        String sql="";
       
       
        DefaultTableModel modelob;
       
        //Podemos usar el metodo varias veces con like %variable%
        sql = "Select r.idreserva,r.idhabitacion,h.numero,r.idcliente," +
                "(select nombre from persona where idpersona=r.idcliente) as Ncliente," +
                "(select apaterno from persona where idpersona=r.idcliente) as Acliente," +
                "r.idtrabajador, (select nombre from persona where idpersona =r.idtrabajador)as Ntrabajador," +
                "(select apaterno from persona where idpersona=r.idtrabajador) as Atrabajador," +
                "r.tipo_reserva, r.fecha_reserva,r.fecha_ingreso,r.fecha_salida,"+
                "r.costo_alojamiento,r.observacion, r.estado from reserva r inner join habitacion h on h.idhabitacion=r.idhabitacion" +
                " where r.idreserva like '%"+buscar+"%'  order by r.idreserva desc";
           
        System.out.println("El sql en mostrar en Reservas vale ===>>>" + sql);
       
       
        String[] titulos = {"ID", "Id Habitación", "Número", "Id Cliente", "Cliente", "Id Trabajador", "Trabajador", "Tipo Reserva", "Fecha Reserva", "Fecha Ingreso", "Fecha Salida", "Total", "Observaciones", "Estado" };
        String[] registro = new String [14];
          modelob = new DefaultTableModel(null, titulos);
         
        try{
           
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql);
            while (conn.getRs().next()) {
                registro[0] = conn.getRs().getString("idreserva");
                registro[1] = conn.getRs().getString("idhabitacion");
                registro[2] = conn.getRs().getString("numero");
                registro[3] = conn.getRs().getString("idcliente");
                registro[4] = conn.getRs().getString("Ncliente")+ " " + conn.getRs().getString("Acliente");
                registro[5] = conn.getRs().getString("idtrabajador");
                registro[6] = conn.getRs().getString("Ntrabajador") + " " + conn.getRs().getString("Atrabajador");
                registro[7] = conn.getRs().getString("tipo_reserva");
                registro[8] = conn.getRs().getString("fecha_reserva");
                registro[9] = conn.getRs().getString("fecha_ingreso");
                registro[10] = conn.getRs().getString("fecha_salida");
                registro[11] = conn.getRs().getString("costo_alojamiento");
                registro[12] = conn.getRs().getString("observacion");
                registro[13] = conn.getRs().getString("estado");

             totalRegistro = totalRegistro + 1;
                System.out.println("el total registros es " +totalRegistro);
                modelob.addRow(registro);

            }
            conn.cerrarConexion();

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrar." + e);
        }
       
       
       
       
        return modelob;
    }

    /**
     * Funcion insertar habitacion en la bbdd.
     *
     * @param obj recive un objeto de habitacion
     * @return devuelve el número de filas al realizar la operación
     *
     */
    public int insertar(Reservas obj) {

        //SQL para persona
        String sql = "insert into reserva (idhabitacion,idcliente, idtrabajador,tipo_reserva, fecha_reserva, fecha_ingreso, fecha_salida, costo_alojamiento, observacion, estado)"
                + " values ("+ obj.getIdhabitacion() + "," + obj.getIdcliente() + "," + obj.getIdtrabajador() + ",'" + obj.getTipoReserva() + "','" + obj.getfReserva() + "','" + obj.getfIngreso() + "','"
                + obj.getfSalida() + "'," + obj.getTotal() + ",'" + obj.getObservacion() + "','" + obj.getEstado()+ "' )";
        System.out.println("La sql insertar en RESERVAS vale => " +sql);
       
        int resultado = -1;
       
        try {

            conn.conecta();
            conn.crearSentencia();
            resultado = conn.updateSQL(sql); //Intentamos ingresar a la persona

            if (resultado >= 0) {

                JOptionPane.showMessageDialog(null, "La reserva ha sido ingresada con exicto.");
               
            } else {
                JOptionPane.showMessageDialog(null, "La reserva no se ha ha podido ser ingresada.");
            }
            conn.cerrarConexion();
        } catch (HeadlessException | SQLException e) {
            JOptionPane.showMessageDialog(null, "Error: " + e);
        }

        return resultado;
    }

    /**
     * Metodo para actualizar la bbdd
     *
     * @return Un entero para saber el numero de filas afectadas
     * @param obj Recibe objeto de habitacion
     */
    public int actualizar(Reservas obj) {

        String sql = "Update reserva set idhabitacion=" + obj.getIdhabitacion() + ",idcliente=" + obj.getIdcliente() + ",idtrabajador=" + obj.getIdtrabajador() + ",tipo_reserva='"
                + obj.getTipoReserva() + "', fecha_reserva='" + obj.getfReserva() + "',fecha_ingreso='" + obj.getfIngreso() + "',fecha_salida='"
                + obj.getfSalida() + "',costo_alojamiento=" + obj.getTotal() + ",observacion='"+obj.getObservacion()+"',estado='"+obj.getEstado()+"' where idreserva=" + obj.getIdreserva() + "";

       

        int resultado = -1;
       

        System.out.println("sql actualizar una RESERVA=> " + sql);
       

        try {

            conn.conecta();
            conn.crearSentencia();
            resultado = conn.updateSQL(sql);

            if (resultado >= 0) {

                JOptionPane.showMessageDialog(null, "La reserva se ha actualizado correctament.");
            } else {
                JOptionPane.showMessageDialog(null, "La reserva  no ha podido ser actualiza.");
            }
            conn.cerrarConexion();

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "El error al actualizar ha sido, " + e);
        }

        return resultado;

    }

    /**
     * Metodo para eliminar habitaciones de la bbdd
     *
     * @param id Recibe el id de la habitación para ser eliminada
     * @return Devuelve el número de filas afectadas
     */
    public int eliminar(int id) {

        String sqlT = "Delete from reserva where idreserva =" + id + "";
       

        System.out.println("sql al eliminar Reserva => " + sqlT);
       

        int resultado = -1;
     

        try {

            conn.conecta();
            conn.crearSentencia();
            resultado = conn.updateSQL(sqlT);

            if (resultado >= 0) {

                JOptionPane.showMessageDialog(null, "La reserva ha sido eliminadoa correctamente.");

            } else {
                JOptionPane.showMessageDialog(null, "No hemos podido eliminar el la reserva.");
            }

            conn.cerrarConexion();

        } catch (SQLException e) {

            JOptionPane.showMessageDialog(null, "Hemos tenido un problema al eliminar la habitación, " + e);
        }

        return resultado;
    }

   
 /**
     * Metodo para buscar en el table model
     *las habitaciones disponibles en las fechas indicadas
     * @param fechaInicio
     * @param fechaSalida
     * @param buscar Recibe un String para ser ejecutado en el MySql
     * @return Devuelve un TableModel
     */
    public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql="";   
        // SQL saber habitaciones ocupadas
        sql ="Select ha.idhabitacion from reserva re, habitacion ha " +"\n" +
        " where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
        "and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";       
       
       
        DefaultTableModel modelob = null;
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
       
        modelob = new DefaultTableModel(null,titulos);
        try{
           
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql); //Sentencia para saber el tamaño, total de habitaciones que tenemos
        while (conn.getRs().next()){
           
        }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
 
           return modelob;
    }   
                   

///clase   

}


Como comento, mi problema es que aunque consiga el array con las habitaciones libres no se como manejarlo.


71
Hola Dongo, para rellenar el JTablo yo lo hago asi;

Código: [Seleccionar]
public DefaultTableModel mostrar (String buscar){
    DefaultTableModel modelob;
    //Podemos usar el metodo varias veces con like %variable%
    String sql = "Select * from habitacion where idhabitacion like '%"+buscar+"%' order by idhabitacion";
    System.out.println("El sql en mostrar es; " + sql);
    String [] titulos = {"ID", "Número", "Piso", "Descripción", "Carácteristicas", "Precio diario", "Estado", "Tipo de habitación"};
    String [] registro = new String [8];
    modelob = new DefaultTableModel(null, titulos);
   
   
    try {
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql);
       
        while (conn.getRs().next()){
            registro [0]= conn.getRs().getString("idhabitacion");
            registro[1] = conn.getRs().getString("numero");
            registro[2] = conn.getRs().getString("piso");
            registro[3] = conn.getRs().getString("descripcion");
            registro[4] = conn.getRs().getString("caracteristicas");
            registro[5] = conn.getRs().getString("precio_diario");
            registro [6] = conn.getRs().getString("estado");
            registro [7] = conn.getRs().getString("tipo_habitacion");
           
            totalRegistro = totalRegistro + 1;
            modelob.addRow(registro);
           
           
        }
       conn.cerrarConexion();
   
       
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "No se ha podido recuperar el dato.");
    }
               
        return modelob;
}
   



Te subo la BBDD con 6 habitaciones  y 8 reservas.

72
Hola Dongo gracias por participar. La verdad que no es nada sencillo. Subo el script aunque
no tienes las reglas de integridad referecial, "on delete cascade, on update cascade, etc".
La verdad que no he sabido exportar la bbdd desde MySql worbrench, si me lo podeis explicar guay.

Aqui el problema es que hay dos tablas y en una se almacenas las reservas con unas determinadas fechas de inicio y fin. Yo lo que quería era que al intentar ingresar  una reserva nueva se habre un JFram y pones las fechas que el cliente solicita. Y se te muestran las habitaciones que en esas fechas no estan ocupadas.

Yo lo estaba haciendo la select en la tabla de reservas, y es ahí donde yo pienso que esta el error, pues si me devuelve x ids de habitaciones luego no se trabajar con ellas.
Pues si intento hacer una select con varias idhabitaciones tengo que hacer un bucle para recorrer el Array y luego me machaca el resultado del JTable."Vamos que solo me aparece la última habitación que esta libre". Algo tipo:

Código: [Seleccionar]
//bucle para recorrer el array con las habitaciones ocupadas
for (int h = 0; h < habitacionesOcupadas.length; h++) {
            System.out.println("La longitud de habitacionesLibres es => " + habitacionesOcupadas.length); 
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != "+habitacionesOcupadas[h]+" ";

El problema viene cuando quieres almacenarlo en el modelo del JTable. Cada pasada del bucle for elimina los datos de la anterior iteración.

Por lo tanto hay que hacer la select, que devuelva desde la tabla habitaciones.

Subo el script.

73
Voy a poner como lo tengo ahora y la salida que me hace;

Código: [Seleccionar]
public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql=""; //Select donde sacaremos las habitaciones que estan en la tablaReservas
        // tamaño que va a tener el array de habitaciones libres
        //Suponiendo que estan todas libres
        String sqlContarHab = "Select  count(*) from habitacion"; 
        System.out.println("El sql contar habitaciones vale => " + sqlContarHab);
        int [] habitacionesOcupadas = null;   // Declaramos el array donde almacenaremos los id de las habitaciones ocupadas
        int cantidadHabitaciones = 0; // Variable para almacenar el tamaño del array
        DefaultTableModel modelob; //TableModel donde mostraremos las habitaciones libres
       Habitacion[] miArray = new Habitacion[10];
  //Si la fecha del posible nuevo ingreso es mayor a la fecha de inicio de cualquier reserva
  // y al mismo tiempo la fecha de inicio es menor que la fecha de salida de cualquier reserva
  // significa que esta en el rango interior de una reserva ya realizado
        //de momento esto vale habra q estudiarlo más profundamente
        sql ="Select ha.idhabitacion from reserva re, habitacion ha " +"\n" +
        " where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
        "and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";       
        System.out.println("El sql para saber que habitaciones estan ocupadas es => " + sql);
       
       
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
        modelob = new DefaultTableModel(null, titulos);
       
        try{
           
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlContarHab); //Sentencia para saber el tamaño, total de habitaciones que tenemos
        while (conn.getRs().next()){
            cantidadHabitaciones = conn.getRs().getInt(1); //Almacenamos tamaño
        }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
        try{
           
            int i = 0;     
        System.out.println("La cantidad de habitaciones que estan ocupadas son => " +cantidadHabitaciones);
        habitacionesOcupadas= new int[cantidadHabitaciones]; //Instanciamos el array con el nuevo tamaño
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql); //Sql que nos devuelve el id de las habitaciones ocupadas
       
          while (conn.getRs().next()) {
              habitacionesOcupadas[i]= conn.getRs().getInt(1); //Almacenamos en el array el id de las habitaciones ocupadas
              i++;
              System.out.println("El numero de id de las habitaciones ocupadas es => " + habitacionesOcupadas[i]);
          }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
           try{         
          String sqlHabitacionesLibres=""; //Sentencia  para mostrar las habitaciones libres
           
          //For donde vamos cambiando el id de las habitaciones ue estaban ocupadas
            for (int h = 0; h < habitacionesOcupadas.length; h++) {
            System.out.println("La longitud de habitacionesLibres es => " + habitacionesOcupadas.length); 
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != "+habitacionesOcupadas[h]+" ";
            System.out.println("El sqlHabitacionesLibres vale=> " + sqlHabitacionesLibres);
           
            //Variable para crear un objeto
            Habitacion obj=null;
            int idhabitacion;
            String numero;
            String piso;
            String descripcion;
            String caracteristicas;
            Double precio;
            String estado;
            String tipo_habitacion;         
       
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlHabitacionesLibres);
       
          while(conn.getRs().next()){
            idhabitacion = conn.getRs().getInt(1);
            numero = conn.getRs().getString("numero");
            piso = conn.getRs().getString("piso");
            descripcion = conn.getRs().getString("descripcion");
            caracteristicas = conn.getRs().getString("caracteristicas");
            precio = Double.parseDouble(conn.getRs().getString("precio_diario"));
            estado = conn.getRs().getString("estado");
            tipo_habitacion = conn.getRs().getString("tipo_habitacion");
           
             
            obj = new Habitacion(idhabitacion, numero, piso, descripcion, caracteristicas, precio, estado, tipo_habitacion);
               //hay que crear un vector de objetos habitacion
             miArray[h]= obj;
            System.out.println("" + obj.toString());   
          }
         
           //Fin del bucle for
            }
           
             for(int i=0; i<miArray.length; i++){
         
            registro[0]= String.valueOf(miArray[i].getIdhabitacion());
            registro[1] = miArray[i].getNumero();
            registro[2] = miArray[i].getPiso();
            registro[3] = miArray[i].getDescripcion();
            registro[4] = miArray[i].getCaracteristicas();
            registro[5] = String.valueOf(miArray[i].getPrecio().toString());
            registro[6] = miArray[i].getEstado();
            registro[7] = miArray[i].getTipo_habitacion();
            totalRegistro = totalRegistro + 1;
           System.out.println("el total registros es " +totalRegistro);
             modelob.addRow(registro);
        }
       
       conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
                 
                     return modelob;
   




La salida por consola, ya que no se porque el modelo no me lo coje el table, y se repite varias veces por que al haber un  for para modificar la select ...
Eso pensaba solucionarlo con antes de meter el objeto en el Array de objetos Habitacion hacer un Compare to por ejemplo con el numero de la habitacion.

FechaInicio vale=>2014-08-01
El sql contar habitaciones vale => Select  count(*) from habitacion
El sql para saber que habitaciones estan ocupadas es => Select ha.idhabitacion from reserva re, habitacion ha
 where ha.idhabitacion=re.idhabitacion and  '2014-08-01'  >= re.fecha_ingreso
and '2014-08-01' <= re.fecha_salida and ha.estado='Disponible'
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.

Conexión cerrada con éxito.
La cantidad de habitaciones que estan ocupadas son => 5
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.

Conexión cerrada con éxito.
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
el total registros es 1
el total registros es 2
el total registros es 3
el total registros es 4
el total registros es 5

74
Hola Ogramar, ahora más que la propia select lo que no se como hacer es cuando tengo el id de las habitaciones ocupadas en x fechas, supongamos "idhabitacion 1,6,10,20". ¿Como hago para sacar el resto?.

Esos id son dinamicos, no puedo ir a la tabla habitaciones y decir select xxxx where idhabitacion no sea 1,6,10,20.
Lo he intentado con un bucle for, pero me machaca en cada iteracion el dataTable.

Estoy algo fustrado, he intentado crear objetos de habitacion dentro del bucle for y meterlos en un array para que no se machacasen, pero se me va de las manos  :-\

75
No no funciona bien, el último bucle for que utilizo para cambiar el idhabitacion machaca el resulset, solo devuelve el último resultado  :'(

76
Ogramar creo que lo he conseguido, pero un cacho código que no veas. Lo pongo a ver que tal lo ves, lo he probado un par de veces y parece funcionar.

Código: [Seleccionar]
public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql=""; //Select donde sacaremos las habitaciones que estan en la tablaReservas
        String sqlContarHab = "Select count(*) from reserva re, habitacion ha " +"\n" +
" where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
"and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";  // tamaño que va a tener el array de habitaciones libres
        int [] habitacionesLibres = null;   // Declaramos el array donde almacenaremos los id de las habitaciones ocupadas
        int cantidadHabitaciones = 0; // Variable para almacenar el tamaño del array
        DefaultTableModel modelob; //TableModel donde mostraremos las habitaciones libres
       
  //Si la fecha del posible nuevo ingreso es mayor a la fecha de inicio de cualquier reserva
  // y al mismo tiempo la fecha de inicio es menor que la fecha de salida de cualquier reserva
  // significa que esta en el rango interior de una reserva ya realizado
        //de momento esto vale habra q estudiarlo más profundamente
sql ="Select ha.idhabitacion from reserva re, habitacion ha " +"\n" +
" where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
"and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";       
                       
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
        modelob = new DefaultTableModel(null, titulos);
       
        try{
           
         int i = 0;   
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlContarHab); //Sentencia para saber el tamaño
        while (conn.getRs().next()){
            cantidadHabitaciones = conn.getRs().getInt(1); //Almacenamos tamaño
           
        }
        habitacionesLibres = new int[cantidadHabitaciones]; //Instanciamos el array con el nuevo tamaño
        conn.ejecutaSQL(sql); //Sql que nos devuelve el id de las habitaciones ocupadas
       
          while (conn.getRs().next()) {
              habitacionesLibres[i]= conn.getRs().getInt(1); //Almacenamos en el array el id de las habitaciones ocupadas
              i++;
          }
         
          String sqlHabitacionesLibres=""; //Sentencia  para mostrar las habitaciones libres
       
          //For donde vamos cambiando el id de la habitacion en la select
            for (int h = 0; h < habitacionesLibres.length; h++) {
             
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion= "+habitacionesLibres[h]+" and idhabitacion != '"+0+"'";
                System.out.println("El sqlHabitacionesLibres vale=> " + sqlHabitacionesLibres);
         //Ejecutamos el result tantas veces como el tamaño del array de habitaciones libres
         //Esto se podría hacer de otra manera es lo primero que se me ha ocurrido
         //Y lo que he tratado de evitar desde un principio
          conn.ejecutaSQL(sqlHabitacionesLibres);
          while(conn.getRs().next()){
                registro[0] = conn.getRs().getString("idhabitacion");
                registro[1] = conn.getRs().getString("numero");
                registro[2] = conn.getRs().getString("piso");
                registro[3] = conn.getRs().getString("descripcion");
                registro[4] = conn.getRs().getString("caracteristicas");
                registro[5] = conn.getRs().getString("precio_diario");
                registro[6] = conn.getRs().getString("estado");
                registro[7] = conn.getRs().getString("tipo_habitacion");
          }

             totalRegistro = totalRegistro + 1;
                System.out.println("el total registros es " +totalRegistro);
                modelob.addRow(registro);

            }     
            conn.cerrarConexion();

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
         for(int z = 0; z < habitacionesLibres.length; z++){
              System.out.println("El valor de habitacionesLibres en " + z +" es" + habitacionesLibres[z]);
         }
       
       
        return modelob;
    }   

77
Vaya sin querer le di a mandar, no estoy acertado hoy. A ver esta select hace justo lo contrario que yo quiero, osea me devuelve todas las habitaciones de la tabla reservas que esten ocupadas en un rango de fechas x.

Ahora faltaría poder sacar de la tabla habitaciones las que no estan ahi. Por ejemplo tengo cinco habitaciones y esta select me devuelve dos idhabitaciones:

Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-08-02' >= re.fecha_ingreso
and '2014-08-14' <= re.fecha_salida and ha.estado='disponible'

Solonhe cambiado los signos para que me devuelva de la tabla reservas las habitaciones que en la fecha de ingreso y salida se encuentre entre el rango que le doy.

78
No Ogramar, conforme esta la select no.

Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-02-15' < re.fecha_ingreso
and '2014-02-01' > re.fecha_salida and ha.estado='disponible'   

Haber, es lógico como he explicado,con una select no se puede hacer. A ver, las fechas que estan en números son las fechas que al abrir el JFram tu escribes para saber si en esas fechas hay alguna habitación libre, y fecha_ingreso y fecha_salida son las fechas que tienen todas las reservas en la tabla reservas.
Claro, en la tabla reserva no va a aparecer una habitación si no ha sido reservada.

Pongo una immagen de bbdd

79
Hola Ogramar, lo he intentado asi;

"Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-02-15' < re.fecha_ingreso
and  '2014-02-01' > re.fecha_salida and ha.estado='disponible' "

Disponible es un campo en la tabla habitación que tiene disponible, en obras, etc. Asi funciona solo si hay reservas, a ver si me explico. Al buscar en la tabla reservas, solo filtra las habitaciones que tienen reservas. En este caso hay una reserva en Febrero, pero no me aparece ninguna habitación, todas estan libres y claro no estan en la tabla reserva. Es lógico.

Si tienes  5 habitaciones y en un mes x tienes en la tabla reservas 2 reservas con dos habitaciones distintas, es una tonteria buscar ahi las habitaciones que estan libres por que ahi no aparecen.

 

80
Dandole vueltas he pensado que podría ser algo a:
El usuario introduce una fecha_inicio y fecha_salida de la reserva. La select debería ser:

select idhabitacion from reservas where "fecha_inicio_nueva_reserva" y "fecha_salida_nueva_reserva" < menor fecha_inicio de todas las reservas OR  "fecha_inicio_nueva_reseva" > fecha_salida de todas las reservas

Pero no consigo construirla  >:(

Páginas: 1 2 3 [4] 5

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".