No cargan todos los registros en la jsp

De nuevo agradecerte la ayuda desinteresada que prestas.
Tengo la jsp de struts que muestra un listado de registros cuando se hace una búsqueda, pero la tengo configurada sin paginación, y no me aparecen todos los registros de la tabla, solo un total de 10. Como se hace para que salgan todos, ¿o cómo se hace para paginar?

1 respuesta

Respuesta
1
Necesitaría ver el código de la JSP. A ciegas es un poco difícil darte una buena respuesta. Lo que si es seguro es que montar una paginación decente es mucho más complicado que sacar todos los registros. Si no te está sacando todos los registros, puede ser por dos razones:
1) En la consulta SQL estás especificando que solo saque los 10 primeros registros. Solución: revisa la consulta SQL.
2) En la JSP presentas sólo los 10 primeros registros. Solución: revisa el bucle donde pintas las filas.
Pero como te he dicho antes, si posteas la JSP te podré dar una solución más concreta.
Estoy casi seguro que es de la jsp, ya que la consulta en el toad me saca 17 registros y en la jsp 10 siempre. Aquí tiene sla jsp:
<html:form action="/KUROCategoriasFaq.do">
<div id="titulocajaformulario">Introduce los datos de búsqueda</div>
<div id="cajaformulario">
         <fieldset class="normales">
            <legend class="normales">Datos Obligatorios</legend>
<hr class="hrblanco">
</hr>
<script>             function limpiaCampos() {
         document.all.CCategoriaFaqID.value="";
         document.all.CCategoriaFaqPadre.value="";
         document.all.DCategoriaFaq.value="";         
         document.all.FCreacion.value="";
         document.all.FModificacion.value="";
         document.all.DDescripcion.value="";
   }
 </script>
<script>             function volvermenu() {
   var volver = 0;
     // Validar numéricos
    //if (document.OCAPPreguntasForm.DNombre.value == "" && document.OCAPPreguntasForm.CPreguntaId.value == ""){
      // alert('Debe introducir el Texto o el Id de la Pregunta');
      // validacion=1;   
    //}
   if (volver==0) enviar('PaginaInicio.do');   
   }
function resetFormulario(){
document.forms.KUROCategoriasFaqForm.reset();
}
 </script>
<br>
              <label class="obligado">* Identificador Categoria:</label>
<html:text property="CCategoriaFaqID"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>         
              <br>
              <label class="obligado">* Categoria Faq Padre:</label>
<html:text property="CCategoriaFaqPadre"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>
              <br>
              <label class="obligado">* Categoria FAQ:</label>
<html:text property="DCategoriaFaq"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>
               <br>
              <label class="obligado">* Descripción:</label>
<html:textarea property="DDescripcion"  cols="50" rows="4" tabindex="18" styleClass="inputColor colocaNombreAreaAlta" />
              </br>
              <br>
              <label class="obligado">* Fecha de Creación:</label>
<html:text property="FCreacion"  tabindex="18" styleClass="inputColor colocaNombreAreaAlta" size="60" maxlength="100"/>
              </br>
              <br>
              <label class="obligado">* Fecha de Modificación:</label>
<html:text property="FModificacion"  styleClass="inputColor colocaNombreAreaAlta"  size="50" maxlength="100"/>
              </br>
         </fieldset>     
      </div>
<div id="cajaformulario02">   
         <fieldset class="normales">
<html:button value="Buscar" property="botonAceptar" styleClass="botonformulario" onclick="javascript:validar();"/>
<html:reset value="Volver" property="Cancelar" styleClass="botonformulario" onclick="javascript:history.back()"/>
<input type="button" value="Limpiar formulario" onClick="javascript:limpiaCampos();">
               <input type="button" align="right" value="Menu principal" onClick="javascript:volvermenu();">
         </fieldset>
    </div>
<br />
      <br />
<logic:present name="sinDatos">
<div id="divSinDatos">
<p><label><bean:write name="sinDatos"/></label></p>
</div>
</logic:present>
<table border="1" class="tabla5 tablaConsultas">
<logic:notPresent name="sinDatos">
   <logic:present name="primeraConsulta">
