(RESOLVIDO)Passar parâmetro para Jasper através de uma Grid

Bom dia a todos, estou com uma ideia, mas não sei como executa-la

Ideia:

Minha Grid:

Se eu deixa todas a vendas desmarcadas, e clicar em exportar relatório, ele ira gerar um relatório completo em pdf(com Jasper)

A ideia agora é selecionar vendas de modo alternado e exibir apenas as selecionadas, exemplo na grid:

no exemplo acima selecionei as vendas com IDs 6 e 12, se eu clicar agora em exportar relatório, gostaria que apenas essas duas vendas fossem exibidas.

Mas confesso que não sei nem por onde começar…alguém poderia me ajudar?

Tu pode passar os IDs das vendas selecionadas como parâmetro para o relatório e usar na consulta que é executada pelo relatório. O parâmetro é passado no mesmo ponto onde é passada a conexão com o banco de dados.

1 curtida

@Lucas_Camara é exatamente isso que quero fazer, para passar os parametros terei que usar HashMap…

@Lucas_Camara se vc puder me ajudar, te agradeço…rs

No momento em que o relatório é processado, veja:

JasperFillManager.fillReport(report, parameters, connection);

O parameters é um mapa que vc deverá preencher com os ids das vendas selecionadas:

Map<String, Object> parameters = new HashMap<>();
parameter.put("idsVenda", idsVendasSelecionadas);

E para usar os parâmetros na consulta, dê uma olhada nesse link: https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v60/using-parameters-queries

A referência do método fillReport é essa:
JasperFillManager#fillReport(java.io.InputStream,java.util.Map,java.sql.Connection)

1 curtida

este: idsVendasSelecionadas, onde e como devo cria-lo?

