Java - Sentencia SQL

 
Vista:
Imágen de perfil de Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 13:38:44
Cuando realizo la consulta sql me tendría que devolver todos los registros por debajo del stock mínimo (ya me asegure de que estén todos por debajo del stock mínimo), sin embargo solo le selecciona aquellos que en su cantidad tiene números con decimales.

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
96
97
98
99
100
101
102
103
104
105
106
107
108
public void CargarArticulos(){
    String proveedor = comboproveedor.getSelectedItem().toString();
 
    if (proveedor == "TODOS"){
        DefaultTableModel modelo = (DefaultTableModel) tablaarticulos.getModel();
        modelo.setRowCount(0);
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            Statement st = null;
            String sql = "Select stockminimo from articulos";
            st = connect().createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                String stockminimo  = rs.getString("stockminimo");
 
                try{
                    String sql1 = "SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= "+stockminimo+"";
                    pst =connect().prepareStatement(sql1);
                    rs = pst.executeQuery();
                    while(rs.next()){
                        Vector v = new Vector();
                        v.add(rs.getString(1));
                        v.add(rs.getString(2));
                        v.add(rs.getString(3));
                        v.add(rs.getString(4));
                        v.add(rs.getString(5));
                        v.add(rs.getString(6));
                        v.add(rs.getString(7));
                        modelo.addRow(v);
                        tablaarticulos.setModel(modelo);
                    }
                }catch(Exception e){
                    System.err.println("Error" + e);
                }finally {
                    try{
                        if (connect() != null && !connect().isClosed()) {
                            connect().close();
                        }
                    }catch (SQLException ex) {
                        ex.printStackTrace(System.out);
                    }
                }
            }
        }catch (Exception e) {
            JOptionPane.showMessageDialog(null,e);
        }finally {
            try{
                if (connect() != null && !connect().isClosed()) {
                    connect().close();
                }
            }catch (SQLException ex) {
                ex.printStackTrace(System.out);
            }
        }
    }else{
        DefaultTableModel modelo = (DefaultTableModel) tablaarticulos.getModel();
        modelo.setRowCount(0);
        PreparedStatement pst = null;
        ResultSet rst = null;
        try {
            Statement st = null;
            String sql = "Select stockminimo from articulos";
            st = connect().createStatement();
            rst = st.executeQuery(sql);
            while(rst.next()){
                String stockminimo  = rst.getString("stockminimo");
                try{
                    String sql1 = "SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= "+stockminimo+" AND proveedor = '"+proveedor+"'";
                    pst =connect().prepareStatement(sql1);
                    rst = pst.executeQuery();
                    while(rst.next()){
                        Vector v = new Vector();
                        v.add(rst.getString(1));
                        v.add(rst.getString(2));
                        v.add(rst.getString(3));
                        v.add(rst.getString(4));
                        v.add(rst.getString(5));
                        v.add(rst.getString(6));
                        v.add(rst.getString(7));
                        modelo.addRow(v);
                        tablaarticulos.setModel(modelo);
                    }
                }catch(Exception e){
                    System.err.println("Error" + e);
                }finally {
                    try{
                        if (connect() != null && !connect().isClosed()) {
                            connect().close();
                        }
                    }catch (SQLException ex) {
                        ex.printStackTrace(System.out);
                    }
                }
            }
        }catch (Exception e) {
            JOptionPane.showMessageDialog(null,e);
        }finally {
            try{
                if (connect() != null && !connect().isClosed()) {
                    connect().close();
                }
            }catch (SQLException ex) {
                    ex.printStackTrace(System.out);
            }
        }
    }
}
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 Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Rodrigo (623 intervenciones) el 28/10/2019 14:00:30
Tengo comentarios a tu codigo, que no necesariamente resuelven tu problema, pero que ayudaran a simplificarlo.
Codigo simple sirve para enterderlo mejor y encontrar sus problemas mas facilmente.

- Por que requieres llamar a connect() a cada rato? Por que no llamarla 1 vez, guardar su valor y usarlo cada vez que se requiere? Es raro esto de andarse conectando cada vez que se hace algo con la base de datos.
- La comparacion de strings equals, no con ==
- En el prepareStatement no uses concatenacion de Strings. En la expresion, usa "?" cuando requieres un valor y luego le pasas los valores con setInt y otras. Hacerlo mediante concatenacion te hace preocuparte de los tipos, agregando comillas en el caso del string, y es un precursor de ataques usando sqlInjection. Es una mala practica que deberias abandonar.
- Hay harta redundancia en este codigo, refactoriza este codigo para no repetir varias veces lo que escribes.
- Usa try with resources. EN GENERAL, En vez de
1
2
3
4
5
6
7
try {
  resource = crear_resource();
   ...
} {
} finally {
   resource.close();
}
puedes usar
1
2
try( resource = crear_resource() ) {
}
- Estas re-usando el resultSet, tienes un ciclo con while( rs.next() ) y dentro de el, modificas rs y haces un ciclo dentro.
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
Imágen de perfil de pablo
Val: 626
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por pablo (239 intervenciones) el 28/10/2019 14:03:55
Hola qué tal Alejandro, pues bueno lo que se me ocurre así por probar y aunque puede parecer algo rustico sería incruir un not like al sql es decir, supongamos que así quedaría tu sql:
1
2
SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= "+stockminimo+" AND proveedor = '"+proveedor+"
and cantidad not like = ",%"

Eso te excluira aquellas cantidades que tenga decimales.

Es lo que se me ocurre de momento de todos modos si no es así esperemos que alguien más del foro responda

Saludos.
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 Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 16:10:35
Hola Pablo, pasa que yo no quiero excluir los que tiene decimal, yo quiero que me seleccione todos los que están por debajo del stock mínimo tengan decimales o no. Creo yo que el problema a de ser a las hora de preguntar si son iguales o mayor al valor de la variable..
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 17:06:15
Una pregunta... la columna stockminimo tiene el mismo valor para todos los registros en la tabla articulos?
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 17:40:22
Lo que puedo ver es que cada registro tiene un stockminimo y también tiene una cantidad.
Supongo que el stockminimo es una especie de punto de reorden y la tabla debe mostrar los productos que están en esa condición.

Si lo que he dicho es correcto entonces te cuento que tienes un verdadero enredo. Tal ves no lo notas porque tienes pocos productos y el procesador (CPU) de tu computadora lo resuelve rápido... Mejor no sigo y te doy una solución correcta.

Te recomiendo destinar una clase que se encargue de gestionar las consultas y conexiones a la base de datos, de este modo evitas estar poniendo cadenas de conexión por todo el proyecto. Para seguir rápido con la respuesta te dejo un método que se va a llamar executeQuery
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
/**
 * Ejecuta una consulta a la base de datos. Devuelve una lista con los
 * registros de la consulta
 *
 * @param sqlCommand
 * @param params
 * @return
 */
