style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Duda Con Consultas

Hola buenas tardes, estoy haciendo un sistema para consultar información vía web, lo estoy desarrollando con Java y debo utilizar una base de datos en Access, esto no lo puedo cambiar por petición del cliente. Lo que estoy haciendo es que para generar los reportes,la información la obtengo a través de métodos, creo un método específico para cada tipo de reporte, y el problema está en que en un solo método tengo problemas al utilizar consultas que contengan Group by o Distinct, estas consultas las pruebo previamente en el manejador y funcionan, pero cuando las implemento en el método de java no me devuelve información. Al obtener los datos de un método los muestro a través de un JSP.
Estos son los códigos para ver si alguien podría indicarme a que se debe que esas consultas no funcionan y como debo resolverlo. Gracias.

Método de Java:

public static LinkedList<MetodosBusquedas> getReportePG(String programa2, String periodo2){    
                Connection canal= null;        
            ResultSet tabla= null, tabla2=null;
            Statement instruccion=null, instruccion2=null;         
            String sqlString="", sqlString2="";    
            String programa=programa2, periodo=periodo2;
           
            String anio="", matricula="", alumnoSem="", carreraSem="", matri="", nombre="", cveAlumno="", semestres="";
            int anioBaja=0, total=0, rows=0, rowM=0, calif=0, rowS=0, numSemestre=0, semestre=0, contador=0, promSem=0;
            double promedioGeneral=0.0, promedio=0.0, califN=0.0, suma=0;
           
            if(periodo!=null && !periodo.equals("")){
                anio=periodo.substring(0,4);
                anioBaja=Integer.parseInt(anio);
            }
           
            LinkedList<MetodosBusquedas> reportePG= new LinkedList<MetodosBusquedas>();
            LinkedList matriculas= new LinkedList();
            LinkedList promedios= new LinkedList();
            LinkedList ordinarios= new LinkedList();
            LinkedList<MetodosAuxiliares> materiaPA= new LinkedList();
            LinkedList<MetodosAuxiliares> totalMatSem= new LinkedList();
            LinkedList<MetodosAuxiliares> totalMatAlum= new LinkedList();
            LinkedList<MetodosAuxiliares> alumnos= new LinkedList();               
           
            try {  //conectar a la b.d.
                canal = Conector.getConexion("ux");
                instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        }catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {} catch(IOException e){};                  
                       
                try{
                        if(anioBaja<2000)
                                sqlString = "SELECT historia.matricula FROM historia INNER JOIN alumnos ON historia.matricula=alumnos.matricula WHERE historia.carrera='"+programa+"' AND historia.periodo='"+periodo+"' AND alumnos.sit_esc<>'B' ORDER BY historia.matricula;";
                        else
                                sqlString = "SELECT historia.matricula FROM historia INNER JOIN alumnos ON historia.matricula=alumnos.matricula WHERE historia.carrera='"+programa+"' AND historia.periodo='"+periodo+"' AND (historia.sit_adm is null OR (historia.sit_adm<>'B' AND historia.sit_adm<>'BD' AND historia.sit_adm<>'BA' AND historia.sit_adm<>'BT' AND historia.sit_adm<>'CE')) ORDER BY historia.matricula;";
                        tabla = instruccion.executeQuery(sqlString);
                        while (tabla.next()){
                                matriculas.add(tabla.getString("matricula"));
                        }              
                       
                        sqlString="SELECT plan_est.sem, plan_est.cve_mat FROM plan_est WHERE plan_est.carrera='"+programa+"' AND plan_est.ext_cur<>'*';";
                        tabla = instruccion.executeQuery(sqlString);
                        while (tabla.next()){
                                MetodosAuxiliares ma= new MetodosAuxiliares();
                                ma.setSemestres(tabla.getString("sem"));
                                ma.setMateria(tabla.getString("cve_mat"));
                                materiaPA.add(ma);
                        }              
                       
                        sqlString="SELECT count(plan_est.cve_mat) AS total, plan_est.sem FROM plan_est WHERE plan_est.carrera='"+programa+"' AND plan_est.ext_cur<>'*' GROUP BY plan_est.sem;";
                        tabla = instruccion.executeQuery(sqlString);
                        while (tabla.next()){
                                MetodosAuxiliares ma= new MetodosAuxiliares();
                                ma.setSemestres(tabla.getString("sem"));
                                ma.setTotal(tabla.getInt("total"));
                                totalMatSem.add(ma);
                        }
                       
                        MetodosBusquedas datos= new MetodosBusquedas();
                        datos.setHombresNI(totalMatSem.size());
                        reportePG.add(datos);          
                                               
                        for(int i=0;i<matriculas.size();i++){
                                matricula=(String)matriculas.get(i);
                                total=0;
                                sqlString = "SELECT DISTINCT historia.sem FROM historia WHERE historia.periodo<='"+periodo+"' AND historia.carrera='"+programa+"' AND historia.matricula='"+matricula+"';";
                                tabla = instruccion.executeQuery(sqlString);
                                tabla.last();
                                rows=tabla.getRow();
                                tabla.beforeFirst();                           
                                for(int p=0;p<rows;p++){                               
                                        if(tabla.next()){
                                                alumnoSem=tabla.getString("sem");
                                                for(int w=0;w<totalMatSem.size();w++){
                                                        carreraSem=totalMatSem.get(w).getSemestres();
                                                        if(carreraSem.equals(alumnoSem)) total+=totalMatSem.get(w).getTotal();
                                                }
                                        }
                                }
                                /*MetodosAuxiliares ma= new MetodosAuxiliares();
                                ma.setMatricula(matricula);
                                ma.setTotal(total);
                                totalMatAlum.add(ma);*/

                        }
                                               
                        for(int i=0;i<matriculas.size();i++){
                                matricula=(String)matriculas.get(i);
                                rowM=10;
                                sqlString="SELECT IIF(grupos.sumario is null,0,val(grupos.sumario)) AS calif FROM grupos INNER JOIN plan_est ON grupos.cve_materia=plan_est.cve_mat WHERE grupos.matricula='"+matricula+"' AND periodo<='"+periodo+"' AND plan_est.ext_cur<>'*';";
                                tabla = instruccion.executeQuery(sqlString);
                                tabla.last();
                                rows=tabla.getRow();
                                tabla.beforeFirst();                           
                                for(int n=0;n<rows;n++){                               
                                        if(tabla.next()){
                                                calif=tabla.getInt("calif");
                                                suma+=calif;
                                                if(calif<=rowM)
                                                        rowM=calif;
                                        }
                                }
                                for(int w=0;w<totalMatAlum.size();w++){
                                        matri=totalMatAlum.get(w).getMatricula();
                                        if(matri.equals(matricula))
                                                promedio=suma/(totalMatAlum.get(w).getTotal());
                                }                      
                                if(rowM>5 && promedio>=9)
                                        ordinarios.add(matricula);                             
                        }                      
                       
                        for(int i=0;i<ordinarios.size();i++){
                                matricula=(String)ordinarios.get(i);
                                sqlString = "SELECT grupos.cve_materia, IIF(grupos.sumario is null,0,val(grupos.sumario)) AS calif, plan_est.sem FROM grupos INNER JOIN plan_est ON grupos.cve_materia=plan_est.cve_mat WHERE grupos.matricula='"+matricula+"' AND periodo<='"+periodo+"' AND plan_est.ext_cur<>'*'";
                                tabla = instruccion.executeQuery(sqlString);                           
                                tabla.last();
                                rows=tabla.getRow();
                                tabla.beforeFirst();                           
                                for(int n=0;n<rows;n++){                               
                                        if(tabla.next()){
                                                MetodosAuxiliares info= new MetodosAuxiliares();
                                                info.setMatricula(matricula);
                                                info.setMateria(tabla.getString("cve_materia"));
                                                info.setSemestre(tabla.getString("sem"));
                                                info.setCalificacion(tabla.getInt("calif"));
                                                alumnos.add(info);
                                        }
                                }                              
                        }                      
                       
                        for(int i=0;i<ordinarios.size();i++){
                                matricula=(String)ordinarios.get(i);
                                sqlString = "SELECT max(historia.sem) AS numSemestre, (alumnos.nombre+' '+alumnos.ap_pat+' '+alumnos.ap_mat) AS nombreCompleto FROM historia INNER JOIN alumnos ON historia.matricula=alumnos.matricula WHERE historia.matricula='"+matricula+"' AND periodo<='"+periodo+"' GROUP BY historia.matricula, (alumnos.nombre+' '+alumnos.ap_pat+' '+alumnos.ap_mat)";
                                tabla = instruccion.executeQuery(sqlString);                           
                                if (tabla.next()){
                                        semestres=tabla.getString("numSemestre");
                                        nombre=tabla.getString("nombreCompleto");
                                }
                                numSemestre=Integer.parseInt(semestres);                               
                               
                                MetodosBusquedas datos= new MetodosBusquedas();
                                datos.setMatricula(matricula);
                                datos.setNombre(nombre);
                               
                                for(int j=0;j<9;j++){
                                        contador=0; califN=0.0; promedio=0.0;
                                        for(int x=0;x<alumnos.size();x++){
                                                cveAlumno=alumnos.get(x).getMatricula();
                                                semestre=alumnos.get(x).getSemestre();
                                                if(cveAlumno.equals(matricula) && semestre==(j+1)){
                                                        califN+=alumnos.get(x).getCalificacion();
                                                        contador+=1;
                                                }                                                                              
                                        }
                                        if(califN==0.0 && contador==0)
                                                promedio=0.0;
                                        else
                                                promedio=califN/contador;
                                        promedioGeneral+=promedio;
                                       
                                        if(promedio>=9)
                                                promSem+=1;                            
                                       
                                        if(j==0)
                                                datos.setPromedio1(promedio);
                                        if(j==1)
                                                datos.setPromedio2(promedio);                                  
                                        if(j==2)
                                                datos.setPromedio3(promedio);
                                        if(j==3)
                                                datos.setPromedio4(promedio);
                                        if(j==4)
                                                datos.setPromedio5(promedio);
                                        if(j==5)
                                                datos.setPromedio6(promedio);
                                        if(j==6)
                                                datos.setPromedio7(promedio);
                                        if(j==7)
                                                datos.setPromedio8(promedio);
                                        if(j==8)
                                                datos.setPromedio9(promedio);                                  
                                }
                                promedioGeneral=promedioGeneral/numSemestre;
                                datos.setPromedioGeneral(promedioGeneral);
                                if(promSem==numSemestre)
                                        reportePG.add(datos);
                                promSem=0;
                                promedioGeneral=0.0;                                   
                        }
                }catch(SQLException e){}
                finally {
                        if (canal != null)
                                try { canal.close();
                                } catch (SQLException e2) { }
                }              
                return reportePG;
        }

JSP:

<%
                                                LinkedList<MetodosBusquedas> lista= ResultadoBusquedas.getReportePG(programa, periodo);
                                                for (int i=0;i<lista.size();i++){
                                                        bandera=1;
                                                        matricula=lista.get(i).getMatricula();
                                                        nombre=lista.get(i).getNombre();                                               
                                                        p1=lista.get(i).getPromedio1();
                                                        p2=lista.get(i).getPromedio2();
                                                        p3=lista.get(i).getPromedio3();
                                                        p4=lista.get(i).getPromedio4();
                                                        p5=lista.get(i).getPromedio5();
                                                        p6=lista.get(i).getPromedio6();
                                                        p7=lista.get(i).getPromedio7();
                                                        p8=lista.get(i).getPromedio8();
                                                        p9=lista.get(i).getPromedio9();
                                                        pG=lista.get(i).getPromedioGeneral();
                                                       
                                                        DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
                                                        simbolos.setDecimalSeparator('.');
                                                        DecimalFormat df = new DecimalFormat("###.##", simbolos);
                                                        /*int matriculas=lista.get(i).getHombresNI();
                                                        int rowM=lista.get(i).getHombresRI();
                                                        int promedios=lista.get(i).getMujeresNI();
                                                        int rows=lista.get(i).getMujeresRI();
                                                        String ord=lista.get(i).getNombre();*/

                                          %>
                           <tr>
                            <td class="espacio"><%=matriculas%></td>
                            <td class="espacio"><%=nombre%></td>
                            <td class="espacio"><%=df.format(p1)%></td>
                            <td class="espacio"><%=df.format(p2)%></td>
                            <td class="espacio"><%=df.format(p3)%></td>
                            <td class="espacio"><%=df.format(p4)%></td>
                            <td class="espacio"><%=df.format(p5)%></td>
                            <td class="espacio"><%=df.format(p6)%></td>
                            <td class="espacio"><%=df.format(p7)%></td>
                            <td class="espacio"><%=df.format(p8)%></td>
                            <td class="espacio"><%=df.format(p9)%></td>
                            <td class="espacio"><%=df.format(pG)%></td>
                          </tr>
                    <%}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

JDBC

sin ver tu código, por la descripción del problema que das, me suena a que tu bronca es con el driver JDBC que estás usando. Cuando dices "en el manejador" supongo que es algun programa que se conecta directo a Access y ahí sí funcionan los queries, pero desde Java no funcionan, esto es probable que sea porque el driver JDBC que estás usando para conectarse a access hace algo con los queries que tienen group by etc y access no los recibe bien.

Y viendo muy por encimita tu código, la bronca podría ser con el SQL como queda generado, porque no estás usando queries parametrizados, sino concatenando la sentencia SQL y eso te hace vulnerable a inyección de SQL etc.

Seguridad

Ante todo te recuerdo que debes estar pendiente a la seguridad , según veo tus consultas sql son vulnerables, deberías usar parámetros en vez de concatenación haces un +matricula+, eso no es correcto, lo correcto sería variable.setString(int var,String var); y usar el signo ? . Así evitarás inyecciones, aparte creo que sería mejor que usaras un switch para los multi-condicionales .

Imagen de neko069

Independientemente de lo que

Independientemente de lo que ya se comentó, y aprovechando tu hueco de seguridad, haz una salida por consola de tu consulta cuando tenga todos los parámetros insertados, o sea, antes de ejecutarla, copia dicha consulta desde la consola, ejecútala en tu navegador de base de datos, si te trae registros, la falla va más por el lado, ya sea del driver como bien dice @ezamudio, o en su defecto, por la conexión (ya sabes, que esté apuntando bien a la URL de la base de datos, que el usuario y pass sea correcto y eso) ya que te asegures que el driver es el correcto, la conexión a la base si se realiza, y las consultas generadas por tus métodos si regresan resultados, cambia TODO según los comentarios anteriores..

