$arrayDeIdHabitaciones -- > Almacenamos aquí cada id de habitación
Ahora hacemos un bucle:
Para cada idHabitación "idHabitac" en $arrayDeHabitaciones
{
arraySeleccion = Seleccionar las filas de la tabla reservas donde (idHabitac sea igual a idHabitacion de esa fila)
Para cada fila en arraySeleccion {
(Si fechaSolicitadaEntrada<fechaIngresoEnLaReserva y fechaSolicitadaSalida < fechaIngresoEnLaReserva) ó
(fechaSolicitadaEntrada > fechaSalidaEnLaReserva) ENTONCES {estadoHabitacion[idHabitacion] = 'DISPONIBLE'; disponible[i]=idHabitacion)
ELSE
{estadoHabitacion[idHabitacion] = 'OCUPADA'}
}
}
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;
}
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;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class prueba {
public static void main (String Args[]){
int i=0;
List<Integer> todasHabitaciones = Arrays.asList(1, 5, 6, 9, 11, 14, 18, 32, 44);
List<Integer> ocupadasAL = Arrays.asList(5, 9, 11, 44);
List<Integer> libres = new ArrayList<Integer>();
for (i=0; i<todasHabitaciones.size(); i++){
if (ocupadasAL.contains(todasHabitaciones.get(i))) {
// Está ocupada
System.out.println("Habitacion " + todasHabitaciones.get(i) + " esta ocupada");
} else {
//Está libre
libres.add(todasHabitaciones.get(i));
}
}
System.out.println("Todas las habitaciones son: " + todasHabitaciones);
System.out.println("Las habitaciones libres son: " + libres);
System.out.println("Las habitaciones ocupadas son: " + ocupadasAL);
}
}
SELECT * FROM habitaciones WHERE estado='Disponible' AND id_habitacion NOT IN(SELECT id_habitacion FROM RESERVAS);
select * from habitaciones where estado="Disponible" and id_habitacion
not in(select id_habitacion from reservas where (FECHA_INICIO_FILTRO beetwen fecha_inicio_reserva and fecha_final_reserva )
or
( FECHA_FINAL_FILTRO beetwen fecha_inicio_reserva and fecha_final_reserva));
No se ejk tampoco tengo el detalle de como tiene este hombre las tablas de la base de datos, pero vamos que con una select, menos la cama, te lo puede hacer prácticamente todo...XDDselect * from habitaciones where estado="Disponible" and id_habitacion
not in(select id_habitacion from reservas
where
(FECHA_INICIO_FILTRO beetwen fecha_inicio_reserva and fecha_final_reserva )
or
( FECHA_FINAL_FILTRO beetwen fecha_inicio_reserva and fecha_final_reserva)
or
((FECHA_INICIO_FILTRO<fecha_inicio_reserva)
and
(FECHA_FINAL_FILTRO> fecha_inicio_reserva))
or
((FECHA_FINAL_FILTRO>fecha_final_reserva)
and
(FECHA_INICIO_FILTRO< fecha_final_reserva)));
//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]+" ";
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;
}
public static String creaHabitacionesLibresQuery(String fecha_inicio, String fecha_fin) {
String cadena = "select * from habitacion where estado='Disponible' and idhabitacion\n"
+ "not in(select idhabitacion from reserva\n"
+ "where"
+ "( STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y') between fecha_reserva and fecha_salida )\n"
+ "or\n"
+ "( STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y') between fecha_reserva and fecha_salida)\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')<fecha_reserva)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')> fecha_reserva))\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')>fecha_salida)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')< fecha_salida)))\n";
return cadena;
}
public static void main(String[] arg){
String consulta = HabitacionesDisponibles.creaHabitacionesLibresQuery("01-01-2014", "25-01-2014");//esto es así porke yo he llamado HabitacionesDisponibles a la clase ke contiene este metodo
System.out.println(consulta);
}
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
}
JTable(Object[][] rowData, Object[] columnNames);
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class CreaTabla extends JFrame {
public CreaTabla(String titulo) {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//finaliza el programa cuando se da click en la X
this.setSize(640, 480);//configurando tamaño de la ventana
this.setLocationRelativeTo(null);
this.setVisible(true);//configurando visualización de la ventana
}
public static void main(String[] arg) {
CreaTabla cr = new CreaTabla("habitaciones");
//creo el array de datos para la tabla
String[][] datos = {{"1", "Disponible", "doble"}, {"2", "Disponible", "Simple"}, {"3", "No disponible", "Simple"},
{"4", "Disponible", "Simple"}, {"5", "Disponible", "Simple"}, {"6", "Disponible", "Simple"}, {"7", "Disponible", "Simple"},
{"8", "Disponible", "Simple"}, {"9", "Disponible", "Simple"}, {"10", "Disponible", "Simple"}};
//creo el array con los nombres de las columnas
String[] nombresColumnas = {"id_habitacion", "estado", "tipo"};
//creo el jtable con el array de datos y el array de nombrs columnas
JTable tabla=new JTable(datos,nombresColumnas);
//creo un jscrollpane y le paso como parametro del constructor la tabla
//esto ahi ke hacerlo asi para ke salgan los titulos de las columnas y barra de scroll derecha
JScrollPane panel_temp =new JScrollPane(tabla);
//añado el Jscroll al contenedor del JFrame
cr.add(panel_temp);
//hago el JFrame visible
cr.setVisible(true);
}
}
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;
}
public static String creaHabitacionesLibresQuery(String fecha_inicio, String fecha_fin) {
String cadena = "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"
+ "( STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y') between fecha_reserva and fecha_salida )\n"
+ "or\n"
+ "( STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y') between fecha_reserva and fecha_salida)\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')<fecha_reserva)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')> fecha_reserva))\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')>fecha_salida)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')< fecha_salida)))\n";
return cadena;
}
select idhabitacion, numero,piso, descripcion, caracteristicas, precio_diario, estado, tipo_habitacion
from habitacion where estado='Disponible' and idhabitacion
not in(select idhabitacion from reserva
where( STR_TO_DATE('01-01-2014', '%d-%m-%Y') between fecha_reserva and fecha_salida )
or
( STR_TO_DATE('25-01-2014', '%d-%m-%Y') between fecha_reserva and fecha_salida)
or
((STR_TO_DATE('01-01-2014', '%d-%m-%Y')<fecha_reserva)
and
(STR_TO_DATE('25-01-2014', '%d-%m-%Y')> fecha_reserva))
or
((STR_TO_DATE('25-01-2014', '%d-%m-%Y')>fecha_salida)
and
(STR_TO_DATE('01-01-2014', '%d-%m-%Y')< fecha_salida)))
//metodo ke recibe una cadena de texto con una consulta, un objeto de tipo Conection y
//devuelve un array con los datos( metodo generico para cualquier consulta )
/*Nota: Este metodo deberia estar en una clase aparte llamada por ejemplo JDBCUtil*/
public static String[][] ejecutaConsulta(String consulta, Connection p_Conexion) {
//creamo el array vacio ke contendrá los datos
String[][] datos = null;
//creamos un objeto statement vacio
Statement st = null;
try {
//inicio el objeto statement ke me permitira obtener un resultSet recorrible en ambos sentidos y de solo lectura
st = p_Conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//creo el resultset y ejecuto la consulta pasada por parametro a traves del objeto statement
ResultSet rs = st.executeQuery(consulta);
//Obtengo un resultSet con los metadatos de la consulta(num columnas, nom columnas, ....)
ResultSetMetaData rsm = rs.getMetaData();
//obtengo el numero de columnas del resultsetmetadata y lo guardo en la variable ke cree para ello
int numCol = rsm.getColumnCount();
//me voy a la ultima fila del resultSet
rs.last();
//creo una variable y el asigno el valor de la fila actual, en este caso la ultima.
int numFilas = rs.getRow();
//vuelvo al principio del resultset para empezar a recorrerlo
rs.beforeFirst();
//inicializo el array de datos con el numero de filas y el numero de columnas
datos = new String[numFilas][numCol];
//creo un contador
int i = 0;
//recorro el resultSet columna a columna y fila a fila y guardo el dato en el array
while (rs.next()) {
for (int j = 0; j < datos[0].length; j++) {
datos[i][j] = rs.getString(j + 1);
}
i++;
}
} catch (SQLException e) {
//error si la consulta falla
System.out.println("Error al ejecutar la consulta " + e.getMessage());
}
//Cierro el objeto statement.
try {
if (st != null) {
st.close();
}
} catch (SQLException ex) {
//error si el statment no se puede cerrar...
System.out.println("Error cerrando el resultset " + ex.getMessage());
}
//devuelvo los datos
return datos;
}
//metodo ke recibe una cadena con una consulta, un objeto de tipo Conection y
//devuelve los nombres de las columnas de esa consulta (metodo generico para cualkier consulta)
//este metodo viene hacer lo mismo ke el anterior pero obtengo el nombre de las columnas
//del objeto ResultSetMeataData
/*Nota: Este metodo deberia estar en una clase aparte llamada por ejemplo JDBCUtil*/
public static String[] getNombresColumnas(String consulta, Connection p_Conexion) {
String[] nombresColumnas = null;
Statement st = null;
try {
st = p_Conexion.createStatement();
ResultSet rs = st.executeQuery(consulta);
ResultSetMetaData rsm = rs.getMetaData();
nombresColumnas = new String[rsm.getColumnCount()];
for (int i = 0; i < rsm.getColumnCount(); i++) {
nombresColumnas[i] = rsm.getColumnLabel(i + 1);
}
} catch (SQLException e) {
System.out.println("Error obteniendo nombres de las columnas " + e.getMessage());
}
try {
if (st != null) {
st.close();
}
} catch (SQLException ex) {
System.out.println("Error cerrando el resultset " + ex.getMessage());
}
return nombresColumnas;
}
public static String creaHabitacionesLibresQuery(String fecha_inicio, String fecha_fin) {
String cadena = "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"
+ "( STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y') between fecha_reserva and fecha_salida )\n"
+ "or\n"
+ "( STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y') between fecha_reserva and fecha_salida)\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')<fecha_reserva)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')> fecha_reserva))\n"
+ "or\n"
+ "((STR_TO_DATE('" + fecha_fin + "', '%d-%m-%Y')>fecha_salida)\n"
+ "and\n"
+ "(STR_TO_DATE('" + fecha_inicio + "', '%d-%m-%Y')< fecha_salida)))\n";
return cadena;
}
public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
Connection conn;
/*aki debemos iniciar el objeto conn con una conexion a tu base de datos*/
//Una vez el conn esta iniciado solo deberemos hacer:
String consulta= NombreClase.creaHabitacionesLibresQuery(fechaInicio,fechaSalida);
String[] nombresColumnas= NombreClase.getNombresColumnas(consulta, conn);
String[][] datos= NombreClase.ejecutaConsulta(consulta, conn);
DefaultTableModel modelo=new DefaultTableModel(datos, nombresColumnas);
return modelo;
}
/**
* 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
/**
* 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.
select idhabitacion from habitacion where (select idhabitacion from habitacion where idhabitacion > 2)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
SELECT * FROM habitacion WHERE idhabitacion IN( SELECT idhabitacion FROM reservas);
SELECT concat( idhabitacion, " Numero de habitaciones: ",(SELECT count(*) FROM habitacion)) FROM habitacion
select idhabitacion from habitacion where idhabitacion in (select idhabitacion from habitacion where idhabitacion > 2)