Java - Filtrar datos java

 
Vista:
sin imagen de perfil
Val: 26
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Aitor (17 intervenciones) el 03/12/2018 12:46:22
Estoy programando una tienda y tengo una ventana con 5 JComboBoxs(Tipo, Talla, Color, Marca, Equipo). Quiero hacer un filtro de los productos en función de las opciones seleccionadas en el JComboBox. El caso es que he hecho un método en la base de datos pero solo consigo que funcione seleccionando una opción en cada JComboBox y yo lo que quiero es que filtre los productos seleccionando 1 JComboBox, 2 , 3 o incluso 4.

No se si me he explicado correctamente yo lo que quiero es filtrar los productos sin tener que utilizar los 5 JComboBoxs. Por ejemplo que me filtre los productos de tipo "Camisetas" con talla "L"

Este es el método que he hecho para el filtrado de productos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public ArrayList<String> obtenerRutasConFiltro(String tipo, String color, String marca, String talla, String equipo, String cat){
 
    String query= "SELECT DISTINCT(ruta) FROM PRODUCTOS WHERE (tipo='" + tipo + "' AND color ='" + color +"' AND marca='" + marca +"' AND talla='" + talla +"' AND equipo='" + equipo +"') AND categoria='"+cat+"'";
    ArrayList<String> aRutas = new ArrayList<String>();
    ResultSet rs;
    try {
        rs = stmt.executeQuery(query);
        while(rs.next()) {
            String ruta = rs.getString(1);
            aRutas.add(ruta);
        }
        rs.close();
    } catch(SQLException e) {
        e.printStackTrace();
    }
    return aRutas;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Billy Joel (876 intervenciones) el 03/12/2018 15:29:14
Viendo tu código lo que veo es que te hace falta la conexión a la base de datos.
He copiado tu código y lo he acomodado y te explico
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public ArrayList<String> obtenerRutasConFiltro(String tipo, String color, String marca, String talla, String equipo, String cat) {
    Connection cn = null;
    PreparedStatement pst = null;
    ResultSet rs;
    String query = "SELECT DISTINCT(ruta) FROM PRODUCTOS WHERE tipo = ? AND color = ? AND marca = ? AND talla = ? AND equipo = ? AND categoria = ?";
    ArrayList<String> aRutas = new ArrayList();
    try {
        cn = MyConnection.getInstance().getConnection();
        pst = cn.prepareStatement(query);
        pst.setObject(1, tipo);
        pst.setObject(2, color);
        pst.setObject(3, marca);
        pst.setObject(4, talla);
        pst.setObject(5, equipo);
        pst.setObject(6, cat);
        rs = pst.executeQuery();
 
        while (rs.next()) {
            String ruta = rs.getString(1);
            aRutas.add(ruta);
        }
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace(System.out);
    } finally {
        try {
            if (pst != null && !pst.isClosed()) {
                pst.close();
            }
            if (cn != null && !cn.isClosed()) {
                cn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
        }
    }
    return aRutas;
}

Como experto te hago las siguientes recomendaciones:
- En lugar de usar la clase Statement para realizar consultas y ejecutar comandos a la base de datos, utiliza la clase PreparedStatement; Esta clase es MUCHO mas eficiente que Statement. Fijate como en lugar de concatenar las variables al comando sql, lo que hago es poner signos de interrogación ?; Luego estas variables se añaden al objeto PrepareStatement
- La línea 8 la he sombreado y subrayado, esto lo hago para resaltar la importancia de la conexión a la base de datos. No se como la estes manejando. Yo lo manejo así.
- Siempre, siempre, siempre, que termines de utilizar un recurso de base de datos debes cerrar la conexión y eso es lo que hago con el finally.

Si necesitas mas ayuda puedes escribir y con gusto te hehco la mano.

Saludos!
;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Aitor (17 intervenciones) el 03/12/2018 15:54:03
La conexión a la base de datos la hago según ejecuto el programa ya que tengo que comprobar que el usuario que se quiere logear está registrado o no.

En cuanto al código en referencia al filtrado de datos me sigue obligando a seleccionar una opción en cada JComboBox. Si elijo solo una opción no me aparece ningún producto, en cambio si elijo las 5 opciones me filtra los productos correctamente.

Yo lo que quiero es que elija las opciones que elija me filtre el producto. Por ejemplo, con ese código si elijo "Camisetas" , "Talla L" "Rojo" "Manchester" "Nike" me salen las camisetas con esos datos

Pero yo quiero que si elijo solo "Camisetas" y "Talla L" me salgan todas las camisetas de dicha tallla

He probado en cambiar los AND de la sentencia por OR pero eso hace que solo me deje elegir uno de los JComboBox.

Muchas gracias por la ayuda de todas formas ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Billy Joel (876 intervenciones) el 03/12/2018 16:38:13
Bueno en ese caso lo que hay que hacer es preparar la consulta (query) en base a los parámetros recibidos.
Siendo así entonces entonces esto te va a funcionar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public ArrayList<String> obtenerRutasConFiltro(String tipo, String color, String marca, String talla, String equipo, String cat) {
    tipo = tipo == null ? "" : tipo;
    color = color == null ? "" : color;
    marca = marca == null ? "" : marca;
    talla = talla == null ? "" : talla;
    equipo = equipo == null ? "" : equipo;
    cat = cat == null ? "" : cat;
    Connection cn = null;
    PreparedStatement pst = null;
    ResultSet rs;
//        String query = "SELECT DISTINCT(ruta) FROM PRODUCTOS WHERE tipo = ? AND color = ? AND marca = ? AND talla = ? AND equipo = ? AND categoria = ?";
    String query = "SELECT DISTINCT(ruta) FROM PRODUCTOS";
    query += (!tipo.isEmpty() || !color.isEmpty() || !marca.isEmpty() || !talla.isEmpty() || !equipo.isEmpty() || !cat.isEmpty()) ? " where " : "";
    query += !tipo.isEmpty() ? " tipo = ?" : "";
    query += !color.isEmpty() ? " color = ?" : "";
    query += !marca.isEmpty() ? " marca = ?" : "";
    query += !talla.isEmpty() ? " talla = ?" : "";
    query += !equipo.isEmpty() ? " equipo = ?" : "";
    query += !cat.isEmpty() ? " categoria = ?" : "";
 
    ArrayList<String> aRutas = new ArrayList();
    try {
        cn = MyConnection.getInstance().getConnection();
        pst = cn.prepareStatement(query);
        int posicion = 1;
        if (!tipo.isEmpty()) {
            pst.setObject(posicion, tipo);
            posicion++;
        }
        if (!color.isEmpty()) {
            pst.setObject(posicion, color);
            posicion++;
        }
        if (!marca.isEmpty()) {
            pst.setObject(posicion, marca);
            posicion++;
        }
        if (!talla.isEmpty()) {
            pst.setObject(posicion, talla);
            posicion++;
        }
        if (!equipo.isEmpty()) {
            pst.setObject(posicion, equipo);
            posicion++;
        }
        if (!cat.isEmpty()) {
            pst.setObject(posicion, cat);
        }
        rs = pst.executeQuery();
        while (rs.next()) {
            String ruta = rs.getString(1);
            aRutas.add(ruta);
        }
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace(System.out);
    } finally {
        try {
            if (pst != null && !pst.isClosed()) {
                pst.close();
            }
            if (cn != null && !cn.isClosed()) {
                cn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
        }
    }
    return aRutas;
}

PD: Deberías colocar como es que te conectas a la base de datos para colocar la solución completa
;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Aitor (17 intervenciones) el 03/12/2018 18:11:45
Muchas gracias porque era algo así lo que necesitaba.

De todas formas me sale el siguiente error: org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "marca": syntax error) Si elijo la opción marca me da error near "marca" si marco la opción talla me da error near "talla" y así con todos....

Le daré unas vueltas a ver si consigo solucionarlo porque creo que es algo así lo que necesito. Por cierto al llamar al método en la categoría le paso un nombre tal que así: VentanaLogin.bd.obtenerRutasConFiltro(tipo, color, marca, talla, equipo, "Fútbol");

¿Tendría que quitar los atributos que hacen referencia a cat en el código anterior no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Billy Joel (876 intervenciones) el 03/12/2018 18:16:51
Mil disculpas, me di cuenta del error de sql. a continuación la corrección
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public ArrayList<String> obtenerRutasConFiltro(String tipo, String color, String marca, String talla, String equipo, String cat) {
    tipo = tipo == null ? "" : tipo;
    color = color == null ? "" : color;
    marca = marca == null ? "" : marca;
    talla = talla == null ? "" : talla;
    equipo = equipo == null ? "" : equipo;
    cat = cat == null ? "" : cat;
    Connection cn = null;
    PreparedStatement pst = null;
    ResultSet rs;
//        String query = "SELECT DISTINCT(ruta) FROM PRODUCTOS WHERE tipo = ? AND color = ? AND marca = ? AND talla = ? AND equipo = ? AND categoria = ?";
    String query = "SELECT DISTINCT(ruta) FROM PRODUCTOS";
    query += (!tipo.isEmpty() || !color.isEmpty() || !marca.isEmpty() || !talla.isEmpty() || !equipo.isEmpty() || !cat.isEmpty()) ? " where " : "";
//    query += !tipo.isEmpty() ? " tipo = ?" : "";
//    query += !color.isEmpty() ? " color = ?" : "";
//    query += !marca.isEmpty() ? " marca = ?" : "";
//    query += !talla.isEmpty() ? " talla = ?" : "";
//    query += !equipo.isEmpty() ? " equipo = ?" : "";
//    query += !cat.isEmpty() ? " categoria = ?" : "";
    int params = 0;
    if(!tipo.isEmpty()){
        query += " tipo = ?";
        params++;
    }
    if(!color.isEmpty()){
        query += params > 0 ? " and color = ?" : " color = ?";
        params++;
    }
    if(!marca.isEmpty()){
        query += params > 0 ? " and marca = ?" : " marca = ?";
        params++;
    }
    if(!talla.isEmpty()){
        query += params > 0 ? " and talla = ?" : " talla = ?";
        params++;
    }
    if(!equipo.isEmpty()){
        query += params > 0 ? " and equipo = ?" : " equipo = ?";
        params++;
    }
    if(!cat.isEmpty()){
        query += params > 0 ? " and categoria = ?" : " categoria = ?";
        params++;
    }
 
    ArrayList<String> aRutas = new ArrayList();
    try {
        cn = MyConnection.getInstance().getConnection();
        pst = cn.prepareStatement(query);
        int posicion = 1;
        if (!tipo.isEmpty()) {
            pst.setObject(posicion, tipo);
            posicion++;
        }
        if (!color.isEmpty()) {
            pst.setObject(posicion, color);
            posicion++;
        }
        if (!marca.isEmpty()) {
            pst.setObject(posicion, marca);
            posicion++;
        }
        if (!talla.isEmpty()) {
            pst.setObject(posicion, talla);
            posicion++;
        }
        if (!equipo.isEmpty()) {
            pst.setObject(posicion, equipo);
            posicion++;
        }
        if (!cat.isEmpty()) {
            pst.setObject(posicion, cat);
        }
        rs = pst.executeQuery();
        while (rs.next()) {
            String ruta = rs.getString(1);
            aRutas.add(ruta);
        }
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace(System.out);
    } finally {
        try {
            if (pst != null && !pst.isClosed()) {
                pst.close();
            }
            if (cn != null && !cn.isClosed()) {
                cn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace(System.out);
        }
    }
    return aRutas;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Filtrar datos java

Publicado por Aitor (17 intervenciones) el 03/12/2018 18:20:48
Mil gracias, funciona a la perfección ahora.

Eres un crack. ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar