Este artigo descreve três tipos de relatórios principais: relatório clássico, relatório interativo (IR) e grade interativa (IG). O Classic Report é o mais simples deles, mas em combinação com outros componentes permite que você faça coisas inesperadas. O IR e o IG têm muito mais recursos prontos para uso, mas essas são coisas em si mesmas. Por um lado, seus amplos recursos tornam desnecessário algum tipo de ajuste adicional; por outro lado, esses mesmos recursos limitam bastante a capacidade de fazer algo extra. Muito do que se aplica ao Relatório Clássico se aplica a eles também.

Sumário
Relatório clássico
Formatação de dados adicionais
Formatação com propriedades da coluna
Formatação editando um modelo
Adicionar interativo
Eventos do tipo "clique na linha do relatório"
Editando dados com o Classic Report
Relatório Interativo (RI)
Grade interativa (IG)
Criando colunas não SQL
Novos tipos de coluna
Relatórios de detalhes mestre baseados em IG
Processando entrada de dados no IG
Relatório clássico
Existem duas maneiras de criar um relatório. O primeiro é criar junto com a página, através do assistente de criação de página: selecione o tipo de página "Relatório", depois o subtipo "Relatório Clássico", siga as etapas do assistente para definir as propriedades da página e a última etapa é especificar a fonte de dados. Uma nova página será criada com um relatório, no qual, se desejado, você poderá adicionar outra coisa. Esse método tem um valor histórico, antes do advento do Page Designer moderno na versão 5.0, era realmente mais fácil.
A segunda maneira - na página já criada no Designer de Página, no menu esquerdo da guia " Rendering
" (é a primeira), encontre o ramo " Regions
", clique com o botão direito do mouse e selecione " Create Region
". Em seguida, é necessário especificar no grupo de propriedades " Identification
" no painel direito: " Title
" - o título sob o qual o relatório será exibido na página e " Type
" - " Classic Report
"; no grupo " Source
": " Location
" - " Local Database
" (um campo relativamente novo, não estava no 5.x), " Type
" - " SQL Query
", " SQL Query
" - a própria consulta. Isso é o suficiente.
Consulta SQL na qual mais exemplos são criados e KDPVCriando uma tabela:
create table students as select id, name, surname, trunc(sysdate - dbms_random.value(18 * 365 - 180, 18 * 365 + 180)) birthdate, trunc(sysdate - 8) examdate, trunc(50 + dbms_random.value * 50) rating from (select 1 id, '' name, '' surname from dual union all select 2 id, '' name, '' surname from dual union all select 3 id, '' name, '' surname from dual union all select 4 id, '' name, '' surname from dual union all select 5 id, '' name, '' surname from dual union all select 6 id, '' name, '' surname from dual union all select 7 id, ' ' name, '' surname from dual);
Consulta para o relatório:
select id, name, surname, birthdate, examdate, rating, rn, case when rn <= 3 then 'highrating' else '' end color, apex_item.checkbox(1) chbx from (select id, name, surname, birthdate, examdate, rating, row_number() over (order by rating desc) rn from students) order by id
Depois de inserir o texto da consulta, o ápice o analisará por si só e detectará as colunas. As configurações de região com um relatório no painel esquerdo terão a seguinte aparência:

