Como vimos anteriormente al trabajar con reportes para “Ventas”; las transacciones requieren de un formulario que servirá como base para lanzar los reportes, estos reportes pueden ser generales o específicos utilizando diferentes variables, como fechas, funcionarios, clientes, proveedores u otros. El diseño para reportes de compras es similar al de ventas, por tanto se puede utilizar el mismo diseño y procedimiento.
En primer lugar vemos el diseño del formulario, este formulario lanza dos reportes diferente, una de tipo general y otra tomando como variable un proveedor y los rangos de fechas inicio y fin. En el diseño se especifican los nombres de variable para los campos y botones (están en letra roja como etiqueta), esto es importante ya que a través de estas se llaman los objetos desde los métodos. Se puede cambiar el “Nombre de variable” de cada objeto haciendo clic derecho sobre la misma y clic en “Cambiar nombre de variable…”. Para la introducción de fechas utilizamos “JFormattedTextField” o “Cuadro formateado” si el IDE está en español, en esta entrada del blog se trata sobre la utilización de un cuadro formateado ((
Fecha y Hora con objeto Calendar). La “Lista desplegable” o “jComboBox” va almacenar los nombres de proveedores.
En las transacciones se suelen utilizar varias tablas para obtener datos de referencia y trabajar con ellas. En este caso “CompraCab”, “CompraDet”, “Funcionario”, “Proveedor” y “Articulo” respectivamente, para confeccionar una lista única con los datos que necesitamos, debemos de crear una clase que servirá como plantilla para nuestros reportes. El nombre de la clase será “CompraR”, la única diferencia con el de “Ventas” será que está en vez de cliente tendrá proveedores, por tanto la misma nos sirve como referencia, y tendrá los siguientes elementos. Tomar en cuenta que esta clase debe ir almacenada dentro del paquete que corresponde a informes.
Código Java
package com.informes;
public class CompraR {
private int id;
private String funcionario;
private String proveedor;
private String fecha;
private String articulo;
private int cantidad;
private long importe;
public CompraR(int id, String funcionario, String proveedor, String fecha, String articulo, int cantidad, long importe) {
this.id = id;
this.funcionario = funcionario;
this.proveedor = proveedor;
this.fecha = fecha;
this.articulo = articulo;
this.cantidad = cantidad;
this.importe = importe;
}
public String getArticulo() {
return articulo;
}
public void setArticulo(String articulo) {
this.articulo = articulo;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public String getFecha() {
return fecha;
}
public void setFecha(String fecha) {
this.fecha = fecha;
}
public String getFuncionario() {
return funcionario;
}
public void setFuncionario(String funcionario) {
this.funcionario = funcionario;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getImporte() {
return importe;
}
public void setImporte(long importe) {
this.importe = importe;
}
public String getProveedor() {
return proveedor;
}
public void setProveedor(String proveedor) {
this.proveedor = proveedor;
}
}
Vemos el diseño del primer reporte que será de tipo general, el nombre del archivo será “ReportCompra”. Se puede consultar este enlace del blog si hay dudas sobre algunos elementos que componen el reporte …(
iReport. Introducción para crear informes). La configuración de la hoja es el A4 tipo vertical.
En la imagen de más abajo se puede ver el diseño del reporte terminado, con los “Fields” correspondientes, “Variables” y demás.
Elementos del diseño del reporte: 1) Un “Label” como descripción del reporte. 2) Una “Variable” para el número de páginas. 3) “Labels” para describir datos de columnas. 4) “Fields” o campos para la banda de detalles. Para el borde se utiliza “Rectangle” de fondo y sin borde. 5) Una “Variable” para indicar la suma total de ventas, en la imagen se especifica los parámetros necesarios para que funcione correctamente. Es importante respetar los nombres de los “Fields” al igual que los tipos de datos correspondientes ya que deben de coincidir con las que le pasaremos desde la lista más arriba creada.(clic para ampliar imagen)
Ahora vemos el segundo reporte que será de tipo específico, utilizando como filtro un proveedor especificado desde el combo. El nombre del archivo será “ReportCompraDos”. La configuración de la hoja es también A4 tipo vertical.
Los elementos del diseño son iguales que la anterior, la diferencia se ve en que ubicamos el nombre del proveedor en “Column Header” ya que será única para el reporte.(clic para ampliar imagen)
Completado el diseño debemos de compilar cada uno de los reportes y obtener los archivos necesarios que tienen la extensión “*.jasper” y “*.jrxml” respectivamente. Estos archivos de reporte debemos de copiar en nuestra carpeta “informes”, que creamos al inicio del proyecto.
El siguiente paso es crear un método que lance cada uno de los reportes creados y también los métodos que harán funcionar nuestro formulario. Más abajo tenemos los métodos creados, el nombre de cada una específica su función. Los comentarios explican que función cumple cada línea de código. Cada método de informe se llama desde su respectivo botón utilizando el evento “ActionPerformed”. Botón “verG” le corresponde el método “informeGeneral()” y el botón “verF” le corresponde el método “informeProveedor()”.
Código Java
private void hibernateSession(){
st = HibernateUtil.getSessionFactory().openSession();
}
private void arranque(){
Calendar cal = Calendar.getInstance();
String fecha = retornarString(cal);
inicioG.setText(fecha);
finG.setText(fecha);
inicioF.setText(fecha);
finF.setText(fecha);
List<Proveedor> listF = (List<Proveedor>)st.createQuery("From Proveedor").list();
for (int i = 0; i < listF.size(); i++) {
Proveedor p = listF.get(i);
listaP.addItem(p.getDes());
}
}
public String retornarString(Calendar fecha){
String retorno=null;
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
if (fecha != null) {
retorno = sdf.format(fecha.getTime());
}
return retorno;
}
public Calendar retornarCalendar(String fecha){
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
try {
cal.setTime(sdf.parse(fecha));
} catch (ParseException ex) {
JOptionPane.showMessageDialog(null, "Error; compruebe formato de fecha: " + ex);
}
return cal;
}
public void informeGeneral(){
try {
st.beginTransaction();
List compraList = new ArrayList();
Query query = (Query) st.createQuery("From CompraCab c Where c. fecha>=? and c. fecha<=?");
query.setParameter(0, retornarCalendar(inicioG.getText()));
query.setParameter(1, retornarCalendar(finG.getText()));
List<CompraCab> lista = query.list();
int id=0;
for (Iterator<CompraCab> it = lista.iterator(); it.hasNext();) {
CompraCab compraCab = it.next();
String funcionario = compraCab.getFuncionario().getNombres();
String proveedor = compraCab.getProveedor().getDes();
String fecha = retornarString(compraCab.getFecha());
List<CompraDet> compraDets = compraCab.getCompraDets();
for (Iterator<CompraDet> it1 = compraDets.iterator(); it1.hasNext();) {
id++;
CompraDet compraDet = it1.next();
compraList.add(new CompraR(id, funcionario, proveedor, fecha, compraDet.getArticulo().getDes(), compraDet.getCantidad(),compraDet.getImporte()));
}
}
JasperReport report = (JasperReport)JRLoader.loadObject(ClassLoader.getSystemResource("com/informes/ReportCompra.jasper"));
JasperPrint fillReport = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(compraList));
JasperViewer jviewer = new JasperViewer(fillReport,false);
jviewer.setTitle("Compras Generales.");
jviewer.setVisible(true);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error cargando reporte." + e);
}
}
public void informeProveedor(){
try {
st.beginTransaction();
List compraList = new ArrayList();
Query query = (Query) st.createQuery("From CompraCab c Where c. fecha>=? and c. fecha<=?");
query.setParameter(0, retornarCalendar(inicioF.getText()));
query.setParameter(1, retornarCalendar(finF.getText()));
List<CompraCab> lista = query.list();
int id=0;
for (Iterator<CompraCab> it = lista.iterator(); it.hasNext();) {
CompraCab compraCab = it.next();
String funcionario = compraCab.getFuncionario().getNombres();
String proveedor = compraCab.getProveedor().getDes();
String fecha = retornarString(compraCab.getFecha());
List<CompraDet> compraDets = compraCab.getCompraDets();
for (Iterator<CompraDet> it1 = compraDets.iterator(); it1.hasNext();) {
id++;
CompraDet compraDet = it1.next();
if( proveedor.equals(listaP.getSelectedItem().toString())){
compraList.add(new CompraR(id, funcionario, proveedor, fecha, compraDet.getArticulo().getDes(), compraDet.getCantidad(),compraDet.getImporte()));
}
}
}
JasperReport report = (JasperReport)JRLoader.loadObject(ClassLoader.getSystemResource("com/informes/ReportCompraDos.jasper"));
JasperPrint fillReport = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(compraList));
JasperViewer jviewer = new JasperViewer(fillReport,false);
jviewer.setTitle("Lista de Compras por Proveedores.");
jviewer.setVisible(true);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error cargando reporte.");
}
}
Obs.: Se anexa una imagen con elementos a tomar en cuenta al crear el formulario al igual que los códigos que corresponden a los eventos para los botones. (clic para ampliar imagen)
Código Java
private void verGActionPerformed(java.awt.event.ActionEvent evt) {
if(!inicioG.getText().isEmpty() && !finG.getText().isEmpty()){
informeGeneral();
}
else{
JOptionPane.showMessageDialog(null, "Especifique una fecha correcta.");
}
}
private void verFActionPerformed(java.awt.event.ActionEvent evt) {
if(!inicioF.getText().isEmpty() && !finF.getText().isEmpty() && !listaP.getSelectedItem().toString().isEmpty()){
informeProveedor();
}
else{
JOptionPane.showMessageDialog(null, "Especifique los datos necesarios. -Fecha- y -Proveedor-");
}
}
En caso de que el IDE indique error de sintaxis, verificar si tenemos todas las importaciones necesarias. A continuación la lista.
Código Java
import com.entidades.CompraCab;
import com.entidades.CompraDet;
import com.entidades.Proveedor;
import com.informes.CompraR;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import org.hibernate.Query;
import org.hibernate.Session;
import util.HibernateUtil;
Por último el formulario en ejecución junto con el reporte. En caso que el reporte aparezca detrás del formulario, modificar la propiedad “modalityType” del “JDialog”, indicando que sea “DOCUMENT_MODAL”. (clic para ampliar imagen)