Passo 4
:
Desenvolvimento do Relatório no iReport
[4.1]
- Descritivo dos Elementos Estruturantes do Relatório
[4.2]
- Propriedades Globais do Relatório (exemplo: nome do relatório etc)
[4.3]
– Parâmetros “de Prompt”do Relatório
[4.4]
– Campos de Relatório Tipo “Imagem”
[4.5]
– Recursos Adicionais de Uso Comum
[4.6]
– Estendendo Colunas em Relatórios de Gride
[4.7]
– Utilizando Serviços do IW como Data Source
[4.1]
- Descritivo dos Elementos Estruturantes do Relatório
A
figura a seguir ilustra a interface gráfica para desenvolvimento dos relatórios
do iReport:
Para aqueles desenvolvedores de relatórios que já conhecem o ambiente de desenvolvimento de relatórios “tradicionais” do IW será perceptível a existência de grande similaridade entre os componentes presentes no ambiente gráfico do iReport Designer e os elementos estruturantes dos relatórios tradicionais do IW. Exemplo: Notem no lado esquerdo da ilustração acima os elementos “Title”, “Page Header”, “Column Header”, “Detail 1”, “Column Footer” e “Sumary”. No iReport esses elementos recebem o nome de “Bands” (faixas) e são extensíveis , ao passo que nos relatórios tradicionais do IW as “Bands” são fixas (pré-determinadas e não extensíveis) mas consistem exatamente no mesmo elemento estruturante na arquitetura do relatório. Ou seja, o “motor de processamento” dos relatórios “Tradicionais” e “Avançados” é exatamente o mesmo (a sintaxe de formulação de expressões, por exemplo, é exatamente a mesma). A principal diferença entre esses dois ambientes é que no ambiente de relatórios “Avançados” a quantidade de recursos e ferramentas que ficam acessíveis para o desenvolvimento é bem maior o que torna o ambiente muito mais poderoso (e conseqüentemente o desenvolvimento de relatórios se torna mais complexo também).
[4.2] - Propriedades Globais do Relatório (exemplo: nome do relatório etc)
Para nomear o relatório bem como definir diversos parâmetros globais (como formato da página etc) clique sobre o primeiro elemento de cima para baixo no lado esquerdo da interface gráfica do iReport (no exemplo acima é o elemento denominado “TESTE”). Em seguida clique com o botão “direito” do mouse sobre o mesmo elemento e selecione a opção “Propriedades”. A figura a seguir ilustra essa edição:
Ao selecionarmos a opção propriedades será exibida a seguinte caixa de diálogo:
Fundamentalmente utilize essa caixa de diálogo para setar o nome do relatório, dimensões da página, orientação da impressão (portrait=retrato ou landscape=paisagem) e as margens do relatório.
Nota técnica: No processamento de relatórios avançados o IW implementa automaticamente um “timeout” na parte do processamento do relatório especificamente no que se refere aos algoritmos de cálculo do layout do relatório. O valor default desse timeout é de 12 segundos (tempo considerado inatingível mesmo para os relatórios mais sofisticados). Se , ocorrerem casos onde esse limite seja atingido pode-se aumentar esse tempo de timeout mediante a declaração explicitamente no relatório de uma propriedade denominada IW_REPORTER_TIMEOUT. Para isso deve-se acrescentar explicitamente essa propriedade na declaração do relatório informando um novo valor de timeout em “milisegundos”. A figura a seguir ilustra como realizar esse procedimento, nesse exemplo estaríamos aumentando o tempo de timeout para 30 segundos (30.000 milisegundos):
[4.3] – Parâmetros “de Prompt”do
Relatório
O
elemento denominado “Parameters” (parâmetros) é onde
vamos (tipicamente) declarar os parâmetros de que serão solicitados (promptados) aos usuários no momento do disparo da execução
do relatório.
A figura a seguir ilustra a interface gráfica do iReport
onde colocamos em foco o elemento estruturante “Parameters”.
Para adicionar novos “Parâmetros” no relatório clique com o botão direito do
mouse sobre o elemento “Parameters” e selecione a
opção “Adicionar Parameter” conforme ilustrado abaixo:
Nota: Os parâmetros
ilustrados na figura acima (acima do parâmetro denominado “parametro_1_texto”)
são parâmetros nativos (criados automaticamente pelo iReport).
Não vamos nos ater a esses parâmetros pois nominalmente eles não serão
utilizados nos relatórios publicáveis no IW.
Ao acionarmos a opção “Adicionar Parameter” o iReport criará um novo parâmetro automaticamente. A figura
a seguir ilustra o resultado dessa edição:
Notem que o foi acionado um novo parâmetro denominado “parameter1” ao
final da lista de parâmetros. Para editar o nome do novo parâmetro clique com o
botão direito do mouse sobre o novo parâmetro e selecione a opção “renomear”. A
figura a seguir ilustra a caixa de diálogo que será lançada pelo iReport. Informe o nome desejado para o novo parâmetro e
clique no botão “ok”.
Basicamente o IW oferece os seguintes “tipos” pré-definidos de parâmetros
de entrada para a execução de relatórios:
[4.3.1] – Parâmetro de prompt Tipo “Texto”
[4.3.2] – Parâmetro de prompt Tipo “Data”
[4.3.3] – Parâmetro de prompt Tipo “Data e
Hora”
[4.3.4] – Parâmetro de prompt Tipo “IW_Constante”
[4.3.5] – Parâmetro de prompt Tipo “IW_SQL”
[4.3.6] – Parâmetros de Prompt Pré-definidos
[4.3.1] – Parâmetro de prompt: Tipo “Texto”
São
parâmetros cujo valor de preenchimento é uma “string”
(texto livre).
A figura a seguir ilustra o detalhamento dos parâmetros na interface do iReport Design na condição onde temos em foco a definição
de um parâmetro tipo “Texto” :
Nesse exemplo selecionamos o parâmetro denominado “parametro_1_texto” e
colocamos em foco a caixa de “propriedades” desse parâmetro. Para a declaração
de parâmetros tipo texto devemos valoras as propriedades do parâmetro da
seguinte forma:
Name : já virá valorado
com o nome do parâmetro
Parameter Class
= Valore com java.lang.string
Nota: Todos os parâmetros a serem utilizados no IW devem ser tipo java.lang.string
Use as Prompt = não será utilizado
Default value expression
= Informe , quando aplicável, um valor default para o parâmetro (poderá ficar
em branco)
Description: informe, se desejar uma
descrição do conceito do parâmetro (para fins de documentação apenas : não será
visível no processamento do relatório).
Properties : Clique no botão “...” de
declare (adicione) as seguintes propriedades:
Type = #TEXTFIELD
LABEL = <Informe o texto “label” que será exibido ao lado parâmetro> Ou, ou seja,
informe um nome significativo para o parâmetro para que o usuário possa
identificar claramente a informação a ser fornecida.
[4.3.2] – Parâmetro de prompt: Tipo “Data”
São parâmetros cujo valor de preenchimento é uma “data” (simples, sem horário. Exemplo: 01/07/2011)
A figura a seguir ilustra o detalhamento dos parâmetros na interface do iReport Design na condição onde temos em foco a definição de um parâmetro tipo “Data” :
Nesse exemplo selecionamos o parâmetro denominado “parametro_2_data” e colocamos em foco a caixa de “propriedades” desse parâmetro. Para a declaração de parâmetros tipo texto devemos valorar as propriedades do parâmetro da seguinte forma:
Name : já virá valorado
com o nome do parâmetro
Parameter Class
= Valore com java.lang.string
Nota: Todos os parâmetros a serem utilizados no IW devem ser tipo java.lang.string
Use as Prompt = não será utilizado
Default value expression
= Informe , quando aplicável, um valor default para o parâmetro (poderá ficar
em branco)
Description: informe, se desejar uma
descrição do conceito do parâmetro (para fins de documentação apenas : não será
visível no processamento do relatório).
Properties : Clique no botão “...” de
declare (adicione) as seguintes propriedades:
Type = #SYSDATE
LABEL = <Informe o texto “label” que será exibido ao lado parâmetro> Ou, ou seja,
informe um nome significativo para o parâmetro para que o usuário possa
identificar claramente a informação a ser fornecida.
[4.3.3] – Parâmetro de prompt: Tipo “Data e Hora”
São parâmetros cujo valor de preenchimento é uma “data hora” (Exemplo: 01/07/2011 08:30:00)
A figura a seguir ilustra o detalhamento dos parâmetros na interface do iReport Design na condição onde temos em foco a definição de um parâmetro tipo “Data Hora” :
Nesse exemplo
selecionamos o parâmetro denominado “parametro_4_IW_Constante” e colocamos em
foco a caixa de “propriedades” desse parâmetro. Para a declaração de parâmetros
tipo texto devemos valoras as propriedades do parâmetro da seguinte forma:
Name : já virá valorado
com o nome do parâmetro
Parameter Class
= Valore com java.lang.string
Nota: Todos os parâmetros a serem utilizados no IW devem ser tipo java.lang.string
Use as Prompt = não será utilizado
Default value expression
= Informe , quando aplicável, um valor default para o parâmetro (poderá ficar
em branco)
Description: informe, se desejar uma
descrição do conceito do parâmetro (para fins de documentação apenas : não será
visível no processamento do relatório).
Properties : Clique no botão “...” de
declare (adicione) as seguintes propriedades:
Type = #SYSDATETIME
LABEL = <Informe o texto “label” que será exibido ao lado parâmetro> Ou, ou seja,
informe um nome significativo para o parâmetro para que o usuário possa
[4.3.4] – Parâmetro de prompt: Tipo “IW_Constante”
São parâmetros cujo valor de preenchimento é uma é uma caixa de seleção (combo box) populada com as opções de valores cadastrados em uma constante do sistema traduções do IW (Exemplo: K_GLB_YESNO etc).
A figura a seguir ilustra o detalhamento dos parâmetros na interface do iReport Design na condição onde temos em foco a definição de um parâmetro tipo “IW Constante” :
Nesse exemplo selecionamos o parâmetro denominado “parametro_4_IW_Constante” e colocamos em foco a caixa de “propriedades” desse parâmetro. Para a declaração de parâmetros tipo texto devemos valoras as propriedades do parâmetro da seguinte forma:
Name : já virá valorado
com o nome do parâmetro
Parameter Class
= Valore com java.lang.string
Nota: Todos os parâmetros a serem utilizados no IW devem ser tipo java.lang.string
Use as Prompt = não será utilizado
Default value expression
= Informe , quando aplicável, um valor default para o parâmetro (poderá ficar
em branco)
Description: informe, se desejar uma
descrição do conceito do parâmetro (para fins de documentação apenas : não será
visível no processamento do relatório).
Properties : Clique no botão “...” de
declare (adicione) as seguintes propriedades:
Type = #SYSDATETIME
CONSTANT_NAME : Informe
o nome da constante. Exemplo: K_GLB_YESNO etc.
LABEL = <Informe o texto “label” que será exibido ao lado parâmetro> Ou, ou seja,
informe um nome significativo para o parâmetro para que o usuário possa
[4.3.5] – Parâmetro de prompt: Tipo “IW_SQL”
São parâmetros cujo valor de preenchimento é uma caixa de seleção (combo box) populada com o resultado de um comando SQL especificado dentro da declaração do próprio parâmetro.
A figura a seguir ilustra o detalhamento dos parâmetros na interface do iReport Design na condição onde temos em foco a definição de um parâmetro tipo “IW SQL” :
Nesse exemplo selecionamos o parâmetro denominado “parametro_4_IW_Constante” e colocamos em foco a caixa de “propriedades” desse parâmetro. Para a declaração de parâmetros tipo texto devemos valoras as propriedades do parâmetro da seguinte forma:
Name : já virá valorado
com o nome do parâmetro
Parameter Class
= Valore com java.lang.string
Nota: Todos os parâmetros a serem utilizados no IW devem ser tipo java.lang.string
Use as Prompt = não será utilizado
Default value expression
= Informe , quando aplicável, um valor default para o parâmetro (poderá ficar
em branco)
Description: informe, se desejar uma
descrição do conceito do parâmetro (para fins de documentação apenas : não será
visível no processamento do relatório).
Properties : Clique no botão “...” de
declare (adicione) as seguintes propriedades:
Type = #SYSDATETIME
SQL_COMMAND : Informe o comando
SQL propriamente dito(*).
LABEL = <Informe o texto “label” que será exibido ao lado parâmetro> Ou, ou seja,
informe um nome significativo para o parâmetro para que o usuário possa
(*) Notde as: O comando sql deverá
necessariamente retornar duas colunas: (1) uma coluna ID e uma coluna NAME. Os
valores retornados na coluna NAME é que serão utilizados no preenchimento da
caixa de seleção que será apresentada ao usuário e o valor da coluna ID
correspondente ao NAME selecionado pelo usuário será o valor que será utilizado
no processamento do relatório.
Exemplo: select id, name from glbenterprise
where healthplan = 1
Nesse
comando exemplo: Serão exibidos na caixa de seleção para o usuário os “nomes
das operadoras” cadastradas no IW e no processamento do relatório será
utilizado o ID da Operadora selecionada pelo usuário.
Nota Técnica (A) :
O IW também suporta em declarações de parâmetros uma “propertie”
denominado IS_EDITABLE. Quando essa property é
declarada com valor = false , o campo de prompt do parâmetro ficará não editável ao usuário. Esse
tipo de recurso é de utilização bastante rara, em casos onde existir um
parâmetro de processamento do relatório que deverá ser exibido ao usuário mas não poderá ser alterado por ele. A figura a
seguir ilustra como ficaria a declaração dessa propertie.
[4.3.6] –
Parâmetros Pré-definidos
Os relatórios avançados no IW já vem nativamente
equipados com o seguinte leque de parâmetros:
Parâmetro: IW_Profile : Valorado
automaticamente com o “nome do profile utilizado no login
no IW” (Ex.: dbIwTreinamento etc)
Parâmetro: IW_UserId : Valorado
automaticamente com o “nome do usuário logado no IW”.
Parâmetro: IW_Language : Valorado automaticamente com o idioma
associado ao usuário logado.
Parâmetro: IW_ReportId : Valorado
automaticamente com o id do relatório sendo executado.
Além desses parâmetros, exclusivamente no caso de relatórios “de Gride”, o IW irá também declarar automaticamente um
parâmetro para cada coluna do gride contendo o valor
“somente da 1° linha do gride”. Os nomes desses
parâmetros são iguais aos nomes da colunas do gride (nomes originais “sem tradução”).
Resumo
das Properties de Parâmetros do iReport
que são suportadas pelo IW
[4.4] –Campos de Relatório Tipo “Imagem”
Iw-Properties
usadas no Elemento <image> :
Qualquer imagem persistida no base de
dados do IW (Tabela GlbImage) pode ser usada como
dado em qualquer relatório, e ser exibida no mesmo assim como é feito com
qualquer outro tipo de dado.
Basta adicionar a propriedade TYPE=”#IMAGE_FROM_DATABASE”
ao objeto image do JasperReport.
E nesse caso o Atributo imageExpression do
Objeto Image deve retornar uma String cujo valor é ID da imagem na tabela GlbImage que deve ser exibida dentro do objeto image. (Proteção contra valores null
devem ser colocadas).
Ex:
<image scaleImage="RetainShape" onErrorType="Blank">
<reportElement x="12" y="14"
width="51" height="60">
<property name="TYPE"
value="#IMAGE_FROM_DATABASE"/>
</reportElement>
<imageExpression
class="java.lang.String">
<![CDATA[($F{IDIMAGE} == null)? "" : $F{IDIMAGE}.toString()]]>
</imageExpression>
</image>
OBS: Aproveitando este espaço que
descreve sobre uso de imagens, podemos descrever um outro modo de colocar
imagens em relatórios avançados. Todas as imagens presentes no diretório IwResources dos servidores IW (geralmente imagens de
logotipos do cliente (como a conhecida customerlogotype.gif por exemplo) podem
ser inseridas em relatórios avançados também, bastando definir um elemento Image, do mesmo modo como exemplificado acima, mas sem a property TYPE e na ImagemExpression
basta colocar uma String com o nome da imagem a ser
exibida. Lembrando que a mesma deve estar presente no diretório IwResource e com o mesmo nome (case sensitive).
Exemplo:
<image scaleImage="RetainShape"
onErrorType="Blank">
<reportElement x="12" y="14"
width="51" height="60">
</reportElement>
<imageExpression
class="java.lang.String">
<![CDATA[“customerlogotype.gif”]]>
</imageExpression>
</image>
Outra possibilidade para obtenção de Imagens é o uso da
propriedade
TYPE = #IMAGE_FROM_GROOVY_EXPRESSION
Com essa propriedade setada no elemento Image, o seguinte padrão de código deve ser usado no campo imageExpression:
new GroovyClassLoader().parseClass('''
def static java.io.InputStream getImage (<lista de parametros>) {
// Coloque aqui o codigo groovy/java que efetua a busca da imagem
}
''').getImage(<lista de parametros>)
Trata-se de código groovy interpretado
dinamicamente na execução do relatório.
Um detalhe importante nção, quando usar
esse recurso, é providenciar que o tipo de objeto retornado pelo metodo GetImage seja coerente com
o tipo de objeto esperado para o resultado da expressão ImageExpression
que é especificado no campo Expression Class
do iReport.
Os seguintes tipos de objetos de retorno podem ser usados:
java.lang.String
java.io.inputStream
java.io.File
java.net.URL
java.awt.Image
net.sf.jasperreports.engine.JRRenderable
Como um exemplo podemos citar o código que foi usado no relatório padrão do
TISS presente nas instalações do IW Care. Esse código busca dinamicamente a
imagem que deve ser usada como logo-tipo na emissão
do relatório.
Essa implementação do método getImage retorna um
objeto do tipo java.io.inputStream.
Assim o campo Expression Class foi setado para java.io.InputStream
no iReport. Seque abaixo o código na integra:
new GroovyClassLoader().parseClass('''
def static java.io.InputStream getImage (String profile, String idEnterprise) {
java.io.InputStream is;
java.sql.Connection conn = null;
try {
conn = com.iwreporter.Utilities.getDatabaseConnection(profile);
String sqlGetImageId =
"select a.id as IDLOGOIMAGE from glbImage a, glbEnterprise b where
a.id = b.idImageLogoType and
b.id = " +
idEnterprise;
java.sql.ResultSet rs = conn.createStatement().executeQuery(sqlGetImageId);
long idImage = 0;
if (rs.next())
{
idImage = rs.getLong("IDLOGOIMAGE");
}
else {
return null;
}
String sqlCmdGetImage
= "SELECT MIMETYPE, IMAGE FROM GLBIMAGE WHERE ID = " + idImage;
rs = conn.createStatement().executeQuery(sqlCmdGetImage);
if (rs.next())
{
if (com.iw.serverComm.BLibUtilities1.isOracle(conn))
{
is = rs.getBlob("IMAGE").getBinaryStream();
}
else {
is= rs.getBinaryStream("IMAGE");
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (conn != null)
{
conn.close(); // close and release connection
}
}
catch (Exception ignore) {};
}
return is;
}
''').getImage($P{IW_Profile}, $P{IDENTERPRISE})
[4.5] – Recursos Adicionais de Uso Comum
Nesse tópico descrevemos como implementar recursos de uso comum no ambiente de relatórios avançados do IW:
4.5.1 - Apresentando a Logo Marca do Cliente no Cabeçalho do Relatório
Para
posicionar a logomarca do cliente no relatório utilize um campo tipo TextField onde na propride “Image Field Expression” deve-se valorar com a expressão
“CustomerLogotype.gif”.
(*) Nessa condição, “em tempo de execução de relatórios avançados no IW” o
sistema irá fornecer a logomarca do cliente cadastrada no servidor de
aplicação. Se tentarmos executar o relatório d eforma
isolada no ambiente do iReport com esse componente
declarado ocorrerá um erro (ou seja, declare esse componente gráfico apenas na
fase final de elaboração do relatório, imediatamente antes de executar a
publicação do relatório no IW).
A imagem a seguir ilustra a configuração de um campo a ser preenchido com a logomarca do cliente:
4.5.2 -
Apresentando impressão da numeração de páginas
O iReport oferece recursos nativos para configuração de paginação. Esses recursos ficam tipicamente dispostos diretamente no componente “palleta” no ambiente de edição gráfico do iReport. Para lançar a palleta utilize menu - “Janela : Opção Palleta (ou Crt+Shift+F8). A figura a seguir ilustra a palleta de recursos do iReport:
4.5.3 - Apresentando a data e hora de impressão do relatório
Para configurar um campo no qual será impressa a data e hora de execução (disparo da execução do relatório) execute os seguintes passos:
(1) Declare um : campo tipo TextField no
relatório
(2) No campo Expressão desse TextField declare a
expressão new Date()
(3) Nos atributos do TextField informe : class = java.util.date
(4) No atributo “Pattern” pode-se declarar o formato
desejado para a impressão da informação data e hora de execução do relatório.
Formas de impressão de data e horas também ficam tipicamente disponíveis no editor gráfico do iReport.
4.5.4 – Passando um nome de arquivo temporário em tempo de execução do relatório
Através desse recurso é possível determinar um prefixo a ser utilizado pelo IW na geração de arquivos .pdf enviados para navegador de internet (Browser). Basicamente esse recurso faz sentido em processos onde se adota a prática de exportar um preview (em formato .pdf) do relatório para o navegador de internet e enviar um e-mail para um destinatário direto do Browser. Com essa funcionalidade é possível fazer com o “nome do arquivo .pdf” anexado seja um “nome inteligível” para destinatário do e-mail.
Exemplo: No painel “Orçamentos” do prontuário eletrônico desejamos gerar um relatório de um orçamento e enviá-lo para uma operadora , fazendo com que o nome do arquivo .pdf que chegará anexado ao e-mail tenha como prefixo o “nome do paciente”. Desse modo o gestor da Operadora que estiver recebendo diversos e-mails citando orçamentos de vários pacientes distintos conseguirá visualizar logo cabeçalho do e-mail os nomes dos pacientes relacionados a cada orçamento recebido.
Basicamente deve-se declarar no corpo do relatório principal uma varável de nome pré-definido : TEMP_FILE_NAME_PREFIX (tipo string). Essa variável deverá receber a informação que será utilizada como prefixo do nome do arquivo .pdf que será enviado ao Browser (e será anexado ao e-mail enviado).
A imagem a seguir ilustra um exemplo de declaração da variável : TEMP_FILE_NAME_PREFIX
4.5.5 – Executando múltiplos comandos SQL no relatório avançado
Na implementação de alguns relatórios algumas vezes poderá ser útil que sejam executados em uma fase de “pré-processamento do relatório” um ou vários comandos SQL que implementem algumas consolidações ou cálculos preparatórios (comandos SqlBefore).
O ambiente de relatórios avançados do IW permite que sejam implementadas estratégias como essa bastando declarar no DataSourde mais de um comando SQL separados por “;” (ponto e vírgula).
Nessas implementações o último comando SQL deverá ser o comando que irá efetivamente retornar os dados para o relatório (data source propriamente dito).
Nota: A utilização de múltiplos comandos SQL pode ser utilizada tanto no relatório principal (MainDataSet) quanto em sub-relatórios (SubDataSets).
4.5.6 – Utilizando comandos SQL para obtenção do DataSet em relatórios avançados de “Gride”
Em algumas implementações de relatórios tipo “Gride” é necessário “complementar” colunas no gride para implementação do relatório desejado. Na primeira implementação do ambiente de relatórios avançados do IW nessas situações fazia-se necessário implementar um sub-relatório para viabilizar a execução de um comando SQL para obtenção do DataSet proprimente dito a ser utilizado no relatório.
Atualmente essa estratégia de implementação não é mais necessária. Na versão atual, basta definir um comando SQL diretamente no relatório principal que o IW irá executar esse comando SQL e utilizará o resultado do mesmo como sendo o DataSet do relatório. Quando se deseja utilizar diretamente os dados do gride como sendo o DataSet do relatório basta “não definir nenhum comando SQL no MainDataSet do relatório principal (mater.jrxml).
[4.6]
– Estendendo Colunas em Relatórios de Gride (IW_SQL_EXTENSION)
O ambiente de relatórios avançado do IW possibilita que sejam estendidas
(acrescidas novas colunas) novas colunas no gride em
tempo de execução do relatório. Para isso deve-se basicamente configurar um
comando SQL de extensão com sintaxe especial. A mesma sintaxe usada em recurso
similar presente nos relatórios tradicionais. A diferença é que nos relatórios
avançados é permitido definir múltiplas extensões, bastando para tal separar os
diversos comandos SQL de extensão por um ponto e vírgula.
Todos os campos retornados pelos comandos de extensão podem ser usados em todo
o corpo do relatório como se eles fizessem parte do grid, usando a sintaxe
padrão $F{nome_do_Campo}
Além disso, caso o comando SQL não tenha referência à cláusula GetListValues/Matches, a primeira linha retornada pelo
comando será associada a todas as linhas de dados do grid, simulando assim um
recurso de extensão de parâmetros (presentes nos relatórios tradicionais), com
a diferença que sempre serão referenciados usando-se $F{} e não $P{}.
Assim nos relatórios avançados também é possível simular múltiplas extensões de
“parâmetros”.
Onde colocar os Comandos SQL de extensões? R.: No mesmo local onde se coloca os
comandos em relatórios que não são de Grid. (No iReport , clicar com botão
direito no elemento raiz e selecionar a opção Edit
Query).
A presença da propriedade IW_SQL_EXTENSION = true associada
ao elemento raiz do jrxml (JasperReport)
sinaliza para o servidor IwReporter que os comandos
SQL entrados serão executados como comandos de extensão para dados do Grid e
não como fontes exclusivas de dados como o caso de relatórios avançados SQL.
Além disso a sintaxe especial de comandos de extensão (com GetListValues/Matches)
será aceita e processada com a seguinte ressalva: Todos os NOMES DE CAMPOS que
aparecerem nos comandos de SQL de Extensão devem ser digitados com LETRAS
MAIÚSCULAS.
[4.7] – Utilizando Serviços do IW como
Data Source em Relatórios Avançados (IW_SERVICE_DATASOURCE)
Relatórios avançados podem usar qualquer serviço do IW-Care como fonte de dados
do relatório como também de Sub-Relatórios.
Isso torna possível novos tipos de relatórios que antes só poderiam ser
elaborados e rodados navegando-se até a uma determinada tela para acessar o
Grid com os dados requeridos.
É usada uma especificação textual do serviço IW-Care a ser executado na
linguagem JSON . Com ela é possível
especificar todos os elementos necessários a chamada de qualquer serviço
IW-Care, inclusive referenciar tokens de substituição
$P!{}, $F!{}, $V!{} e $MP!{} no texto
JSON.
IMPORTANTE: Existe uma diferença conceitual no mecanismo de substituição
de valores de parâmetros nas chamadas de serviços IW-Care. Essa diferença deve-se
a peculiaridades relacionadas a como as chamadas de serviços foram
implementadas no IWReporter.
Comparando com a substituição em comandos SQL onde apenas $P{} e $P!{} são permitidos e referem-se a parâmetros definidos dentro do
próprio jrxml do Relatório /Sub-Relatório onde os mesmos são usados.
Já a substituição em chamadas de serviços IW-Care aceita os seguintes Tokens para substituição $P!{} , $F!{}, $V!{} e $MP!{} e a substituição
é sempre textual.
Quando o próprio Master-Report (Master.jrxml) usa chamada de serviço para busca de dados
apenas o token $P!{} pode ser utilizado e somente parameters definidos no jrxml do master podem ser usados.
Quando um Sub-Report (*Sub.jrxml) usa chamada de serviço para obtenção de dados
podem ser usados todos os 4 tipos de tokens.
1) $P!{} ⇒ parameters definidos no corpo do JRXML que chama o sub-report
2) $F!{} ⇒ fields definidos no corpo do jrxml
que chama o sub-report
3) $V!{} ⇒ variables definidas no corpo do jrxml
que chama o sub-report
4) $MP!{} ⇒ parameters definidos no corpo do jrxml
do Master. Estão disponiveis em todos os níveis, no
próprio master e em toda a árvore de sub-reports abaixo do master.
Os tokens $F!{}, $V!{} e $MP!{} são exclusivas para
chamadas de serviços, portanto, só podem ser utilizadas em chamadas de
serviços.
Essa especificação de Serviço em JSON deve ser colocada no mesmo local onde são
codificados os comandos SQL nos relatórios avançados.
Além disso, uma propriedade de nome IW_SERVICE_DATASOURCE deve ser “setada” no elemento raiz (do jrxml)
com valor igual a true.
A colocação dessa propriedade no elemento Raiz sinaliza para o IwReporter que deve interpretar o texto presente no
local onde normalmente ele espera obter o comando SQL como sendo um serviço
IW-Care escrito na linguagem JSON.
O processo acima descrito descreve quando o data-source
json deve ser usado pelo próprio Master.jrxml.
Quando precisa-se chamar um sub-relatório cujo json está definido dentro do mesmo precisamos setar no elemento subreport datasource connection como sendo do tipo data-source expression, e colocar
no campo datasource-expression o nome do sub-relatório <nome>.jasper. Isso sinalizará para o IwReporter
que o data-source que será usado no processamento do
respectivo sub-relatório é um Json
que estará colocado no jrxml do próprio subrelatório no campo de query.
O exemplo abaixo ilustra uma chamada fictícia que explora todas as
possibilidades de passagens de parâmetros. E servem de modelos para casos
reais.
{
IwService:{
ProjectName:'BOSetIfrRegistry',
ClassName:'testeClass',
ServiceName:"GetRecord's",
Parameters:{
Parameter:[
{
Name:'p1',
Type:'Integer',
Value:1
},
{
Name:'p2',
Type:'Long',
Value:1
},
{
Name:'p3',
Type:'Float',
Value:1.2
},
{
Name:'p4',
Type:'Double',
Value:1.5
},
{
Name:'p5',
Type:'String',
Value:'joão1'
},
{
Name:'p6',
Type:'Date',
Value='10/10/2012
10:20', DateFormat:'dd/MM/yyyy HH:mm'
},
{
Name:'rsFilter',
Type:'Recordset',
Value:{
Row:[
{
Field:[
{Name:'IntegrField', Type:'Integer' , Value=null, SearchOperator:">="},
{Name:'ID' , Type:'Long'
, Value=null},
{Name:'teste1' , Type:'Float' , Value=1.0},
{Name:'teste1' , Type:'Double' , Value=2.0},
{Name:'teste2' , Type:'String'
, Value='joão'},
{Name:'teste3' , Type:'Date',
Value='10/10/2012'},
{Name:'teste3' , Type:'Date',
Value='10/10/2012 10:20', DateFormat:'dd/MM/yyyy HH:mm'}
]
},
{
Field:[
{Name:'IntegrField', Type:'Integer' , Value=null},
{Name:'ID' , Type:'Long'
, Value= $F!{ID} },
{Name:'teste1' , Type:'Float'
, Value= 1.0},
{Name:'teste1' , Type:'Double'
, Value= $P!{parameter1} },
{Name:'teste2' , Type:'String' , Value='joão'},
{Name:'teste3' , Type:'Date' , Value='10/10/2012'},
{Name:'teste3' , Type:'Date' , Value='10/10/2012
10:20', DateFormat:'dd/MM/yyyy HH:mm', isEnd:true}
]
}
]
}
}
]
}
}
}
[4.7]
– Eliminando Páginas em Branco no Relatório (IW_ELIMINATE_BLANK_PAGES)
Caso a lógica do relatório gere páginas em branco indesejáveis
pode se usar a propriedade denominada IW_ELIMINATE_BLANK_PAGES posicionada no elemento raiz do
<JasperReport>
para eliminar essas páginas do resultado final do processamento.
Essa propriedade deve existir e ser valorada com true para que o efeito da retirada das
páginas em branco seja obtido.
ex: IW_ELIMINATE_BLANK_PAGES = true
[4.8] – Administrando o uso da área de memória em disco para processamento
do relatório avançado
Propriedade (IW_MIN_GROW_COUNT_4_SWAP_FILE)
Essa propriedade informa o número de páginas a partir da qual a
rotina de preenchimento de dados no layout deixará de usar a memória e passará a gerar as páginas seguintes
no arquivo de swap, aliviando a quantidade de memória usada no
processamento do relatório. A definição explicita dessa propriedade associada
ao elemento raiz do Master Report sobreporá qualquer valor default
previamente definido.
O valor default para essa propriedade é definido pelo parâmetro de sistema WEB_IWREPORTER_DEFAULTMINGCOUN
(tela 151).
Caso WEB_IWREPORTER_DEFAULTMINGCOUN não esteja definido no Grid da tela 151 ou mesmo definido contenha
um valor inválido (não numérico), será assumido automaticamente o valor 150.
Passo 5: Publicação do Relatório Avançado no IW
Lembramos aqui no “passo 1 : Elaborando o comando sql do relatório” desse tutorial já apresentamos detalhes de como construir o comando com os devidos parâmetros a serem substituídos em temop de execução no IW.
Agora, antes de publicar o relatório no IW devemos substituir a expressão posicionada no “data source” do relatório principal pelo comando sql já devidamente ajustado (contendo os parâmetros de substituição). Vamos realizar essa substituição diretamente o corpo do xml do relatório. A figura a seguir mostra uma imagem do iReport posicionado no modo de visualização “XML”:
O comando SQL devidamente ajustado (com as expressões de substituições dos parâmetros de substituição) deverá ser inserido no ponto indicado na imagem acima (na tag <![CDATA[<INSIRA_ AQUI_O_COMANO_SQL]]>).
Uma vez ajustado o comando SQL o próximo passo será “carregar” o novo relatório para o IW. Para isso vamos acessar a interface F00044 que ilustramos abaixo:
1. Inicialmente insira um “novo relatório” na F00044: Utilize botão “Novo” , informe o nome para o novo relatório e valore também os atributos : “Tipo Objeto= Relatório” , “Origem=Sql” , “Módulo Relatório= <valor desejado>” e “Tipo de Relatório = Relatório Avançado”.
2. Selecione no gride a linha referente ao novo relatório inserido e
navegue para a segunda aba denominada “Editar”. A figura a seguir ilustra essa
navegação:
3. Clique no botão denominado “Carregar”: O IW abrirá uma caixa de diálogo para navegação e localização do diretório onde deve estar posicionado o novo relatório, conforme ilustração a seguir:
Localize o
“diretório” onde estão posicionados os arquivos “.jrxml” do relatório a ser
publicado no IW e clique no botão “Abrir”.
IMPORTANTE:
(a) Nesse diretório devem conter somente o(s) arquivo(s) .jrxml do relatório a ser publicado. Ou seja, nenhum
outro tipo de arquivo deverá estar posicionado nesse diretório.
(b) Em um
diretório devem constar somente arquivos referentes a um único relatório a ser
publicado no IW. Nos casos de relatórios que são compostos por sub-relatórios os arquivos .jrxml referentes aos sub-relatórios
precisam estar no mesmo diretório e precisam ter nomes com sufixo “_sub.jrxml” (esse padrão de nomenclatura para os sub-report´s precisa ser observada).
(c) O nome do arquivo referente ao corpo principal do relatório precisa necessariamente
ser idêntico a “Master.jrxml” (com grafia exatamente
igual a essa). Em um diretório de desenvolvimento de relatórios necessariamente
deveremos ter um “único” relatório denominado “Master.jrxml”.
(d) Para proceder a carga do relatório para o IW selecione “todos os arquivos que fazem parte do relatório”. Nos casos de relatórios que não possuem “sub-reports” teremos sempre um único arquivo denominado “Master.jrxml”. Nos casos de relatórios que possuem “sub-reports” teremos que selecionar o arquivo “Master.jrxml” e também “todos” os arquivos correspondentes ao sub-reports que fizerem parte do relatório. “Todos os arquivos devem ser selecionados para carga” , ou seja, ou IW sempre realizará uma carga “completa” de todos os arquivos que fazem parte do relatório (não existe o conceito de carga parcial).
Após
clicarmos no botão “Carregar” o IW carregará e salvar e proceder
automaticamente a salva do relatório completo (relatório principal e sub-relatórios se existirem). Após essa operação o novo
relatório já poderá ser executado no IW.