Imagen de CesarAlducin

sto es probable que sea

sto es probable que sea porque el driver JDBC que estás usando para conectarse a access hace algo con los queries que tienen group by etc y access no los recibe bien.

Respecto a tu comentario @ezamudio hay alguna forma de solventar este problema, existe alguna herramienta para resolver problemas con el JDBC o porque se da este tipo de problemas, o sera que access presenta mas poblemas de lo normal con Java,???? y es que forzamente tengo que utilizar group by ......

Imagen de CesarAlducin

Cambiare mis Consultas SQL a

Cambiare mis Consultas SQL a como menciona ,@ezamudio y @Jefri y posteare el código resultante.

De igual forma agradezco el aporte de @neko069

Gracias.

Imagen de neko069

JDBC no es más que la

JDBC no es más que la especificación para conexiones a bases de datos, por sí mismo no hace nada.
Cada fabricante de bases de datos (dígase Oracle, IBM, PostgreSQL, MySQL, y en éste caso (el intento de base de datos)Microsoft access) deben proveer la implementación específica para que Java pueda interactuar con su base de datos.

Porqué el rollo? bueno, pues las consultas, si tienen problemas, serían más por el lado del cómo creas y ejecutas las consultas en sí, a diferencia de lo que planteas, el hecho de resolver problemas con JDBC sobre el driver de access .... aunque siendo de microsoft, pues sabe...

Aquí te dejo una liga donde explican cómo hacer la conexión, dando de alta el driver odbc en windows, y después en Java, utilizando un driver para conectarse al odbc.

Y aquí te dejo una liga con un listado de los proveedores de drivers para conexión a bases de datos mediante Java, ya nada más búscale cuál(es) es(son) compatible(s) para access y pues haces la prueba, digo, por decir que sea el jar que tienes para conectividad la causa del problema.

Imagen de cerimice

por experiencia...

Posiblemente tengas los problemas que dice con access debido a que las consultas en este manejador (si se puede llamar asi) son algo raras :S

si por ejemplo quieres lo siguiente:

SELECT AVG(calificacion) FROM alumnoGROUP BY materia

te marcara un error de sintaxis por que no lo se pero lo marca, y te dice algo asi como que todos los parametros de agrupacion deben pertenecer a la sentencia con lo cual lo corriges asi:

SELECT materia,AVG(calificacion) FROM alumnoGROUP BY materia

la verdad yo te recomendaría que propusieras la migración a otra base de datos como SQLite, ya que la conexion con ODBC-JDBC es algo inestable.

Imagen de CesarAlducin

@cerimice es increible

@cerimice es increible cuando te suceden este tipo de detalles los cuales corriges y sigues trabajando pero sin saber exactamente que hacer, aquí lo importante es conocer opiniones para mejorar nuestras aplicaciones, se te agradece el comentario y sigo trabajando en la solución

Imagen de cerimice

creo quee...

creo que por ello estamos aqui posteando nuestras cositas jejejeje seguir adelante, saludos

Imagen de CesarAlducin

ya estuve revise y revise mi

ya estuve revise y revise mi código y siento que por ahí no va el problema, también he revisado mi conexión JDBC y
tampoco es el problema porque hay consultas que si se ejecutan sin ningún problema.

en especifico esta es la consulta que me origina problema, me podrían ayudar a echarle un ojo a ver si por
ahí este algún detalle que este ocasionando que no me devuelva ningún valor y que si la ejecuto en modo consola en mi base de datos si me devuelve valores.

SELECT DISTINCT historia.matricula FROM historia INNER JOIN alumnos ON historia.matricula=alumnos.matricula WHERE historia.carrera='"+programa+"' AND historia.periodo='"+periodo+"' AND (historia.sit_adm is null OR (historia.sit_adm<>'B' AND historia.sit_adm<>'BD' AND historia.sit_adm<>'BA' AND historia.sit_adm<>'BT' AND historia.sit_adm<>'CE')) ORDER BY historia.matricula;
Imagen de neko069

O sea cómo, si la ejecutas en

O sea cómo, si la ejecutas en tu aplicación no te devuelve nada, y si la ejecutas por fuera sí te regresa valores?
Haz una salida por consola ( con System.out ) para que veas cómo queda tu consulta, ya con los valores que le pasas como "programa" y "periodo" y pégala en tu cliente de base de datos, a ver si te devuelve valores...

Imagen de CesarAlducin

Si la ejecuto en mi

Si la ejecuto en mi aplicación no me devuelve ninguna valor esa consulta, en cambio si lo ejecuto
en base de datos es decir en access directamente si me devuelve registros.

El problema es al ejecutar la consulta en mi aplicación, no se si sea java que no acepta por algún motivo
Distintc porque esa misma consulta la hago con gruop by y tampoco genera nada.

Imagen de ezamudio

PreparedStatement

No concatenes SQL, usa PreparedStatement. Y espero que no tengas ese punto y coma al final del statement en JDBC porque podria ser lo que hace que no obtengas nada (se ejecuta el query, pero luego se ejecuta lo que sigue que es nada, y eso es lo que obtienes; si el driver JDBC esta jodido eso podria estar haciendo).

Imagen de CesarAlducin

Que tal @ezamudio respecto a

Que tal @ezamudio respecto a tu comentario ya use PreparedStatement y nada al parecer el error esta en el uso de java con Access por no se que motivo si uso DISTINCT o GRUOP BYE no ejecuta la consulta. ahora intente usar
Top y tampoco.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">