Existem três seções principais:
- uma seção cujo nome é o "
Title
" da região: as propriedades da região são configuradas lá; - "
Columns
": uma lista de colunas, cada uma com suas próprias configurações; - "
Attributes
": propriedades do próprio relatório, ou seja, placas de dados especificamente (não sei quem como, mas a princípio fiquei confuso por um longo tempo, onde estão as propriedades da região e onde estão as propriedades do relatório; em particular, a região e o relatório têm seu próprio " Template
" , e se você alterou o " Template
" e o tipo de relatório / região não foi alterado, verifique se você os misturou).
Recursos básicos do Classic Report:
- Alinhamento (esquerda, centro, direita) dos cabeçalhos e dos dados das colunas, configurando uma máscara de formato para números e datas;
- Classificação: se você especificar "Classificável" - "
Yes
" nas propriedades da coluna, na página o cabeçalho desta coluna será representado por um link que será classificado clicando nela. Você pode classificar os dados adicionando " Order by
" à consulta ou definindo a classificação nas propriedades da coluna, mas não pode fazer as duas coisas juntas; - "
Pagination
": você pode especificar o número de linhas por página (" Attributes
" → " Number of Rows
") e ajustar a aparência do seletor de páginas (várias opções para escolher). Preste atenção também no parâmetro " Maximum Rows to Process
": define quantas linhas de consulta serão exibidas na tabela. Todas as classificações, " Pagination
" e assim por diante serão aplicadas a esse número de linhas. Se sua consulta deve / deve retornar mais, aumente esse número; - "
When No Data Found
": quando a consulta retorna 0 linhas, a tabela não é mostrada (mesmo o título, esse é um recurso do mecanismo) e nesta seção você pode especificar uma mensagem que será exibida em vez da tabela com o resultado; - Upload de dados para CSV: configurado na seção "
Download
".
As colunas têm um campo "Tipo", no qual você pode selecionar uma das várias opções para exibir o resultado:
- "Texto sem formatação": esta é a opção padrão - apenas o resultado da consulta.
- "Texto sem formatação (com base na lista de valores)": se você tiver um campo na consulta que se refere a uma tabela de pesquisa, poderá substituir um valor da pesquisa usando esse campo (mas é melhor, é claro, apenas selá-lo na própria consulta).
- "Link": permite fazer um link. Sobre os links, haverá um artigo separado.
- "Exibir imagem" e "Baixar BLOB": esses tipos permitem acessar arquivos armazenados em uma tabela em uma coluna do tipo
BLOB
. O primeiro exibe o arquivo como uma imagem (se é que é uma foto, é claro), e o segundo exibe um link para download. - "Gráfico percentual": exibe um número de 0 a 100 como uma imagem com uma barra de progresso.
- "Coluna oculta": usada quando o valor da consulta é algo auxiliar (por exemplo, para formatação), mas não deve ser exibido na tela.
Considere um exemplo no qual temos uma lista de alunos que passam no exame (a consulta SQL foi dada acima). Temos uma placa de resultados e queremos destacar os três melhores resultados em vermelho e negrito. Para nos ajudar a encontrar as configurações da coluna " Column formatting
". Quando o ápice renderiza o relatório, ele cria uma tabela HTML e coloca valores dos resultados da consulta em suas células ( <td></td>
). A propriedade " HTML Expression
" permite especificar um código HTML arbitrário. Se estiver vazio, o ápice colocará o valor da solicitação dentro da tag td
e, se não estiver vazio, o conteúdo da propriedade. Na expressão " HTML Expression
", você pode usar links para o valor de qualquer coluna da consulta; para isso, é necessário colocar seu nome entre os dois caracteres #
. Na solicitação, no meu exemplo, existem colunas " RATING
" (o resultado que precisa ser mostrado) e " COLOR
" (calcula o nome da classe CSS que definirá o estilo de destaque, dependendo do valor da coluna " RATING
"). Na propriedade " HTML Expression
" da coluna " RATING
", escreva:
<span class="#COLOR#">#RATING#<span>
E a highrating
classe CSS de classificação alta pode ser descrita nas propriedades da página (" CSS
" → " Inline
"):
.highrating { color: red; font-weight: bold; }
Está tudo pronto. Se você abrir a página agora, verá os três resultados mais altos destacados em vermelho.
E, claro, esse problema pode ser resolvido de várias maneiras alternativas. Por exemplo, não use classes CSS, mas calcule a cor na consulta SQL e insira-a no atributo style
ou descreva a classe CSS desejada na página ou no modelo de relatório. Existem muitas variações, escolha quem está mais próximo.
Nota: para ocultar todas as colunas adicionais usadas para formatação ou alguns cálculos intermediários, selecione " Hidden Column
" nas propriedades da Hidden Column
" Identification
" → " Type
".
A formatação usando as propriedades da coluna tem uma desvantagem: você não pode influenciar o formato da própria célula, ou seja, a tag td
. Por isso, por exemplo, não será possível preencher completamente a célula com qualquer cor (porque nos arquivos CSS padrão do ápice, a célula da tabela possui um padding
diferente de zero e haverá uma borda branca dentro).
Pegue o mesmo exemplo acima e adicione um destaque amarelo para as linhas com os três melhores resultados.
Para fazer isso, execute as seguintes etapas:
- Vamos para "
Shared Components
" → " User Interface
" → " Templates
", na lista de modelos que aparece, clique no cabeçalho da coluna " Type
" e selecione " Report
" na lista de valores que aparece. Agora encontramos o modelo " Standard
" (é usado por padrão) e, na coluna mais à direita da lista (" Copy
"), clique no botão para criar uma cópia do modelo. Na janela exibida, atribua um nome ao modelo, por exemplo, "Padrão com destaque". Propriedades do modelo abertas. Na guia " Column Template
", o campo " Column Template 1
" contém algo como isto:
<td class="t-Report-cell" #ALIGNMENT# headers="#COLUMN_HEADER_NAME#">#COLUMN_VALUE#</td>
Este é o modelo de célula como está sendo usado agora. Nesta guia, você pode especificar até quatro modelos de células alternativos, cuja escolha será realizada dependendo do resultado do cálculo das condições de cada um dos modelos. Temos um campo RN
na solicitação - o número de série do resultado (ou seja, o melhor resultado é o número 1, o próximo é 2 e assim por diante), aqui vamos usá-lo. O primeiro padrão (pela condição do problema) deve ser aplicado apenas às linhas nas quais o valor da coluna RN
maior que três. Nas propriedades do modelo no campo " Column Template 1 Condition
", selecione " Use Based on PL/SQL Expression
" e no campo " Column Template 1 Expression
", escreva:
:RN > 3
E resta apenas adicionar um modelo alternativo (no campo " Column Template 2
"):
<td class="t-Report-cell highlighted" #ALIGNMENT# headers="#COLUMN_HEADER_NAME#">#COLUMN_VALUE#</td>
Aqui, a classe highlighted
é adicionada à classe de célula padrão ( td
). Agora resta clicar no botão "Aplicar alterações".
- Volte para o Page Designer. Encontramos nosso relatório, na propriedade "
Attributes
" → " Appearance
" → " Template
", selecione o novo modelo "Padrão com destaque" na lista. - Como no exemplo anterior, nas propriedades da página ("
CSS
" → " Inline
"), descrevemos nossa nova classe highlighted
:
.highlighted { background-color: lightyellow !important; }
Salvamos a página, verificamos o resultado (deve ser como na foto no início do artigo).
Adicionar interativo
Eventos do tipo "clique na linha do relatório"
Uma das tarefas mais comuns é determinar o número da linha em que o usuário clicou. Para eventos no navegador no ápice, os componentes da Ação Dinâmica (DA) são responsáveis. Infelizmente, apesar do grande número de tipos diferentes, não há DA típico para processar um clique em uma linha de relatório. Mas é relativamente fácil de imitar. Como exemplo, criaremos um relatório de detalhes mestre a partir de dois relatórios clássicos, com base no relatório da seção anterior.
O segundo relatório aqui será uma tabela com números de telefone. Ao clicar na primeira tabela, ela será atualizada e mostrará o número de telefone da pessoa selecionada (e sem recarregar a página!). Para este relatório, crie outra região do tipo "Relatório clássico".
A solicitação será, por exemplo, with phone as ( select 1 id, '1684313' phone_num from dual union all select 2, '6843513' from dual union all select 3, '8916311' from dual union all select 4, '6843213' from dual union all select 5, '6513218' from dual union all select 6, '9561311' from dual union all select 7, '9843135' from dual) select phone_num from phone where id = :P2_ROW_ID
Componentes necessários da solução:
Um método para identificar uma sequência selecionada pelo usuário. Para esse fim, a coluna ID
é adequada. Infelizmente, se esta coluna estiver marcada como oculta (muitas vezes, usuários extras não mostram o usuário para não sobrecarregar a interface), ela não será renderizada pelo mecanismo e esses dados não estarão presentes na página. Mas eles podem ser adicionados a uma coluna existente da mesma maneira que foi usada para formatar a saída. Vamos pegar uma coluna (por exemplo, a primeira visível) e no campo " Column formatting
" → " HTML Expression
", escreva:
<span class="click" data-id="#ID#"></span>#NAME#
Você pode inserir esse código diretamente na consulta SQL, mas é melhor nãoHá outra opção para fazer o mesmo - adicione esse código HTML diretamente à solicitação:
select id, '<span class="click" data-id="' || id || '"></span>' || name as name from ...
O resultado como um todo será o mesmo, mas a classificação pelo campo de name
deixará de funcionar, porque o mecanismo DBMS considerará essa linha inteira como dados e será classificada por ela. E se você fizer isso através da " Column formatting
", os dados pelos quais a classificação será feita não conterão nada de supérfluo.
Além disso, nesse caso, para exibir o código HTML na coluna, você terá que abandonar a fuga de caracteres especiais, e isso também é um possível furo de segurança.
- Identificador de relatório (caso haja mais de um relatório na página). A região possui a propriedade "
Advanced
" → " Static ID
", coloque o valor my_rep
. O valor dessa propriedade é usado no código HTML da página. O elemento div
que contém a região receberá o atributo id
com esse valor. Se o campo " Static ID
" estiver vazio, o ápice usará o identificador de região nas tabelas do sistema para o atributo id
. É melhor não confiar nele, porque ao transferir o aplicativo para outro servidor, esse identificador pode mudar quase garantido para mudar. - Um item para armazenamento temporário do valor do
ID
da linha selecionada. Vamos criar um item P2_ROW_ID
tipo " Hidden
" (este nome, como você pode ver, é usado na solicitação que retorna a lista de telefones). Em seguida, você precisa criar uma ação dinâmica. Abra o Designer de página, no painel esquerdo da guia "Ações dinâmicas", localize o ramo "Clique", clique nele com o botão direito, selecione "Criar ação dinâmica" no menu. Em seguida, preencha as seguintes propriedades do DA:
Em seguida, vamos criar ações para este DA (" True Actions
"):
A primeira ação obtém o ID
linha selecionada e a armazena em um item. Você precisa definir os seguintes valores de propriedade: " Action
" - " Set Value
", " Set Type
" - " JavaScript Expression
", " JavaScript Expression
" - o seguinte código:
this.triggeringElement.querySelector('span.click').dataset.id
Na propriedade " Affected Elements
" → " Selection Type
", selecione " Item(s)
", na propriedade " Item(s)
", selecione o item P2_ROW_ID
.
- A segunda ação envia o valor do item para o servidor. Propriedades: "
Action
" - " Execute PL/SQL Code
", " Execute PL/SQL Code
PL/SQL Code
" - apenas null;
, " Items to Submit
P2_ROW_ID
" - P2_ROW_ID
(de fato, toda essa ação é necessária para enviar o valor do item ao servidor - não há uma maneira mais simples de fazer isso; alternativamente, em vez dessas duas Actions
você pode criar uma com javascript puro, que calculará o valor e enviar para o servidor - e nem será muito mais difícil). - A terceira ação atualiza o segundo relatório (Detalhe). Propriedades: "
Action
" - " Refresh
", " Affected Elements
" → " Selection Type
" - selecione " Region
", em " Region
" selecione a segunda região com telefones.
Nota de ação dinâmicaNo futuro, escreverei um artigo detalhado separado sobre o DA e muitos outros componentes do ápice básico, para que qualquer iniciante entenda imediatamente como e qual dos seguintes trabalhos, mas por enquanto imagine que o leitor já sabe tudo isso.
Isso é tudo. Se você executou todas essas etapas e não perdeu nada, terá dois relatórios na página e, quando clicar em qualquer linha do primeiro, o segundo será atualizado e exibirá os dados da pessoa selecionada.
Editando dados com o Classic Report
No ápice das versões antigas, havia um tipo de relatório conhecido como Forma Tabular (ele ainda existe em princípio, embora seja marcado como Legado), o que permitia alterar dados em várias linhas da tabela de uma só vez. Ele foi substituído por uma Grade Interativa muito mais poderosa. Aqui, demonstrarei como usar os meios improvisados para montar um análogo de uma forma tabular de tubo quente. Pegue a mesma tabela do exemplo anterior e adicione a capacidade de editar o nome e o sobrenome da pessoa.
Para editar dados, cuja quantidade nem sequer é conhecida antecipadamente, aproximadamente, precisaremos dos APEX_APPLICATION
e APEX_APPLICATION
. O primeiro permite criar itens em tempo de execução (a criação, neste caso, é a geração do HTML correspondente) e o segundo permite acessar dados inseridos nos campos criados em tempo de execução.
Considere a função APEX_ITEM.TEXT
como um APEX_ITEM.TEXT
(ela retorna o código HTML de uma entrada de texto simples). É assim que esta função é declarada na documentação :
APEX_ITEM.TEXT( p_idx IN NUMBER, p_value IN VARCHAR2 DEFAULT NULL, p_size IN NUMBER DEFAULT NULL, p_maxlength IN NUMBER DEFAULT NULL, p_attributes IN VARCHAR2 DEFAULT NULL, p_item_id IN VARCHAR2 DEFAULT NULL, p_item_label IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
Os parâmetros a partir do segundo descrevem o que o código HTML conterá: o valor no campo de entrada, atributos adicionais, restrições de comprimento, etc. O parâmetro mais importante em nosso caso é o primeiro (é o único parâmetro necessário, o restante possui valores padrão). Este parâmetro pode assumir valores de 1 a 50 e, em seguida, o número digitado aqui será usado para acessar os dados inseridos pelo usuário. Cada número corresponde à coleção PL / SQL APEX_APPLICATION.G_FXX
, onde XX
é 01
, 02
, ... 50
.
Para nossa tarefa, precisamos de três campos de tabela: id
, name
, surname
. O primeiro deve estar oculto, o segundo e o terceiro devem ser campos de entrada.
Criamos um relatório com base na consulta SQL:
select apex_item.hidden(1, id) || apex_item.text(2, name) name, apex_item.text(3, surname) surname, birthdate, examdate from students
- Nas propriedades das colunas
NAME
e SURNAME
, removemos os caracteres de escape: em " Security
" → " Escape special characters
", definimos " No
". - Crie um botão "
Save
", as configurações podem ser deixadas por padrão. Criamos o processo " After Submit
" com as propriedades: " Identification
" → " Type
" - " PL/SQL
"; " Server-side Conditions
" → " When Button Pressed
" - botão " Save
". E o código para salvar dados no banco de dados:
begin for i in apex_application.g_f01.first .. apex_application.g_f01.last loop update students set name = apex_application.g_f02(i), surname = apex_application.g_f03(i) where id = apex_application.g_f01(i); end loop; end;
Como você pode ver, parece muito simples. Resta apenas mencionar uma armadilha desagradável ao trabalhar com APEX_ITEM
. Se, dessa maneira, você desejar adicionar caixas de seleção ao relatório:
select ... apex_item.checkbox2(4, id) from students
Você terá tantos elementos na coleção APEX_APPLICATION.G_F04
quanto houver caixas de seleção, enquanto em todas as outras coleções o número de elementos será igual ao número de linhas exibidas na tela e o valor que você passa como o segundo parâmetro para a função apex_item.checkbox2
cairá no conteúdo da coleção apex_item.checkbox2
. Portanto, se você usar uma coleção com dados de caixas de seleção em código semelhante ao acima, poderá encontrar a exceção NO DATA FOUND
.
Relatório Interativo (RI)
O Interactive Report é uma combinação multifuncional pronta para uso, na qual, fora da caixa, há um grande número de funções para trabalhar com dados. Tudo o que é necessário é habilitá-los nas configurações (mais precisamente, não os desative, porque por padrão quase tudo está incluído lá). Na página de RI, parece quase um relatório regular, mas acima dela existe um painel adicional com um campo de entrada para pesquisa e o botão " Actions
". O botão " Actions
" mostra um menu adicional no qual todas as outras funções estão disponíveis. Vou listar apenas brevemente as possibilidades:
- Painel de pesquisa: permite pesquisar o texto especificado em todas as colunas do relatório;
- "
Actions
" → " Columns
": define a exibição de colunas (sequência, ocultar / exibir); - "
Actions
" → " Filter
": ferramentas de filtragem de dados que permitem selecionar um campo, operação de filtragem (mais, menos, igual, contém texto etc.); - "
Actions
" → " Data
": manipulação de dados (classificação, cálculo, agregação e Flashback ); - "
Actions
" → " Format
": configurações de exibição de dados; permite destacar os dados necessários (as cores e as condições da luz de fundo dos dados são ajustadas), fazer uma quebra de controle (não sei como é chamado em russo, é o seguinte), selecione o número de linhas de relatório na página; - "
Actions
" → " Chart
", " Group by
", " Pivot
": os nomes falam por si - criação de gráficos, gráficos, relatórios resumidos com base nos dados de IR; - "
Actions
" → " Report
": permite ao usuário final salvar o relatório com um nome específico. Nesse caso, todas as configurações feitas com todos os itens de menu descritos acima serão salvas e cada usuário terá suas próprias; - "
Actions
" → " Download
": exportação de dados, 5 formatos suportados: CSV, PDF, XLS, HTML, RTF.
Qual das opções acima estará disponível para o usuário está configurada nas propriedades do relatório: " Attributes
" → grupos de propriedades " Search Bar
", " Actions Menu
", " Download
".
Interactive Report , Classic Report. , HTML ( ). — " Remove HTML
", HTML ( , ).
, .
-, IR " Template
". , CSS- , — IR , . , . (, - , , , .)
-, . " Sequence
" , . , : , , " Actions
" → " Columns
" . : " Actions
" → " Report
" " Save Report
", " Primary
" — ( " Primary
" , IDE IDE).
Interactive Grid (IG)
Interactive Grid — Interactive Report. 5.1. IG IR, , . IG javascript API, ( 18.2, ). .
, -( , , , ), , , - . 5.1, , :

( )
, ( ), . ( ), .invoke( "add-row" )
.invoke( "row-add-row" )
.
-, , .
, Interactive Grid, ,. ( ), 5. - , . , . — " ".
( IR) — . ( ) , . IDE - . IG : , , , . , 5 , , -. , , — , , , ( "Actions" → "Columns": ).
— . , , 5.1 IG. IG , , — " Actions
" → " Report
" → " Save
". . — , -.
SQL
Classic Report Interactive Report SQL ( , SQL ), IG . " Create Column
". , " Source
" → " Type
" " None
" ( SQL , ), " Database Column
" / " SQL Expression
" . , . , ( , ), .
( IR) . :
- "
Actions Menu
". -"" ( — , ""?). — , , . . - "
Checkbox
". , , " Row Selector
" (. ). , , ( ), , — , . - "
Color picker
". , , . :

- "
Row Selector
". , , , , javascript PL/SQL . - ("
Date picker
", " Number field
", " Password
", ) — . APEX_ITEM
( Classic Report) .
- " Download BLOB
". , Interactive Report Classic Report. — ? ( " IG".)
Master-Detail IG
IG Master-Detail . , Classic Report . , IG . Master , , ( → " Source
" → " Primary Key
" " Yes
"). Detail " Master-Detail
" → " Master Region
" . , , " Master-Detail
" → " Master Column
" . . Master Detail .
IG
, IG — , . IG / . , , ( STUDENTS
) , : , , — , — . IG STUDENTS
:
select id, name, surname, birthdate, examdate from students
(" Attributes
" → " Edit
" → " Enabled
"), " Processing
", IG ( : "IG — Save Interactive Grid Data"), " Settings
" → " Target Type
" " PL/SQL Code
", " PL/SQL Code to Insert/Update/Delete
" :
begin :NAME := initcap(:NAME); :SURNAME := initcap(:SURNAME); case :APEX$ROW_STATUS when 'I' then insert into students (name, surname, birthdate, examdate) values (:NAME, :SURNAME, :BIRTHDATE, :EXAMDATE); when 'U' then update students set name = :NAME, surname = :SURNAME, birthdate = :BIRTHDATE, examdate = :EXAMDATE where id = :ID; when 'D' then
. APEX$ROW_STATUS
I
, U
D
(insert, update, delete) , ( , / ). , ( , ): SQL-, , . , NAME
, SURNAME
, BIRTHDATE
EXAMDATE
.
APEX$ROW_NUM
, , , APEX$ROW_SELECTOR
, X
, " Row Selector
".