Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relatório retorna null #107

Closed
eduardaOKnopf opened this issue Jun 13, 2018 · 9 comments
Closed

Relatório retorna null #107

eduardaOKnopf opened this issue Jun 13, 2018 · 9 comments

Comments

@eduardaOKnopf
Copy link

eduardaOKnopf commented Jun 13, 2018

Boa noite, estou usando o o relatório com um parâmetro para a impressão de uma ordem de serviço, na preview do JasperStudio executou perfeitamente, porém quando executei no meu projeto os campos retornaram null, como na imagem
erro

no meu ReportController está assim:

class ReportController extends Controller
{
    public function getDatabaseConfig()
    {
        return [
            'driver'   => env('DB_CONNECTION'),
            'host'     => env('DB_HOST'),
            'port'     => env('DB_PORT'),
            'database' => env('DB_DATABASE'),
            'username' => env('DB_USERNAME'),
            'password' => env('DB_PASSWORD'),
            'jdbc_dir' => base_path() . env('JDBC_DIR'),
        ];
    }
    public function index($id)
    {
        $output = public_path() . '/reports/' . time() . '_ordemServico';

        $report = new PHPJasper;

        $report->process(
            public_path() . '/reports/ordemServico.jrxml',
            $output,
            ['pdf'],
            ['id' => $id],
            $this->getDatabaseConfig()
        )->execute();
        $file = $output . '.pdf';
        $path = $file;


        if (!file_exists($file)) {
            abort(404);
        }
        $file = file_get_contents($file);

        unlink($path);

        return response($file, 200)
            ->header('Content-Type', 'application/pdf')
            ->header('Content-Disposition', 'inline; filename="ordemServico.pdf"');

    }
}

Não me retorna mais nenhum erro, apenas os campos em null, é a primeira vez que estou usando os relatórios com parâmetro, imagino que seja um erro bem simples que esteja passando despercebido, mas não tenho ideia de como resolve-lo, aguardo alguma ajuda.
Obrigada.

@geekcom
Copy link
Member

geekcom commented Jun 14, 2018

Olá @eduardaOKnopf, obrigado por usar PHPJasper, você está escrevendo alguns trechos do modo antigo da lib, escrevi a forma correta de se fazer abaixo, acredito que funcione de primeira, apenas adapte a sua necessidade e dê uma olhada no README.md, tem uma versão em português do Brasil.

class ReportController extends Controller
{
    public function getDatabaseConfig()
    {
        return [
            'driver'   => env('DB_CONNECTION'),
            'host'     => env('DB_HOST'),
            'port'     => env('DB_PORT'),
            'database' => env('DB_DATABASE'),
            'username' => env('DB_USERNAME'),
            'password' => env('DB_PASSWORD'),
            'jdbc_dir' => base_path() . env('JDBC_DIR'),
        ];
    }

    public function index($id)
    {
        $input = public_path() . '/reports/ordemServico.jrxml';

        $output = public_path() . '/reports/' . time() . '_ordemServico';
        
        $options = [
            'format' => ['pdf'],
            'locale' => 'pt_BR',
            'params' => [ 'id' => $id ],
            'db_connection' => $this->getDatabaseConfig()
        ];

        $report = new PHPJasper;

        $this->report->process(
            $input,
            $output,
            $options
        )->execute();

        $file = $output . '.pdf';
        $path = $file;

        if (!file_exists($file)) {
            abort(404);
        }

        $file = file_get_contents($file);

        unlink($path);

        return response($file, 200)
            ->header('Content-Type', 'application/pdf')
            ->header('Content-Disposition', 'inline; filename="ordemServico.pdf"');
    }
}

@eduardaOKnopf
Copy link
Author

Olá, @geekcom! Obrigada por me ajudar, atualizei meu controller conforme você me sugeriu e agora me retorna o seguinte erro:

"Your report has an error and couldn 't be processed!\ Try to output the command using the function output(); and run it manually in the console."

Procurei por issues que apareciam esse erro e executei as soluções propostas nelas, porém o erro continua, li o readme.md varias vezes para ter certeza de não estar fazendo nada errado. Até testei o código sem a função getDatabaseConfig() que eu tinha feito para a conexão.
A configuração do meu projeto é essa:

  • Estou usando o jdk1.8.0_171
  • PHP na versão 7.1.9
  • MySql pelo phpmyadmin
  • Laravel está na versão 5.6.16

Mais uma vez, obrigada pela atenção!