public List<String[]> executeQuery(String sqlCommand, String[] params) {
    Connection cn = null;
    PreparedStatement pst = null;
    ResultSet rs;
    List<String[]> rows = new ArrayList();
    try {
        cn = connect();
        pst = cn.prepareStatement(sqlCommand);
        if (params != null && sqlCommand.contains("?")) {
            for (int i = 0; i < params.length; i++) {
                pst.setObject(i + 1, params[ i ]);
            }
        }
        rs = pst.executeQuery();
        int cols = rs.getMetaData().getColumnCount();
        String[] row;
        while (rs.next()) {
            row = new String[cols];
            for (int i = 0; i < row.length; i++) {
                row[ i ] = rs.getString(i + 1);
            }
            rows.add(row);
        }
    } catch (SQLException ex) {
        System.out.println("Error al ejecutar query: " + sqlCommand);
        ex.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 rows;
}

Entonces si lo primero que dije es correcto entonces con el uso del método executeQuery y una corrección en tu consulta tu método CargarArticulos() quedaría así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void CargarArticulos() {
    String proveedor = comboproveedor.getSelectedItem().toString();
    String[] columnas = new String[tablaarticulos.getColumnCount()];
    for (int i = 0; i < columnas.length; i++) {
        columnas[i] = tablaarticulos.getColumnName(i);
    }
    String sql = "SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= stockminimo";
    String[] params;
    if (proveedor.equalsIgnoreCase("todos")) {
        params = null;
    } else {
        sql += " AND proveedor = ?";
        params = new String[]{proveedor};
    }
    List<String[]> datos = executeQuery(sql, params);
    String[][] data = new String[datos.size()][columnas.length];
    for (int i = 0; i < data.length; i++) {
        data[i] = datos.get(i);
    }
    tablaarticulos.setModel(new DefaultTableModel(data, columnas));
}


Saludos,
Billy Joel
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
Imágen de perfil de Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 19:29:02
El valor de la columna stockminimo la carga uno mismo cuando genera el articulo de cero, de esta manera cada articulo tiene su cantidad de la cual se dispone en stock y un stock mínimo, el cual me sirve para la consulta y así saber de cuales productos debo realizar pedidos porque ya me quedan pocos o por que esta por debajo del stock mínimo establecido. Y tiene decimales porque la mercadería o artículos que trabajo pueden venir en mts kg o unidad. Y los que no me están listando son los que están en unidad..
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 19:37:55
Entonces mis suposiciones eran correctas y la respuesta que te dejé arriba te debe servir a 100%
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 Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 20:24:42
Me funciono tu código si, pero igual solo me sigue listando los artículos que tiene las cantidades con decimales, por ejemplo la cantidad es 15.5 y el stock mínimo es 20. Ese tipo de artículos si me lista, pero los que tiene cantidades como 85 y un stick mínimo de 100 no me los lista..
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 20:57:29
que tipo de dato tienes para cantidad y stockminimo en tu tabla?
varchar, decimal, real?
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 21:27:10
Modifica esta linea
1
String sql = "SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= stockminimo";

por
1
String sql = "SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cast(cantidad as decimal(10,2)) <= cast(stockminimo as decimal(10,2))";
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
Imágen de perfil de Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 21:31:57
Perfecto, funciono. Una pregunta como funciona eso del cast(cantidad as decimal(10,2)) osea, mas allá de que ya me funcione que es lo que hace esa linea?? Los transforma a decimales o algo así?? Pregunto, porque nunca lo use ni lo había visto..

Muchas Gracias desde ya!!
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 21:33:05
así es... a nivel de MySQL transforma el varchar en decimal
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 Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 21:47:46
Genial, Muchísimas gracias!! Una pregunta, por las dudas tenes idea de como validar un JDateChooser para que no me permita ingresar fechas superior a la del día en que estamos. Yo escribí un código que es siguiente en base a lo que busque en Internet y lo que puede entender de comparar fechas y los coloque en el lostfocus del JDateChooser. La verdad no tengo mucha idea de como validar esto así que estuve probando.

Este es el código que yo escribí pero no funciona, es para cuando yo cargue las facturas de los proveedores y tener un registro en el sistema..

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
private void datefechaFocusLost(java.awt.event.FocusEvent evt) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date fecha3 = null;
    Date fecha4 = null;
 
    Calendar c;
    c = Calendar.getInstance();
    int d = c.get(Calendar.DATE), m = 1 + (c.get(Calendar.MONTH)), a = c.get(Calendar.YEAR);
    String day = Integer.toString(d);
    String month = Integer.toString(m);
    String year = Integer.toString(a);
    String fecha1 = (year + "-" + month + "-" + day);
 
    String fecha2 = sdf.format(datefecha.getCalendar().getTime());
 
    try {
        fecha3 = sdf.parse(fecha1);
        fecha4 = sdf.parse(fecha2);
        int comparacion = fecha3.compareTo(fecha4);
        if(comparacion > 0){
            JOptionPane.showMessageDialog(rootPane, "La fecha es invalida");
            datefecha = null;
        }
 
    } catch (ParseException ex) {
        Logger.getLogger(facturasproveedor.class.getName()).log(Level.SEVERE, null, ex);
    }
}
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

Sentencia SQL

Publicado por Billy Joel (876 intervenciones) el 28/10/2019 22:20:23
Si quieres validar las fechas de un JDateChooser puedes probar con el evento PropertyChange
1
2
3
4
5
6
7
8
9
10
private void datefechaPropertyChange(java.beans.PropertyChangeEvent evt) {
    if(datefecha.getDate() != null){
        if(datefecha.getDate().after(new Date())){
            JOptionPane.showMessageDialog(null, "Fecha despues de hoy", "Fecha invalida", JOptionPane.WARNING_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(null, "Fecha antes de hoy", "Fecha valida", JOptionPane.INFORMATION_MESSAGE);
        }
        System.out.println("property change: " + datefecha.getDate());
    }
}
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
Imágen de perfil de Alejandro
Val: 38
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por Alejandro (21 intervenciones) el 28/10/2019 22:25:51
Perfecto, es justo lo que quería hacer. De verdad Muchísimas gracias!!
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 kip
Val: 96
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Sentencia SQL

Publicado por kip (20 intervenciones) el 28/10/2019 18:00:42
Hola, que tipo de dato tiene la columna sotckminimo y cantidad ? Lo pregunto porque, en mi lógica, no tiene sentido tener un stock en decimales (cantidad en este caso), a menos que sean productos controlados por su peso...

Por cierto iteras sobre la primera consulta y con cada valor realizas una búsqueda, tienen los mismos valores de stockminimo ciertos registros ? porque si es asi vas a tener duplicidad e innecesaria ejecución, para solucionar puedes usar DISTINCT

1
Select DISTINCT(stockminimo) from articulos

Pero de todas formas no le veo el sentido, porque tomas estos valores de stockminimo para luego buscarlos, ejecuta una sola query:

1
SELECT cod, articulo, proveedor, stockminimo, cantidad, unidad, preciocosto FROM articulos WHERE cantidad <= stockminimo
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