<tr>
<th align="center" colspan="5" class="col1">Nº </th>
      <th align="center" colspan="5" class="col2" id="cCategoriaFaqPadre"> Categoria Padre </th>
      <th align="center" colspan="5" class="col3" id="dCategoriaFaq"> Categoria FAQ </th>
      <th align="center" colspan="5" class="col4" id="dDescripcion"> Descripcion </th>
      <th align="center" colspan="5" class="col5" id="fCreacion"> Fecha de Creación </th>
      <th align="center" colspan="5" class="col6" id="fModificacion"> Fecha de Modificación </th>
</tr>
</logic:present>
<logic:present name="paginaKUROCategoriasFaqOT" property="elementos">
<logic:iterate id="elemento" name="paginaKUROCategoriasFaqOT" property="elementos">
<tr>
<td colspan="5" align="left">
       <br />
       <a href="KUROCategoriasFaq.do?accion=irModificar&id=<bean:write name="elemento" property="CCategoriaFaqID"/>">
       <bean:write name="elemento" property="CCategoriaFaqID"/>
       </a>
       </td>
<td colspan="5" align="center">
       <br />
       <bean:write name="elemento" property="CCategoriaFaqPadre"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="DCategoriaFaq"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="DDescripcion"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="FCreacion"/>
       </td>
<td colspan="5" align="center">
       <br />       
       <bean:write name="elemento" property="FModificacion"/>
       </td>
</tr>
</logic:iterate>
</logic:present>
</logic:notPresent>
</table>
</html:form>
Pues en la JSP no veo nada raro. ¿Me puedes pasar el Action al que llamas cuando haces la consulta? Me gustaría ver cómo se rellena el array "elementos", que es el que se usa para iterar.
Mañana te le mando, ya que salgo ya mism odel trabajo, gracias
Ok.
Aquí está. Dentro del avtion llama a un LN y luego a un OAD, te los pongo también
public ActionForward buscar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
 {
   String sig = "error";
   String mensajeError = "Se ha producido un error";
   Logger log = null;
   ActionForward actionForward =null;
   try {
     KUROConfigApp.logger.info("");
     KUROConfigApp.logger.info("---------- CONSULTA DE KURO_PRUEBA --------- ");
     ActionErrors errores = new ActionErrors();
     request.setAttribute("primeraConsulta","false");
     HttpSession session = request.getSession();
             //Cálculo de la página correspondiente
      JCYLUsuario jcylUsuario = (JCYLUsuario) session.getAttribute(JCYLConfiguracion.NOMBRE_ATRIBUTO_USUARIO);
      KUROCategoriasFaqOT categoriasOT = new KUROCategoriasFaqOT();
      int primerRegistro = Pagina.DEFAULT_PRIMER_REGISTRO;     
      int registrosPorPagina = Pagina.DEFAULT_REGISTROS_POR_PAGINA;
      String registro = null;             
      // Obtenemos los parámetros de paginación
      if ( (registro = request.getParameter(Pagina.PRIMER_REGISTRO_PARAMETER_NAME)) != null ) {
        try {
            primerRegistro = Integer.parseInt(registro);
        } catch ( NumberFormatException ne ) {
          // no hacemos nada dejamos el valor por defecto
        }
      }
      if ( (registro = request.getParameter(Pagina.REGISTROS_PAGINA_PARAMETER_NAME)) != null ) {
        try {
            registrosPorPagina = Integer.parseInt(registro);
        } catch ( NumberFormatException ne ) {
          // no hacemos nada dejamos el valor por defecto
        }
      }
      KUROCategoriasFaqOT categoriasFaqOT = new KUROCategoriasFaqOT();
      KUROCategoriasFaqLN categoriasFaqLN = new KUROCategoriasFaqLN(jcylUsuario);    
      //long longCategoriaFaqID = 0;
      try{
         /*Convertir string a cadena (no lo usamos de momento porque declaramos variables como long)
         longCategoriaFaqID = Long.parseLong(categoriasFaqOT.getCCategoriaFaqID());
         */
      }catch (Exception e){
      }
      categoriasFaqOT.setCCategoriaFaqID(((KUROCategoriasFaqForm)form).getCCategoriaFaqID());
      categoriasFaqOT.setCCategoriaFaqPadre(((KUROCategoriasFaqForm)form).getCCategoriaFaqPadre());
      categoriasFaqOT.setDCategoriaFaq(((KUROCategoriasFaqForm)form).getDCategoriaFaq());
      categoriasFaqOT.setDDescripcion(((KUROCategoriasFaqForm)form).getDDescripcion());
      categoriasFaqOT.setFCreacion(((KUROCategoriasFaqForm)form).getFCreacion());
      categoriasFaqOT.setFModificacion(((KUROCategoriasFaqForm)form).getFModificacion());
      if(((KUROCategoriasFaqForm)form).getDDescripcion()!=null && !"".equals(((KUROCategoriasFaqForm)form).getDDescripcion()))
         categoriasOT.setDDescripcion           (((KUROCategoriasFaqForm)form).getDDescripcion());
      if(((KUROCategoriasFaqForm)form).getFCreacion()!=null && !"".equals(((KUROCategoriasFaqForm)form).getFCreacion()))
         categoriasOT.setFCreacion           (((KUROCategoriasFaqForm)form).getFCreacion());
      if(((KUROCategoriasFaqForm)form).getFModificacion()!=null && !"".equals(((KUROCategoriasFaqForm)form).getFModificacion()))
         categoriasOT.setFModificacion           (((KUROCategoriasFaqForm)form).getFModificacion());
     //Obtenemos los siguientes datos de la request para pasarlos a la página genérica como String
    KUROCategoriasFaqLN kUROCategoriasFaqLN = new KUROCategoriasFaqLN(jcylUsuario);
     long cCategoriaFaqID=0;
      long cCategoriaFaqPadre=0;
      String dCategoriaFaq = null;
      String dDescripcion= null;      
     String bBorrado= null;      
     String uCreacion= null;         
     Date fCreacion= null;   
     String uModificacion= null;   
     Date fModificacion= null;
     //ArrayList elementos = kUROPrueba2LN.consultaKUROPrueba2(cPrueba,dPrueba,aDescripcion,FInicio, primerRegistro, registrosPorPagina);
     ArrayList elementos = kUROCategoriasFaqLN.consultaKUROCategoriasFaq(categoriasFaqOT, primerRegistro, registrosPorPagina);
     if (elementos != null){
       KUROConfigApp.logger.info("Se han recuperado "+elementos.size() +" Areas para la consulta");
        if (elementos.size()==0){
            request.setAttribute("sinDatos","No existen registros con los parametros especificados");
            request.removeAttribute("conDatos");
        }else{
          int nListado = 0;
          //nListado = kUROPrueba2LN.listadoPrueba2(cPrueba,dPrueba,aDescripcion,fInicio);
          request.removeAttribute("sinDatos");
          Pagina pagina = new Pagina(mapping.getPath()+".do", request);
          pagina.setElementos(elementos);
          pagina.setRegistroActual(primerRegistro);
          //pagina.setNRegistros(nListado);
          pagina.setNRegistros(elementos.size());
          pagina.setRegistrosPorPagina(registrosPorPagina);
          request.setAttribute("paginaKUROCategoriasFaqOT", pagina);
          request.getSession().setAttribute("conDatos","Hemos recuperado datos");
          request.removeAttribute("menu");
          request.getSession().removeAttribute("menu");
        }
      }else
       {
          request.setAttribute("errorConsultando","Error consultando en la base de datos");
       }
       KUROConfigApp.logger.info("---------- FIN CONSULTA KUROCategoriasFaq ------- ");
   }catch (Exception ex){
  KUROConfigApp.logger.error(ex.getMessage());
      request.setAttribute("mensaje",mensajeError);
   return mapping.findForward("error");
   }
   return mapping.findForward("irBuscar");
  }// Fin de buscar
---------------------------------------------------------------------------
LN:
public ArrayList consultaKUROCategoriasFaq(KUROCategoriasFaqOT categoriasFaqOT ,int inicio, int cuantos)
    {
      ArrayList array = null;
      try
      {
           variableOAD= KUROCategoriasFaqOAD.getInstance();
           //array = variableOAD.consultaKUROPrueba2(cPrueba,  dPrueba,  aDescripcion,  fInicio, inicio, cuantos);
           array = variableOAD.consultaKUROCategoriasFaq(categoriasFaqOT, inicio, cuantos);
      }catch (Exception e)
      {
          array  = null;
          KUROConfigApp.logger.error(e.getMessage());
       }
       return array;
     }//Fin de listadoKUROCategoriasFaq
------------------------------------------------------
OAD:
public ArrayList consultaKUROCategoriasFaq(KUROCategoriasFaqOT categoriasFaqOT, int inicio, int cuantos)  throws Exception {
        PreparedStatement st = null;
        ResultSet rs = null;
        Connection con=JCYLGestionTransacciones.getConnection();
        ArrayList listado = null;
        try {
            StringBuffer sbWhere = new StringBuffer(100);
String selectFrom = "SELECT C_CATEGORIA_FAQ_ID, C_CATEGORIA_FAQ_PADRE, D_CATEGORIA_FAQ, " +                       
                             "D_DESCRIPCION, B_BORRADO, U_CREACION, TO_CHAR(F_CREACION,'DD/MM/RRRR') F_CREACION," +
                             " U_MODIFICACION, TO_CHAR(F_MODIFICACION,'DD/MM/RRRR') F_MODIFICACION  " +
                                "FROM KURO_CATEGORIAS_FAQ " ;                             
            String orderBy=" order by C_CATEGORIA_FAQ_ID";
            String where = "";
boolean primerFiltro = true;
   if (categoriasFaqOT.getCCategoriaFaqID()!=0){  
   if (primerFiltro){ where+= " WHERE ";primerFiltro=false;}
      else{where+= " AND ";}
           where += "C_CATEGORIA_FAQ_ID=" + categoriasFaqOT.getCCategoriaFaqID();
   }
   if (categoriasFaqOT.getCCategoriaFaqPadre()!=0){
   if (primerFiltro){ where+= " WHERE ";primerFiltro=false;}
      else{where+= " AND ";}
           where+= "C_CATEGORIA_FAQ_PADRE='" + categoriasFaqOT.getCCategoriaFaqPadre()+ "'";
   }
   if (!categoriasFaqOT.getDDescripcion().equals("")){
   if (primerFiltro){ where+= " WHERE ";primerFiltro=false;}
      else{where+= " AND ";}
           where+= "D_DESCRIPCION='" + categoriasFaqOT.getDDescripcion()+ "'";
   }
   if (!categoriasFaqOT.getDCategoriaFaq().equals("")){
   if (primerFiltro){ where+= " WHERE ";primerFiltro=false;}
      else{where+= " AND ";}
           where+= "D_CATEGORIA_FAQ='" + categoriasFaqOT.getDCategoriaFaq()+ "'";
   }
   if (!categoriasFaqOT.getFModificacion().equals("")){
   if (primerFiltro){ where+= " WHERE ";primerFiltro=false;}
      else{where+= " AND ";}
           where+= "F_MODIFICACION='" + categoriasFaqOT.getFModificacion()+ "'";
   }
String sqlStatement = new StringBuffer(selectFrom).append(where).append(orderBy).toString();
KUROConfigApp.logger.info("Sentencia SQL:"+sqlStatement);
            st = con.prepareStatement(sqlStatement,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            int index=1;
            KUROCategoriasFaqOT datos = new KUROCategoriasFaqOT();             
            /*if (isCPrueba)
            st.setLong(index++,cPrueba);*/                     
            rs  = st.executeQuery();
            if (inicio >1)
                rs.absolute(inicio-1);
            listado = new ArrayList();
            int i = 0;
            while (rs.next()) {
                datos = new KUROCategoriasFaqOT();
            datos.setCCategoriaFaqID(rs.getLong("C_CATEGORIA_FAQ_ID"));
            datos.setCCategoriaFaqPadre(rs.getLong("C_CATEGORIA_FAQ_PADRE"));
            datos.setDCategoriaFaq(rs.getString("D_CATEGORIA_FAQ"));
            datos.setDDescripcion(rs.getString("D_DESCRIPCION"));                
            datos.setBBorrado(rs.getString("B_BORRADO"));
            datos.setUCreacion(rs.getString("U_CREACION"));
            datos.setFCreacion(rs.getString("F_CREACION"));
            datos.setUModificacion(rs.getString("U_MODIFICACION"));
            datos.setFModificacion(rs.getString("F_MODIFICACION"));
                listado.add(datos);
                if (++i == cuantos)
                break;
            } // while
        } catch (Exception ex) {
KUROConfigApp.logger.error(ex.getMessage());
            throw ex;
        } finally {
if (rs != null)
rs.close();
if (st != null)
st.close();
            JCYLGestionTransacciones.close(con.getAutoCommit());
         } // try-catch
        return listado;         
}//Fin de consultaKUROCategoriasFaq
Aquí si que he encontrado algo. Al principio de tu código tienes esta línea:
int registrosPorPagina = Pagina.DEFAULT_REGISTROS_POR_PAGINA;
... y luego este bloque de código:
if ( (registro = request.getParameter(Pagina.REGISTROS_PAGINA_PARAMETER_NAME)) != null ) { 
        try { 
            registrosPorPagina = Integer.parseInt(registro); 
        } catch ( NumberFormatException ne ) { 
          // no hacemos nada dejamos el valor por defecto 
        } 
      }

Conclusiones:
1) Tienes una clase Página que define una constante que se llama DEFAULT_REGISTROS_POR_PAGINA, que indica el número de registros a recuperar, si no especificas nada. Esta clase Página también define la constante REGISTROS_PAGINA_PARAMETER_NAME, que indica el nombre del parámetro que hay que pasarle al action para sobreescribir el número por defecto
2) El código evalúa si has pasado como parámetro el número de registros que quieres recuperar, si no, recupera el que tiene por defecto, que apuesto la uña del dedo meñique de mi pié izquierdo que vale 10.
Soluciones:
Como todo en esta vida, tienes varios caminos a seguir:
1)Cuando llames al Action, pasa un valor 1000000000 en el parámetro que indica el nº de registros a recuperar. Así, te aseguras que se van a recuperar todos.
2)Cuando quieras recuperar TODOS los registros, pasa un -1 en el parámetro que indica el nº de registros a recuperar, pero tendrás que tocar el código para comprobar que si vale -1, no se meta un tope de registros. El código a tocar es el que está al final de tu post:


listado.add(datos); 
if (
cuantos>0 && ++i == cuantos) 
break;

Con esta comprobación extra, si cuantos vale -1, no se saldrá antes de recuperar todos.
De todas formas, un consejo: no se si tu eres el encargado de mantener el código, pero te recomiendo que modifiquéis el código de consultaKUROCategoriasFaq para que no recupere de la base de datos más registros de la cuenta. Si me dices la base de datos que estás usando, te puedo asesorar sobre el código extra que habría que meter para que recupere de la BD sólo los registros necesarios, y no todos. Depende de la BD que uses el código es diferente. Las consultas te irán más rápido y consumiréis menos ancho de banda en las comunicaciones con la BD.
Impresionante explicación karlos, gracias!
La base de datos es oracle y tenias razón, en la traza se ve como mete 10 en esa constante, pero en la clase página no está definido el valor de esa constante.. ¿sabes dónde puede estar?
En principio me gustaría que salieran todos los registros, ya que no son más de 20 y esta en fase de pruebas.. pero en un futuro cercano será necesaria la paginación, de momento voy a hacer la chapucilla de que salgan todos.
Si la clase Página hereda de otra clase, o implementa alguna interfaz, las constantes que buscas pueden estar definidas bien en la clase padre, bien en alguna de las interfaces que implementa.
Para cuando quieras optimizar el número de resultados que retorna la base de datos, te recomiendo que te leas este artículo que habla de cómo recuperar n registros dependiendo de la base de datos que uses, entre ellas Oracle.
Muchas gracias Karlos, si no consigo realizar la paginación, te avisaré. Entretanto voy a ir resolviendo otros problemillas. Muchas gracias por todo, y un 10 merecido je je.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas