Integrando o Eclipse Business Intelligence and Reporting (BIRT) em um Aplicativo PHP WebSphere sMash

O IBM® WebSphere® sMash fornece um ambiente para o desenvolvimento rápido de aplicativos da Web interativos baseados em tecnologias da Web populares, como PHP. O WebSphere sMash possibilita a reutilização de ativos de software existentes gravados em Java™ de forma rápida e fácil a partir de scripts PHP. O artigo introduz o projeto Eclipse Business Intelligence and Reporting Tools (BIRT) e mostra como é possível usar o BIRT para renderizar relatórios no WebSphere sMash, usando PHP e a ponte de PHP para Java. Este conteúdo é parte do IBM WebSphere Developer Technical Journal.

Ant Phillips, Software Developer, IBM

Photo: Ant PhillipsAnt Phillips é um Desenvolvedor de Software no Centro de Tecnologia Java da IBM em Hursley, Reino Unido. Seu foco atual está no WebSphere sMash, um ambiente simples para criar aplicativos da Web dinâmicos. Antes de entrar na IBM, Ant era o líder técnico de uma empresa inovadora situada em Newbury, Reino Unido. Em vidas passadas, Ant trabalhou para a Sony® e a Microsoft® e adorava visitar Tóquio, Seattle e vários lugares entre as duas cidades. Em seu tempo livre, ele pratica o máximo de esporte que sua esposa e dois filhos deixam.



04/Mar/2009

Introdução

Eclipse Business Intelligence and Reporting Tools (BIRT) é um sistema de relatórios de software livre que pode ser integrado a aplicativos da Web. Conforme descrito nos materiais de Visão Geral do Eclipse BIRT , o BIRT possibilita incluir uma rica variedade de relatórios convincentes para aprimorar seu aplicativo:

  • Listas: Os relatórios mais simples são listas de dados. À medida que as listas ficam mais longas, é possível incluir agrupamento para organizar dados relacionados juntos. Se seus dados forem numéricos, é possível incluir facilmente totais, médias e outros resumos.
  • Gráficos: Dados numéricos são frequentemente muito mais fáceis de entender quando apresentados como um gráfico. O BIRT oferece um mecanismo de gráfico que permite que você inclua gráficos de setores circulares, gráficos de linhas e de barras e muitos mais em seus aplicativos.
  • Tabulações cruzadas: Também chamada de uma tabulação cruzada ou matriz, as tabulações cruzadas mostram dados em duas dimensões; por exemplo, vendas por trimestre ou ocorrências por página da Web.
  • Relatórios compostos: Relatórios que podem combinar tudo acima em um único documento.

Relatórios consistem em quatro partes principais:

Sobre o WebSphere sMash
O IBM WebSphere sMash e o IBM WebSphere sMash Developer Edition são baseados no altamente aclamado projeto incubador Project Zero. Project Zero é a comunidade de desenvolvimento do WebSphere sMash e continuará a oferecer a desenvolvedores uma plataforma gratuita para o desenvolvimento de aplicativos com as compilações mais recentes, os recursos mais recentes e o suporte da comunidade. Reserve alguns minutos para se familiarizar com o Project Zero. É possível se juntar à comunidade do Project Zero, contribuir para o projeto ou se juntar ao fórum de discussão, onde é possível comentar sobre o projeto em cada estágio de seu desenvolvimento.

  • Dados: Bancos de dados, arquivos XML e serviços da Web podem fornecer dados para seu relatório BIRT. Um único relatório pode incluir dados de diversas origens de dados.
  • Transformações de dados: Os relatórios representam dados classificados, resumidos, filtrados e agrupados para atender às necessidades de um usuário. Apesar de os bancos de dados poderem fazer parte desse trabalho, o BIRT deve fazer isso para origens de dados simples, como arquivos simples.
  • Lógica de negócios: Dados do mundo real raramente estão estruturados exatamente como você gostaria para um relatório. Muitos relatórios requerem lógica de negócios específica para converter dados brutos em informações úteis para o usuário. Se a lógica for apenas para o relatório, é possível colocá-la em script usando o suporte a JavaScript™ do BIRT. Se seu aplicativo já contiver a lógica, é possível chamá-la para seu código existente.
  • Apresentação: Quando os dados estiverem prontos, há uma ampla gama de opções para apresentá-los: em tabela, gráficos, texto e mais.

O BIRT possui dois componentes principais:

  • Um designer de relatório baseado no Eclipse.
  • Um componente de tempo de execução que pode ser incluído em aplicativos do Project Zero ou WebSphere sMash.

Este artigo ilustra como integrar o mecanismo de relatório do BIRT a um aplicativo PHP do Project Zero ou WebSphere sMash, mostrando como:

  • Renderizar relatórios do BIRT usando o banco de dados de amostra BIRT Classic Models
  • Carregar e chamar de forma eficiente o Mecanismo de Relatórios do BIRT.
  • Passar parâmetros de relatório para o BIRT a partir de um aplicativo PHP do Project Zero.
  • Configurar relatórios do BIRT para obter imagens do Project Zero.
  • Criar conjuntos de dados em PHP e renderizá-los em um relatório do BIRT.

Antes de Iniciar

Este artigo supõe uma familiaridade básica com o WebSphere sMash ou o Project Zero e com os conceitos de PHP. Supõe-se também que haja um Java Development Kit (JDK) adequado instalado em sua máquina. Nenhum conhecimento específico de Java é necessário para entender este artigo.

Para tornar os exemplos realistas, este artigo usa o banco de dados Eclipse Classic Models, que usa um servidor de banco de dados MySQL. Instruções para instalar o banco de dados de amostra Classic Models (que é distribuído em um arquivo .zip) estão disponíveis no Eclipse. A Figura 1 mostra um exemplo de relatório do BIRT que inclui gráficos, texto e tabelas. Os dados da tabela são extraídos do banco de dados Classic Models quando o relatório é gerado.

Figura 1. Relatório do BIRT Usando o Banco de Dados de Amostra Classic Models
Figura 1. Relatório do BIRT Usando o Banco de Dados de Amostra Classic Models

O banco de dados Eclipse Classic Models também pode ser usado com o Apache Derby.


Criar e Configurar um Aplicativo para Usar o BIRT

  1. Criar um aplicativo PHP

    Sua primeira etapa é fazer download e instalar a versão mais recente do Project Zero. Este artigo usa a interface da linha de comando, mas os conceitos deste artigo funcionam também quanto se preferir usar o AppBuilder ou o Eclipse.

    Crie um aplicativo PHP chamado "demo", conforme detalhado no Guia de Introdução do IBM WebSphere sMash . A Figura 2 mostra a saída do console da criação do aplicativo demo. Certifique-se de incluir a dependência PHP no arquivo de configuração ivy.xml (consulte a seção Incluindo Suporte a PHP no Guia de Introdução). Resumidamente, seu arquivo de dependência config/ivy.xml deve conter esta entrada:

    <dependency name="zero.php" org="zero" rev="[2.0.0.0, 3.0.0.0["/>

    Deve-se, também, executar uma etapa de atualização após alterar o arquivo de configuração ivy.xml.

    Figura 2. Saída da Criação de um Aplicativo PHP do Project Zero de Linha de Comando
    Figura 2. Saída da Criação de um Aplicativo PHP do Project Zero de Linha de Comando

    A estrutura do diretórios do aplicativo é mostrada na Figura 3.

    Figura 3. Estrutura de Diretórios do Aplicativo PHP do Project Zero
    Figura 3. Estrutura de Diretórios do Aplicativo PHP do Project Zero
  2. Fazer download do projeto Eclipse BIRT

    O tempo de execução do BIRT contém os componentes essenciais mínimos (arquivos JAR) para renderizar relatórios em um aplicativo PHP do Project Zero. (Este artigo usa o BIRT 2.3, que era a versão estável mais recente quando este artigo foi escrito.) Também faça download do pacote completo que contém o Eclipse Report Designer, que fornece um ambiente de fácil utilização para a criação e edição de relatórios.

  3. Configurar o aplicativo para usar o BIRT
    1. Descompacte o download do tempo de execução do BIRT no diretório do aplicativo demo (Figura 4).
      Figura 4. O Diretório do Demo Incluindo o Tempo de Execução do BIRT
      Figura 4. O Diretório do Demo Incluindo o Tempo de Execução do BIRT
    2. Copie os arquivos de demo/birt-runtime-2_3_1/ReportEngine/lib para o diretório demo/lib (Figura 5).
      Figura 5. Conteúdo do Diretório demo/lib após Copiar os Arquivos
      Figura 5. Conteúdo do Diretório demo/lib após Copiar os Arquivos
    3. Se ainda não tiver criado o banco de dados de amostra Classic Models, faça isso agora. Instruções para a instalação do banco de dados estão no Web site do Eclipse BIRT.
    4. O arquivo .zip da amostra Classic Models contém os diretórios mostrados na Figura 6. Copie o diretório images para seu diretório demo/public.
      Figura 6. Conteúdo do Arquivo ZIP da Amostra Classic Models
      Figura 6. Conteúdo do Arquivo ZIP da Amostra Classic Models
    5. Você precisará de um driver JDBC para que o BIRT possa se comunicar com o banco de dados MySQl. Faça download do driver JDBC Connector/J do Web site do MySQL. Certifique-se de que a versão do Connector/J corresponda à versão do servidor MySQL instalado.
    6. Copie o arquivo JAR do MySQL Connector/J JAR transferido por download para o diretório demo/birt-runtime-2_3_1/ReportEngine/plugins/org.eclipse.birt.report.data.oda.jdbc_2.3.1.v20080827/drivers.
    7. Execute uma etapa zero update no aplicativo demo executando o comando mostrado na Figura 7. Isso inclui o tempo de execução do BIRT no caminho da classe do aplicativo demo.
      Figura 7. Executando uma Atualização no Aplicativo
      Figura 7. Executando uma Atualização no Aplicativo
    8. Faça download das definições de relatórios incluídas neste artigo . Copie essas definições de relatórios para o aplicativo demo sob o diretório demo/samples (Figura 8).
      Figura 8. As Amostras de Definições de Relatórios
      Figura 8. As Amostras de Definições de Relatórios
    9. Inicie o aplicativo demo inserindo o comando zero start mostrado na Figura 9.
      Figura 9. Iniciando o Aplicativo Demo
      Figura 9. Iniciando o Aplicativo Demo
      O diretório do aplicativo demo agora deve ter a aparência da Figura 10.
      Figura 10. O Diretório do Aplicativo Demo
      Figura 10. O Diretório do Aplicativo Demo

Você configurou com êxito um aplicativo do Project Zero para usar o Eclipse BIRT.


Renderizar Relatórios Usando o BIRT com PHP

Crie um script PHP "Hello World" que renderiza um relatório usando o BIRT:

  1. Crie um arquivo PHP chamado "hello_world.php" no diretório demo/public.
  2. Copie e cole o código PHP mostrado na Lista 1 no arquivo e salve-o. O código é um programa de amostra que carrega e renderiza um relatório básico para HTML. O código é examinado em mais detalhes na próxima seção.
    Lista 1
    <?php
    
    $root_directory = zget("/config/root");
    $report_engine = $root_directory."/birt-runtime-2_3_1/ReportEngine";
    $log_directory = zget("/config/appLogDir");
    $design_file = $root_directory."/samples/hello_world.rptdesign";
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');
    
    java_import("org.eclipse.birt.core.framework.Platform");
    java_import("java.util.logging.Level");
    java_import("org.eclipse.birt.report.engine.api.EngineConfig");
    java_import("org.eclipse.birt.report.engine.api.IReportEngineFactory");
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");
    
    $config = new EngineConfig();
    $config->setBIRTHome($report_engine);
    $config->setLogConfig($log_directory, Level::$FINEST);
    Platform::startup($config);
    
    $factory = Platform::createFactoryObject(
        IReportEngineFactory::$EXTENSION_REPORT_ENGINE_FACTORY);
    
    $engine = $factory->createReportEngine($config);
    $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->validateParameters();
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $options->setHtmlRtLFlag(false);
    $options->setEmbeddable(false);
    
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    $engine->destroy();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    ?>
  3. Em um navegador da Web, navegue até http://locahost:8080/hello_world.php. Se o resultado for semelhante à Figura 11, então, você renderizou um relatório BIRT com êxito em um aplicativo PHP do Project Zero.
    Figura 11. Saída do Navegador da Web da Renderização do Relatório
    Figura 11. Saída do Navegador da Web da Renderização do Relatório
  4. Se o relatório não renderizar, certifique-se de que seu arquivo ivy.xml esteja configurado corretamente, em seguida, tente novamente.

Examinando o Código de Amostra

Agora, vamos percorrer o código PHP de amostra executado acima e ver o que está ocorrendo:

  1. Configurar o diretório
    Lista 2
    <?php
    
    $root_directory = zget("/config/root");
    $report_engine = $root_directory."/birt-runtime-2_3_1/ReportEngine";
    $log_directory = zget("/config/appLogDir");
    $design_file = $root_directory."/samples/hello_world.rptdesign";
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');

    O programa primeiro localiza onde o tempo de execução do BIRT foi instalado (ele foi copiado para demo/birt-runtime-2_3_1). O diretório-raiz do aplicativo atual do Project Zero está disponível no contexto global sob /config/root. O código usa a função PHP zget para obter o diretório do contexto global.

    Você também precisa do nome do caminho completo para a definição de relatório hello world. As definições de relatórios fornecidas no diretório demo/samples foram copiadas. Quando o relatório for renderizado, ele será renderizado em um arquivo temporário. O arquivo será ecoado no navegador e, então, excluído. Essa é uma maneira fácil e conveniente de usar o BIRT. As chamadas a tempnam e sys_get_temp_dir criam um arquivo temporário no diretório temporário do aplicativo.

  2. Importar as classes do BIRT
    Lista 3
    java_import("org.eclipse.birt.core.framework.Platform");
    java_import("java.util.logging.Level");
    java_import("org.eclipse.birt.report.engine.api.EngineConfig");
    java_import("org.eclipse.birt.report.engine.api.IReportEngineFactory");
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");

    A função java_import traz as definições de classes Java para o tempo de execução PHP. As próximas seções de código abaixo usam essas classes. Tendo importado a classe EngineConfig, o código PHP pode criar instâncias dessa classe usando o operador new (por exemplo, new EngineConfig). Da mesma forma, importando a classe Level, é possível acessar membros estáticos no código PHP, usando a sintaxe “::”; por exemplo: Level::$FINEST.

  3. Criar um mecanismo de relatório
    Lista 4
    $config = new EngineConfig();
    $config->setBIRTHome($report_engine);
    $config->setLogConfig($log_directory, Level::$FINEST);
    Platform::startup($config);
    
    $factory = Platform::createFactoryObject(
        IReportEngineFactory::$EXTENSION_REPORT_ENGINE_FACTORY);
    
    $engine = $factory->createReportEngine($config);

    Esse código inicializa o tempo de execução do BIRT e cria um mecanismo de relatório. O mecanismo de relatório é a parte de negócios do BIRT e é responsável por renderizar relatórios. A chamada de método setBIRTHome é importante, pois o BIRT precisa ser informado sobre onde foi instalado.

  4. Rendereizar o relatório
    Lista 5
      $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->validateParameters();
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $options->setHtmlRtLFlag(false);
    $options->setEmbeddable(false);
    
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    $engine->destroy();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    ?>

    Esse código renderiza o relatório em um arquivo temporário. O código ecoa o conteúdo do arquivo no navegador usando file_get_contents e echo. O BIRT possui muitas opções entre as quais escolher ao renderizar relatórios, como o formato de saída (HTML, PDF ou XML). Após ter renderizado o relatório, o código encerra o tempo de execução do BIRT.


Compartilhando o BIRT

O código PHP de amostra acima iniciou o BIRT, renderizou um relatório e encerrou o BIRT. O problema com essa abordagem é que o BIRT deve ser iniciado uma vez (e somente uma) por processo e ser usado diversas vezes. O mecanismo é seguro para thread, portanto, ele pode ser compartilhado entre diversos threads, todos renderizando relatórios. Então, como iniciar o BIRT apenas uma vez e compartilhá-lo entre os threads?

Isso parece muito com um padrão singleton (ou antipadrão, se preferir). O problema é que singletons para todo o processo são difíceis de implementar corretamente em PHP. Você pode achar que o código PHP na Lista 6 funcionaria:

Lista 6
<?php

class Singleton {
    private static $birt = NULL;
    static function getInstance() {
        if (self::$birt == NULL) {
            self::$birt = new BIRT(...);
        }
        return self::$birt;
    }
}

?>

Mas há dois problemas com esse código:

  • No final do pedido atual, todas as estatísticas são limpas pelo PHP, portanto, $birt é reconfigurado para NULL. Deve-se manter o tempo de execução do BIRT em torno de para sempre (ou pelo menos até o processo ser encerrado).
  • Em um tempo de execução PHP com diversos threads, como o WebSphere sMash, cada pedido PHP obtém um conjunto independente de variáveis estáticas. Se dois pedidos estiverem sendo processados e cada pedido chamar getInstance, então, ambos criarão uma instância da classe do BIRT.

A intenção do design em PHP é que parece que cada pedido está sendo executado em um processo PHP de thread único, apesar de estar realmente em execução em um processo PHP com diversos threads. Mas o que você deseja é um tempo de execução do BIRT em um processo que possa ser compartilhado entre todos os threads.

A solução apresentada aqui é usar o contexto global, que é uma área de armazenamento do WebSphere sMash onde pode-se colocar praticamente qualquer coisa. Diferentes bits do contexto global possuem diferentes tempos de vida. Por exemplo, a zona /request é mantida somente para o pedido atual. No código PHP de amostra, o tempo de execução do BIRT está na zona /tmp, para que seja mantido durante o tempo de vida do processo. A zona /tmp também está disponível em todos os threads em execução no mesmo processo e nunca é persistida.

A peça final do quebra-cabeça é assegurar que somente um thread realmente crie o tempo de execução do BIRT. Lidar com diversos threads pode dar uma certa dor de cabeça, mas o contexto global fornece uma solução com comandos de bloqueio. Cada thread realiza um bloqueio, verifica se o tempo de execução do BIRT já foi criado -- se não tiver sido, cria-o e coloca-o na zona /tmp -- e, então, desbloqueia-o.

PHP é uma linguagem de thread único. Não fornece nenhum recurso de thread para o desenvolvedor de PHP. Java, no entanto, é uma linguagem com diversos threads. Além do mais, algumas bibliotecas Java (como o BIRT) precisam ser inicializadas uma vez (por processo) antes de serem usadas. Essa combinação é um pouco complicada de implementar em PHP, sem thread e stateless. A solução apresentada na próxima seção mostra uma solução possível que inicializa o tempo de execução do BIRT e coloca-o na zona /tmp no contexto global. O uso dos comandos de bloqueio para sincronizar threads não é familiar para a maioria dos desenvolvedores PHP, mas é uma maneira pragmática de assegurar que uma coisa ocorre uma vez, apenas uma vez.


Modificando o Código de Amostra

Vamos seguir em frente e atualizar o código PHP de amostra para carregar o tempo de execução do BIRT uma vez:

  1. Crie um novo script PHP chamado startup.php em demo/app/scripts (o diretório /app/scripts é colocado automaticamente no caminho de inclusão do aplicativo). Esse novo script PHP trata da configuração do tempo de execução do BIRT. Após a criação do mecanismo de relatório, ele é armazenado no contexto global sob o caminho /tmp/factory. Chamadas subsequentes ao método de inicialização nesse script retornam o mecanismo de relatório existente ao responsável pela chamada. Copie e cole o código PHP mostrado na Lista 7 no arquivo e salve-o.
    Lista 7
    <?php
    
    function startup() {
    	$engine = zget("/tmp/factory");
    	if ($engine != NULL)
    return $engine;
    
    	// Serialize platform startup
    	zpost("/app#lock", "/engine");
    
    	$engine = zget("/tmp/factory");
    	if ($engine != NULL)
    		return $engine; // Did someone else get in first?
    
    	$root_directory = zget("/config/root");
    	$report_directory =
    $root_directory."/birt-runtime-2_3_1/ReportEngine";
    	$log_directory = zget("/config/appLogDir");
    
    	java_import("org.eclipse.birt.core.framework.Platform");
    	java_import("java.util.logging.Level");
    	java_import("org.eclipse.birt.report.engine.api.EngineConfig");
    	java_import(
    		"org.eclipse.birt.report.engine.api.IReportEngineFactory");
    
    	$config = new EngineConfig();
    	$config->setBIRTHome($report_directory);
    	$config->setLogConfig($log_directory, Level::$FINEST);
    	Platform::startup($config);
    
    	$factory = Platform::createFactoryObject(
    		IReportEngineFactory::$EXTENSION_REPORT_ENGINE_FACTORY);
    
    	// Store in process wide non persistent zone
    	$engine = $factory->createReportEngine($config);
    	zput("/tmp/factory", $engine);
    
    	// Unlock when we are finished!
    	zpost("/app#unlock", "/engine");
    
    	return $engine;
    }
    
    ?>
  2. Copie e cole o código da Lista 8 no script hello_world.php. Esse código deve substituir o conteúdo existente do script. Esse novo script inclui o script startup.php e chama o método de inicialização para obter o mecanismo de relatório. Essa solução é muito mais eficiente. O primeiro script PHP a renderizar um relatório causa a criação do mecanismo de relatório do BIRT. Todos os relatórios subsequentes usam a mesma instância do mecanismo de relatório.
    Lista 8
    <?php
    
    require_once 'startup.php';
    $engine = startup();
    
    $root_directory = zget("/config/root");
    $design_file = $root_directory."/samples/hello_world.rptdesign";	
    $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->validateParameters();
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    
    ?>

Passando o Nome do Relatório na URL

Uma limitação do script PHP é que a definição de relatório está codificada permanentemente, conforme mostrado na Figura 12.

Figura 12. Nome Codificado Permanentemente da Definição de Relatório
Figura 12. Nome Codificado Permanentemente da Definição de Relatório

É possível atualizar o código para passar o nome do relatório como um argumento da URL para o script:

  1. Crie um novo arquivo chamado render_report.php em demo/public.
  2. Copie e cole o código da Lista 9 no arquivo e salve-o. Esse script espera que um nome de relatório seja passado como um parâmetro de cadeia de caracteres de consulta na URL. O nome do relatório é transformado em um nome qualificado do arquivo e é, então, renderizado da mesma forma que na Lista 8.
    Lista 9
    <?php
    
    // Check the report name has been set
    if (isset($_GET["name"]) == FALSE) {
    	die("No report name passed to script..!");
    }
    
    require_once 'startup.php';
    $report_name = $_GET["name"].".rptdesign";
    $engine = startup();
    
    $root_directory = zget("/config/root");
    $design_file = $root_directory."/samples/".$report_name;	
    $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->validateParameters();
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    ?>
  3. Em um navegador da Web, navegue até http://locahost:8080/render_report.php?name=hello_world.

O mesmo relatório deve ser renderizado conforme mostrado na Figura 11, mas desta vez o nome do relatório é passado como um argumento para o script através da URL. O nome do relatório na URL não precisa da extensão do arquivo (.rptdesign), já que o script anexa a mesma no nome qualificado do arquivo.

Lembre-se de que o código mostrado aqui é somente para propósitos de exemplo. Essa linha de código, se usada como se encontra, contém um problema de segurança em potencial:

$report_name = $_GET["name"].".rptdesign";

Um navegador poderia passar algo como: ../../secrets/myreport para o script. Um script pronto para a produção deve validar o nome do relatório antes de abrir o arquivo. Por questão de simplicidade, esse código de validação foi omitido do exemplo.


Relatórios de Classic Models

Tente usar alguns dos outros relatórios de exemplo fornecidos com este artigo. Isso irá exigir o banco de dados de amostra Classic Models. Os relatórios são configurados para serem anexados ao banco de dados MySQL, em execução em uma máquina local, com um nome de usuário root e uma senha vazia. Para alterar essas informações:

  1. Inicie o BIRT Report Designer (incluído no download completo do BIRT), mostrado na Figura 13.
  2. Abra a definição de relatório product_catalog.rptdesign , que está no diretório demo/samples.
    Figura 13. BIRT Report Designer
    Figura 13. BIRT Report Designer
  3. Abra a lista de origens de dados expandindo Origens de Dados.
  4. Clique com o botão direito do mouse em MySQL e selecione Editar (Figura 14).
    Figura 14. Editar a Origem de Dados MySQL
    Figura 14. Editar a Origem de Dados MySQ
  5. Edite os detalhes da origem de dados para se adequar à configuração de MySQL, usando a Figura 15 como guia.
    Figura 15. Editando as Informações de Conexão da Origem de Dados
    Figura 15. Editando as Informações de Conexão da Origem de Dados
  6. Clique em OK, então, Arquivo => Salvar e feche o BIRT Report Designer.
  7. Em um navegador da Web, navegue até http://localhost:8080/render_report.php?name=product_catalog. O resultado deve ser semelhante à Figura 16.
    Figura 16. Renderização do Relatório do Catálogo de Produtos
    Figura 16. Renderização do Relatório do Catálogo de Produtos
  8. Experimente o relatório Annual Sales By Product Line, navegando até http://localhost:8080/render_report.php?name=cross_tab.rptdesign. O resultado deve ser semelhante à Figura 17.
    Figura 17. Renderização do Relatório de Vendas Anuais
    Figura 17. Renderização do Relatório de Vendas Anuais

Passando Parâmetros do Relatório

A definição do relatório sales_invoice.rptdesign destaca o uso dos parâmetros do relatório. Agora, você irá criar um script PHP que renderiza o relatório e configura os parâmetros de relatório, que são passados ao script PHP na URL.

  1. Abra a definição de relatório no BIRT Report Designer.
  2. Expanda Parâmetros de Relatório, clique com o botão direito do mouse em Número do Pedido e selecione Editar (Figura 18).
    Figura 18. Editar o Parâmetro de Relatório Número do Pedido
    Figura 18. Editar o Parâmetro de Relatório Número do Pedido
  3. O parâmetro de relatório Número do Pedido tem um valor padrão igual a 10100 (Figura 19). Isso significa que, a menos que você forneça um valor diferente, esse relatório sempre irá renderizar a fatura de vendas com um identificado igual a 10100. Por meio de exemplo, navegue até http://localhost:8080/render_report.php?name=sales_invoice e verá o número de pedido padrão no relatório (Figura 20).
    Figura 19. Editar as Informações do Parâmetro de Número de Pedido
    Figura 19. Editar as Informações do Parâmetro de Número de Pedido
    Figura 20: Renderização do Relatório da Fatura de Vendas
    Figura 20: Renderização do Relatório da Fatura de Vendas
  4. para atualizar o código para que você possa passar o número do pedido como um argumento da URL para o script, crie um novo arquivo chamado sales_invoice.php no diretório demo/public.
  5. Copie e cole o código da Lista 10 no arquivo e salve-o. Atualizações do código aparecem em negrito.
    Lista 10
    <?php
    
    // Check the order number has been set
    if (isset($_GET["order"]) == FALSE) {
    	die("No order number passed to script..!");
    }
    
    require_once 'startup.php';
    $engine = startup();
    $order_number = $_GET["order"]; // This user input needs filtering!
    
    $root_directory = zget("/config/root");
    $report_engine = $root_directory."/ReportEngine";			
    $design_file = $root_directory."/samples/sales_invoice.rptdesign";
    $images_directory = $root_directory."/public/images/logos";
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");
    java_import(
    "org.eclipse.birt.report.engine.api.HTMLServerImageHandler");
    
    $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->setParameterValue("OrderNumber", (int) $order_number);
    $task->validateParameters();
    
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $options->setImageDirectory($images_directory);
    $options->setBaseImageURL("/images/logos/");
    $options->setImageHandler(new HTMLServerImageHandler());
    
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    ?>
  6. Agora, navegue até http://locahost:8080/sales_invoice.php?order=10272. O resultado deve ser semelhante à Figura 21, que exibe o novo número de pedido.
    Figura 21. Renderização de Relatório da Fatura de Vendas Atualizada
    Figura 21. Renderização de Relatório da Fatura de Vendas Atualizada

Origem de Dados em Script

Para este último relatório de amostra, você irá renderizar um relatório usando dados gerados em um script PHP. Essa é uma técnica poderosa, pois ativa um aplicativo do Project Zero para gerar dados, possivelmente chamando um serviço da Web RESTful e passando os resultados ao BIRT para renderizar um relatório.

  1. Crie um novo arquivo chamado data_source.php em demo/public.
  2. Copie e cole o código da Lista 11 no arquivo e salve-o. A mágica deste exemplo é executada através do contexto global. O script PHP preenche uma array contendo os dados do relatório. Armazena isso no contexto global sob o caminho /request/report.
    Lista 11
    <?php
    
    require_once 'startup.php';
    $engine = startup();
    
    $root_directory = zget("/config/root");
    $report_engine = $root_directory."/ReportEngine";			
    $design_file = $root_directory."/samples/data_source.rptdesign";
    $images_directory = $root_directory."/public/images/logos";
    java_import("org.eclipse.birt.report.engine.api.HTMLRenderOption");
    java_import(
    "org.eclipse.birt.report.engine.api.HTMLServerImageHandler");
    
    $design = $engine->openReportDesign($design_file);
    $task = $engine->createRunAndRenderTask($design);
    $task->validateParameters();
    $generated_report_file = tempnam(sys_get_temp_dir(), 'report');
    
    $models[] = array("ANG Resellers",
    "1952 Alpine Renault 1300", "Red");
    $models[] = array("AV Stores, Co.",
    "1969 Harley Davidson Ultimate Chopper", "Blue");
    $models[] = array("Alpha Cognac",
    "1969 Ford Falcon", "Blue");
    $models[] = array("Asian Shopping Network, Co",
    "1969 Dodge Charger", "Plum Crazy Purple");
    $models[] = array("Asian Treasures, Inc.",
    "1969 Corvair Monza", "Red");
    
    zput("/request/report", $models);
    
    $options = new HTMLRenderOption();
    $options->setOutputFileName($generated_report_file);
    $options->setOutputFormat("html");
    $options->setImageDirectory($images_directory);
    $options->setBaseImageURL("/images/logos/");
    $options->setImageHandler(new HTMLServerImageHandler());
    
    $task->setRenderOption($options);
    $task->run();
    $task->close();
    
    echo file_get_contents($generated_report_file);
    unlink($generated_report_file);
    ?>
  3. Navegue até http://localhost:8080/data_source.php. O resultado deve ser semelhante à Figura 22.
    Figura 22. Renderização do Relatório da Origem de Dados em Script
    Figura 22. Renderização do Relatório da Origem de Dados em Scrip
  4. Este exemplo também requer algum script no relatório do BIRT. Abra a definição de relatório data_source.rptdesign no BIRT Report Designer (Figura 23). Neste exemplo, o relatório possui algum JavaScript integrado para abrir, fechar e buscar linhas de dados. O JavaScript obtém a array do contexto global e passa cada linha de volta ao BIRT. O BIRT possui um mecanismo JavaScript integrado que permite que trechos de JavaScript sejam executados em diferentes fases da renderização de um relatório. O relatório usa a chamada aberta para acessar os dados anteriormente armazenados no contesto global. O trecho usa a palavra-chave Packages de JavaScript para acessar um nome de classe Java completo.
    Figura 23. Editar a Definição de Relatório da Origem de Dados em Script
    Figura 23. Editar a Definição de Relatório da Origem de Dados em Scrip

Resumo

Seguindo as etapas descritas neste artigo, você:

  • Criou e configurou um aplicativo do Project Zero para usar o BIRT.
  • Renderizou um relatório usando o tempo de execução do BIRT em um script PHP.
  • Modificou o código de origem para carregar de forma eficiente o tempo de execução do BIRT.
  • Criou um script PHP que renderizou os nomes de relatórios passados na URL.
  • Passou parâmetros de relatórios ao BIRT através da URL da página da Web.
  • Usou PHP para criar uma origem de dados em script para um relatório.

Agora, você deve ser capaz de aplicar essas informações para que possa incluir recursos de relatórios flexíveis em seu próprios aplicativos PHP do Project Zero.


Download

DescriçãoNomeTamanho
Report samplesReports.zip16 KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=WebSphere
ArticleID=423777
ArticleTitle=Integrando o Eclipse Business Intelligence and Reporting (BIRT) em um Aplicativo PHP WebSphere sMash
publish-date=03042009