Boa tarde a todos, após muita luta e com a ajudar de amigos aqui do fórum, consegui fazer com que minha aplicação gerasse um pdf sem abri-lo em um nova guia do navegador e sem fazer o download do mesmo, apenas salvando-o no mesmo diretório que o jrxml.
O meu problema agora é que, o pdf gerado está vindo com valores nulos:
// aqui vc recupera as vendas do banco de dados, ex.:List<Venda>vendas=vendaRepository.findAll();// é soh um exemplo, veja como é o método no seu repositório para retornar todas as vendas// e nessa outra linha vc monta o datasource passando a lista de vendasJRBeanCollectionDataSourceds=newJRBeanCollectionDataSource(vendas);
Essa vendaRepository deve está NULL. Vc anotou a classe PDF com @Component ou @Service?
R
rafaspara2017
não, nenhuma anotação…qual das duas seria a mais correta?
L
Lucas_Camara1 like
Para funcionar, tanto faz. Acaba que o @Service é um @Component.
Geralmente vc usa o @Service qdo vc quer indicar que é uma classe de serviço que irá conter regras de negocio. No seu caso, acho que está mais para um componente mesmo. Pode usar @Component.
Vc tem que aprender sobre injeção de dependência e inversão de controle (container IoC) do Spring.
Se vc anotar uma classe com @Component, @Service ou @Repository, vc não precisa instanciar com NEW a classe anotada, pois o Spring irá fazer isso para vc. No seu caso, vc nem precisaria desse new PDF(vendaRepository).
Manda ai a classe RelatorioVendaView completa pra gente ver.
R
rafaspara2017
packagebr.com.fjsistemas.relatorios;importjava.text.NumberFormat;importjava.text.ParseException;importjava.time.format.DateTimeFormatter;importjava.util.List;importjava.util.Locale;importorg.springframework.beans.factory.annotation.Autowired;importcom.vaadin.flow.component.button.Button;importcom.vaadin.flow.component.button.ButtonVariant;importcom.vaadin.flow.component.datepicker.DatePicker;importcom.vaadin.flow.component.grid.Grid;importcom.vaadin.flow.component.html.Label;importcom.vaadin.flow.component.orderedlayout.HorizontalLayout;importcom.vaadin.flow.component.orderedlayout.VerticalLayout;importcom.vaadin.flow.component.textfield.TextField;importcom.vaadin.flow.data.binder.PropertyId;importcom.vaadin.flow.data.renderer.LocalDateRenderer;importcom.vaadin.flow.router.PageTitle;importcom.vaadin.flow.router.Route;importbr.com.fjsistemas.backend.Venda;importbr.com.fjsistemas.main.MainView;importbr.com.fjsistemas.repository.VendaRepository;importnet.sf.jasperreports.engine.JRException;@Route(value="relatorio-view",layout=MainView.class)@PageTitle("Relatório de Vendas")publicclassRelatorioVendaViewextendsVerticalLayout{privatestaticfinallongserialVersionUID=1L;privateHorizontalLayoutlayoutDatas=newHorizontalLayout();privateButtongerarRelatorio=newButton("Gerar Relatório");privateButtonexportarRelatorio=newButton("Exportar Relatório");privateGrid<Venda>grid=newGrid<>();Labellabel=newLabel("Valor Total no Periodo:");@PropertyId("dataInicio")privateDatePickerdataInicio=newDatePicker("Início");@PropertyId("dataFim")privateDatePickerdataFim=newDatePicker("Final");@PropertyId("somaValores")privateTextFieldsomaValores=newTextField();@AutowiredprivateVendaRepositoryvendaRepository;@AutowiredprivatePDFpdf=newPDF(vendaRepository);privateList<Venda>listaVendas;publicRelatorioVendaView(){configuraRelatorio();}privatevoidpopulaInformacao(){listaVendas=vendaRepository.findAllByDataVendaBetween(dataInicio.getValue(),dataFim.getValue());somaValoresRelatorio();atualizaGrdVenda();}privatevoidatualizaGrdVenda(){grid.setItems(listaVendas);}privatevoidsomaValoresRelatorio(){NumberFormatformatter=NumberFormat.getCurrencyInstance(newLocale("pt","BR"));doublesoma=0;for(Vendavenda:listaVendas){try{soma+=formatter.parse(venda.getValorTotalVenda()).doubleValue();}catch(ParseExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}somaValores.setValue(formatter.format(soma));}privatevoidconfiguraRelatorio(){grid.setWidthFull();grid.setHeight("740px");grid.addColumn(newLocalDateRenderer<>(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));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");exportarRelatorio.addClickListener(event->{try{pdf.generatePdfButton();}catch(JRExceptione){// TODO Auto-generated catch blocke.printStackTrace();}});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,exportarRelatorio,somaValores);add(layoutDatas,grid);}publicList<Venda>getListaVenda(){returnlistaVendas;}publicvoidsetListaVenda(List<Venda>listaVenda){this.listaVendas=listaVenda;}}
L
Lucas_Camara1 like
Tente trocar isso:
@AutowiredprivatePDFpdf=newPDF(vendaRepository);
por apenas isso:
@AutowiredprivatePDFpdf;
A classe PDF tem que estar com as anotações do spring
Agora chamou o relatório, blz. Porém, deu erro na execução do relatório pela lib do jasper, provavelmente ao tentar ler os campos da venda.
R
rafaspara2017
Propriedade desconhecida ‘’ na classe ‘classe br.com.fjsistemas.backend.Venda’
realmente faz sentido pois na query eu passo isso para relatorio:
SELECTcliente.nome,//classe clientevenda.id,// classe vendavenda.data_venda,//classe vendavenda.valor_total_venda,//classe vendaformaPagamento.forma_de_pagamento//classe forma de pagamentoFROMfjsistemas.vendavendaINNERJOINfjsistemas.clienteclienteONcliente.id=venda.cliente_idINNERJOINfjsistemas.forma_de_pagamentoformaPagamentoONvenda.forma_de_pagamento_id=formaPagamento.id
R
rafaspara2017
na classe venda ha somente o id do cliente(não o nome)
e o id da forma de pagamento(nao a forma)
L
Lucas_Camara1 like
Manda o jrxml pra gente ver.
R
rafaspara2017
<?xmlversion="1.0"encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd --><jasperReportxmlns="http://jasperreports.sourceforge.net/jasperreports"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"name="RelatorioVendas"pageWidth="595"pageHeight="842"columnWidth="535"leftMargin="20"rightMargin="20"topMargin="20"bottomMargin="20"uuid="2e0e50d4-9514-4537-9eb7-b2223b2664d1"><propertyname="com.jaspersoft.studio.data.sql.tables"value=""/><propertyname="com.jaspersoft.studio.data.defaultdataadapter"value="fjsistemas"/><queryStringlanguage="SQL"><![CDATA[SELECT cliente.nome, venda.id, venda.data_venda, venda.valor_total_venda, formaPagamento.forma_de_pagamentoFROM fjsistemas.venda venda INNER JOIN fjsistemas.cliente cliente ON cliente.id = venda.cliente_id INNER JOIN fjsistemas.forma_de_pagamento formaPagamento ON venda.forma_de_pagamento_id = formaPagamento.id]]></queryString><fieldname="nome"class="java.lang.String"><propertyname="com.jaspersoft.studio.field.name"value="nome"/><propertyname="com.jaspersoft.studio.field.label"value="nome"/><propertyname="com.jaspersoft.studio.field.tree.path"value="cliente"/><fieldDescription><![CDATA[]]></fieldDescription></field><fieldname="id"class="java.lang.Long"><propertyname="com.jaspersoft.studio.field.name"value="id"/><propertyname="com.jaspersoft.studio.field.label"value="id"/><propertyname="com.jaspersoft.studio.field.tree.path"value="venda"/><fieldDescription><![CDATA[]]></fieldDescription></field><fieldname="data_venda"class="java.sql.Date"><propertyname="com.jaspersoft.studio.field.name"value="data_venda"/><propertyname="com.jaspersoft.studio.field.label"value="data_venda"/><propertyname="com.jaspersoft.studio.field.tree.path"value="venda"/><fieldDescription><![CDATA[]]></fieldDescription></field><fieldname="valor_total_venda"class="java.lang.String"><propertyname="com.jaspersoft.studio.field.name"value="valor_total_venda"/><propertyname="com.jaspersoft.studio.field.label"value="valor_total_venda"/><propertyname="com.jaspersoft.studio.field.tree.path"value="venda"/><fieldDescription><![CDATA[]]></fieldDescription></field><fieldname="forma_de_pagamento"class="java.lang.String"><propertyname="com.jaspersoft.studio.field.name"value="forma_de_pagamento"/><propertyname="com.jaspersoft.studio.field.label"value="forma_de_pagamento"/><propertyname="com.jaspersoft.studio.field.tree.path"value="forma_de_pagamento"/><fieldDescription><![CDATA[]]></fieldDescription></field><background><band/></background><title><bandheight="72"><frame><reportElementmode="Opaque"x="-20"y="-20"width="595"height="92"backcolor="#006699"uuid="4a5bb3ef-9a2a-4935-a501-65480e83408b"/><staticText><reportElementx="0"y="0"width="595"height="92"forecolor="#FFFFFF"uuid="9a4d8f9c-b897-4e51-9e44-13a8046222ca"/><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="34"isBold="true"/></textElement><text><![CDATA[RELATÓRIO DE VENDAS]]></text></staticText></frame></band></title><pageHeader><band/></pageHeader><columnHeader><bandheight="21"><line><reportElementx="-20"y="20"width="595"height="1"forecolor="#666666"uuid="5e89c1f4-5166-405e-b8f2-a0ab858a7247"/></line><staticText><reportElementmode="Opaque"x="-20"y="0"width="151"height="20"forecolor="#006699"backcolor="#E6E6E6"uuid="40f47e82-8b64-4cf1-b52f-8c8eb0e08af7"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="9e80d110-ce3c-4160-8754-87ba8dba1ac8"/></reportElement><textElementtextAlignment="Center"><fontsize="14"isBold="true"/></textElement><text><![CDATA[ID]]></text></staticText><staticText><reportElementmode="Opaque"x="91"y="0"width="151"height="20"forecolor="#006699"backcolor="#E6E6E6"uuid="d84e8987-62de-4ee7-89b4-4b8e6274f230"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="4536281d-5c6e-4197-81c2-c6f3fbc2babf"/></reportElement><textElementtextAlignment="Center"><fontsize="14"isBold="true"/></textElement><text><![CDATA[DATA]]></text></staticText><staticText><reportElementmode="Opaque"x="202"y="0"width="151"height="20"forecolor="#006699"backcolor="#E6E6E6"uuid="b140ab7b-d427-4559-a422-73616518ff9a"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="8b1f275b-2bd2-452e-b206-f553fd0f5c6a"/></reportElement><textElementtextAlignment="Center"><fontsize="14"isBold="true"/></textElement><text><![CDATA[CLIENTE]]></text></staticText><staticText><reportElementmode="Opaque"x="313"y="0"width="151"height="20"forecolor="#006699"backcolor="#E6E6E6"uuid="ad528a61-f62f-43a6-b862-363839b63a02"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="b0cc8fe2-8712-4c22-9f68-0165a2ac5a53"/></reportElement><textElementtextAlignment="Center"><fontsize="14"isBold="true"/></textElement><text><![CDATA[VALOR]]></text></staticText><staticText><reportElementmode="Opaque"x="424"y="0"width="151"height="20"forecolor="#006699"backcolor="#E6E6E6"uuid="d2b0f4e4-88f8-4362-86da-cef09765e112"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="2d066431-6862-42c1-b8b1-97cb6e46f470"/></reportElement><textElementtextAlignment="Center"><fontsize="14"isBold="true"/></textElement><text><![CDATA[F.PAGAMENTO]]></text></staticText></band></columnHeader><detail><bandheight="21"><line><reportElementpositionType="FixRelativeToBottom"x="-20"y="20"width="595"height="1"uuid="e0ee4647-b7a7-4eb5-925e-750dc7ad0d85"/></line><textFieldtextAdjust="StretchHeight"><reportElementx="0"y="0"width="111"height="20"uuid="cdab64e7-e01d-4a66-ba74-67f3c208f7ee"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="9e80d110-ce3c-4160-8754-87ba8dba1ac8"/></reportElement><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="14"/></textElement><textFieldExpression><![CDATA[$F{id}]]></textFieldExpression></textField><textFieldtextAdjust="StretchHeight"><reportElementx="111"y="0"width="111"height="20"uuid="b2f1ead4-4b3b-43ed-bdd6-ea2713472dc9"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="4536281d-5c6e-4197-81c2-c6f3fbc2babf"/></reportElement><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="14"/></textElement><textFieldExpression><![CDATA[$F{data_venda}]]></textFieldExpression></textField><textFieldtextAdjust="StretchHeight"><reportElementx="222"y="0"width="111"height="20"uuid="c0f810a5-bd07-4fbc-ba0b-8ee89e677145"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="8b1f275b-2bd2-452e-b206-f553fd0f5c6a"/></reportElement><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="14"/></textElement><textFieldExpression><![CDATA[$F{nome}]]></textFieldExpression></textField><textFieldtextAdjust="StretchHeight"><reportElementx="333"y="0"width="111"height="20"uuid="d01d637d-5248-428a-bf06-ef6edb4ccdc6"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="b0cc8fe2-8712-4c22-9f68-0165a2ac5a53"/></reportElement><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="14"/></textElement><textFieldExpression><![CDATA[$F{valor_total_venda}]]></textFieldExpression></textField><textFieldtextAdjust="StretchHeight"><reportElementx="444"y="0"width="111"height="20"uuid="41ddd3a1-42ba-4803-b359-25cbedb22b7d"><propertyname="com.jaspersoft.studio.spreadsheet.connectionID"value="2d066431-6862-42c1-b8b1-97cb6e46f470"/></reportElement><textElementtextAlignment="Center"verticalAlignment="Middle"><fontsize="14"/></textElement><textFieldExpression><![CDATA[$F{forma_de_pagamento}]]></textFieldExpression></textField></band></detail><columnFooter><band/></columnFooter><pageFooter><bandheight="17"><textField><reportElementmode="Opaque"x="0"y="4"width="515"height="13"backcolor="#E6E6E6"uuid="05ed0fd3-d214-421b-af78-eda7b865e587"/><textElementtextAlignment="Right"/><textFieldExpression><![CDATA["Page "+$V{PAGE_NUMBER}+" of"]]></textFieldExpression></textField><textFieldevaluationTime="Report"><reportElementmode="Opaque"x="515"y="4"width="40"height="13"backcolor="#E6E6E6"uuid="9df907f5-7443-47aa-9f6b-9d19c6039184"/><textFieldExpression><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression></textField><textFieldpattern="EEEEE dd MMMMM yyyy"><reportElementx="0"y="4"width="100"height="13"uuid="6bbc7b9c-89d1-495f-a56e-2ea57fddae32"/><textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression></textField></band></pageFooter><summary><band/></summary></jasperReport>
L
Lucas_Camara1 like
Entendi. vc está gerando por uma query direto no relatório. Então vc realmente não precisa passar a lista como eu tinha te falado. Vc deve passar uma Connection do banco de dados para o relatório.
Deve ser por conta do spring data jpa. Confesso que nunca precisei recuperar uma Connection jdbc numa aplicação Spring. Vou dá uma pesquisa aqui e posto se achar algo.
L
Lucas_Camara1 like
AH mano, o código tah errado. Tu duplicou a linha que preenche o relatório:
Manooo…muito obrigado mais uma vez…vc é fera!!! Vlw manoooo Muitooo Obg!!!
L
Lucas_Camara1 like
Massa!
Só lembrando: Em projetos Spring, evite usar new Classe blz? Sempre anote suas classes e as use através de injeção de dependência. Por @Autowired ou pelo construtor (como foi feito na classe PDF).
R
rafaspara20171 like
Sim sim…estou vendo o link que vc mandou agora com mais calma…vlw parça!!!