Você está na página 1de 448

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

N o v a s f a c i l i d a d e s n a Re l e a s e 6

Ed i t o r PL /SQL Para abrir mais de um editor PL/ SQL


Ao selecionar a program unit ou trigger a ser aberta, manter pressionado o Shift

Mostrar o nmero da linha


Posicionar o mouse na scrollbar

Fo r m s Ru n t i m e Di a g n o s t i c s Para fazer um log de todos os eventos para um arquivo


ifrun60 module= ... userid= ... record= collect log= < nome_arquivo> .log

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

SQL e PL /SQL St a n d a r d s

A s 1 0 M e l h o r e s Ra z e s p a r a N o Pa d r o n i za r o C d i g o
Os padres no fazem sentido Meus padres pessoais so melhores Os padres infringem minha criatividade No preciso escrever cdigo legvel porque no vou fazer manuteno nele No quero escrever cdigo legvel porque quero ser o nico que pode fazer manuteno nele Estou fazendo um prottipo e s quero testar o cdigo No tenho tempo para escrever cdigo num certo formato No digito bem o suficiente se tiver que formatar o cdigo enquanto escrevo Ningum saber at que seja tarde demais para padronizar o cdigo Eu voltarei mais tarde para reformatar o cdigo para atender aos padres

Pa d r e s Ge r a i s d e C d i g o Tamanho mximo de objetos limitado em 30 caracteres Trs espaos para identao Uppercase para keywords Lowercase para elementos do usurio Mximo de 80 caracteres por linha Usar fonte monospaced (Courier) Um comando por linha Comentrios para documentao

Pa d r o n i za n d o I d e n t a o n o PL /SQL Ed i t o r Para controlar a tabulao no PL/ SQL Editor necessrio acrescentar um valor de sequncia DE_PREFS_TABSIZE abaixo de HKEY_LOCAL_MACHINE\ SOFTWARE\ ORACLE, colocando no valor o nmero de caracteres para identao Visualizar as diferenas de identao nas figuras 3-1 e 3-2 da pgina 70 do livro Oracle Developer Advanced Forms & Reports

Pa d r e s d e C d i g o SQL
Uppercase para SQL keywords, clause keywords e functions pr-definidas Lowercase para objetos do usurio Espaamento e identao
SELECT FROM WHERE AND tab.coluna2 tabela tab tab.coluna1 = 1 tab.coluna2 IS NOT NULL;

Comentar e organizar o cdigo Conveno de nomes Usar alias para tabelas Usar colunas qualificadas ( tab.coluna) Usar alias para colunas

Pa d r e s d e C d i g o PL /SQL
Uppercase
keywords, funes PL/ SQL, datatypes, valores boleanos (TRUE, FALSE), constantes de built - ins, objetos do Forms (blocos, campos)

Lowercase
variveis, sub-programas, built - ins

Usar espao aps = , > , < , | | e , Inserir comentrios Usar conveno de nomes para cursores e subprogramas Colocar somente um return nas functions Usar sempre cursores explcitos

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Wh a t Do Y o u B a s e a B l o c k o n ?

Fo r m s Qu e r y T e x t O Forms monta a sentena select atravs da seguinte concatenao:


SELECT FROM WHERE ORDER BY <itens base-table do bloco> <Propriedade Query Data Source Name> <Propriedade WHERE Clause> <Propriedade ORDER BY Clause>

Co n t r o l B l o c k Blocos que no possuem um database source Populados manualmente Normalmente single record blocks, mas podem tambm ser multi-record Usados para organizar os control itens Criar atravs de manually

Bloc o Baseado em Tabela Associa o bloco a uma tabela do banco de dados Problemas de trfego de rede com dados adicionais que devem ser populados atravs da trigger POST-QUERY Usar o Data Block Wizard para criar
Enforce data integrity
Se for checado, o Forms cria triggers para checar se os itens mandatrios foram preenchidos e violaes de foreign key

Bloc o Baseado em View Resolve toda a query no server e devolve como uma nica linha No necessita da trigger POST-QUERY Pode ser atualizvel
As view complexas podem fazer uso das triggers instead of

A view pode ser definida com join ou chamada functions de banco A implementao do bloco semelhante ao baseado numa tabela

B l o c o B a s e a d o e m Pr o c e d u r e Existem dois tipos de procedures que podem ser utilizadas para bloco:
PL/ SQL Table Procedure
Procedure que retorna uma PL/ SQL table

REF CURSOR Procedure


Uma varivel cursor (declarada como datatype REF CURSOR) aponta para uma linha especfica num query result set

B l o c o B a s e a d o e m Pr o c e d u r e I m p l e m e n t a o d e REF CU RSOR Seguir os passos abaixo:


Criar uma package contendo a definio do tipo record, do ref cursor e tabela de records. Deve conter tambm uma procedure para cada sentena DML ( select , insert , update, delete e lock) Usar o Data Block Wizard
Tab Type: Stored Procedure Informar as procedures de query, insert, update, delete e lock

Definir o layout

B l o c o B a s e a d o e m Pr o c e d u r e I m p l e m e n t a o d e REF CU RSOR Sero criadas triggers a nvel de bloco para chamar as procedures da package:
INSERT- PROCEDURE, UPDATE-PROCEDURE, DELETE- PROCEDURE, LOCK-PROCEDURE

Query by Example
Para implement- la necessrio adicionar parmetros procedure de select Associar um item do bloco ao parmetro, no formato :BLOCO.ITEM

B l o c o B a s e a d o e m Pr o c e d u r e I m p l e m e n t a o d e PL /SQL T a b l e Seguir os passos abaixo:


Criar uma package contendo a definio do tipo record e tipo PL/ SQL table. Deve conter tambm uma procedure para cada sentena DML ( select , insert , update, delete e lock) Usar o Data Block Wizard
Tab Type: Stored Procedure Informar as procedures de query, insert, update, delete e lock

Definir o layout

B l o c o B a s e a d o e m FROM Cl a u s e Qu e r y
1. A sentena select criada no formato
SELECT <todas colunas base table do bloco> FROM <Propriedade Query Data Source Name> Obs.: A propriedade query data source name contm a sentena select usada como data source

2. Somente permite query


1.

Deve-se alterar o DML Target Name para outro tipo caso for necessrio insert , update e/ ou delete

3. Bastante flexvel 4. Altervel em tempo de execuo


SET_BLOCK_PROPERTY ( <nome-bloco> , QUERY_DATA_SOURCE_NAME, nome-do-source ); Obs.: O select de nome-do-source deve vir entre parnteses

5. Perde performance devido implementao SELECT FROM (SELECT ...)

B l o c o B a s e a d o e m FROM Cl a u s e Qu e r y - Im plem ent a o pelo Hard Met hod


Usar somente quando no existe nenhuma tabela ou view que possa ser usada como modelo para o bloco:
Criar o bloco manualmente Alterar a propriedade Query Data Source Type para FROM clause query Digitar a sentena select na propriedade Query Data Source Name Criar itens com nomes baseados nas colunas da sentena select Setar a propriedade Primary Key de um item Setar as propriedades dos itens apropriadamente

B l o c o B a s e a d o e m FROM Cl a u s e Qu e r y - I m p l e m e n t a o p e l o Ea s y M e t h o d Criar primeiramente o bloco baseado numa tabela atravs do Data Block Wizard, executando depois os passos 2 e 3, ignorando o passo 4 e setando as demais propriedades dos passos 5 e 6.

Bloc o Baseado em Transac t ional Triggers


Quando se criam blocos baseados em views ou tabelas, pode-se alterar os procedimentos default para insert, update, delete e lock Efetivamente torna-se a mesma funcionalidade das triggers INSTEAD OF de views, apenas que o cdigo fica no client (Form) e no no server (View) Recomendado somente quando usar banco de dados non-Oracle Para implementar, setar as propriedades Query Data Source Type e DML Data Target Type para Transactional Triggers e escrever o cdigo nas trigger ON-INSERT, ON-UPDATE, etc.

Ex e r c c i o I .1 Fazer um form (table.fmb) com bloco baseado na tabela emp, conforme layout:

Ex e r c c i o I .2 Fazer um form com bloco baseado numa procedure com ref cursor Utilizar o mesmo layout do exerccio I.1 Basear-se no exemplo refcur.fmb e refcur.pck

Ex e r c c i o I .3 Alterar a procedure do exerccio anterior para contemplar o recurso de query by example Ver exemplo refcur2.pck

Ex e r c c i o I .4 Implementar um form com bloco baseado em procedure com PL/ SQL table Exemplo em plsql_tab.fmb

Ex e r c c i o I .5 Fazer um form com bloco baseado numa clusula from Exemplo em from_clause.fmb

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s GU I St a n d a r d s

De s e n v o l v i m e n t o d o Fo r m s Processo dividido em 3 fases:


Non- Functional Storyboard
Planejamento das telas do sistema como demonstrao para o usurio validar

Semi- Functional Prototype


Prottipo com uso de tabelas, navegao entre forms, lookups

Production Form
Os forms acabados, rodando no ambiente de produo

T p i c o s p a r a o De s e n v o l v i m e n t o
3. Tamanho do Form
3.

No agrupar muitas funcionalidades num nico form Para o desenvolvimento sugere-se usar monitor e resoluo maior Colocar ttulos na window, no nos blocos Organizar o espao horizontal dos itens Em multi-records calcular o nmero de registros a serem mostrados cuidadosamente Posicionamento dos campos: layout tabular e formlike

4. Resoluo de tela e tamanho do monitor


3.

5. Espao real da tela


3. 4. 5.

6.

T p i c o s p a r a o De s e n v o l v i m e n t o
Propriedade Defer Required Enforcement
Yes: valida o preenchimento de itens obrigatrios somente na validao do registro No: valida no prprio item. O usurio no consegue sair do item sem digitar um valor

Ordenao de blocos e itens


Quando um form executado, o cursor posicionado no primeiro item navegvel do primeiro bloco que aparece no Object Navigator O posicionamento dos itens dentro do bloco determinam a navegao default entre itens

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Wh e r e t o Pu t t h e Co d e i n Fo r m s

Pa c k a g e s o u St a n d -A l o n e 1.Benefcios das Packages


Organizao do cdigo 2. Orientao a objeto 3. Publicao de objetos disponveis
1.

1.Variveis definidas em packages

Encapsulamento de cdigo 5. Aumento de performance


4.

1.Uma vez chamado um sub-programa da package, ela carregada totalmente para a memria

Pa c k a g e s o u St a n d -A l o n e 3.Desvantagens das Packages


Mais passos para o desenvolvimento 4. Menor granularidade de acesso
3.

3.Dando grant execute a uma package, permite-se executar qualquer sub-programa da mesma
5.

Mais objetos a serem gerenciados


3.Ao se criar um novo sub-programa deve-se decidir em qual package este deve residir

6.

Mais overhead no desenvolvimento

Da t a b a s e Se r v e r o u Fo r m 4.Todo cdigo que acessa dados do servidor mais eficiente se localizado no prprio servidor, reduzindo tambm o trfego de rede 5.Somente cdigo que no dependa de dados do servidor, ou que contenha builtins do forms devem ser executadas no form

T r a t a n d o Fu n e s d o Fo r m s
6. A built-in DO_KEY emula o pressionamento de uma tecla de funo
6.

Exemplo: Pode-se executar uma consulta:


6.Pressionando uma tecla de funo 7.Fazendo chamada a um item de menu 8.Pressionando um boto (smartbar)

7. 8.

Todos esses modos deveriam executar o mesmo cdigo Soluo:


6.A tecla de funo dispara a trigger KEY-EXEQRY, onde deve ser colocado o cdigo a ser executado, ou uma chamada a um sub-programa 7.O item de menu deve executar DO_KEY ('Execute_query'); 8.A trigger WHEN-BUTTON-PRESSED do boto deve tambm executar o mesmo comando do menu

T r a t a n d o Fu n e s d o Fo r m s A trigger KEY-OTHERS um default para todas as teclas que no possuem uma trigger especificada Para desabilitar uma tecla, deve-se inserir o cdigo NULL; na trigger KEY- desejada

T r i g g e r o u Pr o g r a m U n i t Vantagens e desvantagens
O cdigo digitado diretamente na trigger mais difcil de localizar Digitando numa program unit necessrio verificar na trigger qual program unit est sendo chamada Utilizando program unit mais fcil de reutilizar o cdigo

Fo r m o u L i b r a r y Deve-se colocar no form todo cdigo que muito especfico para um s form Os sub-programas candidatos a fazerem parte de uma library so aqueles usados em mais de um form

Qu a l L i b r a r y Es c o l h e r Devem existir trs nveis de libraries:


Uma library genrica Uma library especfica da aplicao Uma library especfica do form

Su b c l a s s o u Co p y d a Ob j e c t L i b r a r y 1.Embora no seja ideal colocar program units em object library, se for necessrio, deve-se sempre usar o subclass para manter o link com a fonte. Caso o cdigo for modificado na object library, todos os forms ao serem recompilados herdaro o novo cdigo

Qu a l N v e l d e T r i g g e r 3.Existem 3 nveis de trigger:


Form 4. Bloco 5. Item
3.

4.A hierarquia da execuo : item, bloco, form 5.Havendo uma mesma trigger em mais de um nvel, a propriedade Execution Hierarchy determina a ordem Before , After ou Override

Qu a l N v e l d e T r i g g e r
4. Trs opes de padronizao:
4.

Nvel de form
4.Escrever o cdigo para todas as triggers de todos os eventos a nvel de form, testando qual bloco e item se est atualmente

5.

Nvel de bloco
4.Escrever triggers especficas para cada bloco, testando-se somente qual o item atual 5.As demais triggers devem ser escritas a nvel de form

6.

Nvel de item
4.Escrever triggers no mais baixo nvel. Preferencialmente fazer chamadas a program units do que escrever diretamente na trigger

Ge n e r a l i za n d o C d i g o p a r a a L i b r a r y 5.No referenciar itens usando a sintaxe bind variable (:bloco.item). Em vez disso, usar as built-ins COPY e NAME_IN
5.

Exemplo:
5.Atribuindo um valor para bloco.item
5.copy ( valor , bloco.item );

6.Utilizando o valor de bloco.item numa expresso


5.if name_in( bloco.item ) = valor then ...
6.

As duas built -ins trabalham com valores character. necessrio fazer as devidas converses com TO_CHAR, TO_DATE, TO_NUMBER

Gu i a Ge r a l Sempre que possvel, implementar acesso e manipulao de dados no server Escrever cdigo to genrico quanto possvel Usar packages para organizar e modularizar o cdigo Sempre que possvel, escrever triggers do Forms no nvel mais alto

Ex e r c c i o I I .1
Fazer um form para cadastrar empregados, devendo aparecer somente um registro na tela Validaes (usar a trigger When-Validate-Item):
A nvel de item para que o nome do empregado seja sempre informado A nvel de bloco para que o gerente seja vlido (exista na tabela emp) e a data de admisso seja menor ou igual data atual
Guardar o item atual numa varivel global

Alterar o comportamento de teclas

Ver exemplo em exercII1.fmb

No permitir excluir registro ( key-delrec) No permitir limpar bloco ( key- clrblk) , dando uma mensagem de aviso Ao criar registro ( key-crerec), dar uma mensagem de aviso antes (usar create_record)

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Re p o r t s De v e l o p m e n t St a n d a r d s

On d e Co l o c a r C d i g o n o Re p o r t No report pode-se colocar cdigo em:


Libraries atachadas Program Units locais Data Model
Ao serem criados, os campos frmula geram program units para conter o cdigo Campos sumrio devem ser usados preferencialmente sobre criao de views com somatrios

Query do report
Chamadas a funes do server

On d e Co l o c a r C d i g o n o Re p o r t
1.

Report Triggers
1.Before Parameter Form
1.Disparada antes que a tela de parmetros seja mostrada

2.After Parameter Form


1.Aps o usurio pressionar o boto Run

3.Before Report
1.Aps o parse da query e o primeiro set de fetches for executado, antes de mostrar a primeira pgina

4.Between Pages
1.Antes de ser mostrada cada pgina. No disparada antes da primeira nem aps a ltima pgina

5.After Report
1.Aps o report ter terminado

On d e Co l o c a r C d i g o n o Re p o r t
Format Triggers
Definidas a nvel de objetos de layout, so disparadas antes que o objeto seja mostrado. Devem sempre retornar TRUE ou FALSE. Se for FALSE, o objeto no ser mostrado

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s T e m p l a t e s B a s i c s

B e n e f c i o s d o U s o d e T e m p l a t e s Existem diversos benefcios:


Compartilhamento de objetos Compartilhamento de cdigo Padronizao do desenvolvimento Otimizao do tempo de desenvolvimento Melhor alocao dos recursos humanos Fornece guia de desenvolvimento

De s v a n t a g e n s n o U s o d e T e m p l a t e s 1.Existem alguns problemas a serem administrados:


1.

Estagnao da qualidade da equipe


1.Os iniciantes no tero contato com cdigo PL/ SQL avanado, uma vez que este j est todo desenvolvido dentro das libraries

2.

Curva de aprendizado
1. necessrio um aprendizado de como as templates esto organizadas e qual deve ser usada em cada situao

O q u e Co l o c a r n a T e m p l a t e
3. Objetos modelo
3.

Podem ser implementados atravs de subclasses e visual attributes Sistema de help Window help about Toolbars Alerts Sistema de mensagem Utilitrios e suporte a objetos Mtodos de componentes reusveis

4. Componentes reusveis
3. 4. 5. 6. 7.

5. Cdigo genrico
3. 4.

Ob j e c t Gr o u p Objeto do Forms que agrupa outros objetos num named set Usado para facilitar subclass e cpia entre mdulos. Ao fazer subclass ou cpia de um grupo, todos os objetos filhos vo junto com o grupo Qualquer objeto do primeiro nvel do forms, exceto libraries atachadas e o prprio form, podem ser arrastados para dentro de um grupo

Ob j e c t L i b r a r y 1.Arquivo que contm objetos Forms para fins de subclass ou cpia 2.Possui a extenso .olb 3.Smartclasses
Flag que indica que o nome do objeto deve aparecer num popup menu 2. Para setar , deve- se selecionar o objeto e selecionar Object -> SmartClass
1.

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

M u l t i -v a l u e d Se l e c t i o n Ob j e c t s

Ch e c k B o x e s
3. Usado para campos com no mximo dois valores possveis, normalmente obrigatrios 4. Propriedades necessrias
3. 4. 5. 6. 7. 8.

Label Value when Checked Value when Unchecked Check Box Mapping of Other Values Datatype Initial Value Devem ser manipulados pelos valores de checado e no checado
3.Exemplo: if :bloco.checkbox = Y then...

5. Atribuio/ verificao dos valores


3.

6. Triggers
3.

WHEN-CHECKBOX-CHANGED

3.Usada para realizar aes cada vez que o usurio clica no check-box alterando seu estado

Ra d i o Gr o u p s
6. Usado quando ao menos existem trs valores possveis 7. Propriedades necessrias
6.

Radio Group
6.Data Type 7.Initial Value

7.

Radio Button
6.Label 7.Radio Button Value

8. Atribuio/ verificao dos valores


6.

Atravs dos valores dos radio buttons


6.Exemplo: if :bloco.radio_grupo = Val_radio_button1 then...

9. Triggers
6.

WHEN-RADIO- CHANGED

List It em s Existem trs tipos:


Poplists
Valores podem ser:
Hard-coded atravs da propriedade Elements in List Populados via um record group (esttico ou dinmico)

T-lists Combo Boxes

L i s t I t e m s - H a r d -c o d e d
Propriedades necessrias
Elements in List
List Element: valor que aparecer na tela List Item Value: valor usado internamente no form

List Style ( Poplist , Tlist ou Combo Box) Mapping of Other Values Datatype Initial Value Required

Atribuio/ verificao dos valores


Atravs de um dos List Item Value
Exemplo: if :bloco.lista = Item_value_1 then...

Triggers
WHEN- LIST-CHANGED

L i s t a s d e V a l o r e s (L OV s ) Uma implementao de LOV consiste de cinco objetos:


O valor de display O valor do dado Um boto para chamar o LOV O prprio LOV Um record group para popular o LOV

Pode mostrar quantas colunas forem necessrias. As poplists podem mostrar somente um valor

L i s t a s d e V a l o r e s (L OV s )
Para implementar, usar o LOV Wizard:
Escolher ou criar o record group Construir/ alterar a sentena select
O boto Build SQL Query chama o Query Builder

Selecionar as colunas a serem mostradas no LOV Alterar ttulo e tamanho das colunas do LOV
Para no mostrar uma coluna no LOV, setar width para zero

O boto Look up return item faz o mapeamento para o retorno da seleo


O tamanho do nome deve ter no mximo 31 caracteres

Ajustar tamanho e ttulo da janela Setar como deve ser a montagem da lista Selecionar o item ao qual o LOV estar associado (onde ser invocado) Opcionalmente, criar um boto com a instruo DO_KEY( LIST_VALUES )

Ex e r c c i o I I I .1 Acrescentar uma lista de valores para os gerentes no form criado no exerccio II.1 Mostrar o cdigo (empno) e nome do empregado (ename)

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

I n t e g r a t i n g Fo r m s a n d Re p o r t s

Ch a m a n d o Re p o r t s d o Fo r m s 3.Existem duas built-ins para se chamar relatrios a partir do Forms:


3.

RUN_PRODUCT
3.nica opo em verses anteriores 4.Simplesmente passa-se o nome do relatrio como parmetro

4.

RUN_REPORT_OBJECT
3. uma funo, no uma procedure 4.Requer alguma preparao

Ch a m a n d o Re p o r t s d o Fo r m s RU N _PRODU CT
4. A sintaxe para a chamada :
4.

Run_Product (produto, < nome-do-report > ', modocomunicao, modo-execuo, localizao, < lista-de-parametros> , < chart -item> );
4.produto: REPORTS ou GRAPHICS 5.modo-comunicao: SYNCHRONOUS ou ASYNCHRONOUS 6.modo-execuo: BATCH ou RUNTIME 7.localizao: FILESYSTEM ou DB 8.chart-item: nome do item no forms para mostrar o grfico (somente se produto for GRAPHICS)

5.

Exemplo:
4.Run_Product (REPORTS, report1', SYNCHRONOUS, RUNTIME, FILESYSTEM, w_lst_parm, NULL);

Ch a m a n d o Re p o r t s d o Fo r m s RU N _REPORT _OB J ECT 5.Passos para implementar:


Criar um objeto na seo Reports do Object Navigator do Form Builder 6. Alterar as propriedades do report , conforme a necessidade
5.

5.Destination Type, Destination Name, Destination Format

Ch a m a n d o Re p o r t s d o Fo r m s RU N _REPORT _OB J ECT


7.

A sintaxe para a chamada :


7.ret = run_report_object (< id_report> , < lista-de-parametros> ) 8.Exemplo:
DECLARE w_idt_report w_ret_report BEGIN w_idt_report w_ret_report END; REPORT_OBJECT; VARCHAR2(100); := find_report_object('rep_refcur'); := run_report_object (w_idt_report);

7.

Se for usado o Reports Server, pode- se verificar o status do report atravs da built -in REPORT_OBJECT_STATUS

Pa s s a n d o I n f o r m a o p a r a u m Re p o r t 8.Os parmetros de um Report so criados programaticamente, no so objetos do Form 9.Devem existir como User Parameters no Data Model do Report, com o mesmo nome

L i s t a s d e Pa r m e t r o s Os parmetros devem ser de tipos escalares (Date, Character, Number) Os passos a serem seguidos so:
Checar se a lista de parmetros j existe. Se existir, elimin-la Criar a lista de parmetros Adicionar parmetros com seus valores

L i s t a s d e Pa r m e t r o s
1. Exemplo:
DECLARE w_lst_param PARAMLIST; w_nom_lista VARCHAR2(10) := PAR_RELATORIO ; w_idt_relat REPORT_OBJECT; w_dsc_retorno VARCHAR2(100); BEGIN -- Deleta a lista de parmetros, se existir w_lst_param := get_parameter_list (w_nom_lista); IF NOT id_null(w_lst_param) THEN w_lst_param := destroy_parameter_list (w_lst_param); END IF; -- Cria a lista de parmetros w_lst_param := create_parameter_list (w_nom_lista); -- Acrescentando os parmetros e seus valores add_parameter (w_lst_param, P_PARAM1 , TEXT_PARAMETER, <Texto1> ); add_parameter (w_lst_param, P_PARAM2 , TEXT_PARAMETER, TO_CHAR( <Cdigo1> )); -- Rodando o relatrio w_idt_relat := find_report_object ( report1 ); w_dsc_retorno := run_report_object (w_idt_relat, w_lst_param); END;

B i n d V a r i a b l e s e L e x i c a l Pa r a m e t e r s 6.Duas formas de passagem de parmetros 7.Bind Variables


Passado como valor de substituio 7. Usado com a sintaxe :nome- parametro 8. Exemplo:
6.

6.SELECT emp.empno ,emp.ename FROM emp emp WHERE emp.deptno = :p_deptno;


9.

Usar sempre que for necessrio passar um simples valor para a query

B i n d V a r i a b l e s e L e x i c a l Pa r a m e t e r s Lexical Parameters
Guarda uma parte da sentena SQL Usado com a sintaxe &nome- parametro Exemplo:
SELECT emp.empno ,emp.ename FROM emp emp &p_where

Usar aspas simples para literais do tipo string Usar somente quando for necessrio alterar a query em tempo de execuo, pois sua performance pior do que bind variable. Isto ocorre devido ao parse que sempre executado para lexical parameters, uma vez que a query muda dinamicamente

Ex e r c c i o I V .1 Criar um report que liste os empregados de um departamento, que ser informado via parmetro Criar um form que chame o report passando como parmetro o cdigo do departamento a ser listado Fazer um boto que chame atravs do run_product e outro com o run_report_object

Ex e r c c i o I V .2 Criar outra tela de parmetros que permita ao usurio escolher a ordem de classificao do relatrio
empno ename sal

Criar outro report que receba como lexical parameter

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Re p o r t s - A n Ov e r v i e w

A r q u i t e t u r a d o Re p o r t B u i l d e r O Reports dividido em duas interfaces:


Report Editor - Data Model
Define as queries e agrupamentos que comporo o report

Report Editor - Layout Model


Especifica como esses grupos so distribudos no layout do relatrio

Da t a M o d e l 1.Os grupos do Reports correspondem aos blocos do Forms 2.Grupos so baseados em queries 3.Uma query pode ser organizada em mais de um grupo, que normalmente refletem quebras no relatrio

Layout Model 3.Os objetos no layout so organizados via frames 4.Repeating frames
3.

Usados para imprimir o resultado dos grupos

5.Nem todos os grupos precisam ter um repeating frame no layout, alguns podem ser necessrios somente para clculos

Pa r a m e t e r Fo r m Tela de parmetros do relatrio User Parameters


Definidos pelo desenvolvedor, de acordo com a necessidade no report

System Parameters
Parmetros que definem a forma de execuo e gerao do relatrio

L i v e Pr e v i e w e r
1. Permite rodar o relatrio e mostrar os dados como sero para o usurio, habilitando tambm sua edio 2. Pode ser feito:
Alinhamento de colunas 2. Redimensionamento de colunas 3. Movimentao de colunas 4. Inserir nmero de pginas 5. Editar texto 6. Alterar cores e fontes 7. Setar mscaras de formato 8. Inserir um campo 9. Inserir link para arquivo HTML 10. Inserir objetos boilerplate
1.

B u i l t -i n PL /SQL Fu n c t i o n s
3. A package SRW (SQL Report Writer) contm algumas built-ins teis:
3.

SET_MAXROW
3.Procedure que altera o nmero mximo de linhas que uma query deve retornar

4.

GET_PAGE_NUM
3.Para obter o nmero da pgina atual

5.

SET_FIELD_NUM
3.Dados retornados num campo especfico podem ser sobrescritas por campos numricos

6. 7. 8.

SET_FIELD_CHAR SET_FIELD_DATE MESSAGE


3.Para mostrar uma mensagem ao usurio

Re p o r t Wi za r d 6.Orienta a gerao passo a passo de um report 7.Pode ser invocado para criar ou alterar um Report (Tools -> Report Wizard)

Co n s t r u i n d o a Qu e r y A query a base para construo dos grupos, que so o fundamento do report Query Builder
Ferramenta para construo de queries atravs de point -e-click Acessvel atravs da tab Data no Report Wizard e no Data Model quando se cria ou edita uma query Possui a limitao de no poder trabalhar com UNION ALL

Gr u p o s Quando as colunas so selecionadas numa query, elas so automaticamente colocadas num grupo Um grupo pode ento ser dividido em vrios grupos

Cr i a n d o B r e a k Gr o u p s n o Re p o r t Wi za r d

Deve-se selecionar um estilo que usa um grupo


Group Left , Group Above, Matrix With Group

A tab Groups fica habilitada, permitindose mover os Available Fields para Group Fields. Cada coluna cria um novo break group, podendo ser feito drag-drop para agrupar mais colunas num mesmo grupo

Cr i a n d o B r e a k Gr o u p s n o Da t a M o d e l Basta clicar e arrastar a coluna para fora do grupo onde ela est Um novo grupo ser criado automaticamente Pode-se tambm arrastar uma coluna de um grupo para outro

Co l u n a s Su m m a r y e F r m u l a
Colunas summary
Tipo especial de frmula que permitem criao de somatrios ( sum, count , max, etc) Sempre se baseia em outra coluna de um grupo filho do qual o somatrio est A propriedade Reset At especifica onde o total deve ser inicializado

Colunas Formula
Funes PL/ SQL que retornam um valor Em geral, so menos eficientes No podem ser definidas no Report Wizard, somente no Data Model Deve ser colocada no grupo onde esta deve ser calculada

T r a b a l h a n d o c o m Fr a m e s 1.Frames so usados para agrupar objetos, podendo ser visveis no relatrio ou no 2.Podem ser de dois tipos:
1.

Enclosing ( nonrepeating) frames


1.Agrupam objetos similares e foram posies relativas no layout

2.

Repeating frames
1.Alm de agrupar objetos, imprimem os resultados de um grupo do Data Model. Dentro de um repeating frame pode haver somente objetos do grupo associado ou de um parent group

Ob j e c t N a v i g a t o r 3.O nvel mais alto o nome do report, que o mesmo do arquivo salvo 4.Live Previewer
3.

No um objeto, apenas invoca o Live Previewer

Ob j e c t N a v i g a t o r
Data Model
Mostra a estrutura lgica do report
System Parameters
Valores dos parmetros de sistema do report

User Parameters
Parmetros adicionais definidos para o report

Queries
Texto das queries existentes no report

Groups
Agrupamentos dos objetos segundo sua hierarquia

Formula Columns
Colunas calculadas definidas a nvel de report

Summary Columns
Colunas somatrio definidas a nvel de report

Placeholder Columns
Colunas placeholder definidas a nvel de report

Data Links
Ligaes entre queries, com a condio de join

Ob j e c t N a v i g a t o r Layout Model
Objetos do layout fsico do report
Header
Uma ou mais pginas impressas antes do relatrio

Trailer
Uma ou mais pginas impressas depois do relatrio

Body
Onde os principais objetos do report so colocados

Margin
Para especificar cabealhos e rodaps

Ob j e c t N a v i g a t o r
6. Parameter Form
6.

Componentes da tela de parmetros do report Cdigo para as triggers do relatrio So elas, pela ordem de disparo:
6.Before Parameter Form
6. Os parmetros passados ao report j esto disponveis

7. Report Triggers
6. 7.

7.After Parameter Form e Before Report


6. Se a After Parameter Form retorna False, o report mostra novamente a tela de parmetros 7. Se a Before Report retorna False, o report s cancelado aps a query ter sido resolvida e o Report tentar mostrar a primeira pgina do relatrio

8.Between Pages
6. Executada antes de cada pgina, menos antes primeira e aps a ltima pgina

9.After Report
6. Aps a impresso ou for fechado o previewer

Ob j e c t N a v i g a t o r
Program Units
Procedures, functions e packages que sero executadas no client

Attached Libraries Templates External SQL Libraries


Para queries utilizadas em mais de um report , podendo ser armazenadas em arquivos ou no database

PL/ SQL Libraries Debug Actions e Stack


Pertinentes s aes de debug

Built-in Packages Database Objects

Ex e r c c i o V .1 Criar um relatrio que liste o total de salrios acumulados por departamento Calcular o total de salrios com aumento, dependendo de:
Se o empregado tiver sido admitido antes de 1981, deve receber um aumento de 25% Se o empregado tiver sido admitido entre 1981 a 1982, o aumento deve ser de 20% Se tiver sido admitido aps estas datas, deve receber 17% de aumento

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

T h e Re p o r t s Da t a M o d e l

Qu e r y B u i l d e r Queries podem ser construdas no Report Wizard ou no Data Model do Report Editor Trs mtodos para constuo: digitar a sentena SQL, copiar de um arquivo ou usar o Query Builder O Query Builder fornece uma interface grfica para construo da query

M l t i p l a s Qu e r i e s
1. No Data Model podem haver vrias queries, linkadas ou no 2. Queries no linkadas so usadas para construir relatrios independentes dentro do mesmo report fsico 3. Queries linkadas estabelecem uma ligao lgica entre uma query e outra (correlated subqueries)
1. 2. 3.

4.

A cada linha da query principal, a query linkada buscada novamente Pode causar problemas de performance mais eficiente criar uma query com diversos joins entre as tabelas envolvidas Ver figuras 19- 2 e 19- 3 na pgina 488 do livro Oracle Developer Advanced Forms & Reports

Usando View s Soluo para reports com acessos complexos, mltiplas queries linkadas Pode-se otimizar os joins entre tabelas, ganhando ainda a vantagem de tudo ser resolvido no server O Data Model torna-se mais simples

A t r i b u i n d o A l i a s p a r a N o m e s d e Co l u n a s

Um dos inconvenientes do Reports que os nomes das colunas so globais No se pode haver duas colunas com o mesmo nome, mesmo que em queries ou grupos distintos Para evitar que o Reports atribua nomes de colunas arbitrrios, deve-se sempre usar alias para as colunas da query

Se l e c i o n a n d o Fu n e s PL /SQL e m Qu e r i e s

Qualquer funo que no atualize o banco de dados pode ser usada numa sentena select Se uma frmula faz acesso ao banco deve-se optar por coloc-la no server, em vez de criar colunas frmula no client Se a funo for colocada numa package, deve-se especificar a PRAGMA RESTRICT_REFERENCES

Ou t e r J o i n s Um outer join pode muitas vezes resolver a necessidade de mltiplas queries linkadas Uma query com outer join demora mais para executar do que uma sem ele, mas ainda mais rpido do que mltiplas queries linkadas

T a b e l a s T e m p o r r i a s n o Re p o r t Usadas quando o report muito complexo e no h possibilidade de se criar uma view para simplific-lo O report torna-se um simples relatrio de ler e imprimir os dados de uma tabela temporria Sempre que isto for necessrio, criar a tabela e popul-la dentro do Forms. Isto tem se mostrado bem mais eficiente

Co l u n a s F r m u l a Evitar o processamento de cursores A cada linha do grupo a coluna frmula calculada Se a frmula tiver que acessar o banco de dados, preferivelmente coloc-la no server

Co l u n a s Pl a c e h o l d e r Agem como variveis globais no Data Model, podendo receber valores:


Se for uma coluna a nvel de report :
Na Before Report Trigger Numa coluna frmula a nvel de report

Numa coluna frmula do mesmo grupo ou abaixo do grupo da coluna placeholder

Podem ser usadas quando se desejam imprimir determinados valores no report

Ob j e t o s a N v e l d e Re p o r t Objetos que no dependem de grupos ou queries Sempre que possvel, devem ser criadas no Data Model. Estes objetos, contudo, no podem ser manipulados enquanto o report est rodando. Caso houver esta necessidade, criar variveis numa package definida nas Program Units Outra forma criar como user parameters

Gr u p o s
O layout do report trabalha com grupos So um estgio intermedirio entre a query e o layout Servem para construir relacionamentos masterdetail Determinam pontos onde um somatrio deve ser zerado (Propriedade Reset At da coluna summary) Se houverem mltiplas queries linkadas, os grupos tambm ficam linkados Ver figura 19-4 na pgina 499 do livro Oracle Developer Advanced Forms & Reports

B r e a k Co l u m n s
Quando os grupos so criados, as colunas do grupo possuem uma seta azul esquerda do item no Data Model. Estas setas indicam que a coluna foi marcada como coluna break order H duas funes para colunas break order:
Indicam identificadores nicos para o grupo Determinam a ordem de classificao

Deixar todas as colunas marcadas como break pode degradar a performance, devido ao acrscimo da clusula ORDER BY na query

Es p e c i f i c a n d o Gr u p o s Em geral, os grupos correspondem a reas de impresso no relatrio O grupo deve ter um nome identificador que serve para responder pergunta: Cada linha deste grupo mostra informaes sobre ...

Fi l t r o s d e Gr u p o
Na Property Pallete do grupo pode-se setar filtros, na propriedade Filter Type, podendo ser:
First
Na propriedade Number of Records especifica-se quantas linhas do incio da query devem ser consideradas Exemplo: Se for especificado 3, sero consideradas somente as 3 primeiras linhas

Last
Na propriedade Number of Records especifica-se quantas linhas do final da query devem ser consideradas

PL/ SQL
Permite especificar um filtro mais complexo para o grupo

Raramente necessrio utilizar esta facilidade

Ex e r c c i o V I .1 Criar um relatrio que liste os empregados por departamento e por gerente, mostrando tambm a quantidade de empregados no departamento e quantidade de empregados subordinados ao gerente

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

T h e Re p o r t s L a y o u t M o d e l

Layout Model
Fundamenta-se em dois conceitos:
Completa independncia do Data Model e do layout
O Data Model deve estar completo antes de se criar o Layout Model Campos so criados independentes no layout e associados colunas do Data Model atravs da propriedade Source Facilidade do default layout

Utilizao de frames
Em vez de usar bandas horizontais fixas, pode-se definir diversas reas retangulares no relatrio, chamadas frames Os frames agrupam objetos no layout Governam o comportamento do layout, direo de impresso, relacionamentos master-detail e quebras de pgina

Trabalhando c om o Layout Model


A maior parte do design de um relatrio pode ser feita atravs do Report Wizard Tarefas que devem ser evitadas manualmente:
Criar repeating group e objetos de layout Criar um campo no layout Setar ncoras manuais

Aes comuns no Layout Model:


Setar a propriedade Format Mask Criao de labels Usar enclosing frames em volta de objetos Setar propriedades em alguns objetos Setar a propriedade Keep With Anchoring Objects
Para campos e/ ou frames, a fim de evitar cabealhos rfos

Digitar format triggers em objetos

Trabalhando c om o Layout Model Algumas aes tornam-se mais eficientes sendo feitas no Live Previewer:
Setar propriedades de Format Mask Alteraes do tamanho de colunas Alteraes das propriedades Font e Font Style Alterao de cores de objetos

T r a b a l h a n d o c o m Fr a m e s Repeating Frames
Sempre associados a somente um grupo Todos os objetos dentro do frame devem pertencer ao grupo, a um parent grupo ou deve ser objeto a nvel de report Os smbolos para os repeating frames podem ser vistos na pgina 510 do livro Oracle Developer Advanced Forms & Reports

Pr i n t Di r e c t i o n
Propriedade do repeating frame, que determina como a informao ser posicionada na pgina
Down
O frame ser repetido para baixo na pgina at o rodap, continuando na prxima pgina

Across
O frame ser repetido da esquerda para a direita da pgina. Quando no h mais espao na pgina, o processo se repete na prxima

Across/ Down
O frame ser repetido da esquerda para a direita at no haver mais espao, quando ento o processo se repete na mesma pgina (como feito wrap de campo texto)

Down/ Across
O frame ser repetido para baixo na pgina at o rodap, continuando no topo da mesma pgina, ao lado da coluna anterior

V e r t i c a l e H o r i zo n t a l El a s t i c i t y Refere-se a como os objetos podem ser expandidos ou contrados de acordo com as informaes que contm Aplica-se a frames e campos A elasticidade horizontal s expande ou contrai um objeto na direita A elasticidade vertical s o faz no sentido para baixo do objeto

V e r t i c a l e H o r i zo n t a l El a s t i c i t y
Existem quatro opes para cada direo:
Contract
Quando o relatrio executado, o objeto no pode ser maior que o tamanho no Layout Model. Se houver um espao em branco, o objeto pode ficar menor, mas nunca maior. Se no couber no tamanho do layout este ser truncado

Expand
Quando o relatrio executado, o objeto deve ser ao menos do tamanho mostrado no Layout Model. Se houver muita informao a ser mostrada, ele ser expandido para a direita ou para baixo, dependendo da opo de expand (horizontal ou vertical)

V e r t i c a l e H o r i zo n t a l El a s t i c i t y
Fixed
O tamanho no Layout Model exatamente o tamanho que o objeto deve ocupar quando o relatrio for executado

Variable
O objeto livre para expandir ou contrair conforme a necessidade para mostrar os dados

Os smbolos de elasticidade podem ser visualizados na pgina 515 do livro Oracle Developer Advanced Forms & Reports O mais comum para repeating frames Horizontal Elasticity Fixed e Vertical, Variable

V e r t i c a l e H o r i zo n t a l El a s t i c i t y
Campos
A maioria dos campos so fixos verticalmente e horizontalmente Para comentrios e descries usa- se elasticidade horizontal Fixed e vertical Expand para fazer wrap em vrias linhas somente quando necessrio

Frames
A maioria dos frames so fixos horizontalmente e variveis verticalmente Repeating e enclosing frames devem ser variveis verticalmente para mostrar as informaes que se repetem ou objetos que se expandem Quando se deseja um nmero fixo de linhas por pgina pode-se setar a Vertical Elasticity para Fixed Frames que s agrupam objetos normalmente so fixos nas duas direes

Fl e x M o d e Quando est ligado, ao mover ou redimensionar um objeto, todos os outros objetos no layout se movem de acordo
Se um campo estiver num frame e for movido, o frame ser expandido ou contrado para acomodar o movimento Os movimentos podem ser feitos somente horizontalmente ou verticalmente, um de cada vez

Co n f i n e M o d e Mantm todos os objetos dentro de seus parent frames No previne sobreposio de frames do mesmo nvel (sibling frames) Somente deve ser desligado quando se deseja mover um campo de um frame para outro (normalmente boilerplates)

A d d i t i o n a l De f a u l t L a y o u t Minimiza a necessidade de uso manual do Layout Model Permite a criao de layout para cada grupo individualmente Deve-se clicar no cone especfico e desenhar um retngulo onde se deseja posicionar o layout. Esse espao deve ser grande o suficiente para acomodar os objetos a serem mostrados

A c r e s c e n t a n d o Ca m p o s
Se o layout foi todo gerado atravs do Report Wizard ou Additional Default Layout mais rpido eliminar tudo e recriar o layout Se no foi feito assim, deve-se primeiro abrir espao para acomodar o novo campo, podendose usar o Flex Mode para facilitar. Deve-se ter certeza de estar no frame correto e setar o source do campo corretamente, a fim de evitar uma mensagem de erro na execuo

M o v e n d o Ob j e t o s
Ao mover um label de um campo para outro frame, desligar o Confine Mode, tendo a certeza de que o objeto est completamente contido no novo frame onde foi posicionado Ao criar um novo frame em volta de alguns objetos ele no faz um enclose automaticamente
necessrio selecionar no menu Arrange - > Move Backward (F8) Verificar cuidadosamente no Object Navigator se o posicionamento est correto

n c o r a s : Co l o c a n d o a s Co i s a s On d e El a s Pe r t e n c e m
Em geral, os objetos so ancorados ao seu vizinho mais prximo que pode ser expandido ou movido sobre ele Podem ser criadas ncoras explicitamente entre objetos ou colocar enclosing frames em volta de objetos no posicionados corretamente no relatrio O posicionamento baseado no tamanho dos objetos na execuo do report As informaes de ncora podem ser visualizadas no Object Navigator
Selecionar no menu Navigator -> Navigator Options, clicando no checkbox Anchoring Information na tab Layout

Fo r m a t T r i g g e r s Funo que permite o condicionamento de display dos objetos


Se retornar False, o objeto no ser impresso no relatrio Se for a nvel de campo, somente o campo no ser impresso Se for a nvel de frame, nenhum objeto do frame ser impresso

Ex e r c c i o V I I .1 Criar outro report, alterando o que foi criado no exerccio VI.1 A quantidade de empregados deve ser mostrada somente quando houver mais de um empregado

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

U s i n g a n d B u i l d i n g Re p o r t s Tem plat es

Ov e r v i e w Uma vez gerado um report baseado numa template, no fica nenhum link com objetos da template. Uma alterao na template deve ser refeita em todos os reports ou regerar novamente

Lim it a es Limitaes das templates de report:


No se pode colocar objetos na seo Body da Template Layout Model No podem ser criados objetos globais na Template Data Model No h mais nenhuma forma de especificar objetos default para Header e Trailer

Es t r u t u r a d a T e m p l a t e
Template Editor - Data Model
Permite especificar system e user parameters, bem como definir defaults

Template Editor - Layout Model


Especificam-se propriedades que influenciam o Report Wizard e Additional Default Layout Propriedades especficas podem ser definidas para cada tipo diferente de report (Tabular, Group Above, etc) Novos objetos somente podem ser colocados na seo Margin Na seo Body, somente podem ser feitas modificaes das propriedades dos objetos existentes

Es t r u t u r a d a T e m p l a t e
Section
Define propriedades como Height e Width da pgina

Body
Define como os objetos sero posicionados no layout Default
Descreve o comportamento de todos os frames Governa o comportamento de uma seo do report Frames Propriedades visuais de quatro tipos de frames (Section, Heading, Fields e Summaries) Field Labels/ Heading Propriedades visuais dos labels de campos Character, Number e Date Fields Propriedades visuais para campos Character, Number e Date Summary Labels Propriedades visuais para os labels de somatrios Summaries Propriedades visuais para os campos somatrios

Es t r u t u r a d a T e m p l a t e
Override
Permite especificar propriedades para diversos tipos de reports diferenciadamente Herda as propriedades da seo Default, permitindo alterao para cada tipo Objetos da margem sero os mesmos para todos os tipos de report Podem ser definidas propriedades diferentes para diversos nveis do layout Exemplo: Num master-detail-detail, a Section (Level 1) define o master, a Section (Level 2) define o primeiro detail e a Section (Level 3) define o segundo detail

Re p o r t T r i g g e r s Todo cdigo colocado numa trigger na template ser copiado para o report gerado se este no tiver cdigo para a mesma trigger

Pr o g r a m U n i t s
As Program Units possuem o mesmo comportamento das report triggers Se a Program Unit no existe no report, ela ser copiada para ele. Se j existir uma Program Unit com o mesmo nome, esta permanecer inalterada (o cdigo da template no ser aplicado) Se a ligao entre o report e a template for removida, as Program Units referenciadas na template tambm sero removidas, mesmo que tiverem sido modificadas

At t ac hed Libraries
Se houverem libraries atachadas na template quando o report for criado baseado na template, estas sero atachadas ao report gerado Limitaes
Se for desatachada uma library no report e for rodado novamente o Report Wizard reaplicando a template com a library atachada, o Reports no vai atachar novamente ao report Se modificar de uma template que tem libraries atachadas para uma outra sem nenhuma, estas no sero desatachadas ao se aplicar a nova template

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

B u i l d i n g a Pr o d u c t i o n Re p o r t

Cr i a n d o u m Re p o r t Pa s s o a Pa s s o Para executar os passos seguintes, necessrio executar o script brwbld60.sql, que faz a criao das tabelas necessrias Ver exemplo em relat22.rdf

St e p 1 : Se l e c i o n a n d o o Re p o r t St y l e Criar um novo report


Selecionar menu File -> New -> Report Selecionar o Report Wizard Na primeira tela ( tab Style), pode- se selecionar o estilo do layout do report , bem como seu ttulo Neste exemplo escolher Group Above, com ttulo Compras e Vendas por Produto

St e p 2 : Co n e c t a r a o Da t a b a s e Ser construdo um report baseado numa sentena SQL Conectar ao banco de dados para poder visualizar as tabelas disponveis

St e p 3 : Co n s t r u i r a Qu e r y Se l e c i o n a n d o T a b e l a s Primeiro ser construda a query de Customer Clicar no boto do Query Builder e selecionar as tabelas CUSTOMER, ITEM, PRODUCT e SALES_ORDER na window Select Data Tables. Clicar no boto Include e aps em Close Organizar as tabelas conforme figura 22-3 da pgina 553 do livro Oracle Developer Advanced Forms & Reports

St e p 4 : Co n s t r u i r a Qu e r y Se l e c i o n a n d o Co l u n a s Selecionar as colunas das tabelas clicando no checkbox ao lado das colunas:


Product
Product_id e description

Customer
Customer_id e name

Item
Actual_price, quantity e total

Clicar em OK para gerar a sentena SQL

St e p 5 : Co n s t r u i r a Qu e r y M o d i f i c a n d o o C d i g o SQL
Um problema com Reports que os nomes de colunas so globais Colocar alias para as colunas ajuda a identificlas melhor no report
PRODUCT.PRODUCT_ID PRODUCT.DESCRIPTION CUSTOMER.CUSTOMER_ID CUSTOMER.NAME ITEM.ACTUAL_PRICE ITEM.QUANTITY ITEM.TOTAL prod_id prod_desc cust _id cust _name it _price it _quant it _total

St e p 6 : Co n s t r u i r a Qu e r y Se l e c i o n a n d o Ca m p o s p a r a Qu e b r a s
Declarar os campos (colunas) do grupo master movendo as colunas prod_id e prod_desc para a caixa da direita Por default, geram-se dois grupos de quebra. Clicar e arrastar prod_desc sobre prod_id, a fim de criar um s grupo Criar um segundo grupo com cust_id e cust_name A estrutura deve ficar conforme a figura 22-4 da pgina 554 do livro Oracle Developer Advanced Forms & Reports

St e p 7 : De c i s e s d e Di s p l a y Decidir o que ser mostrado no relatrio Neste exemplo selecionar todos os campos A ordem em que os itens aparecem a ordem em que eles aparecero no relatrio. Pode-se clicar e arrastar para organizar

St e p 8 : Co l u n a s Su m m a r y Permite especificar geraes de somatrios Gerar uma soma para cada uma das seguintes colunas:
it _total it _quant

St e p 9 : L a b e l s Neste ponto definem-se os labels (prompts) e tamanhos dos campos Neste exemplo, alterar somente os prompts dos somatrios:
Total Item Cliente Total Item Produto Total Item Geral Quant Item Cliente Quant Item Produto Quant Item Geral

St e p 1 0 : Se l e o d a T e m p l a t e Pode-se selecionar em qual template o report dever ser baseado No exemplo, selecionar No template Clicar em Finish

St e p 1 1 : A d i c i o n a r u m a Qu e r y
O Report Wizard no permite acrescentar queries adicionais necessrio criar manualmente no Report Editor - Data Model clicando no boto SQL Entrar no Query Builder e selecionar CUSTOMER, EMPLOYEE, ITEM e SALES_ORDER Organizar o diagrama das tabelas conforme a figura 22-5 da pgina 556 do livro Oracle Developer Advanced Forms & Reports

St e p 1 2 : Se l e c i o n a r Co l u n a s No Query Builder selecionar:


Employee
Employee_id, last_name, first_name e middle_initial

Item
Product_id, actual_price, quantity e total

Clicar em OK para montar a sentena SQL

St e p 1 3 : Co l o c a r A l i a s p a r a Co l u n a s
Para evitar que o Reports nomeie automaticamente as colunas para evitar duplicaes, deve-se colocar alias para cada coluna
EMPLOYEE.EMPLOYEE_ID EMPLOYEE.LAST_NAME EMPLOYEE.FIRST_NAME EMPLOYEE.MIDDLE_INITIAL ITEM.QUANTITY ITEM.ACTUAL_PRICE ITEM.TOTAL ITEM.PRODUCT_ID emp_id emp_sobrenome emp_nome emp_meio_nome emp_quant _venda emp_preco_venda emp_total_venda emp_prod_id

St e p 1 4 : Cr i a r Gr u p o s d e Qu e b r a No Data Model selecionar (Shift-click):


emp_preco_venda emp_quant _venda emp_prod_id

Arrastar estes trs campos para baixo a fim de criar um grupo separado

St e p 1 5 : Re n o m e a r Gr u p o s e Qu e r i e s
Atravs da Property Palette, renomear:
Q_1 Q_2 G_prod_id G_cust _id G_it _price G_emp_id G_emp_quant _venda Q_product _sales Q_employee_sales G_prod G_cust G_sale G_emp G_emp_sale prod_price prod_quant cust _price cust _quant ger_price ger_quant

Ver figura 22-2 da pgina 551 do livro Oracle Developer Advanced Forms & Reports
Sumit _totalPerprod_id Sumit _quantPerprod_id Sumit _totalPercust _id Sumit _quantPercust _id Sumit _totalPerReport Sumit _quantPerReport Verificar colunas de quebra

St e p 1 6 : Cr i a r Co l u n a s Su m m a r y
Criar colunas somatrio para emp_total_venda e emp_quant_venda no grupo g_emp
Clicar no cone Summary Column e aps no grupo g_emp, criando a coluna CS_1 Click duplo para editar as propriedades
Name: emp_price Source: emp_total_venda Reset At: g_emp Esta coluna ser um somatrio para cada empregado

Criar outra coluna somatrio no grupo g_emp


Name: emp_quant Source: emp_quant_venda Reset At: g_emp

St e p 1 7 : L i n k a r a s Qu e r i e s
Para ligar as duas queries, usa-se o cone Data Link Pode-se clicar no header de cada uma das queries. A ferramenta vai buscar o relacionamento no banco para fazer o link Se no conseguir encontrar, deve-se clicar em cada coluna do relacionamento
Clicar em prod_id no grupo g_prod e arrastar at emp_prod_id no grupo g_emp_sale

Neste ponto o Data Model est completo. Recomenda-se salvar o report

St e p 1 8 : Cr i a r o L a y o u t d o Re l a t r i o Clicar no boto Layout Model Selecionar todos os elementos e deletar Clicar no boto Additional Default Layout e selecionar uma rea aproximadamente de 7.25 de largura e 2 de altura Aparece uma tela abreviada do Report Wizard. Na tab Style selecionar Group Above e eliminar o ttulo

St e p 1 9 : Se l e c i o n a r Gr u p o s e M o d i f i c a r Na tab Groups, selecionar somente os grupos PROD e CUST, clicando em Down para indicar que iro repetir para baixo na pgina Na tab Fields, selecionar tudo menos ger_price, ger_quant e it_total Na tab Labels podem ser modificados os labels dos campos Clicar em Finish para executar o report no Live Previewer

St e p 2 0 : A l t e r a r o L a y o u t U s a n d o o L i v e Pr e v i e w e r No relatrio verifica-se que a descrio do produto muito pequena. Aumentar no Live Previewer Pode-se tambm alterar o label de Total Item Produto para Totais Alterar outros campos conforme a necessidade

St e p 2 1 : A d i c i o n a r I n f o r m a o a o Re l a t r i o Criar uma rea para as informaes do empregado, abaixo de f_prod_desc Criar um frame no espao existente, alterando seu nome para m_empregado e Vertical Elasticity para Variable Aumentar seu tamanho, usando a facilidade do Flex Mode

St e p 2 2 : Cr i a r u m a Fu n o
H necessidade de mostrar o nome completo do empregado, mas este est dividido em trs colunas. Soluo: criar uma funo No Data Model, criar uma coluna frmula dentro do grupo g_emp Clicar duplo na coluna CF_1, alterando suas propriedades:
Name: cf _emp_name Datatype: character Width: 220 Comments: Nome completo do empregado PL/ SQL Formula:

return(:emp_sobrenome||','||:emp_nome||' ' || :emp_meio_nome);

St e p 2 3 : A d i c i o n a n d o a s I n f o r m a e s d e Em p r e g a d o
Clicar no boto Additional Default Layout e selecionar a rea do frame m_empregado. O Report Wizard aberto Na tab Style, selecionar Tabular Na tab Groups, selecionar g_emp como Down Na tab Fields, selecionar:
cf _emp_name, emp_price, emp_quant

Na tab Labels, alterar:


Emp Price Tot Venda Emp Quant Qtd Venda Cf Emp Name Empregado Tamanho ( width) cf _emp_name para 15

St e p 2 4 : A p l i c a n d o a T e m p l a t e Clicar na tab Template para aplicar uma template ao layout do relatrio Clicar em Finish Fazer os ajustes de layout necessrios no Layout Model Clicar no Live Previewer para visualizar o relatrio

St e p 2 5 : A d i c i o n a n d o T o t a i s Ajustar os totais por cliente conforme layout da figura 22-6 na pgina 560 do livro Oracle Developer Advanced Forms & Reports Copiar para a rea do empregado os mesmos totais. A maneira mais fcil usar o duplicate (Ctrl-D)

St e p 2 6 : Re f i n a n d o o L a y o u t
Aumentar o espao entre os produtos
Selecionar o frame R_G_PROD (No Layout Editor, no Live Previewer ou no Object Navigator) Setar a propriedade Vert . Space Between Frames para .2 Se estiver no Live Previewer, a alterao j pode ser visualizada

Para que produtos no quebrem no final da pgina, setar a propriedade Page Protect do frame R_G_PROD para Yes

St e p 2 7 : Co m p l e t a r o Re l a t r i o Fazer os ajustes finais para que o relatrio fique conforme o layout da figura 22-6 na pgina 560 do livro Oracle Developer Advanced Forms & Reports

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

I n t e r v i e w Qu e s t i o n s

Or a c l e Fo r m s - B e g i n n e r
Na construo de um form, foi esquecido de adicionar uma scroll bar quando se criou o bloco usando o Data Block Wizard e o Layout Wizard. Como se pode adicionar agora? necessrio criar um bloco multirecord com overflow itens no rodap, como mostrado na figura da pgina 758 do livro. Todos esses itens esto no mesmo bloco. Como fazer para alguns itens aparecerem mltiplas vezes e outros somente uma?

Or a c l e Fo r m s - B e g i n n e r
Quando foi criado um bloco usando o Data Block Wizard, foi esquecido de atach-lo ao seu parent block. Como adicionar um relacionamento parent-child a dois blocos j existentes? Quais os passos necessrios para criar uma poplist ou LOV para mostrar uma lista dos departamentos do banco de dados?

Or a c l e Fo r m s - B e g i n n e r
Deseja-se mostrar a lista de empregados num bloco e mostrar o nome do departamento a que cada empregado pertence, como mostrado na figura da pgina 759 do livro. Como isto pode ser feito se tambm for permitido fazer INSERT, UPDATE e DELETE dos registros? Foram omitidos um dos cinco itens de dados do bloco. O bloco foi desenhado incluindo triggers, ento no pode ser eliminado. Listar os passos necessrios para adicionar um item ao bloco.

Or a c l e Fo r m s - B e g i n n e r Quando o usurio clicar no boto Save, desejado mostrar uma mensagem Tem certeza da operao? numa popup onde o usurio possa selecionar Yes ou No. Quais so os passos necessrios para implementar?

Or a c l e Fo r m s - B e g i n n e r
Existe o seguinte cdigo na trigger POST-QUERY de um form:
DECLARE CURSOR c_avg_sal_nr IS SELECT avg(sal) FROM emp WHERE deptno = :dept.deptno; BEGIN OPEN c_avg_sal_nr; FETCH c_avg_sal_nr INTO :dept.avg_sal_nr; CLOSE c_avg_sal_nr; END;

Como deve ser reescrito o cdigo para mover a funo com o cursor para o banco de dados?

Or a c l e Fo r m s - B e g i n n e r desejado que todas as datas em todos os forms usem a mesma format mask DD-MON-YYYY. Qual a melhor maneira de fazer isto? Quando um form aberto, desejado que um bloco como EMP faa query automaticamente. Como isto pode ser feito?

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Na Property Palette do bloco que se deseja mostrar a scroll bar, setar as propriedades:
Show Scroll Bar property para Yes Scroll Bar Canvas para o canvas onde o bloco aparece Scroll Bar Tab Page, somente se for um tab canvas

A soluo mais simples selecionar Tools -> Layout Wizard e navegar para a pgina que mostra o checkbox Display Scrollbar

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s Setar a propriedade Number of Items Displayed para 1 para cada um dos itens de overflow (neste exemplo, salary e commission). Dos demais itens, esta propriedade deve ficar com 0, indicando que o nmero de itens mostrados ser o mesmo que o Number of Records Displayed do bloco

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Seguir os passos:
Navegar para o bloco master no Form Builder Object Navigator e criar um novo relacionamento clicando no nodo Relations e ento no boto Create Digitar a condio de join para o bloco detalhe como mostrado na figura 23- 2 da pgina 567 do livro

Tambm pode ser feito reentrando no Data Block Wizard e preencher a tab Mater-Detail para o bloco detalhe

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Mtodo Poplist
Criar um record group no Object Navigator ou programaticamente atravs da built - in CREATE_GROUP_FROM_QUERY Criar um item com tipo List Item No cdigo para popular a poplist (por exemplo, na trigger WHEN-NEW-FORM- INSTANCE ou numa procedure chamada por esta), deve-se popular o record group usando a built -in POPULATE_GROUP Popular a poplist usando a built - in POPULATE_LIST
continua...

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Mtodo LOV
Usar o LOV Wizard para criar Criar o LOV manualmente:
Criar um record group. Numa poplist deve haver somente duas colunas na query. Usando um LOV, pode haver qualquer nmero de colunas no record group Criar o LOV e base-lo no record group criado Para o LOV mostrar um valor aps a seleo de OK, deve-se especificar uma coluna de retorno apropriada para a coluna do LOV. Para invocar o LOV, criar um boto que dispare a built-in SHOW_LOV ou LIST_VALUES

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
A forma tradicional colocar o seguinte cdigo na trigger POST-QUERY do bloco EMP:
DECLARE CURSOR c_dname_tx IS SELECT dname FROM dept WHERE deptno = :emp.deptno; BEGIN OPEN c_dname_tx; FETCH c_dname_tx INTO :emp.dname; CLOSE c_dname_tx; END;

Este mtodo tem a desvantagem de disparar um cursor separado para cada linha do bloco recuperado. Um mtodo melhor usar uma view updateable, fazendo join de DEPT e EMP. A coluna dname deve ser setada para Query Only

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Criar um item no Object Navigator (o default um database item) e alterar as propriedades:
Data Type Maximum Length Visible = Yes Prompt Canvas

No canvas selecionado, posicionar o item. Outra forma duplicar um item semelhante e alterar suas propriedades

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
Seguir os passos:
Criar um alert chamado Save no Object Navigator, alterando as propriedades:
Message Button 1 Label Button 2 Label

Na trigger WHEN-BUTTON-PRESSED do boto Save colocar o seguinte cdigo:


BEGIN IF show_alert( SAVE ) = ALERT_BUTTON1 THEN commit_form; END IF; END;

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s Pega-se a referncia do form e passa-se como um parmetro para a funo. Melhor do que tentar gravar diretamente no item, a funo deve retornar um valor e atribuir aquele valor ao item. A funo preferencialmente deve ficar numa package. O cdigo da funo fica conforme descrito a seguir.
continua...

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s
FUNCTION avg_sal_nr (p_deptno dept.deptno%TYPE) RETURN NUMBER IS CURSOR c_avg_sal_nr (p_dept dept.deptno%TYPE) IS SELECT avg(sal) avg_sal_nr FROM emp WHERE deptno = p_dept; v_casr c_avg_sal_nr%ROWTYPE; v_found BOOLEAN; BEGIN OPEN c_avg_sal_nr (p_deptno); FETCH c_avg_sal_nr INTO v_casr; v_found := c_avg_sal_nr%FOUND; CLOSE c_avg_sal_nr; RETURN v_casr.avg_sal_nr; END f_avg_sal_nr;

O cdigo na trigger POST-QUERY fica:


:dept.avg_sal_nr := avg_sal_nr (:dept.deptno);

Or a c l e Fo r m s - B e g i n n e r - Re s p o s t a s Criar um campo data com a format mask apropriada. Colocar numa object library e ligar a flag SmartClass. Ento, quando forem criados campos data no form, fazer um subclass da SmartClass. Na trigger WHEN-NEW-FORM-INSTANCE ou numa procedure chamada por ela, colocar o seguinte cdigo:
go_block ( EMP ); execute_query;

Or a c l e Fo r m s - I n t e r m e d i a t e
Os usurios devem poder digitar um employee ID. Se o cdigo for vlido, deve automaticamente popular um item adjacente com o nome do empregado. Se no for vlido, o usurio deve receber uma mensagem. Como fazer isso? Sobre a capacidade de digitar um cdigo e retornar o nome do empregado, se for desejado utilizar esta mesma funcionalidade em diversos lugares em diferentes forms, qual a melhor maneira de fazer isto?

Or a c l e Fo r m s - I n t e r m e d i a t e
Uma aplicao multi-tab com um bloco master na primeira tab e diferentes blocos detalhe em cada uma das outras tabs. Quando feita query do primeiro bloco h muita demora porque se faz tambm a query em todos os blocos detalhe. Como se pode evitar a query dos blocos detalhe e somente fazer isso quando suas tabs forem selecionadas? Como pode ser feito um bloco Employee multirecord e uma poplist para selecionar um Department para que s apaream os empregados daquele departamento, conforme figura da pgina 761?

Or a c l e Fo r m s - I n t e r m e d i a t e
Um programador jnior criou alguns itens requeridos no form setando a propriedade Required para Yes na Data Section das Property Palettes de cada item. Os usurios reclamaram que, quando clicam no item, no podem sair deles sem digitar algum valor. O programador jnior alterou a propriedade Required para No. Agora, quando os usurios tentam sair ou salvar o form sem entrar algo naqueles itens, recbem a mensagem FRM-40508 ORACLE error: unable to INSERT record. De que forma mais amigvel pode-se gerenciar itens requeridos no Oracle Forms?

Or a c l e Fo r m s - I n t e r m e d i a t e -Re s p o s t a s
necessrio codificar uma trigger WHENVALIDATE-ITEM, que pode ser colocada a nvel de item, bloco ou form. Assumindo que os itens esto num bloco chamado CONTROL, o cdigo chamado IN_EMPNO e o item texto para o nome do empregado, OUT_TX. O cdigo fica assim:
DECLARE CURSOR c_valid_emp (p_empno emp.empno%TYPE) IS SELECT ename FROM emp WHERE empno = p_empno; BEGIN OPEN c_valid_emp (:control.in_empno); FETCH c_valid_emp INTO :control.out_tx; IF c_valid_emp%NOTFOUND THEN :control.out_tx := Empregado no cadastrado ; END IF; CLOSE c_valid_emp; END;

Or a c l e Fo r m s - I n t e r m e d i a t e -Re s p o s t a s Assumindo que foi criada esta funcionalidade para a questo 1 nos itens IN_EMPNO e OUT_TX. Para replicar esta funcionalidade, copiar um object group para os itens descritos. Guardar este object group numa object library para que possa ser copiado ou subclassed facilmente em diversos forms.

Or a c l e Fo r m s - I n t e r m e d i a t e -Re s p o s t a s
Existem dois passos:
Quando so criados os relacionamentos master-detail usando o Form Builder Data Block Wizard,os blocos child so consultados automaticamente sempre que o master consultado. Localizar o relation para o bloco child no nodo Relations do Object Navigator abaixo do parent block. Setar as propriedades Deferred e Automatic Query para Yes. Setando a propriedade Deferred para Yes no bloco child significa que quando o bloco parent for consultado, o bloco child no deve ser consultado automaticamente. Setando a propriedade Automatic Query para yes significa que no necessrio fazer EXECUTE_QUERY explcito para popular o bloco, basta navegar para o bloco. Assumindo que o bloco child chama-se EMP e aparece na tab page 2, a nvel de form, criar a trigger WHEN-TAB- PAGECHANGED com:
IF :system.tab_new_page = go_block ( EMP ); END IF; EMP THEN

Or a c l e Fo r m s - I n t e r m e d i a t e -Re s p o s t a s
A melhor forma de resolver criar um falso relacionamento master-detail entre uma poplist e um control block, seguindo os passos:
Criar uma poplist chamada DEPTNOLIST dentro de um control block chamado CONTROL Popular a poplist com um record group contendo os nomes e nmeros dos departamentos de todos os departamentos da poplist Criar uma trigger WHEN- LIST-CHANGED com o cdigo:
go_block ( EMP); execute_query;

Na Property Palette do bloco EMP, alterar a propriedade WHERE clause para:


deptno = CONTROL.DEPTNO_LIST

Or a c l e Fo r m s - I n t e r m e d i a t e -Re s p o s t a s O Forms permite a opo de fazer a validao de preenchimento de campos s acontecer quando o registro validado. Isto feito setando a propriedade do mdulo form Defer Required Enforcement para Yes.

Or a c l e Fo r m s - A d v a n c e d
Dado um form com bloco multirecord usado para selecionar employees como mostrado na figura da pgina 762. No primeiro item, seleciona-se um department. Uma vez selecionado um department, podem-se selecionar employees no segundo item. Como pode ser construdo um form de forma que ao ser selecionado um department no primeiro item, os usurios somente possam ver employees do department selecionado? (Obs.: Os objetos que parecem poplists so na verdade itens com botes anexos que mostram LOVs)

Or a c l e Fo r m s - A d v a n c e d
Como pode ser feito um form com multitab canvas e tambm com subtabs? Desenvolvedores jnior pedem auxlio sobre o seguinte problema: Esto tentando criar um stacked canvas com alguns itens. Foi usado o comando SHOW_VIEW para o stacked canvas ser mostrado. Quando o form executado, o canvas aparece e desaparece rapidamente. O que est errado e como pode ser corrigido?

Or a c l e Fo r m s - A d v a n c e d
Assumindo que se est usando a tabela location juntamente com emp e dept. desejado selecionar uma location numa poplist e somente ver employees daquela location, como mostrado na figura da pgina 763. Notar que no h cdigo de identificao da location na tabela emp. Como isto pode ser implementado?

Or a c l e Fo r m s - A d v a n c e d
H um form que se deseja selecionar uma Person de uma lista ativada por um boto (LOV). O database contm centenas de milhares de nomes, tornando um scrolling atravs de uma lista, uma opo invivel. necessrio usar uma locator window separada com alguns critrios de seleo para ajudar a encontrar uma pessoa especfica. Esta mesma funcionalidade ser requerida em mltiplos forms.
Esta funcionalidade deve ser criada como um form ou como um objeto group locator numa object library? Como pode ser implementado usando a estatgia selecionada? Quais so os prs e contras de cada estratgia?

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
Pode ser implementado com poplists, mas no to fcil quanto com LOVs.
Usando um LOV, o boto para a primeira coluna, DEPT, mostra um LOV com uma lista dos departamentos baseados na seguinte query de record group:
SELECT deptno, dname FROM dept ORDER BY dname;

O LOV para a segunda coluna baseado na seguinte query de record group:


SELECT empno, ename FROM emp WHERE deptno = :emp.deptno ORDER BY ename;

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
Seria simples de responder se o Oracle Forms inclusse a funcionalidade de tal forma que um tab canvas pudesse ser tratado como um display item numa page de outro tab canvas. Entretanto, tab canvases comportam-se mais como stacked canvases e podem somente residir em content canvases. Podese porm ter mltiplos tab canvases visveis ao mesmo tempo com um no topo de outro. desta forma que esta questo pode ser resolvida. preciso ter certeza que o subtab canvas aparea no topo do tab canvas primrio quando este est visvel, ou no ser possvel visualiz-lo. necessrio criar um tab canvas numa posio e o subtab outro tabbed canvas pequeno o suficiente para caber inteiro numa pgina do tab canvas principal, como mostrado na figura 23-6 da pgina 579. continua...

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
... Executar um comando SHOW_VIEW ( subtab ), onde subtab o nome da subtab, na pgina onde a subtab deve aparecer. O HIDE_VIEW deve ser usado para esconder a subtab nas demais pginas. Para evitar que a navegao para itens da tab principal faa desaparecer a subtab, colocar o comando SHOW_VIEW( subtab ) na trigger WHEN-NEW-BLOCK-INSTANCE do bloco que contm os itens da tab page onde a subtab aparece.

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
Stacked canvases no podem ser mostrados se o item onde o cursor est fica abaixo do stacked canvas. Se aquele item estiver abaixo do stacked canvas, far com que o stacked canvas desaparea assim que o item seja mostrado. Por este motivo o stacked canvas aparece por um instante e desaparece. A soluo pode ser tanto navegar para um item no stacked canvas, que por definio no esteja embaixo do stacked canvas, ou navegar para um item explicitamente no abaixo do stacked canvas.

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
o clssico problema de haver um bloco filtrando numa coluna que no est na base table. Dada a simplicidade deste exemplo, podese criar uma updateable view, basear o bloco nessa view e usar uma simples WHERE clause. Uma soluo melhor filtrar por uma subquery, neste exemplo:
DECLARE v_where_tx VARCHAR2(2000); BEGIN IF :loc IS NOT NULL THEN v_where_tx := DEPTNO IN (SELECT deptno FROM dept || WHERE loc = ||:dept.loc|| ) ; ELSE v_where_tx := NULL; END IF; set_block_property ( EMP , default_where, v_where_tx); go_block ( EMP ); execute_query; END;

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
A resposta para cada item:
Aqui mais uma questo de opinio e estilo de programao. Pode-se tanto constru- lo como um object group e fazer um subclass em cada form onde for usado, ou fazer um form separado passando alguns parmetros Implementao
Object group
Criar um object group com todos os objetos do locator Colocar o object group numa object library Acessar conforme a necessidade nos forms Pode ser necessrio uma funo especial para invocar o locator passando o nome do campo onde o cdigo do empregado deve retornar

Form separado
Um pouco mais complicado Usar o comando CALL_FORM O form chamado deve gravar os resultados em variveis globais ou de package para que o chamador possa recuperar continua...

Or a c l e Fo r m s - A d v a n c e d - Re s p o s t a s
Usando form separado, a aplicao ser mais eficiente devido ao cdigo ser menor. O form para a pesquisa s ser carregado quando invocado. Porm, a cada chamada ele ser novamente carregado. Com o object group a aplicao fica mais pesada, mas a chamada pesquisa mais rpida

Or a c l e Re p o r t s - B e g i n n e r
Todas as questes nesta seo referem-se ao seguinte report: Master-detail mostrando os cdigos e nomes dos departamentos (dept) e os cdigos e nomes dos empregados (emp) em cada departamento. Os departamentos devem ser mostrados mesmo que no tenham empregados. Escrever a SQL query para este report
Desenhar o Data Model com os grupos Se fosse usado o Report Wizard para gerar um default layout , como este seria? Desenhar os frames e colocar os objetos do report , labels e campos de dados em cada frame, onde apropriado

Or a c l e Re p o r t s - B e g i n n e r
Para cada frame no Layout Model, qual devem ser os valores para as propriedades Vertical Elasticity e Horizontal Elasticity e repeating direction para os repeating frames? Cada departamento deve comear numa nova pgina. Como isto pode ser feito? Em vez de haver cada departamento numa nova pgina, como fazer para criar uma separao de 1 entre cada departamento?

Or a c l e Re p o r t s - B e g i n n e r
Deve ser mostrado total de recebimento (salary e commission). Como deve ser modificado o report para suportar isto? Nmeros das pginas devem aparecer no topo de cada pgina direita. Como isto pode ser feito sem usar o Report Wizard? Ao executar o report, o nmero da pgina aparece somente na primeira pgina. Como isto pode ser corrigido?

Or a c l e Re p o r t s - B e g i n n e r
Um report que foi rodado com sucesso tem que ter mais um campo. Aps adicionar o campo, rodando o report ocorre a seguinte mensagem de erro: The xxx field references a column xxx at a frequency below its group (O campo xxx referencia uma coluna xxx numa frequncia abaixo de seu grupo). O que aconteceu e como corrigir o problema?

Or a c l e Re p o r t s - B e g i n n e r Como fazer para usar um formato DD-MM-YYYY para mostrar o campo HIREDATE? Como pode ser criado um somatrio a nvel de report mostrando o nmero total de empregados da organizao sem somatrios a nvel de departamento?

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
A melhor maneira de fazer uma query simples com um outer join:
SELECT ALL dept.deptno, dept.dname, emp.empno, emp.ename, emp.hiredate, emp.sal, emp.comm FROM dept, emp WHERE emp.deptno (+) = dept.deptno;

Podem ser feitas tambm duas queries, uma para DEPT e outra para EMP e lig-las no Data Model. Porm no to eficiente quanto a soluo acima. continua...

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
...
O Data Model bem simples. Deve haver dois grupos, um acima e outro abaixo. Ponto extra para grupos nomeados devidamente. As colunas devem estar dispostas conforme mostra a figura 23- 8 da pgina 583 A figura 23-9 da pgina 584 mostra a resposta com os frames expandidos para ficar mais legvel. Os repeating frames devem estar identificados com seus respectivos campos

A propriedade Horizontal Elasticity de todos os frames deve ser setada para Fixed. A Vertical Elasticity para todos pode ser Variable, exceto para o header frame dos labels do employee, que deve ser Fixed. A propriedade Print Direction dos repeating frames deve ser Down.

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
Setar a propriedade Maximum Records per Page no repeating frame de Dept para 1. Outra alternativa possvel setar a propriedade Page Break After para Yes no enclosing frame de employee, se houver algo para quebrar aps. Inserindo uma linha ou objeto abaixo do enclosing frame de employee e setando a propriedade Page Break After para Yes, fora uma quebra de pgina entre aquele objeto e qualquer objeto ancorado a ele. Se no houver objeto para ancorar, esta estratgia no funciona. Se for escolhido colocar uma linha no frame, pode-se faz-la branca para no ser impressa (Branca melhor do que No line porque permite ainda visualizar a linha no Layout Model)

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s H mais de uma maneira de solucionar. A melhor setar a propriedade Vert. Space Between Frames para 1 no repeating frame de Dept. Pode-se tambm colocar uma linha branca de 1 entre cada departamento para forar o espaamento.

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
A melhor forma modificar a query adicionando sentena select:
NVL(sal, 0) + NVL(comm, 0) tot_comp_nr

Neste ponto, pode-se adicionar o campo no Layout Model. Se no foram feitas alteraes manuais, pode-se eliminar todos os objetos do layout e recri-lo. Outra forma de modificar o report criar uma view com a mesma expresso acima. Uma terceira alternativa criar uma coluna frmula no grupo de employee, contendo:
RETURN NVL(sal, 0) + NVL(comm, 0);

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
Uma soluo criar um campo no Layout Model e declarar sua propriedade Source como Page Number. Outra forma colocar o nmero da pgina num texto boilerplate usando & seguido pelo nome do campo. Por ser um campo de sistema, necessrio escrever &< page number> H uma propriedade em cada objeto do report chamada Print Object On, cujo default First Page. Alterar esta propriedade para All Pages

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s
Esta mensagem significa que h um objeto que no pode logicamente ser impresso no frame onde est colocado. Por exemplo, se um campo com o nmero do employee for colocado no repeating frame do Dept, no faz senso lgico e a mensagem de erro mostrada na execuo. A soluo verificar e colocar o objeto no local adequado. No Layout Model, abrir a Property Palette para o objeto Hiredate e setar a propriedade Format Mask para o formato desejado.

Or a c l e Re p o r t s - B e g i n n e r - Re s p o s t a s A melhor forma usar o Data Model para criar uma coluna summary fora de qualquer grupo no layout. Setar a propriedade Summary Function para Count com Source setado para Empno. Selecionar empno para a contagem a melhor prtica. A contagem feita somente para valores no nulos, por isso deve-se sempre fazer count de coluna obrigatria (not null).

Or a c l e Re p o r t s - I n t e r m e d i a t e
No mesmo report, se o nome do departamento aparecer no rodap da pgina e no houver espao para nenhum empregado (um header de departamento rfo), como pode-se fazer para que esse header seja movido para o incio da prxima pgina? Deseja-se escrever um report que liste os nomes dos empregados de um determinado departamento passado pelo Oracle Forms. Como pode ser feito?

Or a c l e Re p o r t s - I n t e r m e d i a t e
Dois grupos de informao independentes necessitam ser mostradas na mesma pgina. Por exemplo, mostrar todos os departamentos no topo e empregados abaixo, conforme figura na pgina 765. Como pode ser implementado? Havendo um report com trs partes independentes cada uma delas deve comear numa nova pgina. Como isso pode ser feito? Desenhar o Data Model e Layout Model para suportar um report matriz bsico onde as linhas so departamentos (dept),as colunas so as localizaes (locations) e cada clula contm uma contagem de empregados (employees), conforme mostrado na figura da pgina 766.

Or a c l e Re p o r t s - I n t e r m e d i a t e -Re s p o s t a s

Diferente das verses anteriores, quando criado um report default Group Above, o Reports no coloca mais um frame em volta dos objetos do master. H dois passos a serem seguidos:
Setar a propriedade Keep with Anchoring Object no enclosing frame para Yes Criar um enclosing frame envolvendo todos os headers, conforme mostrado na figura 23-10 da pgina 589.

Or a c l e Re p o r t s - I n t e r m e d i a t e -Re s p o s t a s
Para criar um report com informaes passadas pelo Oracle Forms, necessrio criar um parameter list no Forms e passar para o Reports atravs do comando RUN_PRODUCT ou RUN_REPORT_OBJECT. No Reports necessrio definir um user parameter, colocando-o na query, usando como bind variable ou lexical parameter. Criar a primeira query no Data Model usando o Report Wizard. Voltar para o Data Model e acrescentar a segunda query. No Layout Model, fazer um segundo layout onde desejado usando o Additional Default Layout tool.

Or a c l e Re p o r t s - I n t e r m e d i a t e -Re s p o s t a s
No enclosing frame envolvendo a primeira e segunda parte, setar a propriedade Page Break After para Yes. Alternativamente, pode ser setada a propriedade Page Break Before nos frames da segunda e terceira parte. Setar a propriedade Maximum Record per Page para 1 nos repeating groups no est correto. O Data Model deve mostrar dois repeating frames intersectando-se e sobrepondo-se com os campos nas posies corretas, conforme figura 23-13 na pgina 592.

Or a c l e Re p o r t s - A d v a n c e d
necessrio criar um report que tem um master com dois details independentes. Por exemplo, um Project pode ser associado com People e Equipment. Como ficaria o Data Model e Layout Model para este report? Criar um report que retorna os primeiros N employees (N um parmetro passado para o report). Como fazer para iniciar um report numa pgina diferente de 1?

Or a c l e Re p o r t s - A d v a n c e d
Para o modelo de dados mostrado na figura da pgina 767 e dados mostrados nas tabelas do banco de dados abaixo, qual a sentena SQL necessria? Como fica o Data Model? Assumir atributos razoveis para as entidades. Criar um report de uma pgina que dobra-se horizontalmente ao meio de forma que a metade de cima da pgina seja de cabea pra cima e a metade de baixo seja de cabea pra baixo, conforme mostrado na figura da pgina 768. Como isto pode ser feito no Reports?

Or a c l e Re p o r t s - A d v a n c e d - Re s p o s t a s
Ver figuras 23-14 e 23-15 na pgina 593. O modo mais eficiente construir a primeira query e o layout usando o Report Wizard. Ento, usar o Data Model e manualmente construir e atachar a segunda query. Usar o Layout Model para incrementar o tamanho do repeating frame de Project, usando o Additional Default Layout tool para criar o layout para equipment Na query existe a propriedade Maximum Rows to Fetch. Programaticamente ela pode ser setada com SRW.SET_MAXROW na trigger AFTER PARAMETER FORM. Ser necessrio colocar uma clusula order by na query para que os primeiros N registros sejam os desejados.

Or a c l e Re p o r t s - A d v a n c e d - Re s p o s t a s No h como referenciar o nmero lgico da pgina num texto boilerplate ou criar um objeto no Data Model para fazer isto. Deve ser feito atravs do comando SRW.SET_FIELDNUM ou uma format trigger no campo da margem do Layout Model.

Or a c l e Re p o r t s - A d v a n c e d - Re s p o s t a s
Aqui o modelo de dados para o report bem diferente do banco de dados. O Data Model deve ficar conforme a figura 23-16 da pgina 596. A sentena SQL necessria :
SELECT projt.proj_type_cd, projt.name_tx, expt.exp_type_cd, expt.name_tx, SUM(exp.amnt_nr) tot_amnt FROM project_type projt, project proj, expense exp, expense_type expt WHERE projt.proj_type_cd = proj.proj_type_cd AND proj.proj_id = exp.proj_id AND expt.expt_type_cd = exp.exp_type_cd GROUP BY projt.proj_type_cd, projt.name_tx, expt.exp_type_cd, expt.name_tx;

Or a c l e Re p o r t s - A d v a n c e d - Re s p o s t a s
Duas informaes importantes:
Usando o boto Rotate, pode-se rotacionar textos boilerplate, mas no campos no Reports Usando &, pode-se colocar valores de campos em boilerplates

Para a parte invertida, criar os labels e invertlos. Criar um texto boilerplate para cada campo de dado e inverter. O layout resultante mostrado na figura 23-18 da pgina 598.

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Re p o r t s T i p s & T e c h n i q u e s

Qu e b r a s d e P g i n a
As propriedades mais comuns para controlar quebras de pgina so:
Maximum Records per Page
Aplicada somente a repeating frames Normalmente deixada em branco para o Reports colocar o mximo possvel de registros numa pgina Se for setada para 1, somente 1 registro ser impresso por pgina

Page Protect
Para forar que todos os objetos de regular ou repeating frames fiquem na mesma pgina Se todo o frame couber na pgina, ele ser impresso, seno, quebra a pgina antes de imprimir o frame

Qu e b r a s d e P g i n a
Keep with Anchoring Object
Pode ser setada para qualquer objeto do layout Fora que o objeto e seu anchoring object apaream na mesma pgina Usada frequentemente para evitar group headers rfos no rodap da pgina

Page Break Before/ Page Break After


Somente controlam anchoring objects Podem ser setadas em qualquer objeto Geralmente necessrio setar explicitamente ncoras para assegurar-se que os objetos que se deseja mover so objetos child Seu uso mais comum quando h um report com mltiplas partes, uma abaixo da outra no mesmo report. Seno, raramente so usadas Exemplo na figura 24-1 da pgina 604

Qu e b r a s d e P g i n a Fl e x v e i s
Alguns passos necessrios para criar report com quebras definidas durante a execuo:
Criar um user parameter chamado p_break, com datatype character e valor inicial x (x entre aspas simples) Construir a query usando p_break como um lexical parameter. Por exemplo, para passar a coluna de quebra para um report baseado nas informaes do employee, criar a query:
SELECT &p_break break_col, empno, ename FROM emp, dept WHERE emp.deptno = dept.deptno;

Qu e b r a s d e P g i n a Fl e x v e i s
Criar uma query com dois grupos, um com a coluna de quebra e outro com as demais colunas. Pode-se tambm usar lexical parameters para adicionar clusulas FROM e WHERE para permitir quebras em mais tabelas Criar um report master-detail

Se for passado o valor DEPTNO para o parmetro P_BREAK, o relatrio far quebra por departamento

Qu e b r a s d e P g i n a Fl e x v e i s
Se para um report no for necessria uma quebra e nenhuma informao deve ser impressa nessa rea, seguir os passos abaixo:
Colocar todas as colunas de quebra num enclosing frame Colocar uma FORMAT trigger naquele frame de forma que se o valor de P_BREAK for no break no ser impressa a informao de quebra
FUNCTION M_1FormatTrigger RETURN BOOLEAN IS BEGIN IF :p_break = no break THEN RETURN (FALSE); ELSE RETURN (TRUE); END IF; END;

Na execuo, passar o literal no break (incluindo as aspas)

Co n t r o l e d e L a y o u t d e P g i n a n u m Re p o r t Es t i l o Fo r m
Para controlar os campos no layout gerado existem dois mtodos:
Setando o tamanho dos campos
No Report Wizard, alterar o tamanho dos campos para, por exemplo, forar cada um a figurar numa linha separada, conforme figura 24-2 da pgina 607 A desvantagem que os campos ficam muito grandes e necessrio ajust-los posteriormente Acrescent-las aos grupos para adicionar espao e forar o wrap de linha, conforme figura 24-3 da pgina 608 Preserva o tamanho dos campos, mas tende a poluir o Data Model com colunas adicionais No exemplo da figura 24-3 o interfield gap foi reduzido para 0 (zero) em Tools -> Preferences para que os campos pudessem ser alinhados. Uma largura fracional foi usada para o campo placeholder CP_4, como mostrado na figura 24-4 da pgina 609

Adicionando colunas placeholder

Ce n t r a l i za o Co m p l e x a d e u m Re p o r t
No h nenhum mecanismo no Reports para centralizar um layout na pgina. A soluo colocar um campo esquerda do frame do report que ir expandir ou contrair para mover o report para a direita para centralizar. Usar um campo varivel na horizontal que pode ser programaticamente preenchido com espaos (provavelmente na trigger BEFORE REPORT), explicitamente ancorando a margem esquerda do frame do report com a margem direita do campo varivel.

Es t r a t g i a p a r a U s a r Do t L e a d e r s Strings de caracteres repetidos, usualmente pontos, conectando dois campos de informao, como por exemplo no ndice de um livro (do ttulo at o nmero da pgina) Passos para implementar:
Criar o layout com todos os campos nos locais desejados

Es t r a t g i a p a r a U s a r Do t L e a d e r s
Criar um campo texto suficientemente longo para preencher a distncia entre um campo e outro que se deseja ligar por pontos
Preench-lo com pontos, ou outro caracter desejado Deve ser posicionado de forma a sobrepor os campos de dados
Selecionar o campo texto e o campo da esquerda e usar Arrange -> Align Objects, escolhendo Each Other, Horizontally Align Left e Vertically Align Top.

Em cada um dos campos de dados, colocar uma cor de preenchimento branco e selecionar Arrange - > Bring to Front . Setar a Horizontal Elasticity para Variable Ser necessrio ancorar explicitamente as colunas ao topo do frame para evitar que os campos da direita sejam movidos horizontalmente

Ge r e n c i a n d o Re p o r t s c o m Fo r m s
Reports muito grandes causam problemas Se um report possui vrias partes, pode-se quebrar em reports separados e fazer um form que gerencie a execuo de cada uma das partes Podem ser feitas diversas coisas, como:
Ignorar o preview do report Setar o form para rodar continuamente todas as partes do report Passar nmeros de pginas contnuos de um report para outro

Pa s s a n d o N m e r o d e P g i n a p a r a u m Re p o r t Para dar ao relatrio (dividido em partes) uma s sequncia de nmero de pgina Seguir os passos:
Setar um user parameter no report e uma varivel no form que o usurio possa informar na execuo ou tenha um valor inicial No Data Model do report , criar uma coluna placeholder fora de qualquer grupo no modelo No Layout Model, colocar um campo no layout onde o nmero da pgina ser mostrado com a coluna placeholder como seu Source

Pa s s a n d o N m e r o d e P g i n a p a r a u m Re p o r t
Escrever uma FORMAT trigger para o campo, que ir sobrepor o source original do campo a no ser que a trigger retorne False. O cdigo da trigger :
FUNCTION F_PAGENOFormatTrigger RETURN BOOLEAN IS v_temp_nr NUMBER; BEGIN srw.get_page_num(v_temp_nr); srw.set_field_num(0, v_temp_nr + (TO_NUMBER( :p_start_page_nr) - 1)); globals.page_numbers := v_temp_nr + TO_NUMBER(:p_start_page_nr) - 1; RETURN (TRUE); END;

Pa s s a n d o N m e r o d e P g i n a p a r a u m Re p o r t

A varivel GLOBALS.PAGE_NUMBERS uma varivel definida numa database package (globals), de onde o forms pode obter o nmero atualizado para passar para o prximo report Aqui h uma ineficincia, uma vez que, a cada pgina do report, feito um acesso ao banco de dados para gravar o valor

A l t e r n a n d o Ca b e a l h o s d e P g i n a
Para reports que podem ter cabealhos diferentes em cada pgina Exemplo: Num livro impresso, as pginas pares possuem um cabealho alinhado esquerda e nas mpares alinhado direita Para implementar:
Criar dois grupos de campos e frames no layout onde devem aparecer, um para pginas pares e outra para as mpares Em cada frame, escrever uma FORMAT trigger que busque o nmero da pgina. Se o nmero da pgina for mpar, retornar True na trigger do frame das pginas mpares e False na trigger do frame das pginas pares

A l t e r n a n d o Ca b e a l h o s d e P g i n a
Segue um exemplo da format trigger para frame de pgina par:
... v_page_num NUMBER; BEGIN srw.get_page_num (v_page_num); IF MOD((v_page_num + TO_NUMBER(:start_page) - 1)) ,2) != 0 THEN -- Pgina mpar RETURN (FALSE); ELSE RETURN (TRUE); END IF; END;

Co n t a g e n s d e Su b c o n j u n t o s d e Re g i s t r o s
Refere-se a relatrios que categorizam informaes, contam o nmero de registros retornados por cada categoria, mostrando a contagem em vez dos dados Passos para implementar:
No grupo detalhe do report , deve-se criar colunas frmula do tipo number para cada categoria. Cada frmula contm uma sentena IF para sua categoria. Se a condio satisfeita, ento retorna 1, seno retorna 0 (zero) No grupo master do report , criar colunas summary correspondentes a cada frmula, do tipo sum, com source da coluna frmula apropriada

Co n t a g e n s d e Su b c o n j u n t o s d e Re g i s t r o s
Assim obtm-se nas colunas summary o nmero de registros que se enquadram em cada categoria Exemplo de cdigo da coluna frmula:
BEGIN IF :occ_code = RETURN 1; ELSE RETURN 0; END IF; END; 0110 THEN

B a s e a n d o u m a Qu e r y n u m a Fu n c t i o n
Uma query pode ser baseada numa query de REF CURSOR, devendo-se seguir os passos:
Preparao da package com um sub- programa que retorne uma varivel ref cursor. Podemos utilizar a mesma package refcur, criada para o form refcur Criar um report manualmente. No Data Model desenhar uma Ref Cursor Query Complementar a funo que retornar a varivel cursor. Neste caso, temos:
FUNCTION QR_1RefCurDS RETURN refcur.reg_empdept IS w_reg_empdept refcur.reg_empdept; BEGIN refcur.c_select (w_reg_empdept, null); RETURN (w_reg_empdept); END;

B a s e a n d o u m a Qu e r y n u m a Fu n c t i o n
Aps compilar a funo, aparece um grupo com as colunas no Data Model Fechar o PL/ SQL Editor e criar um Report Wizard tabular layout

Ot i m i za o d e Pe r f o r m a n c e e m Re p o r t s
Usar nmero pequeno de queries
Mltiplas queries linkadas num report causam grande nmero de cursores sendo executados para rodar o report

Evitar uso de colunas frmula que requerem acesso ao banco de dados


sempre aconselhvel criar funes no banco de dados As frmulas a nvel de report so aceitveis por executarem somente uma vez A funo pode estar contida numa package e ser chamada diretamente na sentena SQL ou colocada numa view e o report basear a query na view

Ot i m i za o d e Pe r f o r m a n c e e m Re p o r t s
No recuperar registros detail que no sero mostrados Fazer tuning na sentena SQL
Indexao Database hints Database tuning

Em reports com somatrios observar o uso de GROUP BY na query em vez de fazer master-detail

Cuidado com bind variables, alteraes de verses de database ou utilizao de outro database

A incluso de uma bind variable pode modificar a maneira como uma query executada A troca de verso do database pode causar o mesmo impacto, bem como a utilizao de um banco diferente do usado para teste

Ot i m i za o d e Pe r f o r m a n c e e m Re p o r t s

Evitar usos de imagens desnecessrias


Imagens podem gerar um grande overhead impresso do report e at afetar sua execuo Quando necessrio, utilizar a menor resoluo possvel

Performance de impressora
Verificar a velocidade de impresso de um relatrio nas impressoras disponveis

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s I t e m T i p s a n d Tec hniques

H i e r a r c h i c a l T r e e Co n t r o l
Representao de rvores hierrquicas, como usado no Object Navigator para representar os objetos e suas subordinaes Pode ser usada para representar tabelas com auto-relacionamento A partir da release 6.0 passa a ser um controle nativo do Forms, com propriedades, built-ins e triggers A figura 25-1 da pgina 623 mostra uma implementao de hierarchical tree control. Quando o usurio seleciona um empregado na rvore, suas informaes so mostradas no bloco direita

H i e r a r c h i c a l T r e e Co n t r o l
Preparao
Escrever uma sentena select que retorna linhas num loop recursivo Deve ser usado START WITH para indicar onde a query deve iniciar o loop e CONNECT BY para indicar o link parent -child. Ser gerada uma pseudo-coluna chamada LEVEL indicando onde o registro est na hierarquia
SELECT level, ename, empno, mgr FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr;

H i e r a r c h i c a l T r e e Co n t r o l
Passos
Criar um control block com a propriedade Number of Records Displayed setada para 1. O tree control deve ser o nico item deste bloco de controle No Layout Editor criar uma hierarchical tree control utilizando seu boto Setar as propriedades do tree control. Pode ser redimensionado ou trocadas as cores. A propriedade mais importante Data Query, que onde ser colocada a sentena select previamente preparada Escrever uma trigger para popular a rvore a partir da query. Pode ser feito em qualquer ponto do form, mas um local lgico pode ser a trigger pre-form. Usar o seguinte cdigo:
ftree.populate_tree ( CONTROL.EMP_TREE );

H i e r a r c h i c a l T r e e Co n t r o l
Na query, a sentena select deve incluir cinco colunas na seguinte ordem:
Estado Inicial
Indica se o nodo deve estar expandido ou collapsed. Os valores possveis so 1 para expandido, -1 para collapsed e 0 para mostrar o registro no mesmo nvel que seu registro parent. Pode-se usar a funo DECODE para setar este estado inicial baseado no LEVEL ou outro critrio

Node Tree Depth


Posio na hierarquia. Usa-se a pseudocoluna LEVEL para este propsito. Um registro de topo ter level 1

Node Label
Valor mostrado na hierarquia. Se o valor da coluna do select for um cdigo, melhor usar um nome ou descrio

H i e r a r c h i c a l T r e e Co n t r o l
Node Icon
Pode-se associar um cone que ser mostrado ao lado do label. O nome do cone no deve conter a extenso nem o diretrio. Pode-se usar DECODE para mostrar diferentes cones nos nodos. O cone deve estar no diretrio de trabalho ou num dos diretrios setados no registry (UI_ICON)

Valor do Dado
Valor do nodo que ser usado quando o nodo for selecionado. Usualmente um cdigo que representa o label do nodo

H i e r a r c h i c a l T r e e Co n t r o l
Exemplo de query
SELECT decode(level, 1, 1, -1), level, INITCAP(ename), parar , empno FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr

Esta query mostrar o nome do empregado como label e o cdigo como valor do nodo. O nvel 1 ser expandido e os demais collapsed. O cone parar ser mostrado ao lado de cada label

H i e r a r c h i c a l T r e e Co n t r o l Usando um Record Group


Pode- se tambm usar um record group como data source para a hierarchical tree, preenchendo a propriedade Record Group em vez da propriedade Data Query. A vantagem de usar um record group que um objeto que pode ser reutilizado por diversas hierarchical tree, se houver, no mesmo form

H i e r a r c h i c a l T r e e Co n t r o l
Passos adicionais
Se for desejado um bloco que mostre os detalhes de um registro, deve-se criar o bloco com os itens e codificar numa trigger WHEN-TREE- NODE-SELECTED no bloco CONTROL o seguinte:
go_block ( EMP ); set_block_property ( EMP , default_where, EMPNO= || ftree.get_tree_node_property ( CONTROL.EMP_TREE , :system.trigger_node, ftree.node_value)); execute_query;

setada a propriedade WHERE Clause do bloco para o valor selecionado no nodo. Se estiver sendo permitida seleo em mltiplos nodos, devem ser guardados os cdigos selecionados numa varivel e us-la para construir uma lista para a clusula where

H i e r a r c h i c a l T r e e Co n t r o l
Outros passos podem ser feitos para tornar a hierarchical tree control genrica para uma query especfica e colocar na object library. Pode- se tambm carregar a query em tempo de execuo atravs de:
ftree.set_tree_property ( CONTROL.EMP_TREE , FTREE.QUERY_TEXT, SELECT decode(level,1,1,-1), level, INITCAP(ename), || tbrun , empno FROM emp START WITH mgr IS NULL || CONNECT BY PRIOR empno = mgr );

H i e r a r c h i c a l T r e e Co n t r o l
Outras Propriedades
Allow Empty Branches
Se for setada esta propriedade para Yes, o tree control mostrar nodos sem filhos com um + ou - embora no tenham filhos. O default No, fazendo os nodos filhos mais baixos (folhas) no mostram os smbolos de expanso

Multi- Selection
Setando para Yes (o default No), habilita ao usurio a escolha de mais de um nodo usando Shift-Click ou Ctrl-Click

Show Lines
Se for Yes (default), sero desenhadas linhas para ligar os nodos entre si

Show Symbols
Se for Yes o control mostrar os smbolos de expanso + e em cada nodo. No ser possvel expandir ou fazer collapse de nodos manualmente, somente atravs de clique duplo ou programaticamente

H i e r a r c h i c a l T r e e Co n t r o l
Built-Ins Prefixar com o nome da package FTREE
GET_TREE_PROPERTY SET_TREE_PROPERTY GET_TREE_SELECTI ON SET_TREE_SELECTI ON GET_TREE_NODE_PROPERTY SET_TREE_NODE_PROPERTY GET_TREE_NODE_PARENT FI ND_TREE_NODE POPULATE_TREE ADD_TREE_DATA ADD_TREE_NODE POPULATE_GROUP_FROM_TREE DELETE_TREE_NODE Busca as propriedades de um tree control Seta as propriedades de um tree control Para obter uma lista de nodos selecionados Para setar a seleo de um nodo Busca as propriedades de um determinado nodo Seta as propriedades de um determinado nodo Para encontrar o nodo parent de um nodo Encontra o prximo nodo com um valor de dado que se deseja encontrar Carrega os valores da query ou record group para o tree control Adiciona um conjunto de dados abaixo de um nodo Adiciona um elemento abaixo de um nodo Carrega os dados de uma rvore para um record group j existente Remove um elemento da rvore

H i e r a r c h i c a l T r e e Co n t r o l Triggers
WHEN-TREE-NODE-ACTIVATED Disparada quando o usurio d clique duplo no nodo ou pressiona ENTER quando o nodo est selecionado WHEN-TREE-NODE-EXPANDED Disparada quando o usurio clica no + ou para fazer expand ou collapse WHEN-TREE-NODE-SELECTED Disparada quando o usurio clica num nodo para selecion-lo :SYSTEM.TRIGGER_NODE Varivel do sistema que determina qual nodo disparou a trigger

Dy n a m i c Po p l i s t s A definio bsica de um item poplist inclui valores estticos na propriedade Elements in List A carga dinmica de poplist mais apropriada para tabelas de cdigos e lookup tables com poucas linhas (menos de 100 linhas)

Dy n a m i c Po p l i s t s
Preparao
Pode-se preparar uma package para carregar dinamicamente um record group usando a built -in POPULATE_GROUP, carregando ento o list item com a built -in POPULATE_LIST

Ingredientes
Um item poplist
Deve ser subclassed de um objeto de object library para possuir as propriedades visuais corretas

Uma tabela para carregar na Poplist


Preparar a query que retornar os dados para a lista

Dy n a m i c Po p l i s t s
Passos
Criar um record group
Criar no Object Navigator com a query que recuperar os valores e suas descries. Por exemplo, um record group chamado DEPT pode ser baseado na seguinte query:
SELECT dname, to_char(deptno) FROM dept ORDER BY deptno

Devem haver somente duas colunas recuperadas. A primeira ser o label na lista, a segunda, o valor associado ao label. Ambas colunas devem ser caracter. A propriedade Data Type do item poplist deve ser setado apropriadamente, mesmo que a poplist retorne campos caracter Pode-se criar um record group atravs da built-in CREATE_GROUP_FROM_QUERY

Dy n a m i c Po p l i s t s
Carregar o record group e o list item
Na trigger WHEN-NEW-FORM-INSTANCE deve-se chamar as built-ins POPULATE_GROUP e POPULATE_LIST Para evitar a warning FRM-30351: No list elements defined for list item criar um item nulo na propriedade Elements in List. Este elemento ser apagado no momento da carga da lista

V a l o r e s d e Ch a v e s Sy s t e m -A s s i g n e d
Tratamento das tabelas que possuem a coluna da primary key populada por uma sequncia Forms e Sequences
Pode-se assinalar o prximo valor de uma sequncia a um item colocando- se o nome da sequncia na propriedade Initial Value (:SEQUENCE.< nome_seq> .nextval) Sempre que for inserido um novo registro, uma nova sequncia ser buscada O problema que a busca ocorre sempre que o cursor navega para um novo registro, mesmo que este seja ou no comitado. Uma soluo melhor somente buscar a sequncia quando a linha inserida

V a l o r e s d e Ch a v e s Sy s t e m -A s s i g n e d
Usando uma Database Trigger
Outra opo buscar o prximo valor da sequncia numa database trigger BEFORE INSERT row-level Se o form no utilizar essa coluna, esse o melhor mtodo a ser usado Se o item aparecer no form e a propriedade DML Returning Value for setada para Yes, o novo valor atualizar o item do form automaticamente. Entretanto, essa atualizao ocorre aps todos os blocos detalhe. Portanto, este no o melhor mtodo quanto o form contm blocos detalhe

V a l o r e s d e Ch a v e s Sy s t e m -A s s i g n e d Usando uma Trigger Pre-Insert


Esta trigger disparada antes da sentena insert seja enviada para o database Se o campo for populado com a sequncia nesta trigger, todos os blocos detalhes podero fazer uso deste valor Pode- se definir uma funo no banco de dados que retorne o nmero da sequncia. Na pgina 636 h um exemplo de uma funo desse tipo

Ca r r e g a n d o I t e n s I m a g e m
A fim de evitar a necessidade de se colocar uma imagem em cada canvas onde se deseja que esta seja mostrada, pode-se usar a built-in READ_IMAGE_FILE que busca a imagem de um arquivo do sistema operacional Ingredientes
Um item texto contendo o nome do arquivo imagem a ser carregado. O arquivo deve estar localizado no diretrio de trabalho ou num diretrio das variveis FORMS60_PATH ou ORACLE_PATH do registry Um item do tipo Image para mostrar a imagem carregada do arquivo

Ca r r e g a n d o I t e n s I m a g e m Passos
Na trigger PRE- FORM ou WHEN- NEW-FORMINSTANCE fazer a chamada da built -in READ_IMAGE_FILE para que seja carregado o arquivo para o item imagem

Tec las de Ac esso para It ens Tex t o


Em forms com grandes entradas de dados, os usurios acham mais fcil usar o teclado para diversas operaes O Forms implementa o conceito Windows de access keys que permite ao usurio mover o cursor para um objeto pressionando uma combinao de teclas O Forms extende o conceito de teclas de acesso de menu para outros objetos como botes radio group, botes e check boxes. No h entretanto para text items, list items e imagem

Tec las de Ac esso para It ens Tex t o


Definindo uma Access Key
Para os objetos suportados (botes radio group, botes e check boxes) a propriedade Access Key define qual tecla servir de atalho para aquele objeto, sendo ativado atravs da combinao de Alt e o caracter especificado As access keys so case- insensitive Os caracteres definidos para itens de menu tm precedncia sobre os objetos Se o label do objeto possuir a letra definida como access key, esta aparecer sublinhada somente durante a execuo do form

Tec las de Ac esso para It ens Tex t o


Para itens texto, que no possuem uma propriedade para especificar uma access key, o segredo criar um boto (chamado de access key button) no mesmo bloco para cada item que requer uma access key O boto tem as propriedades height e width zero e Visible Yes, de forma que a access key far o esperado (atravs de cdigo na trigger WHEN-BUTTON-PRESSED), mas o boto no ser visvel

Tec las de Ac esso para It ens Tex t o


Preparao
Para que seja bem genrico, o cdigo necessrio colocado numa procedure de library. Esta assume que o boto tem o mesmo nome do item para onde deve navegar, simplesmente removendo o sufixo _PB. Por exemplo, o item ename usaria o boto ename_pb para access key button

PROCEDURE access_key IS v_button VARCHAR2(80) := :system.trigger_item; v_go_item VARCHAR2(61) := substr(v_button,1, length(v_button) - 3); BEGIN IF NOT id_null(find_item(v_go_item)) THEN go_item(v_go_item); ELSE message( Erro na access key do item: ||v_go_item); raise form_trigger_failure; END IF; END;

Outro passo a criao do bloco com os itens texto necessrios

Tec las de Ac esso para It ens Tex t o


Passos
Criar o access key button
Localizado no mesmo canvas do item associado, setando as propriedades width e height para 0 e a propriedade Access Key para a tecla desejada

Criar um prompt com uma letra sublinhada


No possvel num prompt colocar caracteres normais e sublinhados ao mesmo tempo Aps criar o prompt, criar um boilerplate text com a letra da access key com a mesma fonte do prompt. No Layout Editor, sublinh-la e posicionar exatamente sobre o prompt Ver figuras na pgina 644

Tec las de Ac esso para It ens Tex t o


Outras idias
Pode-se usar esta mesma tcnica para mostrar um outro canvas Outra forma de tornar mais flexvel guardar o nome do item para o qual deve ser navegado na propriedade Label do access key button. Por exemplo, o boto ename_pb conteria na propriedade Label o valor emp.ename . A procedure access_key deve ser alterada:
go_item(get_item_property( name_in( system.trigger_item , label));

Ca r a c t e r e s c o m o c o n e s d e B o t e s
Em vez de usar arquivos de cones para botes, considerar o uso de caracteres de smbolos Elimina o problema de distribuio dos arquivos de cones e evita que o Forms tenha que buscar o arquivo no disco durante a execuo do form Para usar caracteres como cones:
Definir a propriedade Label do boto como o smbolo que se deseja representar Atribuir a fonte de smbolo desejada ( Symbol, WingDings, Monotype Sorts, etc)

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s B l o c k T i p s a n d Tec hniques

Cu s t o m i za n d o o N o m e d o s B l o c o s
O Data Block Wizard usa o nome da tabela como default para o nome do bloco. Cria cdigo para checagem de integridade e coordenao de bloco (para relacionamentos master-detail) usando esse nome. Tambm usa o nome do bloco na propriedade Copy Value from Item do item da foreign key de um master-detail Para alterar esse nome necessrio pesquisar em todo o cdigo (usando o menu Program -> Find and Replace PL/ SQL) e fazer as substituies necessrias. Alm disso deve-se alterar as propriedades Copy Value from Item e a propriedade Join Condition do relation

Cu s t o m i za n d o o N o m e d o s B l o c o s
Uma soluo melhor seria criar o bloco antes de usar o Data Block Wizard, da seguinte forma:
No Object Navigator, selecionar Data Blocks e clicar no boto Create. No dialog, selecionar Build a new data block manually . Isto criar um bloco com o nome BLOCKn, onde n um nmero Alterar o nome do bloco conforme o desejado e na propriedade Query Data Source colocar o nome da tabela na qual o bloco ser baseado Agora que o bloco tem o nome correto e a propriedade para lig-lo tabela, pode-se usar o Data Block Wizard a partir do menu Tools - > Data Block Wizard. No wizard, pode-se selecionar a tab Table e clicar no boto Refresh para mostrar as colunas

Fi l t r o Di n m i c o d e B l o c o
As aes padro de Enter Query e Execute Query no Forms permitem ao usurio entrar com critrios que modificam o resultado de uma query No se tem acesso sentena select que o Forms usa para executar a query, mas pode-se controlar a clusula where, atravs de:
Condies de query em itens na trigger PRE-QUERY Alteraes na propriedade WHERE clause do bloco

Fi l t r o Di n m i c o d e B l o c o
Condies de query na trigger PRE-QUERY
O ltimo passo da built -in EXECUTE_QUERY construir a sentena select baseada nas colunas representadas pelos itens no bloco. O critrio que o usurio digitou no modo Enter Query usado para construir a clusula where Pode-se alterar os valores entrados pelo usurio ou assinalar mais valores na trigger PRE-QUERY Por exemplo, para acrescentar na clusula where a condio empno = 10 , coloca-se o seguinte na PRE- QUERY:
:emp.empno := 10;

Estando nesta trigger o cdigo 10 no atribudo para o item, mas usado para gerar a clusula:
WHERE empno = 10

Fi l t r o Di n m i c o d e B l o c o
O efeito o mesmo como se o usurio tivesse digitado esse valor na tela, quando no modo Enter Query Quando no se deseja usar o operando = , possvel usar o smbolo # na frente da condio, dizendo assim ao Forms que deve copiar a string que segue o smbolo # para a clusula where
:emp.empno := # between 7300 and 7500 ;

A nica restrio que o campo deve ser caracter e a propriedade Query Length deve ser grande o suficiente para acomodar o nmero de caracteres assinalados para o item na trigger PRE-QUERY

Fi l t r o Di n m i c o d e B l o c o
Propriedade Where Clause do Bloco
Mtodo mais flexvel Carrega na propriedade do bloco toda a clusula where desejada Ser adicionada aos critrios entrados pelo usurio ou gerados na PRE-QUERY Exemplo:
v_where := empno in (101, 102, 103) ; set_block_property ( emp , default_where, v_where);

Pode ser feito em qualquer trigger, no requer tipos de dados especiais ou tamanhos para itens A varivel de sistema : system.last _query possui a sentena select completa da ltima query executada

Cl a s s i f i c a o Di n m i c a d e B l o c o
A propriedade Order By Clause do bloco tambm pode ser setada durante a execuo
set_block_property ( EMP , ORDER_BY, DEPTNO,ENAME );

Implementando Classificao Dinmica


Uma forma de permitir escolha de qual classificao usar criar um menu para cada tipo de classificao

List Item Order By


Outro mtodo a criao de um item poplist nonbase table contendo as colunas de sort Na trigger WHEN- LIST-CHANGED deve-se colocar o cdigo semelhante a:
set_block_property( EMP ,ORDER_BY,:control.sort_by); go_block ( EMP ); execute_query;

Cl a s s i f i c a o Di n m i c a d e B l o c o
Um exemplo desta lista mostrado na figura 26- 1 da pgina 653 Pode-se ainda disponibilizar mais de uma lista, permitindo ao usurio classificar por mais de uma coluna. Pode-se tambm oferecer uma opo de classificao ascendente ou descendente Mtodo que permite ao usurio selecionar as colunas de classificao clicando em botes no topo de cada coluna, conforme figura 26- 2 da pgina 654 Quando o usurio clica num boto, o bloco reconsultado e classificado pela coluna clicada A classificao unidimensional, ou seja, somente por uma coluna de cada vez Se o usurio clica novamente no boto da mesma coluna, a ordem de classificao passa para descendente e vice- versa

Botes Order by de Coluna

Cl a s s i f i c a o Di n m i c a d e B l o c o
Bloco de Botes
Um bloco separado contm os botes. Para habilitar um cdigo genrico, o nome do bloco o mesmo que o data block a ser classificado com um sufixo _HDR (Ex.: bloco EMP e EMP_HDR). As propriedades Keyboard Navigable e Mouse Navigate so setadas para No. O cursor nunca navegar para o bloco e o hint nunca ser mostrado. O cdigo genrico usa a propriedade Display Hint Automatically como uma flag para indicar a classificao ascendente ou descendente. O label dos botes funciona como prompt das colunas

Cl a s s i f i c a o Di n m i c a d e B l o c o
Trigger e Procedure Genrica
O bloco de botes possui uma trigger WHENBUTTON-PRESSED que dispara uma procedure numa library que executa os seguintes passos:
Determina o nome do boto pressionado: v_button_block_item := name_in( system.trigger_item ); Deriva o nome do data block retirando a extenso _HDR do nome do bloco de botes. O nome do item boto o mesmo que o item do data block a ser usado para classificao Determina a ltima direo de classificao (ascendente ou descendente) para o item utilizando a propriedade Display Hint Automatically do boto. Se for TRUE, a ltima classificao foi ascendente. A seguinte built-in busca o valor da propriedade:
get_item_property (v_button_name, AUTO_HINT);

Cl a s s i f i c a o Di n m i c a d e B l o c o
Remove a clusula order by da ltima query
v_pos := instr(name_in( system.last_query ), ORDER BY ); IF v_pos > 0 THEN v_order_by := substr( name_in( system.last_query ), v_pos + 10); END IF;

Seta a propriedade Where Clause do bloco


set_block_property(v_data_block, DEFAULT_WHERE, v_where);

Seta a propriedade Order By Clause do bloco para o nome da coluna (nome do boto) e o valor oposto determinado pela ltima ordem de classificao. Se a ltima classificao foi ascendente, o valor atual ser DESC e vice-versa

Cl a s s i f i c a o Di n m i c a d e B l o c o
Executa query no bloco. O valor atribudo nas clusulas where e order by sero usadas
go_block(v_data_block); execute_query;

Seta a propriedade Display Hint Automatically para o valor correspondente direo usada na ltima query. A varivel v_sort_order guarda a direo passada para a clusula order by
IF v_sort_order = DESC THEN set_item_property(p_button_name, AUTO_HINT, PROPERTY_FALSE); ELSE set_item_property(p_button_name, AUTO_HINT, PROPERTY_TRUE); END IF;

Cl a s s i f i c a o Di n m i c a d e B l o c o
Bloco baseado numa Procedure
Neste caso, tanto a ordem de classificao como a(s) coluna(s) devem ser passadas como parmetros para a procedure responsvel pelo select. A clusula order by poderia ficar assim:
ORDER BY decode(p_asc_desc, ASC , decode (p_order_by, ENAME , ename, EMPNO , TO_CHAR(empno, 099999999999999 ), HIREDATE , TO_CHAR(hiredate, j ), job ) ) ASC, decode(p_asc_desc, DESC , decode (p_order_by, ENAME , ename, EMPNO , TO_CHAR(empno, 099999999999999 ), HIREDATE , TO_CHAR(hiredate, j ), job ) ) DESC

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s M o d u l e T i p s a n d Tec hniques

T r a t a n d o Er r o s e M e n s a g e n s d o Fo r m s
O Forms retorna as mensagens de erro na linha de hint no seguinte formato:
XXX-99999: YYYYYYYY... Onde XXX : error_type 99999 : error_code YYYYY... : error_text Exemplo: FRM-40301: Query caused no records to be retrieved. Re-enter.

Se ocorrer um database error, o usurio necessita selecionar Display Error para ver o texto de erro. Aparece uma tela conforme mostrado na figura da pgina 661

T r a t a n d o Er r o s e M e n s a g e n s d o Fo r m s
Triggers
H duas categorias de cdigos que o Forms envia: erros e mensagens Trigger ON- ERROR
Usada para substituir o mecanismo do Forms para mostrar textos de erro Podem ser usadas as built-ins com ERROR

Trigger ON-MESSAGE
Usada para substituir o mecanismo do Forms para mostrar textos de mensagens Podem ser usadas as built-ins com MESSAGE

Disparadas em resposta a eventos do Forms Podem ser criadas a nvel de form

T r a t a n d o Er r o s e M e n s a g e n s d o Fo r m s
Funo Built-in ERROR_TYPE ERROR_CODE ERROR_TEXT MESSAGE_TYPE Significado Categoria do cdigo de erro (FRM para Forms) Nmero do cdigo de erro Texto descritivo para o cdigo de erro Categoria do cdigo da mensagem (FRM para Forms) MESSAGE_CODE Nmero do cdigo da mensagem MESSAGE_TEXT Texto descritivo para o cdigo da mensagem DBMS_ERROR_CODE Nmero do erro Oracle (usualmente negativo) ocorrido no database, mostrado no dialog Display Error DBMS_ERROR_TEXT Texto associado ao cdigo de erro. Se houver uma srie de erros, ser mostrada toda a pilha de erros

T r a t a n d o Er r o s e M e n s a g e n s d o Fo r m s
Usando Message
Built - in que mostra mensagens na linha de hint Se houver mais de uma chamada a esta built - in numa trigger, a segunda message causa que a primeira aparea num alert . A segunda mensagem aparece normalmente na linha de hint Pode-se evitar isto usando o parmetro no_acknowledge
message( Erro ocorrido na trigger , NO_ACKNOWLEDGE);

Entretanto, se houverem diversas mensagens, somente a ltima ser mostrada

T r a t a n d o Er r o s e M e n s a g e n s d o Fo r m s
Pode-se utilizar o efeito de mais de uma chamada a message para mostrar sempre em alert
message( Erro ocorrido na trigger ); message( );

A primeira mensagem ser mostrada num alert com um boto porque precisa ser visualizada antes de ser mostrada a segunda mensagem. A segunda mensagem s um espao em branco (uma string nula no funciona nesta situao), ento a linha de hint vai mostrar uma mensagem em branco

Si s t e m a d e A l e r t
Alerts so usados quando necessrio solicitar uma ao ao usurio ou fazer uma simples pergunta A alert window modal Podem conter:
Ttulo Mensagem Um entre trs cones De um a trs botes (um deles pode ser definido como default )

A figura 27-1 da pgina 667 mostra os componentes de alerts

Si s t e m a d e A l e r t
Os cones servem para categorizar as mensagens Passos para utilizar alerts:
Criar um objeto alert no Object Navigator Assinalar as propriedades Title, Alert Style (o cone), Message, Button 1 Label, Button 2 Label e Button 3 Label Escrever o cdigo para mostrar a mensagem usando a built - in SHOW_ALERT Processar o boto pressionado no alert

Todas as propriedades do alert podem ser alteradas programaticamente, exceto a Alert Style que designa qual cone ser mostrado na alert window. Desta forma, necessrio criar um alert para cada estilo

L o o p i n g En t r e Ob j e t o s Looping entre Itens


Para determinar qual item aparece primeiro no Object Navigator abaixo de um determinado bloco blk_emp
GET_BLOCK_PROPERTY ( BLK_EMP , FIRST_ITEM);

Para determinar qual o prximo item do Object Navigator aps o item blk_emp.item1
GET_ITEM_PROPERTY ( BLK_EMP.ITEM1 , NEXTITEM);

L o o p i n g En t r e Ob j e t o s
Looping entre Itens - Exemplo
PROCEDURE disable_all_buttons (p_block_name IN VARCHAR2) IS v_curr_item VARCHAR2(30); v_block_item VARCHAR2(61); BEGIN v_curr_item := get_block_property (p_block_name, FIRST_ITEM); WHILE v_curr_item IS NOT NULL LOOP v_block_item := p_block_name || . || v_curr_item; -- Desabilita se for um boto IF get_item_property (v_block_item, ITEM_TYPE) = BUTTON THEN set_item_property(v_block_item, ENABLED, PROPERTY_FALSE); END IF; v_curr_item := get_item_property (v_block_item,NEXTITEM); END LOOP; END;

L o o p i n g En t r e Ob j e t o s Looping entre Blocos


Para obter o nome do primeiro bloco no Object Navigator e do prximo acessvel, respectivamente
GET_FORM_PROPERTY ( <Nome-do-form> , FIRST_BLOCK); GET_BLOCK_PROPERTY( <Nome-do-bloco> , NEXTBLOCK);

Quando nextblock retornar um valor nulo porque se chegou ao ltimo bloco

L o o p i n g En t r e Ob j e t o s Looping entre Outros Objetos


No existe uma forma direta de determinar o nome de todos os canvases, windows ou qualquer outro objeto do form Para poder emular esta facilidade com outros objetos pode-se criar uma varivel que contenha os nomes desses objetos

T u n i n g d o s Fo r m s
Objetivos gerais:
Reduzir o tempo de carga e execuo do form Otimizar acessos ao database Reduzir necessidade de memria no client Minimizar o trfego de rede

Tuning fora do form


Tuning no Client Tuning na Rede Tuning no Database Tuning na Aplicao

T u n i n g d o s Fo r m s
Tuning dentro do form
Sugestes Gerais
Particionamento de cdigo
Uma parte no server, outra no client

Modularizao
Quanto menores os forms, mais rpido sero carregados

Menor quantidade de objetos


Em vez de usar itens sem serem mostrados (null canvas) para guardar valores variveis, usar variveis de packages. Os itens usam mais memria por terem valores de propriedades O mesmo se aplica a parmetros do form, que devem ser usados somente para receber valores passados ao form Evitar uso de variveis globais, pois usam memria extra e so difceis de gerenciar As variveis de packages tm menos overhead

T u n i n g d o s Fo r m s
Eliminar objetos boilerplate desnecessrios
Em vez de incluir objetos grficos (.TIF, etc) no canvas, utilizar a tcnica de carregar arquivos imagem

Propriedade Interaction Mode


Propriedade do mdulo form que permite especificar que o usurio possa parar uma query antes desta ser completada. Se for setada para Non-Blocking , o Forms mostra um dialog box conforme figura da pgina 679. Se o usurio pressionar o boto Cancel, a query ser interrompida. A melhor prtica deixar esta propriedade no seu valor default, Blocking

Forms Runtime Diagnostic (FRD)


Mtodo para capturar todos os eventos que ocorrem numa sesso form e gravar um arquivo com os detalhes desses eventos. Usar somente durante o desenvolvimento

Evitar database lookups


O uso da POST-QUERY deve ser reduzido, a abertura e fechamento de novos cursores ineficiente Solues possveis: usar views, variveis table PL/SQL, record groups

T u n i n g d o s Fo r m s
Propriedades de Bloco
DML Array Size
Pode reduzir o nmero de envio de dados pela rede. Se for setado para um nmero maior do que o default 1, o form envia mais de um registro para o banco de dados quando feito commit de uma sentena DML

Update Changed Columns Only


O default No, significando que, independente das colunas alteradas, todas participam do update. O update feito com todas as colunas com seus valores correntes. Setando esta propriedade para Yes pode ajudar se houverem muitos itens no bloco, mas usualmente altera-se somente alguns (e sempre os mesmos), evitando a necessidade de novo parse

Optimizer Hint
Pode especificar que o optimizer use um determinado plano de acesso para um grupo de dados, podendo-se alterar em tempo de execuo. No necessrio colocar os marcadores de comentrio (/* */)

T u n i n g d o s Fo r m s
Query Array Size
O nmero de registros buscados de uma vez num fetch podem afetar o tempo de resposta. O valor default zero, indicando que o array size o mesmo que o nmero de registros mostrados. Setando esta propriedade para um valor maior pode reduzir o trfego na rede, mas ir requerer mais memria no client

Number of Records Buffered


O default zero, indicando que o nmero de registros no bloco mantidos na memria igual ao nmero de registros mostrados mais trs. Quanto mais registros forem mantidos na memria, mais rpido eles iro reaparecer no form quando o usurio rola a tela. Os registros que excedem esse valor so buferizados no disco

Query All Records


O default No, o bloco inicialmente buscar somente o nmero de linhas setadas na propriedade Query Array Size, que mais rpido do que retornar todos os registros. O benefcio de setar para Yes a possibilidade de calcular valores sumarizados de todas as linhas. Tambm necessrio setar para Yes se houverem itens calculados e a propriedade Precompute Summaries estiver setada para No.

En c o n t r a n d o C d i g o e Ob j e t o s n u m Fo r m
Encontrando o cdigo
Para fazer pesquisa de palavras no form seleciona-se Program - > Find and Replace PL/ SQL Aparece uma janela permitindo fazer pesquisa e/ ou troca em todos os forms abertos

Encontrando objetos
No h utilitrio para pesquisar todas as ocorrncias de um determinado objeto No Object Navigator h uma caixa de Find permitindo localizar alguns objetos pelo nome No existe, porm, uma forma de localizar as referncias que esto contidas em propriedades

En c o n t r a n d o C d i g o e Ob j e t o s n u m Fo r m
Gerando o Forms Object List Report
Lista todos os objetos do form, inclusive o cdigo PL/ SQL num arquivo texto com o mesmo nome do form e extenso .txt Lista tambm informaes sobre a herana das propriedades atravs de um caracter esquerda da propriedade, usando os smbolos:
^ O * Propriedade default Propriedade subclassed Propriedade subclassed modificada Propriedade modificada

En c o n t r a n d o C d i g o e Ob j e t o s n u m Fo r m
Para executar, no Form Builder, selecionar o form desejado e File - > Administration -> Object List Report Gera um report de form, library, menu ou object library Pode tambm ser executado da linha de comando:
ifcmp60 module=<nome>.fmb userid=<usurio>/<senha> forms_doc=YES

Usando Forms Open API


Consiste de arquivos header e library que podem ser usados num programa C+ + para ler diretamente o arquivo .fmb

A l t e r a n d o a Fo r m a d o Cu r s o r
Built-in SET_APPLICATION_PROPERTY Exemplos:
SET_APPLICATION_PROPERTY(CURSOR_STYLE, BUSY ); SET_APPLICATION_PROPERTY(CURSOR_STYLE, DEFAULT );

Para determinar qual o formato do cursor num determinado momento pode-se usar a built-in GET_APPLICATION_PROPERTY O formato do cone depende da configurao de cada mquina

Ch a m a n d o Ou t r o s Fo r m s CALL_FORM
Starta outro form, mas o chamador permanece na memria Quando o form chamado finaliza, o controle repassado para o chamador Ambos forms usam a mesma conexo com o database, sendo assim impossvel fazer commit separado para cada um Atravs da built -in GET_APPLICATION_PROPERTY pode-se obter o nome do form chamador

Ch a m a n d o Ou t r o s Fo r m s NEW_FORM
Finaliza o chamador e remove-o da memria antes de startar outro form No h maneira de se obter o nome do form chamador. Se for necessrio voltar ao chamador necessrio controlar qual o nome desse form

Ch a m a n d o Ou t r o s Fo r m s OPEN_FORM
Permite mais de um form aberto simultaneamente Pode abrir sesses separadas no database Permite commit separado por form

Ch a m a n d o Ou t r o s Pr o g r a m a s
Host
Built - in que permite rodar outro comando do sistema operacional ou programa de modo sncrono Enquanto o comando est sendo executado, o form pra o processamento e no pode ser acessado. Quando o comando termina, o controle volta para o form Exemplo:
host ( NOTEPAD C:\ TEMP\ ARQUIVO.TXT );

Host Start
O comando start do Windows roda outro processo de forma assncrona Exemplo:
host ( start NOTEPAD C:\ TEMP\ ARQUIVO.TXT );

Ch a m a n d o Ou t r o s Pr o g r a m a s WinExec
Funo do Windows que permite outra forma de rodar um programa de forma assncrona Pode ser incorporada ao forms atravs da tcnica de Foreign Function Interface (FFI) Cdigo de exemplo de uso pode ser utilizado ou extrado da package win_api_shell localizada na library d2kwutil.pll

Ou t r o s T r u q u e s e T c n i c a s Sistema de Notas do Usurio


Permitir ao usurio fazer comentrios na aplicao durante a fase de testes e homologao A idia disponibilizar ao usurio uma tela para incluir comentrios sobre erros no funcionamento do sistema. Atravs de mecanismos simples, pode- se incluir numa tabela do database informaes de contexto, alm do comentrio digitado pelo usurio, facilitando seu monitoramento e soluo

Ou t r o s T r u q u e s e T c n i c a s Visualizando Windows e Canvases


Para visualizar o tamanho da window, selecionar View -> Show Canvas para mostrar a borda do canvas (normalmente de cor branca) e View -> Show View para mostrar a borda da window (normalmente de cor preta)

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s M e n u T i p s a n d Tec hniques

Cr i a n d o u m M e n u Passos bsicos para criao de um menu:


Planejar a estrutura Criar um novo mdulo de menu Abrir o Menu Editor Criar os cabealhos dos menus top- level Criar os itens Preencher as propriedades dos itens Compilar o menu

Cr i a n d o u m Po p u p M e n u Nova funcionalidade do Developer 2 Menu criado no nodo Popup Menus no form So acionados pelo click da direita Devem ser associados a um ou mais itens ou canvases no form, atravs da propriedade Popup Menu

Pr o p r i e d a d e s d o M e n u
Label
Palavra ou frase a ser mostrada durante a execuo A primeira letra maiscula ser a access key, a no ser que seja explicitamente colocado o caracter & na frente de uma outra letra

Menu Item Type


Plain
Valor default usado para a maioria das necessidades Mostra um check mark num item

Check Radio

Mostra um radio button como parte de um grupo ou como um item separado Linha para agrupar logicamente grupos de itens Aproveita a funcionalidade magic item

Separator Magic

Pr o p r i e d a d e s d o M e n u
Command Type
Null
Usar para separadores ou menu item types

Menu
Se o item for um menu de outro item de menu

PL/ SQL
Default. Associa um bloco ao item de menu

Plus, Form e Macro


Usam outras linguagens que no PL/ SQL. Devem ser evitados

Menu Item Code


o cdigo que ser executado na seleo do item do menu No necessrio para Menu Item Type Magic

On M a g i c I t e m s
Facilidades que o gerenciador do ambiente disponibiliza como itens de menu No Windows temos: Cut, Copy, Paste, etc Setar as propriedades Menu Item Type para Magic e Magic Item para um dos valores da lista
Undo e About
Por default, estes itens no fazem nada no Windows. Sua ao deve ser definida na propriedade Menu Item Code S funcionam em Windows. Na Web, deve-se definir a ao atravs das built-ins CUT_REGION, COPY_REGION e PASTE_REGION (Estas built-ins funcionam nos dois ambientes) Funciona nos ambientes Web e Windows Internamente executa a built-in DO_KEY( EXIT_FORM ) No necessrio escrever nenhum cdigo

Cut , Copy e Paste

Quit

On Ch e c k e Ra d i o Gr o u p I t e m s Itens de menu podem tambm ser do tipo check ou radio (Propriedade Menu Item Type) Sero mostrados no menu com um radio button ou check mark durante a execuo, conforme figura da pgina 700 O cdigo deve considerar o estado atual de checado ou no checado, atravs da built-in GET_MENU_ITEM_PROPERTY

On M e n u I c o n s Pode-se associar cones aos itens de menu atravs da propriedade Icon in Menu e Icon Filename No Windows os arquivos devem ter a extenso .ico e na Web, .gif

Menu Toolbars Mostra uma barra de botes baseada nos itens de menu Propriedades:
Visible in Menu Horizontal Toolbar
Yes: mostra o cone na toolbar horizontal

Visible in Menu Vertical Toolbar


Yes: mostra o cone na toolbar vertical

Icon Filename
Nome do arquivo do cone (sem a extenso)

Visible in Menu
Yes: mostra o item no menu

Menu Toolbars
Ordenando os botes
Criar o menu com todos os menus e itens Criar outro item chamado TOOLBAR abaixo do menu principal. A propriedade Command Type Menu, mas Visible in Menu No Definir um menu chamado TOOLBAR_MENU. Assinalar a propriedade Submenu Name do item TOOLBAR para TOOLBAR_MENU Arrastar e fazer subclass de todos os itens a serem colocados na toolbar Setar as propriedades Visible in Menu para No e Visible in Horizontal Menu Toolbar para Yes em todos os itens da toolbar Para cada item no separador setar a propriedade Icon Filename Os itens dentro do TOOLBAR_MENU podem ser posicionados de acordo com a ordem desejada

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s

Fo r m s Sy s t e m T i p s a n d Tec hniques

Co m p a r t i l h a n d o V a r i v e i s O valor de uma varivel setado numa trigger s pode ser visualizado em outra trigger se for de um dos seguintes tipos:
Variveis de Database package specification Variveis de Forms package specification Parmetros Itens num bloco Variveis globais

V a r i v e i s d e Da t a b a s e Pa c k a g e Sp e c i f i c a t i o n

Variveis declaradas numa package specification so disponveis durante toda a sesso O valor pode ser acessado de outros forms, desde que na mesma seo As variveis podem ser de qualquer tipo suportado pelo PL/ SQL em Forms e no database

V a r i v e i s d e Fo r m s Pa c k a g e Sp e c i f i c a t i o n

Packages definidas no form ou numa library atachada trabalham de modo similar a packages do database O benefcio que as packages de Forms no acessam o database Somente so disponveis entre vrios forms se for especificado na chamada a opo SHARE_LIBRARY_DATA

Pa r m e t r o s Valores de variveis em dois formatos:


Como parte de uma lista de parmetros, construda programaticamente Objeto no Object Navigator do form

Lista de Parmetros
Construdas programaticamente para passar valores para outros forms atravs de CALL_FORM, OPEN_FORM e NEW_FORM Podem tambm ser passados parmetros para Reports e Graphics Comunicao de mo nica, no h retorno

Pa r m e t r o s
Consiste na criao de uma lista de parmetros ( built -in CREATE_PARAMETER_LIST) e adio de parmetros ( built -in ADD_PARAMETER) Valores simples so passados como TEXT_PARAMETER Record groups so passados como DATA_PARAMETER. Estes podem ser usados somente para passar para Reports ou Graphics

Pa r m e t r o s
DECLARE v_parm_id PARAMLIST; v_parm_name VARCHAR2(15) := emp_params ; BEGIN -- Criando a lista de parmetros v_parm_id := get_parameter_list(v_parm_name) IF NOT id_null(v_parm_id) THEN destroy_parameter_list(v_parm_id); END IF; v_parm_id := create_parameter_list (v_parm_name); -- Adicionando os parmetros add_parameter(v_parm_id, P_PARAM1 ,TEXT_PARAMETER, N ); add_parameter(v_parm_id, P_PARAM2 ,TEXT_PARAMETER, TO_CHAR(:emp.deptno)); call_form ( FORM2 , NO_HIDE, NO_REPLACE, NO_QUERY_ONLY, SHARE_LIBRARY_DATA, v_parm_id); END;

Exemplo:

Pa r m e t r o s Objetos Parmetros
Criados no Object Navigator, podem ser definidos como character, number ou date Podem servir como variveis globais para todo o form No visvel em outros forms Os parmetros passados atravs de uma lista devem existir no Object Navigator do form chamado, com o mesmo nome

It ens num Bloc o Valores podem ser armazenados em itens, podendo estes estar em blocos de controle Tomar cuidado com clear_form, pois todos os blocos sero limpos, inclusive blocos de controle

V a r i v e i s Gl o b a i s
Acessveis durante toda uma sesso, em todos os forms Variveis globais possuem o tamanho de 255 caracteres Para armazenar datas e nmeros, estes devem ser convertidos para caracter Criadas quando recebem valores a primeira vez Built-ins mais utilizadas:
ERASE
Elimina uma varivel global

DEFAULT_VALUE

Se a varivel no existe, atribui um valor a ela, criando-a imediatamente Se a varivel existe, no faz nenhuma ao

No so compartilhadas entre Forms e Reports

Es c o p o d a s V a r i v e i s Co m p a r t i l h a d a s
Tipo de varivel Database package specification Forms package specification Parmetros Itens num Bloco Global Disponvel no Form Chamado Sim No (default) Sim (opcional) Sim No Sim Disponvel no Form Chamador Sim No (default) Sim (opcional) No No Sim Acessa o Database Sim No No No No

Co m p i l a n d o A r q u i v o s Fo r m s
Quando h necessidade de recompilar diversos forms ou outros mdulos, pode-se usar o Project Builder Outra forma de fazer isso usar o command line Compilando Forms
for %f in (*.fmb) do start ifcmp60 userid=scott/tiger@db module=%f

Compilando Libraries
@echo off :: COMPILE_LIB.BAT cls ECHO Compilando Libraries FOR %%f IN (*.pll) DO ifcmp60 userid=scott/tiger@db module_type=LIBRARY module=%%f compile_all=yes batch=yes ECHO Compilao finalizada

Co m p i l a n d o A r q u i v o s Fo r m s
Parmetros da linha de comando
O parmetro COMPILE_ALL fora recompilao e regravao do arquivo .PLL. Sem este parmetro, a compilao somente cria o .PLX sem alterar o .PLL. O parmetro BATCH indica que o compilador no deve parar para confirmao entre cada arquivo Para visualizar os parmetros disponveis entrar com um parmetro invlido na linha de comando.
Exemplo: ifcmp60 x

Co m p i l a n d o A r q u i v o s Fo r m s A ordem de compilao
Primeiramente compilar as libraries, pois o cdigo do forms depende delas Se houverem libraries atachadas a outras libraries, compilar primeiro as atachadas e depois as que possuem o atachamento Menus e forms podem ser compilados em qualquer ordem, pois no dependem um do outro

Se t a n d o V a l o r e s d o Re g i s t r y
As principais variveis do registry para o forms so:
UI_ICON
Diretrio onde se encontram os cones para os botes da toolbar ou smartbar

FORMS60_PATH
Lista de diretrios onde o form vai buscar os arquivos a serem executados Limitado a 512 caracteres A busca sempre inicia no working directory para depois usar esta varivel

O registry pode ser atualizado dentro do forms atravs de READ_REGISTRY e WRITE_REGISTRY da package WIN_API_ENVIRONMENT localizada na library D2KWUTIL.PLL

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s - Ou t r o s T p i c o s

B u i l t -i n s M a i s U t i l i za d a s n o Fo r m s

CH ECK B OX _CH ECK ED


Retorna um valor booleano indicando o estado de um check box Sintaxe
FUNCTION CHECKBOX_CHECKED (item_id ITEM); FUNCTION CHECKBOX_CHECKED (item_name VARCHAR2);

Exemplo
IF Checkbox_Checked(nome_check_box) THEN ...

CL EA R_B L OCK
Remove todos os registros do bloco corrente Sintaxe
PROCEDURE CLEAR_BLOCK; PROCEDURE CLEAR_BLOCK ( commit _mode NUMBER);
commit_mode:
ASK_COMMIT: pergunta se deve fazer commit DO_COMMIT: valida as alteraes e faz o commit sem perguntar NO_COMMIT: valida as alteraes, mas no faz o commit NO_VALIDATE: no valida, no commita, no pergunta

Exemplo
go_block ( EMP ); clear_block (no_validate);

CL EA R_FORM
Remove todos os registros do form e posiciona o cursor no primeiro item do primeiro bloco Sintaxe
PROCEDURE CLEAR_FORM; PROCEDURE CLEAR_FORM ( commit _mode NUMBER); PROCEDURE CLEAR_FORM ( commit _mode NUMBER, rollback_mode NUMBER);
commit_mode: os mesmos valores que clear_block rollback_mode
TO_SAVEPOINT: faz rollback at o savepoint atual FULL_ROLLBACK: faz rollback de toda sesso do forms

COPY
Copia um valor de um item ou varivel para outro item ou varivel global Pode ser usada para:
Atribuir valores a itens de referncia em libraries Colocar caracteres, como operadores relacionais em campos number ou date numa trigger pre-query

Sintaxe
PROCEDURE COPY(fonte VARCHAR2, destino VARCHAR2);

Exemplo
copy ( >7500 , emp.empno ); copy ( Sim , global. ||w_nom_var);

DO_K EY
Executa a key trigger que corresponde built-in especificada Comporta-se como se tivesse sido pressionada aquela tecla de funo Sintaxe
PROCEDURE DO_KEY ( built - in_subprogram_name VARCHAR2);
built-in_subprogram_name: nome de uma built-in vlida

Ver no help uma lista das built - ins e suas respectivas teclas

Exemplo
do_key( Execute_query );

EX I T _FORM
Permite a sada do form, confirmando commit e especificando ao de rollback Se estiver em modo Enter Query, cancela a query (sai do modo Enter Query, no do form) Sintaxe
PROCEDURE EXIT_FORM; PROCEDURE EXIT_FORM ( commit _mode NUMBER); PROCEDURE EXIT_FORM ( commit _mode NUMBER, rollback_mode NUMBER);
commit_mode: os mesmos de clear_block rollback_mode: os mesmos de clear_form, mais:
NO_ROLLBACK: sai do form sem fazer rollback

FI N D_A L ERT
Procura por um alert, retornando seu ID, caso for encontrado A varivel de retorno deve ser do tipo Alert Sintaxe
FUNCTION FIND_ALERT ( alert _name VARCHAR2);

Exemplo
DECLARE al_id Alert; al_button NUMBER; BEGIN al_id := Find_Alert('User_Warning'); IF Id_Null(al_id) THEN Message('User_Warning alert does not exist'); RAISE Form_Trigger_Failure; ELSE al_button := Show_Alert(al_id); ...

FI N D_B L OCK Procura por um bloco e retorna seu ID Sintaxe


FUNCTION FIND_BLOCK ( block_name VARCHAR2);

Exemplo
DECLARE bk_id Block; BEGIN bk_id := Find_Block( bk_name ); IF Id_Null(bk_id) THEN ... END;

FI N D_CA N V A S Procura por um canvas e retorna seu ID Sintaxe


FUNCTION FIND_CANVAS ( canvas_name VARCHAR2);

Exemplo
DECLARE w_canvas_id Canvas; BEGIN w_canvas_id := Find_Canvas('meu_canvas'); END;

FI N D_FORM Procura por um form, retornando seu ID Sintaxe


FUNCTION FIND_FORM (formmodule_name VARCHAR2);

Exemplo
DECLARE fm_id FormModule; tmpstr VARCHAR2(80); BEGIN fm_id := Find_Form(:System.Current_Form); tmpstr := Get_Form_Property(fm_id,CURSOR_MODE); tmpstr := tmpstr||','|| Get_Form_Property(fm_id,SAVEPOINT_MODE); Message('Form is configured as: '||tmpstr); END;

FI N D_I T EM Procura por um item e retorna seu ID Sintaxe


FUNCTION FIND_ITEM (block.item_name VARCHAR2);

Exemplo
DECLARE it_id Item; BEGIN it_id := Find_Item( emp.empno ); IF Id_Null(it_id) THEN Message( Item no existente: '||item_name); RAISE Form_Trigger_Failure; ELSE Set_Item_Property(it_id,VISIBLE,PROPERTY_FALSE); END IF; END;

FI N D_M EN U _I T EM Procura por um item de menu e retorna seu ID Sintaxe


FUNCTION FIND_MENU_ITEM (menu_name.menu_item_name VARCHAR2);

Exemplo
DECLARE mi_id MenuItem; val VARCHAR2(10); BEGIN mi_id := Find_Menu_Item('Preferences.AutoCommit'); val := Get_Menu_Item_Property(mi_id,CHECKED); ... END;

FI N D_WI N DOW Procura por uma window e retorna seu ID Sintaxe


FUNCTION FIND_WINDOW (window_name VARCHAR2);

Exemplo
DECLARE w_window_id window; BEGIN w_window_id := Find_Window( CONSULTA_EMP ); Set_Window_Property(w_window_id,X_POS, 2.3); ... END;

FORM _SU CCESS Retorna se o resultado da ltima ao executada foi com sucesso Sintaxe
FUNCTION FORM_SUCCESS;

Exemplo
BEGIN Enter; -- Se o item foi validado com sucesso, faz o Commit IF Form_Success THEN Commit; IF :System.Form_Status <> 'QUERY' THEN Message('Erro durante o Commit'); RAISE Form_Trigger_Failure; END IF; END IF; END;

FORM S_DDL
Usada para construir SQL dinmico Lembrar que toda sentena DDL faz um commit implcito Sintaxe Restries
FUNCTION FORMS_DDL (statement VARCHAR2); Statement no pode conter referncias a bind variables, mas seu valor pode ser concatenado como texto As sentenas no podem retornar valor

Exemplo

DECLARE w_nom_tab VARCHAR2(30) := 'temp'; BEGIN Forms_DDL('create table '||w_nom_tab ||' (n NUMBER)'); IF NOT Form_Success THEN Message ('Falha na criao da tabela'); END IF; END;

GET _A PPL I CA T I ON _PROPERT Y


Retorna informaes sobre a aplicao corrente Deve ser chamada uma vez para cada valor que se deseja obter. Ver no help uma lista das propriedades disponveis Sintaxe
FUNCTION GET_APPLICATION_PROPERTY (property NUMBER);

Exemplo
PROCEDURE Get_Connect_Info( p_username IN OUT VARCHAR2, p_password IN OUT VARCHAR2, p_connect IN OUT VARCHAR2) IS BEGIN p_username := Get_Application_Property(USERNAME); p_password := Get_Application_Property(PASSWORD); p_connect := Get_Application_Property(CONNECT_STRING); END;

GET _B L OCK _PROPERT Y


Retorna informaes sobre um bloco especfico Deve ser chamada uma vez para cada valor que se deseja obter. Ver no help uma lista das propriedades disponveis Sintaxe
FUNCTION GET_BLOCK_PROPERTY (block_id Block, property NUMBER); FUNCTION GET_BLOCK_PROPERTY (block_name VARCHAR2, property NUMBER);

Exemplo
BEGIN IF get_block_property ( bloco1 , INSERT_ALLOWED) = ... END IF; END; TRUE THEN

GET _FI L E_N A M E


Mostra a caixa de dilogo padro do Windows para abrir um arquivo, permitindo ao usurio selecionar um arquivo existente ou especificar um novo arquivo Sintaxe
FUNCTION GET_FILE_NAME (directory_name VARCHAR2, file_name VARCHAR2, file_filter VARCHAR2, message VARCHAR2, dialog_type NUMBER, select_file BOOLEAN);

GET _FI L E_N A M E


Parmetros
directory_name file_name file_filter
Especifica o nome do diretrio que contm o arquivo a ser aberto. Se for NULL (default), subsequentes chamadas abrem o ltimo diretrio visitado Nome do arquivo a ser aberto. Default: NULL Mscara dos arquivos a serem selecionados Especifica o tipo de arquivo que est sendo selecionado Abre uma das seguintes caixas de dilogo:
OPEN_FILE SAVE_FILE

message

dialog_type select _file

Especifica se o usurio est selecionando arquivos ou diretrio

GET _FI L E_N A M E


Exemplo
DECLARE wrk_nom_path VARCHAR2(256); wrk_nom_arq VARCHAR2(256):= '*.exe'; BEGIN wrk_nom_arq := get_file_name (wrk_nom_path ,wrk_nom_arq ,'Executveis (*.exe)|*.exe|' ,NULL ,OPEN_FILE ,TRUE); IF wrk_nom_arq IS NOT NULL THEN message( O arquivo selecionado foi ||wrk_nom_arq); END IF; END;

GET _FORM _PROPERT Y


Retorna informaes sobre um form especfico Deve ser chamada uma vez para cada valor que se deseja obter. Ver no help uma lista das propriedades disponveis Sintaxe FUNCTION GET_FORM_PROPERTY (formmodule_id FormModule, property NUMBER); FUNCTION GET_FORM_PROPERTY (formmodule_name VARCHAR2, property NUMBER);

GET _I T EM _PROPERT Y Retorna valores de propriedades para um item especfico Sintaxe


FUNCTION GET_ITEM_PROPERTY (item_id ITEM, property NUMBER); FUNCTION GET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER);

GET _M EN U _I T EM _PROPERT Y Retorna o estado de um item de menu em relao a uma propriedade Sintaxe
FUNCTION GET_MENU_ITEM_PROPERTY (menuitem_id MenuItem, property NUMBER); FUNCTION GET_MENU_ITEM_PROPERTY (menu_name.menuitem_name VARCHAR2, property NUMBER);

GET _RA DI O_B U T T ON _PROPERT Y Retorna informaes sobre um item radio button Sintaxe
FUNCTION GET_RADIO_BUTTON_PROPERTY (item_id ITEM, button_name VARCHAR2, property NUMBER); FUNCTION GET_RADIO_BUTTON_PROPERTY ( item_name VARCHAR2, button_name VARCHAR2, property NUMBER);

GET _T A B _PA GE_PROPERT Y Retorna os valores de propriedades para uma tab page especfica Sintaxe
FUNCTION GET_TAB_PAGE_PROPERTY (tab_page_id TAB_PAGE, property NUMBER); FUNCTION GET_TAB_PAGE_PROPERTY (tab_page_name VARCHAR2, property NUMBER);

GET _WI N DOW_PROPERT Y Retorna o valor de propriedade para uma determinada window Sintaxe
FUNCTION GET_WINDOW_PROPERTY (window_id Window, property NUMBER); FUNCTION GET_WINDOW_PROPERTY (window_name VARCHAR2, property NUMBER);

GO_B L OCK Navega para o bloco indicado Se o bloco destino no for entrvel, ocorre um erro Sintaxe
PROCEDURE GO_BLOCK (block_name VARCHAR2);

Exemplos
go_block( bloco1 ); go_block(w_nom_bloco);

GO_I T EM Navega para o item indicado Tem sucesso, mesmo quando o item destino tiver sua propriedade Keyboard Navigable setada para No Sintaxe
PROCEDURE GO_ITEM (item_id Item); PROCEDURE GO_ITEM (item_name VARCHAR2);

H I DE_V I EW Esconde o canvas indicado Sintaxe


PROCEDURE HIDE_VIEW (view_id ViewPort ); PROCEDURE HIDE_VIEW (view_name VARCHAR2);

Exemplo
hide_view( CANVAS_DET );

PA U SE Suspende o processamento at que o usurio pressione uma tecla Normalmente utilizado em conjunto com a built-in message Sintaxe
PROCEDURE PAUSE;

POST Grava os dados do form no database, mas no realiza o commit Sintaxe


PROCEDURE POST;

Se o form foi chamado via OPEN_FORM com o parmetro NO_SESSION, ento o POST vai validar e gravar os dados tanto do form atual como do form chamador

REA D_I M A GE_FI L E


L uma imagem de um determinado tipo de um arquivo dado e mostra-a num item imagem Sintaxe
PROCEDURE READ_IMAGE_FILE (file_name VARCHAR2, file_type VARCHAR2, item_id ITEM); PROCEDURE READ_IMAGE_FILE (file_name VARCHAR2, file_type VARCHAR2, item_name VARCHAR2);

REA D_I M A GE_FI L E


Exemplo
DECLARE tiff_image_dir VARCHAR2(80) := 'C:\temp\'; photo_filename VARCHAR2(80); BEGIN :System.Message_Level := '25'; photo_filename := tiff_image_dir|| LOWER(:emp.userid)||'.tif'; READ_IMAGE_FILE(photo_filename, 'TIFF', 'emp.emp_photo'); IF NOT FORM_SUCCESS THEN MESSAGE('Empregado sem arquivo de foto'); END IF; :SYSTEM.MESSAGE_LEVEL := '0'; END;

SET _A L ERT _B U T T ON _PROPERT Y


Altera o label de um dos botes num alert Sintaxe
PROCEDURE SET_ALERT_BUTTON_PROPERTY ( alert _id ALERT, button NUMBER, property VARCHAR2, value VARCHAR2); PROCEDURE SET_ALERT_BUTTON_PROPERTY ( alert _name VARCHAR2, button NUMBER, property VARCHAR2, value VARCHAR2);
button: constante que especifica o boto a ser alterado (ALERT_BUTTON1, ALERT_BUTTON2, ALERT_BUTTON3) property: LABEL value: novo valor para o label do boto

SET _A L ERT _PROPERT Y Altera o texto de mensagem de um alert Sintaxe


SET_ALERT_PROPERTY (alert_id ALERT, property NUMBER, message VARCHAR2); SET_ALERT_PROPERTY (alert_name VARCHAR2, property NUMBER, message VARCHAR2);

SH OW_A L ERT Mostra o alert especificado e retorna um valor numrico indicando o boto selecionado pelo usurio Sintaxe
SHOW_ALERT (alert_id Alert ); SHOW_ALERT (alert_name VARCHAR2);
Se o usurio selecionar... Boto 1 Boto 2 Boto 3 Form Builder retorna ALERT_BUTTON1 ALERT_BUTTON2 ALERT_BUTTON3

SH OW_V I EW Mostra o canvas especificado nas coordenadas das propriedades X e Y position Sintaxe
SHOW_VIEW (view_id ViewPort ); SHOW_VIEW (view_name VARCHAR2);

Exemplo
show_view( CANVAS_DET );

SY N CH RON I Z E
Sincroniza a tela com o estado interno do form, ou seja, atualiza o display da tela para refletir a informao da representao interna da tela Sintaxe
SYNCHRONIZE

Exemplo
Numa trigger, tipicamente, a tela s atualizada quando o Form Builder completa a execuo de uma trigger e vai voltar a interagir com o usurio. Para fazer atualizaes durante o processamento da trigger, deve-se emitir o comando synchronize.

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s - Ou t r o s T p i c o s

T r i g g e r s M a i s U t i l i za d a s n o Fo r m s

Fu n c t i o n K e y T r i g g e r s
So associadas com teclas de funo do form Disparadas quando o usurio pressiona uma tecla de funo, ou quando explicitamente chamadas via do_key Aes definidas numa function key trigger substitui a ao que aquela tecla normalmente executa Nvel de definio: form, bloco ou item Utilizao
Desabilitar teclas de funo Alterar o comportamento default de uma tecla

Exemplo
-- Trigger key-crerec -- Desabilita inserir registro null;

K e y -Ot h e r s
Associada com todas as teclas que podem ter triggers especficas mas que no foram definidas (em qualquer nvel) Nvel de definio: form, bloco ou item Substitui o comportamento default das teclas de funo que no possuem uma function key trigger declarada explicitamente Usada para restringir o nmero de teclas de funo que podem ser usadas num determinado contexto

On -Co m m i t Disparada quando o Form Builder vai fazer um commit para finalizar uma transao Nvel de definio: form Usada para colocar procedimentos defaults que devem ser executados no commit

On -De l e t e
Disparada durante o processo de post e commit, substituindo o processamento default para eliminar registros Disparada aps a trigger Pre-Delete e antes da Post-Delete, uma vez para cada linha marcada para excluso Nvel de definio: form ou bloco Exemplo
Fazer um update numa coluna da tabela, em vez de eliminar a linha do database
BEGIN UPDATE emp SET termination_date = SYSDATE WHERE empno = :Emp.Empno; END;

On -Er r o r Disparada sempre que ocorre um erro a ser mostrado na tela Nvel de definio: form, bloco ou item Usada para fazer um tratamento dos erros ocorridos

On -I n s e r t Disparada durante o processo de post e commit quando um registro inserido Disparada aps a trigger Pre-Insert e antes da Post-Insert, uma vez para cada linha marcada para insero Nvel de definio: form ou bloco

On -M e s s a g e Disparada sempre que uma mensagem deve ser mostrada e antes de limp-la Nvel de definio: form, bloco ou item Usada para fazer um tratamento das mensagens ocorridas

On -U p d a t e Disparada durante o processo de post e commit quando um registro alterado Disparada aps a trigger Pre-Update e antes da Post-Update, uma vez para cada linha marcada para alterao Nvel de definio: form ou bloco

Po s t -B l o c k Disparada ao sair do bloco, quando o foco movido para fora do bloco Nvel de definio: form ou bloco No disparada quando a propriedade Validation Unit for setada para Form

Pr e e Po s t -... (DM L ) Pre e Post-Delete Pre e Post-Insert Pre e Post-Update

Po s t -Qu e r y Disparada aps uma query ser executada, para cada linha do bloco Nvel de definio: form ou bloco Usada para popular campos oriundos de outras tabelas (lookup) que no a base table do bloco

Pr e -Fo r m Disparada no startup do form Nvel de definio: form Usada para controlar acesso ao form e fazer processos de inicializao de variveis globais

Pr e -Qu e r y Disparada durante o processo de Execute Query ou Count Query, antes de construir e enviar a sentena select para identificar as linhas que satisfazem condio desejada Nvel de definio: form ou bloco Usada para complementar as condies de query by example

Wh e n -B u t t o n -Pr e s s e d Disparada quando o usurio aciona um boto, tanto pelo click do mouse quanto pelo teclado Nvel de definio: form, bloco ou item

Wh e n -Ch e c k b o x -Ch a n g e d Disparada quando o usurio altera o estado de um check box Nvel de definio: form, bloco ou item Usada para executar determinado processo dependendo do estado de um check box Variaes
When-List - Changed When- Radio-Changed When- Tab-Page- Changed

Wh e n -N e w -B l o c k -I n s t a n c e Disparada quando o foco movido para um item num bloco diferente Disparada aps a navegao para um item, quando o form est pronto para receber dados num bloco que diferente do bloco anterior Nvel de definio: form ou bloco Usada para qualquer processo de inicializao de um bloco

Wh e n -N e w -Fo r m -I n s t a n c e No startup do form, o Form Builder navega para o primeiro item navegvel no primeiro bloco navegvel. Esta trigger disparada aps a navegao com sucesso No disparada quando o controle retorna de um form chamado Nvel de definio: form Usada para procedimentos de inicializao

Wh e n -N e w -I t e m -I n s t a n c e Disparada quando o foco movido para um item Disparada aps a navegao para um item, quando o form est pronto para receber dados num item que diferente do item anterior Nvel de definio: form, bloco ou item Usada para qualquer processo de inicializao de um item

Wh e n -N e w -Re c o r d -I n s t a n c e Disparada quando o foco movido para um registro diferente do qual onde o foco estava anteriormente Nvel de definio: form ou bloco Usada para inicializar um registro

Wh e n -V a l i d a t e -I t e m Disparada durante o processo de validao do item Nvel de definio: form, bloco ou item Usada para validar um cdigo contra uma tabela de cadastro (lookup)

Wh e n -V a l i d a t e -Re c o r d Disparada durante o processo de validao do registro Nvel de definio: form ou bloco Semelhante When-Validate-Item, s que faz as validaes a nvel de registro como um todo

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s - Ou t r o s T p i c o s

Sy s t e m V a r i a b l e s - Fo r m s

V a r i v e i s e m De s u s o
Algumas variveis esto em desuso, devendo ser substitudas pelas suas correspondentes
Varivel em desuso Substituir uso por... SYSTEM.CURRENT_BLOCK SYSTEM.CURSOR_BLOCK ou SYSTEM.TRIGGER_BLOCK SYSTEM.CURRENT_ITEM SYSTEM.CURSOR_ITEM ou SYSTEM.TRIGGER_ITEM SYSTEM.CURRENT_VALUE SYSTEM.CURSOR_ITEM e SYSTEM.CURSOR_VALUE

V a r i v e i s d e Da t a e H o r a
Buscam do sistema operacional (mquina client)
$$DATE$$ $$DATETIME$$ $$TIME$$

Buscam do database
$$DBDATE$$ $$DBDATETIME$$ $$DBTIME$$

Usadas como valor default, colocando-se na propriedade Initial Value

SY ST EM .B L OCK _ST A T U S
Representa o status do bloco onde o cursor est localizado ou o bloco atual durante o processo de uma trigger Valores possveis:
CHANGED
Indica que o bloco contm pelo menos um registro alterado

NEW
Indica que o bloco contm somente registros novos

QUERY
Indica que o bloco contm somente registros vlidos que foram recuperados do database

Exemplo
-- Trigger key-clrblk IF :System.Block_Status = 'CHANGED Commit_Form; END IF; Clear_Block; THEN

SY ST EM .CU RSOR_B L OCK


Seu valor depende da unidade atual de navegao:
Se for bloco, registro ou item (como nas triggers Pre- e Post - Item, Record e Block), o valor desta varivel o nome do bloco onde o cursor est localizado Se for o form (como nas triggers Pre- e Post -Form), o valor desta varivel nulo

Exemplo
-- Trigger key-nxtblk DECLARE curblk VARCHAR2(30); BEGIN curblk := :System.Cursor_Block; IF curblk = 'ORDERS' THEN Go_Block('ITEMS'); ELSIF curblk = 'ITEMS' THEN Go_Block('CUSTOMERS'); END IF; END;

SY ST EM .CU RSOR_I T EM
Representa o nome do bloco e item (bloco.item) onde o cursor est localizado Dentro de uma trigger, o valor desta varivel muda conforme a navegao efetuada. J o valor da varivel system.trigger_item permanece o mesmo durante toda a execuo da trigger Exemplo
PROCEDURE CALC_VALUE IS new_value NUMBER; BEGIN new_value := TO_NUMBER(:System.Cursor_Value) * .06; Copy(TO_CHAR(new_value), :System.Cursor_Item); END;

SY ST EM .CU RSOR_RECORD Representa o nmero do registro onde o cursor est localizado. Este nmero representa a ordem fsica do registro na lista de registros do bloco Exemplo
-- Trigger Key-Prev-Item IF :System.Cursor_Record = '1' THEN Go_Item('orders.total'); ELSE Previous_Item; END IF;

SY ST EM .CU RSOR_V A L U E Representa o valor do item onde o cursor est localizado Exemplo
PROCEDURE CALC_VALUE IS new_value NUMBER; BEGIN new_value := TO_NUMBER(:System.Cursor_Value) * .06; Copy(TO_CHAR(new_value), :System.Cursor_Item); END;

SY ST EM .EV EN T _WI N DOW


Representa o nome da ltima window afetada por uma ao que disparou uma trigger de evento de janela As seguintes triggers atualizam esta varivel:
WHEN-WINDOW-ACTIVATED WHEN-WINDOW-CLOSED WHEN-WINDOW-DEACTIVATED WHEN-WINDOW-RESIZED

Exemplo
IF :System.Event_Window = 'ROOT_WINDOW' THEN Go_Item('EMPNO'); ELSIF :System.Event_Window = 'DEPT_WINDOW' THEN Go_Item('DEPTNO'); END IF;

SY ST EM .FORM _ST A T U S
Representa o status do form atual Valores possveis:
CHANGED
Indica que o form contm pelo menos um bloco com um registro alterado

NEW
Indica que o form contm somente registros novos

QUERY
Indica que uma query est aberta. O form contm pelo menos um bloco com registros QUERY e nenhum bloco com registros CHANGED

Exemplo
-- Trigger key-clrfrm IF :System.Form_Status = 'CHANGED' THEN Commit_Form; END IF; Clear_Form;

SY ST EM .L A ST _QU ERY Representa a sentena select da ltima query utilizada para popular um bloco Pode ser usada para passar como parmetro para um report toda a sentena ou somente a clusula where

SY ST EM .M ESSA GE_L EV EL
Guarda um dos seguintes nveis de severidade de mensagem: 0, 5, 10, 15, 20, 25 O valor default zero Durante a execuo, o Form Builder suprime todas as mensagens com um nvel de severidade igual ou menor que o nvel de severidade indicado por esta varivel Usada para esconder mensagens com severidades menores Exemplo
-- Mostra somente as mensagens com severidade maior que 20 :System.Message_Level := '20'; ... -- A partir deste ponto, volta a mostrar mensagens normais :System.Message_Level := '0';

SY ST EM .M ODE
Indica o modo em que o form est atualmente Valores possveis:
NORMAL
Indica que o form est em modo de processo normal

ENTER-QUERY
Indica que o form est atualmente em modo enter-query

QUERY
Indica que o form est processando uma query

Exemplo
-- When-New-Item-Instance Trigger BEGIN IF :System.Cursor_Item = 'EMP.EMPNO' AND :System.Mode = 'ENTER-QUERY' THEN IF NOT Show_Lov('my_lov') THEN RAISE Form_Trigger_Failure; END IF; END IF; END;

SY ST EM .RECORD_ST A T U S
Representa o status do registro onde o cursor est localizado Valores possveis:
CHANGED INSERT NEW
Indica que o registro foi alterado Indica que o registro foi alterado na tela e ainda no existe no database Indica um novo registro Indica que um registro vlido recuperado do database

QUERY

Exemplo
-- Trigger key-clrrec IF :System.Record_Status IN ('CHANGED', 'INSERT') THEN Commit_Form; END IF; Clear_Record;

SY ST EM .T A B _N EW_PA GE Especifica o nome da tab page para onde ocorreu a navegao Usar na trigger When-Tab-Page-Changed Exemplo
-- Trigger When-Tab-Page-Changed IF :SYSTEM.TAB_NEW_PAGE = TAB_1 c_configura_tab_1; ELSE c_configura_tab_1; END IF; THEN

SY ST EM .T A B _PREV I OU S_PA GE
Especifica o nome da tab page de onde proveio a navegao Usar na trigger When-Tab-Page-Changed Exemplo
-- Trigger When-Tab-Page-Changed DECLARE w_nom_tab VARCHAR2(30); w_idt_tab TAB_PAGE; w_des_tab VARCHAR2(30); BEGIN w_nom_tab := :SYSTEM.TAB_PREVIOUS_PAGE; w_idt_tab := FIND_TAB_PAGE (w_nom_tab); w_des_tab := GET_TAB_PAGE_PROPERTY(w_idt_tab, label); IF w_nom_tab = TAB_1 THEN SET_TAB_PAGE_PROPERTY(w_idt_tab, label, Tab 2 ); END IF; END;

SY ST EM .T RI GGER_... As variveis deste tipo representam o nome do objeto onde o cursor estava localizado quando a trigger foi disparada So elas:
SYSTEM.TRIGGER_BLOCK SYSTEM.TRIGGER_ITEM SYSTEM.TRIGGER_RECORD

O uso semelhante s suas variveis correspondentes system.cursor_...

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s - Ou t r o s T p i c o s

B u i l t -i n s M a i s U t i l i za d a s n o Re p o r t s

SRW.SET _A T T R Procedure utilizada para alterar atributos Somente existe para compatibilidade com verses anteriores Substituda por procedures especficas mas simples para cada atributo a ser alterado No deve mais ser utilizada

SRW.DO_SQL
Procedure que executa uma sentena SQL no Report Builder, podendo ser DML ou DDL Sintaxe
SRW.DO_SQL ( sql_statement CHAR);

Usada para fazer SQL dinmico Exemplo


... Srw.do_sql ( create table temp (col1 number(5,0)) ); ... Srw.do_sql ( insert into temp values ( || to_char(w_empno)|| ) ); ... Srw.do_sql ( select col1 into :p_col1 from temp ); ...

SRW.DO_SQL _FA I L U RE Exception que ocorre quando a procedure srw.do_sql falha Sugesto
No fazer tratamento de erros quando for feito srw.do_sql para sentenas DDL para no mascarar o erro ocorrido Fica mais fcil identificar o erro se deixar que a srw.do_sql falhe sem nenhum tratamento

SRW.SET _B A CK GROU N D_FI L L _COL OR Procedure que especifica a cor de preenchimento de fundo do objeto Dependendo do padro (pattern) sendo usado, esta cor pode no ser visualizada. Para visualizar, deve-se usar pattern transparent, seno, somente a cor de frente ser visvel Sintaxe
SRW.SET_BACKGROUND_FILL_COLOR('cor');

SRW.SET _FI L L _PA T T ERN Procedure que especifica o padro de preenchimento do objeto Sintaxe
SRW.SET_FILL_PATTERN( 'pattern');

Para uma lista dos padres disponveis, abrir uma template e, na Property Palette, visualizar os valores possveis para a propriedade Fill Pattern

SRW.SET _FON T _FA CE Procedure que especifica a fonte de campos CHAR, DATE ou NUMBER Sintaxe
SRW.SET_FONT_FACE('nome_da_fonte');

Para especificar o tamanho, usar a procedure SRW.SET_FONT_SIZE


SRW.SET_FONT_SIZE (tamanho);

SRW.SET _FON T _ST Y L E


Procedure que especifica o estilo da fonte de campos CHAR, DATE ou NUMBER Sintaxe
SRW.SET_FONT_STYLE(estilo);
Valores possveis para estilo:
SRW.ITALIC_STYLE SRW.UNDERLINE_STYLE SRW.SHADOW_STYLE SRW.BLINK_STYLE SRW.OBLIQUE_STYLE SRW.OUTLINE_STYLE SRW.INVERTED_STYLE SRW.PLAIN_STYLE

Pode-se chamar esta procedure diversas vezes para combinar estilos Exemplo
-- Torna o campo Itlico sublinhado SRW.SET_FONT_STYLE(SRW.UNDERLINE_STYLE); SRW.SET_FONT_STYLE(SRW.ITALIC_STYLE); -- Volta o campo ao normal SRW.SET_FONT_STYLE(SRW.PLAIN_STYLE);

SRW.SET _FON T _WEI GH T


Procedure que especifica a espessura da fonte de campos CHAR, DATE ou NUMBER Sintaxe
SRW.SET_FONT_WEIGHT( weight );
Valores possveis para weight:
SRW.ULTRALIGHT_WEIGHT SRW.EXTRALIGHT_WEIGHT SRW.LIGHT_WEIGHT SRW.DEMILIGHT_WEIGHT SRW.DEMIBOLD_WEIGHT SRW.BOLD_WEIGHT SRW.EXTRABOLD_WEIGHT SRW.MEDIUM_WEIGHT

SRW.SET _FOREGROU N D_FI L L _COL OR Procedure que especifica a cor de preenchimento de frente do objeto Sintaxe
SRW.SET_FOREGROUND_FILL_COLOR('cor');

SRW.SET _FORM A T _M A SK Procedure que especifica mscara de formato para campos DATE ou NUMBER Sintaxe
SRW.SET_FORMAT_MASK

SRW.SET _M A X ROW Procedure que seta o nmero mximo de registros a serem buscados numa query Sintaxe
SRW.SET_MAXROW (nome_da_query CHAR, num_maximo PLS_INTEGER);

Deve ser usada na trigger Before Report, isto , aps ter sido feito o parse Pode ser usada para limitar ou mesmo evitar o retorno de linhas de uma query

SRW.SET _T EX T _COL OR Procedure que especifica a cor de texto de campos CHAR, DATE ou NUMBER Sintaxe
SRW.SET_TEXT_COLOR('cor');

SRW.M ESSA GE Procedure que mostra uma mensagem com um nmero especificado, no formato de um alert box, solicitando confirmao Sintaxe
SRW.MESSAGE ( msg_number NUMBER, msg_text CHAR);

Exemplo
srw.message(1000, Parmetro invlido );

SRW.PROGRA M _A B ORT Exception que interrompe a execuo do report e mostra a mensagem


REP-1419: PL/ SQL program aborted.

Sintaxe
SRW.PROGRAM_ABORT;

Exemplo
IF w_campo IS NULL THEN srw.message(100, Valor deve ser informado ); raise srw.program_abort; END IF;

Or a c l e De v e l o p e r A d v a n c e d Fo r m s & Re p o r t s - Ou t r o s T p i c o s

T r i g g e r s e Sy s t e m Pa r a m e t e r s d o Re p o r t s

Qu a l Re p o r t T r i g g e r U s a r Como regra geral, qualquer processo que afeta os dados recuperados pelo report deve ser executado nas triggers Before Parameter Form ou After Parameter Form Qualquer processo que no afeta os dados recuperados pode ser executado nas outras triggers

Re p o r t T r i g g e r s
Before Report
Disparada antes do report ser executado, mas depois da query ter sofrido o parse

After Report
Disparada depois de sair do Previewer ou depois da sada do relatrio ter sido enviada para seu destino Pode ser usada para fechar processos temporrios do relatrio (como tabelas criadas) Sempre executada, mesmo que o relatrio seja abortado

Re p o r t T r i g g e r s
Between Pages
Disparada antes de cada pgina ser formatada No Previewer, disparada somente na primeira vez que se navega para uma pgina

Before Parameter Form


Disparada antes da tela de parmetros ser mostrada, mesmo que seu display tenha sido suprimido

After Parameter Form


Disparada depois da tela de parmetros Usada para checagem de parmetros, permitindo voltar tela de parmetros

Sy s t e m Pa r a m e t e r s
So parmetros pr-definidos no report
BACKGROUND
Se o report deve rodar em foreground ou background

COPIES
Nmero de cpias a serem impressas

CURRENCY
Smbolo indicador monetrio (Ex: $ )

DECIMAL
Smbolo para o indicador decimal ( , )

DESFORMAT
Definio do formato do dispositivo de sada. Usado em modo caracter ou quando envia um report bitmap para um arquivo (para criar PDF, HTML, etc)

Sy s t e m Pa r a m e t e r s
DESNAME
Nome do dispositivo de sada (nome do arquivo, impressora ou userid do mail), dependendo do DESTYPE

DESTYPE
Tipo do dispositivo para enviar a sada do relatrio (screen, file, mail, printer, preview, etc)

MODE
Se o report deve rodar em modo caracter ou bitmap

ORIENTATION
Direo de impresso do report (landscape, portrait, default)

PRINTJOB
Se deve aparecer a caixa de dilogo para impresso do relatrio

THOUSANDS
Smbolo para o separador de milhares ( . )

Você também pode gostar