Tu tem que receber como parâmetro. Ele pode ser um List<Long> (use o mesmo tipo que vc está usando para definir a PK da entidade Venda.

1 curtida

então nesta classe:

package br.com.fjsistemas.relatorios;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.stereotype.Component;

import br.com.fjsistemas.repository.VendaRepository;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

@Component
public class ConverteJrxmlToPdf {

	@SuppressWarnings("unused")
	private VendaRepository vendaRepository;

	private DataSource dataSource;

	public ConverteJrxmlToPdf(VendaRepository vendaRepository, DataSource dataSource) {
		this.vendaRepository = vendaRepository;
		this.dataSource = dataSource;
	}

	public byte[] conversor() throws JRException, SQLException {

		InputStream reportJrxml = this.getClass().getResourceAsStream("/RelatorioVendas.jrxml");
		JasperReport document = JasperCompileManager.compileReport(reportJrxml);
		
		Map<String, Object> parameters = new HashMap<>();
		parameters.put("idsVenda", idsVendasSelecionadas);

		JasperPrint print = JasperFillManager.fillReport(document, parameters, dataSource.getConnection());

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		JasperExportManager.exportReportToPdfStream(print, baos);
		byte[] relatorio = baos.toByteArray();

		return relatorio;
	}

}

devo criar uma lista, desta forma:

List<Long> idsVendasSelecionadas = null;

correto?

Ficando a classe assim:

package br.com.fjsistemas.relatorios;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.stereotype.Component;

import br.com.fjsistemas.repository.VendaRepository;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

@Component
public class ConverteJrxmlToPdf {

	@SuppressWarnings("unused")
	private VendaRepository vendaRepository;

	private DataSource dataSource;

	public ConverteJrxmlToPdf(VendaRepository vendaRepository, DataSource dataSource) {
		this.vendaRepository = vendaRepository;
		this.dataSource = dataSource;
	}

	public byte[] conversor() throws JRException, SQLException {
		
		List<Long> idsVendasSelecionadas = null;

		InputStream reportJrxml = this.getClass().getResourceAsStream("/RelatorioVendas.jrxml");
		JasperReport document = JasperCompileManager.compileReport(reportJrxml);
		
		Map<String, Object> parameters = new HashMap<>();
		parameters.put("idsVenda", idsVendasSelecionadas);

		JasperPrint print = JasperFillManager.fillReport(document, parameters, dataSource.getConnection());

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		JasperExportManager.exportReportToPdfStream(print, baos);
		byte[] relatorio = baos.toByteArray();

		return relatorio;
	}

}

Tem que ser por parâmetro:

public byte[] conversor(List<Long> idsVendasSelecionadas) throws JRException, SQLException {

E no lugar onde vc chama esse método conversor vc deve passa a lista de ids preenchida.

1 curtida

Aqui é onde passo o metodo conversor

exportarRelatorio.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		exportarRelatorio.getStyle().set("margin-top", "37px");
		exportarRelatorio.setWidth("180px");

		FileDownloadWrapper buttonWrapper = new FileDownloadWrapper(new StreamResource("RelatorioVenda.pdf", () -> {
			try {
				return new ByteArrayInputStream(pdf.conversor());
			} catch (JRException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			return null;
		}));

Minha duvida é, como eu relaciono a seleção na grid com a lista? E, como passo a lista preenchida para o metodo?

passa a lista preenchida para o método é facil:

return new ByteArrayInputStream(pdf.conversor(listaIds));

Agora, recuperar a lista com base na seleção feita em tela, tu tem que pesquisar como o componente do vaadin te entrega isso.

1 curtida

Certo…só para deixar claro

na classe converteJrxmlToPdf eu passe a lista no parametro

public byte[] conversor(List<Long> idsVendasSelecionadas) throws JRException, SQLException

Agora na classe RelatorioView, devo criar a lista

List<Long> idsVendasSelecionadas;

e devo passar ela preenchida para o metodo

return new ByteArrayInputStream(pdf.conversor(idsVendasSelecionadas));

é isso?

1 curtida

Isso mesmo.

1 curtida

@Lucas_Camara, ok vou agora pesquisar como recuperar a lista com base na seleção feita em tela

@Lucas_Camara

Mano, pelo que estou lendo aqui na documentação:

Grid | Using Vaadin Components | Flow | Vaadin 14 Docs

Eles não usam listas, mas sim um Set…tentei fazer aqui com Set, mas não deu certo(não deu erros, apenas não funcionou)

O uso com Set ou List é indiferente nesse seu caso, a diferença é que o Set garante a ordem, e isso não impacta o que vc precisa fazer.

A primeira coisa é conseguir recuperar esse Set preenchido. Como está o código para obter os itens selecionados nesse Set?

1 curtida

@Lucas_Camara

Bom meu código está assim no momento:

Classe converteJrxmlToPdf

package br.com.fjsistemas.relatorios;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import org.springframework.stereotype.Component;

import br.com.fjsistemas.backend.Venda;
import br.com.fjsistemas.repository.VendaRepository;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

@Component
public class ConverteJrxmlToPdf {

	@SuppressWarnings("unused")
	private VendaRepository vendaRepository;

	private DataSource dataSource;

	public ConverteJrxmlToPdf(VendaRepository vendaRepository, DataSource dataSource) {
		this.vendaRepository = vendaRepository;
		this.dataSource = dataSource;
	}

	public byte[] conversor(Set<Venda> idsVendasSelecionadas) throws JRException, SQLException { //Aqui eu substitui List<Venda> por Set<Venda>
		
		InputStream reportJrxml = this.getClass().getResourceAsStream("/RelatorioVendas.jrxml");
		JasperReport document = JasperCompileManager.compileReport(reportJrxml);
		
		Map<String, Object> parameters = new HashMap<>();
		parameters.put("id", idsVendasSelecionadas);

		JasperPrint print = JasperFillManager.fillReport(document, parameters, dataSource.getConnection());

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		JasperExportManager.exportReportToPdfStream(print, baos);
		byte[] relatorio = baos.toByteArray();

		return relatorio;
	}

}

Classe RelatorioView

    package br.com.fjsistemas.relatorios;

    import java.io.ByteArrayInputStream;
    import java.sql.SQLException;
    import java.text.NumberFormat;
    import java.text.ParseException;
    import java.time.format.DateTimeFormatter;
    import java.util.List;
    import java.util.Locale;
    import java.util.Set;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.vaadin.olli.FileDownloadWrapper;

    import com.vaadin.flow.component.button.Button;
    import com.vaadin.flow.component.button.ButtonVariant;
    import com.vaadin.flow.component.datepicker.DatePicker;
    import com.vaadin.flow.component.grid.Grid;
    import com.vaadin.flow.component.grid.Grid.SelectionMode;
    import com.vaadin.flow.component.html.Label;
    import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
    import com.vaadin.flow.component.orderedlayout.VerticalLayout;
    import com.vaadin.flow.component.textfield.TextField;
    import com.vaadin.flow.data.binder.PropertyId;
    import com.vaadin.flow.data.renderer.LocalDateRenderer;
    import com.vaadin.flow.data.selection.MultiSelect;
    import com.vaadin.flow.router.PageTitle;
    import com.vaadin.flow.router.Route;
    import com.vaadin.flow.server.StreamResource;

    import br.com.fjsistemas.backend.Venda;
    import br.com.fjsistemas.main.MainView;
    import br.com.fjsistemas.repository.VendaRepository;
    import net.sf.jasperreports.engine.JRException;

    @Route(value = "relatorio-view", layout = MainView.class)
    @PageTitle("Relatório de Vendas")
    public class RelatorioVendaView extends VerticalLayout {

    	private static final long serialVersionUID = 1L;

    	private HorizontalLayout layoutDatas = new HorizontalLayout();

    	private Button gerarRelatorio = new Button("Gerar Relatório");
    	private Button exportarRelatorio = new Button("Exportar Relatório");

    	private Grid<Venda> grid = new Grid<>();

    	@Autowired
    	private ConverteJrxmlToPdf pdf;

    	Label label = new Label("Valor Total no Periodo:");

    	@PropertyId("dataInicio")
    	private DatePicker dataInicio = new DatePicker("Início");

    	@PropertyId("dataFim")
    	private DatePicker dataFim = new DatePicker("Final");

    	@PropertyId("somaValores")
    	private TextField somaValores = new TextField();

    	@Autowired
    	private VendaRepository vendaRepository;

    	private List<Venda> listaVendas;
    	
    	Set<Venda> idsVendasSelecionadas;

    	public RelatorioVendaView() {
    		configuraRelatorio();
    	}

    	private void populaInformacao() {

    		listaVendas = vendaRepository.findAllByDataVendaBetween(dataInicio.getValue(), dataFim.getValue());
    		somaValoresRelatorio();
    		atualizaGrdVenda();

    	}

    	private void atualizaGrdVenda() {
    		grid.setItems(listaVendas);
    	}

    	private void somaValoresRelatorio() {

    		NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));

    		double soma = 0;

    		for (Venda venda : listaVendas) {
    			try {
    				soma += formatter.parse(venda.getValorTotalVenda()).doubleValue();
    			} catch (ParseException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}

    		somaValores.setValue(formatter.format(soma));
    	}

    	private void configuraRelatorio() {

    		grid.setWidthFull();
    		grid.setHeight("740px");

    		grid.addColumn(Venda::getId).setHeader("ID:").setAutoWidth(true);

    		grid.addColumn(new LocalDateRenderer<>(Venda::getDataVenda, DateTimeFormatter.ofPattern("dd/MM/yyy")))
    				.setHeader("Data Venda").setAutoWidth(true);

    		grid.addColumn(venda -> venda.getCliente().getNome()).setHeader("Nome:").setAutoWidth(true)
    				.setKey("cliente.nome");

    		grid.addColumn(Venda::getValorTotalVenda).setHeader("Valor Total:").setAutoWidth(true)
    				.setKey("valorTotalVenda");

    		grid.getColumns().forEach(col -> col.setAutoWidth(true).setSortable(true).setResizable(true));
//----------------------------------------------------------------------------------------------------------------------------
    		grid.setSelectionMode(SelectionMode.MULTI);

    		MultiSelect<Grid<Venda>, Venda> multiSelect = grid.asMultiSelect();
    		multiSelect.addValueChangeListener(e -> {
    			Set<Venda> idsVendasSelecionadas = e.getValue();
    		});

    		gerarRelatorio.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
    		gerarRelatorio.getStyle().set("margin-top", "37px");
    		gerarRelatorio.setWidth("180px");
    		gerarRelatorio.addClickListener(event -> {
    			populaInformacao();
    		});

    		exportarRelatorio.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
    		exportarRelatorio.getStyle().set("margin-top", "37px");
    		exportarRelatorio.setWidth("180px");

    		FileDownloadWrapper buttonWrapper = new FileDownloadWrapper(new StreamResource("RelatorioVenda.pdf", () -> {
    			try {
    				return new ByteArrayInputStream(pdf.conversor(idsVendasSelecionadas));
    			} catch (JRException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}

    			return null;
    		}));

    		buttonWrapper.wrapComponent(exportarRelatorio);
    		add(buttonWrapper);
//-----------------------------------------------------------------------------------------------------------------------------
    		somaValores.setWidth("245px");
    		somaValores.getStyle().set("margin-left", "620px");
    		somaValores.setLabel("Valor Total no Período");

    		dataInicio.setWidth("181px");
    		dataFim.setWidth("181px");

    		layoutDatas.add(dataInicio, dataFim, gerarRelatorio, buttonWrapper, somaValores);

    		add(layoutDatas, grid);
    	}

    	public List<Venda> getListaVenda() {
    		return listaVendas;
    	}

    	public void setListaVenda(List<Venda> listaVenda) {
    		this.listaVendas = listaVenda;
    	}

    }

Essa parte está errada:

multiSelect.addValueChangeListener(e -> {
	Set<Venda> idsVendasSelecionadas = e.getValue();
});

Vc está atribuindo numa variável diferente (que tem o mesmo nome) da variável passada para o método conversor. Mude para:

multiSelect.addValueChangeListener(e -> {
	this.idsVendasSelecionadas = e.getValue();
});
1 curtida

mudei, mas continua buscando todas as vendas

MultiSelect<Grid<Venda>, Venda> multiSelect = grid.asMultiSelect();
		multiSelect.addValueChangeListener(e -> {
			this.idsVendasSelecionadas = e.getValue();
		});

Buscando onde? no relatório? Se for isso, agora vc terá que usar esse parâmetro com os Ids selecionados na consulta que está no relatório.

1 curtida