@geekcom
Copy link
Member

geekcom commented Jun 14, 2018

Pergunta meio obvia, mas as vezes esquecemos, você criou o parâmetro no relatório .jrxml? e se criou está usando ele na query do seu relatório?
Para criar o parâmetro basta fazer pelo item "Create Parameter" do seu jasper studio se for o caso e abaixo um exemplo de como ficaria seu parâmetro na query

SELECT *
FROM tabela
WHERE id  = $P{id}

@geekcom
Copy link
Member

geekcom commented Jun 14, 2018

Execute o método output copie o retorno e execute esse retorno dentro da pasta que contém o binário PHPJasper, assim vc saberá exatamente onde está o erro, se não consegui resolver manda aqui o retorno do método output e do erro se existir.

print $this->report->process(
    $input,
    $output,
    $options
)->output();

@eduardaOKnopf
Copy link
Author

eduardaOKnopf commented Jun 14, 2018

Sim, criei, vou te passar a minha query para esse relatório

users.nome
AS users_nome,
users.email AS users_email,
users.celular AS users_celular,
users.telefone AS users_telefone,
serv.descricao AS serv_descricao,
serv.valor AS serv_valor,
pecas.nome AS pecas_nome,
pecas.valor AS pecas_valor,
s.descricao AS s_descricao,
s.dataHoraBaixa AS s_dataHoraBaixa,
s.valorFinal AS s_valorFinal,
enderecos.endereco AS enderecos_endereco,
enderecos.numero AS enderecos_numero,
enderecos.bairro AS enderecos_bairro,
enderecos.cep AS enderecos_cep,
enderecos.complemento AS enderecos_complemento,
s.id AS s_id,
sp.quantidade AS sp_quantidade
FROM
solicitacao_servicos ss INNER JOIN solicitacaos s ON ss.solicitacao_id = s.id
INNER JOIN solicitacao_pecas sp ON s.id = sp.solicitacao_id
INNER JOIN users users ON s.user_id = users.id
INNER JOIN enderecos enderecos ON users.id = enderecos.user_id
INNER JOIN pecas pecas ON sp.peca_id = pecas.id
INNER JOIN servicos serv ON ss.servico_id = serv.id
WHERE
s.id = $P{id}

Substitui o trecho do meu ReportController

$this->report->process(
            $input,
            $output,
            $options
        )->execute();

pelo

print $this->report->process(
    $input,
    $output,
    $options
)->output();

e me retornou:

jasperstarter --locale pt_BR process "C:\Users\Baraoinfo2\Desktop\helpTec\public/reports/ordemServico.jrxml" -o "C:\Users\Baraoinfo2\Desktop\helpTec\public/reports/1529013335_ordemServico" -f pdf -P id="2" -t mysql -H 127.0.0.1 --db-port 3306 -n assistencia -u root -p --jdbc-dir C:\Users\Baraoinfo2\Desktop\helpTec/vendor/geekcom/phpjasper/bin/jasperstarter/jdbc

@geekcom
Copy link
Member

geekcom commented Jun 15, 2018

Perfeito @eduardaOKnopf a query está correta o comando gerado pelo PHPJasper também copie esse retorno do método output() e execute no seu cmd dentro da pasta: C:\Users\Baraoinfo2\Desktop\helpTec/vendor/geekcom/phpjasper/bin/jasperstarter/bin, e observe exatamente qual o erro.

@eduardaOKnopf
Copy link
Author

Olá @geekcom!! Consegui gerar meu relatório com sucesso...
Fiz oque você me sugeriu e retornou primeiramente o erro
jasperstarter: error: argument -p: expected one argument
Pois meu DB não possui senha, então comentei o password da minha function de conexão, depois que corrigi esse erro, fiz o procedimento novamente do retorno do 'output()' e me retornou
input file: "C:\Users\Baraoinfo2\Desktop\helpTec\public\reports\ordemServico.jrxml" is not a valid jrxml file
De tanto que eu mexi no meu relatório acabei trocando o tipo do parâmetro, de Integer para Number.
Corrigindo isso, testei e deu certo!

Muito obrigada por ter tirado um pouco do seu tempo para me ajudar!

@devpaulopaixao
Copy link

Eduarda, pode me dar algumas dicas de como resolver esse problema?

@DaviJP7
Copy link

DaviJP7 commented Mar 19, 2022

Obrigado. Consegui resolver aqui também!💻🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants