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");
}
}
}
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í:
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP