TransWikia.com

Como hacer un reporte o consulta por rango de fechas en java?

Stack Overflow en español Asked by Pedro Valverde on December 4, 2021

Quisiera saber como hacer un reporte usando rango de fechas (fecha inicio , fecha fin) en el método de la GUI

proceso

public class GestionReporteVentas implements ReporteVentasInterface{

@Override
public ArrayList<ReporteVentas> listado() {
    ArrayList<ReporteVentas> lista = new ArrayList<ReporteVentas>();
    ResultSet rs = null; // tipo de resultado
    Connection con = null;
    PreparedStatement pst = null;
    try {
       con = MySQLConexion.getConexion(); 
       String sql = "{CALL usp_reporte1}"; // sentencia sql

       pst = con.prepareStatement(sql);
       // parámetros según la sentencia        

       rs = pst.executeQuery(); // tipo de ejecución

       // Acciones adicionales en caso de consultas
       while (rs.next()){
           ReporteVentas rv = new ReporteVentas();
           rv.setNumvta(rs.getString(1));
           rv.setFechavta(rs.getString(2));
           rv.setNomproducto(rs.getString(3));
           rv.setNomvendedor(rs.getString(4));
           rv.setMontoventa(rs.getDouble(5));
           lista.add(rv);
       }
    } catch (Exception e) {
       System.out.println("Error en la sentencia " + e.getMessage());
    } finally {
      try {
          if (pst != null) pst.close();
          if (con != null) con.close();
       } catch (SQLException e) {
          System.out.println("Error al cerrar ");
       }
    }
   return lista;
}}

EN LA GUI

    void listarReporte(){


        // llamar la gestion
        GestionReporteVentas gr = new GestionReporteVentas();

        ArrayList<ReporteVentas> lista = gr.listado();

        if (lista == null){
            txtListado.setText("LISTA VACIA");
        }else {
            txtListado.setText("NumVentatFechaVtNomProductotNomVendedortMonton");
            for (ReporteVentas rv : lista){
                txtListado.append(rv.getNumvta() + "t" + rv.getFechavta() + "t" +
                        rv.getNomproducto() + "t" + rv.getNomvendedor() + "t" + rv.getMontoventa() +"n");
        }

}
}

3 Answers

Hola yo he implementado esa funcionalidad en mi programa. Ahora te explico mi código.

El primer método es simplemente para que te envíe a una vista con un buscador para las fechas.

//filtrar por Fecha 
        @Secured({ "ROLE_ADMIN", "ROLE_USER","ROLE_SADMIN","ROLE_USERGESTSERV","ROLE_USERGESTSERV2"})
        @GetMapping("/listFindFecha")   
        public String listFindFecha(Model model) {
            try {
                model.addAttribute("contrato", new Contrato());
                //model.addAttribute("listaContratos", cService.listar());
            } catch (Exception e) {
                model.addAttribute("error", e.getMessage());
            }
            return "/gestserv/contrato/findFecha";
        }

El segundo método te permite hacer la intersección de 2 listas

    public List<Contrato> intersect(List<Contrato> A, List<Contrato> B) {
        
        List<Contrato> rtnList = new LinkedList<>();
        for(Contrato dto : A) {
            if(B.contains(dto)) {
                rtnList.add(dto);
            }
        }
        return rtnList;   
    }

En este último método tengo 3 listas. La primera es para listar todos los registros que fueron creados después de una fecha A, la segunda una lista de registros que fueron creados antes de una fecha B y por último una lista que es la intersección de dichas listas.

@Secured({ "ROLE_ADMIN", "ROLE_USER","ROLE_SADMIN","ROLE_USERGESTSERV","ROLE_USERGESTSERV2"})
@RequestMapping("/findFecha")
public String findFecha(Map<String, Object> model, @ModelAttribute Contrato contrato) throws ParseException {
    List<Contrato> listaContratos;
    List<Contrato> listaContratos2;
    List<Contrato> listaContratos3 = new ArrayList<Contrato>();;
    
    contrato.setAm_fecha_inicio_con(contrato.getAm_fecha_inicio_con());
    listaContratos = cService.findByFechaDespues(contrato.getAm_fecha_inicio_con());
    contrato.setAn_fecha_fin_con(contrato.getAn_fecha_fin_con());
    listaContratos2 = cService.findByFechaAntes(contrato.getAn_fecha_fin_con());
    listaContratos3= intersect(listaContratos, listaContratos2);
    if (listaContratos.isEmpty()) {
        model.put("mensaje", "No se encontró");
    }
    model.put("listaContratos", listaContratos3);
    
    return "/gestserv/contrato/findFecha";

}

Al fina quedaría algo así:

Filtrar por registros por fecha

Answered by Italo Oré on December 4, 2021

Puedes probar pasando tu fecha a LocalDate la cual es la nueva clase para manipular fechas en Java 8 , luego hacer la verificacion si la fecha de la lista esta dentro de tu rango deseado , codigo similar a este :

java.time.format.DateTimeFormatter formateador = java.time.format.DateTimeFormatter.ofPattern("dd/MM/yyyy"); //el formato de tu fecha
java.time.LocalDate fechaInicio = java.time.LocalDate.parse("01/06/2017",formateador);//debes reemplazar el String por la fecha de inicio de tu GUI
java.time.LocalDate fechaTermino = java.time.LocalDate.parse("10/06/2017",formateador);//debes reemplazar el String por la fecha de termino de tu GUI

for (ReporteVentas rv : lista)
{   
    java.time.LocalDate fecha = java.time.LocalDate.parse(rv.getFechavta());
    if(     (fecha.isBefore(fechaInicio) || fecha.isEqual(fechaInicio))
                                         &&
            (fecha.isAfter(fechaTermino) || fecha.isEqual(fechaTermino) )                            
     )
    {
        txtListado.append(rv.getNumvta()+"t"+rv.getFechavta()+"t"+rv.getNomproducto()+"t"+rv.getNomvendedor()+ "t"+rv.getMontoventa()+"n");        
    }
}

Answered by Jose Felipe Charbel Pavez Gass on December 4, 2021

Tenes dos alternativas.

1) Cambiar el stored procedure para pasarle desde java las fechas limite como parámetro y que el stored procedure devuelva solo lo que hay que incluir en el reporte.

O 2) Asumiendo que la fecha de la que hablamos es la fecha de venta. Cuando se recorre el result set sólo agregar a lista aquellos rv donde los rv.getFechaventa() sean mayores o iguales a la fecha de inicio y menores o iguales a la fecha de fin.

Answered by Juan on December 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP