Como Pegar o Relatório atualizado

Amigos, mais uma vez eu aqui, solucionado o problema de enviar email com java, pelo amigo @orochimaru.

Só que agora tenho outro problema, que é em relação a como pegar o ultimo pdf gerado pelo sistema, tentei usar assim

 FileDataSource fds = new  FileDataSource("C:/reports/OrdemAcampamento.pdf/"); 

ate gera, mas não atualizado, como se resolve isso?

esse é o ultimo relatorio?

Na verdade esse é o primeiro relatório, não pegou as ultimas informações

eu tenho que salvar o arquivo atualizado no pc, pra mandar pro email, tem alguma forma de manipular FileDataSource fds = new FileDataSource("C:/reports/Acampamentos.jasper"); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(fds.getName()); em vez de colocar C:e tal, colocar outro endereço que pegue esse esse pdf, não sei se pude explicar de forma correta

O arquivo do pc ta atualizado?

É que assim, pra vc passar o anexo no email, tem q passar o caminho absoluto do arquivo:

C:\\arquivo.pdf

ou o caminho que esteja no seu app, usando o

InputStream is = this.getClass().getResourceAsStream("resources/arquivo.pdf");

Ese filedatasource é pra que exatamente?

beleza, O filedatasource é de onde esta pegando os arquivos, os anexos no caso

Esse anexo vai pro email? Alias, vc ta usando o fileDataSource pra mandar o anexo pro email? ta meio confuso

1 curtida

vai sim, só que ele pega sempre o primeiro relatório sabe, tipo se eu criar um relatório dia 20 por exemplo, se esse for o primeiro relatorio do sistema ele manda sem problemas, agora se eu criar outro depois, ele não encontra. não sei se pude explicar

O nome do arquivo é o mesmo?

É sim, vou te mandar ai.
identar texto pré-formatado por 4 espaços

public class EnviarJava {

public void envioAnexo(String nomeRemetente, String assunto, String mensagem, String destinatario, String imagem) throws UnsupportedEncodingException {
    try {
        String host = "smtp.gmail.com";
        String usuario = "henri199@gmail.com";
        String senha = "#eliasemana17";
        String remetente = "henri199@gmail.com";
        
        boolean sessionDebug = true;

        Properties props = System.getProperties();            
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.required", "true");
        props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
        props.put("mail.smtp.starttls.enable", "true");
        
         props.setProperty("mail.debug", "true");

// jdk > 8
// java.security.Security.addProvider(new Provider(host, remetente, senha) {
// });

// jdk == 8
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        Session mailSession = Session.getDefaultInstance(props, null);
        mailSession.setDebug(sessionDebug);

        Message msg = new MimeMessage(mailSession);
        msg.setFrom(new InternetAddress(remetente, nomeRemetente));             msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
        msg.setSubject(assunto);
        msg.setSentDate(new Date());

        // cria a primeira parte da mensagem
        MimeBodyPart mbp1 = new MimeBodyPart();
        mbp1.setContent(mensagem, "text/html;charset=UTF-8");

        // cria a segunda parte da mensage
        MimeBodyPart mbp2 = new MimeBodyPart();

        // anexa o arquivo na mensagem
        FileDataSource fds = new FileDataSource("C:/reports/Acampamentos.jasper");
        mbp2.setDataHandler(new DataHandler(fds));
        mbp2.setFileName(fds.getName());

        // cria a Multipart
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(mbp1);
        mp.addBodyPart(mbp2);

        // adiciona a Multipart na mensagem
        msg.setContent(mp);

        // configura a data: cabecalho
        msg.setSentDate(new Date());

        // envia a mensagem
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(host, usuario, senha);
        transport.sendMessage(msg, msg.getAllRecipients());
        transport.close();
        System.out.println("Enviado com Sucesso");
    } catch (MessagingException ex) {
        System.out.println(ex);
    }
}

O Evento da onde eu quero que faça tanto imprimir pro usuário, como mandar pro email ( ou poderia colocar pra enviar Email em um horário do dia)

Cara, vc nao ta formatando seus códigos. Vc tem que SELECIONAR ele todo (o código) e clicar em </>

image

Quando vc for perguntar aqui, vc tem que ser objetivo, nós trocamos 10 mensagens e vc ainda não disse se dá erro, se acontece algo…

Só disse que não encontra.

vc tem que passar o caminho com dupla barra invertida: c:\\pasta\\arquivo.ext

Por isso eu estava estranhando, eu passei a variavel imagem justamente pra vc nao mexer nessa parte do código. Era só vc chamar assim:

envioAnexo(
    "Fulano", //Nome do Remetente
    "JavaMail Code", //Asunto
    "Abner mandou esse código",  //Mensagem
    "fulano@gmail.com", //Email do destinatário
    "c:\\caminho\\teste.pdf" //arquivo
);

Mas enfim, diga se dá erro, o que acontece de fato

Assim, talvez eu tenha formulado a pergunta de forma errada. Ele pega e manda por email, só o que foi salvo, por exemplo, tenho na pasta do ireport, alguns pdf, se eu colocar um desse arquivo, lá na saida do enviar email, ele vai mandar sem problemas, só que vai fica desatualizados, sempre vai mandar aquele, queria que fosse atualizado, pro responsável estar sempre ciente dos lucros do dia.

Se o nome do arquivo é o mesmo e vc está de fato salvando o novo relatório, o anexo tem que ir correto.

Uma solução é vc criar um arquivo temporário (com nomes diferentes, tipo, financeiro-joao-paulo-21062020210323) e enviar. Depois de enviado, vc pode apagar esse arquivo temporário e manter só os que importam.

O nome do relatório foi composto por:

financeiro   - tipo de relatorio
joao-paulo   - nome do cliente
21/06/2020   - data (sem as barras)
21:03:23     - horario(sem os traços)

Baseado na sua explicação o que eu posso auxiliar é nisso.

1 curtida

mais uma vez muito obrigado

só mais uma duvida, quando clico no botão visualizar relatórios, ele gera um pdf através da FillReport, posso pegar esse FillReport e jogar no enviar email?? assim eu teria quem sabe o email atualizado.

identar texto pré-formatado por 4 espaços    try {
            
            JasperPrint imprimir= JasperFillManager.fillReport("C:/reports/Acampamentos.jasper",null,conexao);
            // linha exibe relatorio 
             EnviarJava e = new EnviarJava();
             
            try {
                e.envioAnexo( "Fulano","teste", "teste", "alexandremenna@hotmail.com", "C:\\reports\\Acampamentos.jasper");
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(TelaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            }
            JasperViewer.viewReport(imprimir,false);
            
        } catch (JRException e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }
}

Eu faço assim:

String nomeArquivo = "blablabla.pdf";
JasperExportManager.exportReportToPdfFile(jpPrint, "C:\\pasta\\" + nomeArquivo);
1 curtida

vc pode testar meu sistema?

Não posso… O que eu posso fazer é te auxiliar por aqui

1 curtida

vou mandar os eventos responsáveis de imprimir e mandar por Email os relatórios. O imprimir ta funcionando bem. Só que pra mandar por email, ele manda sempre o primeiro salvo como falei anteriormente. Será que posso mandar por email, sem salvar no PC, mas sim quando é clicado no botão visualizar relatórios??
private void RelatorioAcampActionPerformed(java.awt.event.ActionEvent evt) {

    // painel mensagem de confirmação
    int confirma = JOptionPane.showConfirmDialog(null, "Confirma Emissão Deste Realatório?","Atenção",JOptionPane.YES_NO_OPTION);
    if(confirma ==JOptionPane.YES_OPTION){
       
    // imprimir relatorio com frame
    
        try {
            

            
            JasperPrint imprimir= JasperFillManager.fillReport("C:/reports/Acampamentos.jasper",null,conexao);
         //   // linha exibe relatorio 
          JasperViewer.viewReport(imprimir,false);
             EnviarJava e = new EnviarJava();
             
            try {
                e.envioAnexo( "Fulano","teste", "teste", "alexandremenna@hotmail.com", "C:\\reports\\Acampamentos.jasper");
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(TelaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            }
           
            
        } catch (JRException e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }
}                                              texto pré-formatado por 4 espaços

Vc pode fazer exatamente isso que falei acima, resolve o seu problema.

E não, não tem como vc mandar um arquivo que “não existe”, é um anexo, precisa estar em algum lugar…