Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
As informações contidas neste documento pertencem à Value Team Brasil S/C Ltda e ao destinatário do documento. Cópia, publicação ou
distribuição não-autorizada deste material são práticas estritamente proibidas e podem ser ilegais.
Value Team Brasil S/C Ltda Rua da Cadenlária Tel +55 21 2213 9191
VALUE PARTNERS GROUP 60 – 10º andar Fax + 55 21 2213 9190
20091–020 www.valueteam.com
Rio de Janeiro – RJ - Brasil
BRAVT-TREINAM-9F-061220-LFern
ÍNDICE I
BRAVT-TREINAM-9F-061220-LFern
ÍNDICE II
BRAVT-TREINAM-9F-061220-LFern
ÍNDICE III
BRAVT-TREINAM-9F-061220-LFern
ÍNDICE IV
BRAVT-TREINAM-9F-061220-LFern
ÍNDICE V
BRAVT-TREINAM-9F-061220-LFern
O Pacote Developer 6i
A ferramenta de desenvolvimento Form Builder 6i faz parte de um pacote de ferramentas para
desenvolvimento chamado Oracle Developer 6i. Este pacote é composto de 8 ferramentas:
• Report Builder – é a ferramenta para a construção de relatórios que façam acesso a uma
base de dados Oracle.
• Schema Builder – esta ferramenta nos auxilia na criação, cópia, modificação e remoção de
objetos (e relacionamentos) do banco de dados.
Este pacote contém ferramentas que abrangem todas as áreas necessárias ao desenvolvimento de um
sistema: aplicações online, batch, relatórios, gráficos e, ainda, uma ferramenta para controle do ambiente.
A Ferramenta
O desenvolvimento de uma aplicação Online envolve diversas etapas, dentre elas: construção da
aplicação, compilação, execução e depuração.
• IFRUN60 – Form Runtime – Este é o aplicativo para execução das aplicações desenvolvidas
(Form, Menus e Libraries PL/SQL).
Considerações Gerais
A ferramenta Form Builder é capaz de construir quatro tipos de “módulos” diferentes:
Módulo Form – que consiste da aplicação online, contendo lógicas de atualização, telas, botões, itens,
etc. O fonte de um módulo Form possui a extensão FMB e o executável FMX.
Módulo Menu – que consiste de um conjunto de submenus e lógicas para acionamento dos diversos
módulos Form ou de outros submenus, execução de aplicações PL/SQL em batch, acionamento de
gráficos, etc. O fonte de um módulo Menu possui a extensão MMB e o executável MMX.
Módulo PL/SQL Library – que consiste de um conjunto de programas PL/SQL que podem ser
compartilhados por diversas aplicações Form (ou Report) que executam no ambiente. Possui apenas
um tipo de arquivo cuja extensão é PLL.
Object Library – que consiste de um conjunto de objetos internos do Form que podem ser definidos uma
única vez e utilizados em outras aplicações. Esta biblioteca de objetos auxilia o desenvolvedor na
criação de padrões.
Quando um determinado nó aparece com o símbolo – (menos) à esquerda indica que este nó está
expandido. Quando aparece com o símbolo + (mais) indica que o nó está contraído, ou seja, existem
elementos subordinados a este nó que não estão visíveis.
• Bibliotecas PL/SQL – subordinado a este nó estará o módulo Library de PL/SQL que viermos
a desenvolver.
EXPANDIR OU CONTRAIR
Para expandir um nó ou contraí-lo basta que pressionemos o mouse sobre o símbolo ( + ) para
expandi-lo ou sobre o símbolo ( - ) para contrai-lo.
As ações de expansão e contração podem ser feitas com os botões expandir e contrair da barra
de ferramentas.
Fig. 3
A figura 3 apresenta os botões que realizam as ações de expansão e contração na barra de ferramentas.
CRIAR OU DELETAR
A criação de qualquer elemento no Form Builder pode ser feita utilizando-se o botão Criar,
apresentado na figura 4.
Fig. 4
Para realizarmos esta ação basta que selecionemos o nó ou um objeto do mesmo tipo daquele que
desejamos criar e pressionemos o botão Criar.
Fig. 5
Com estas ferramentas podemos:
Fig. 6
Na figura 6 apresentamos os três botões ligados à execução da aplicação:
• Botão Executar Depuração – aciona o Forms Runtime com o auxílio do depurador que
permitirá que acompanhemos passo a passo cada ação a ser efetuada.
• Botão Executar Form Web – aciona a execução da aplicação em ambiente Web (só
disponível em ambiente WindowsNT).
• Botão Abrir - serão apresentados outros arquivos com extensão FMB (Form) para que
façamos a escolha daquele que desejamos abrir.
Após a salva, o nome do módulo (no Navegador) é alterado e na parte inferior da janela do Form Builder
aparece não só o nome do módulo ativo como também o nome com que este arquivo está salvo em disco.
LOCALIZAR
Podemos usar o pesquisador do Navegador para
encontrar elementos e nós dentro do Navegador.
Quando necessário podemos utilizar as duas lanternas posicionadas ao lado do campo Localizar para
efetuar uma busca para frente ou para trás.
NAVEGANDO NA HIERARQUIA
Do lado esquerdo da janela do Navegador existe um
campo que apresenta o nome do elemento atualmente
selecionado.
Podemos escolher qualquer elemento desta hierarquia, bastando que façamos a seleção do elemento
desejado, clicando o mouse sobre um dos nomes na lista.
PAINÉIS DO NAVEGADOR
Podemos dividir o navegador em múltiplos painéis
horizontalmente ou verticalmente.
Freqüentemente realizaremos uma ação já conhecida com uma opção de menu em vez do botão
correspondente.
Bloco de Dados
O bloco é a estrutura básica e fundamental do Form Builder. É o centro de toda a ação. É em torno dele
que todas as ações se processam.
Um bloco não tem representação visual. Um usuário visualiza itens, pois são eles que são apresentados
em uma tela, porém hierarquicamente os itens estão subordinados a blocos, pertencem a blocos e estão
sujeitos às ações que efetuarmos para o bloco que o contém.
Um bloco pode estar ligado a uma tabela no banco de dados. Quando isto ocorre existe uma paridade
entre bloco e tabela, registro e linha da tabela e entre item e coluna da tabela.
Toda a funcionalidade do Form gira em torno do bloco. Conheceremos esta funcionalidade aos poucos.
2. Um bloco de dados pode se basear em uma tabela (ou view) ou em uma stored procedure.
Escolheremos, a criação de um bloco baseado em uma tabela.
3. No próximo diálogo devemos escolher a tabela ou view na qual desejamos basear o bloco.
4. Para que nos seja apresentada a lista de tabelas ou views disponíveis, devemos pressionar o
botão pesquisar.
5. Caso não tenhamos feito logon no banco de dados até este momento será necessário que o
façamos agora. Neste caso devemos informar o nome do usuário, senha e a string de conexão
com o banco de dados.
6. O próximo diálogo permite o estabelecimento de uma restrição sobre a lista de objetos a ser
apresentada:
8. Nosso próximo passo é selecionar a tabela Func e pressionar o botão OK. Retornamos, desta
forma, ao diálogo do passo 3, porém com os campos “Tabela ou view” e “Colunas Disponíveis”
preenchidos.
9. Nosso próximo passo será definir quais as colunas que daremos manutenção nesta aplicação. As
colunas (cd_mat, nm_func, cd_depto, nr_cargo, in_sexo, vl_sal, dt_nasc) devem ser transferidas
para o campo “Itens do Banco de Dados”.
Se desejássemos selecionar todas as colunas poderíamos pressionar o botão ( >> ), sem haver
necessidade de selecionar nenhuma coluna.
O botão Renovar presente acima do campo Colunas Disponíveis, reordena a lista de acordo com a
ordem das colunas no banco de dados.
A ordem que as colunas são definidas no campo Itens do Banco de Dados será a ordem default
para a construção da tela, que passaremos a chamar de Canvas.
O último campo da tela “Impor integridade de dados” indica que as regras de integridade presentes
do banco de dados também serão asseguradas a nível de ambiente cliente.
10. É apresentado o último diálogo deste assistente. Neste diálogo podemos acionar o assistente de
layout para construção da Canvas (tela) ou podemos encerrar e posteriormente acioná-lo.
É subordinado a este tipo de nó que incluiremos os trechos de PL/SQL responsáveis pela lógica de
programação (críticas, movimentação, atribuição, etc).
1. Após o diálogo inicial, devemos determinar a canvas em que os itens do bloco Func serão criados.
Neste diálogo temos 3 campos para preencher.
• No primeiro (Canvas) devemos selecionar entre uma canvas já existente ou uma nova canvas.
• No segundo campo devemos escolher o tipo de Canvas (tela) que desejamos criar. Nos são
apresentadas 5 opções: Conteúdo (Content), Barra de Ferramentas Vertical (Vertical ToolBar),
Barra de Ferramentas Horizontal (Horizontal ToolBar), Sobreposto (Stack) e Guia (Tab).
• O terceiro campo fica desabilitado quando definimos no segundo campo qualquer opção
diferente de Guia (Tab).
Ao selecionarmos um elemento do campos “Itens Exibidos” o campo Tipo de Item ficará habilitado,
permitindo que façamos a especificação de como desejamos que o item seja apresentado na
Canvas.
4. Neste diálogo faremos a escolha do tipo de layout mais adequado: Form ou Tabular.
Quando o Assistente conclui, nos é mostrado o Editor de Layout contendo todos os itens pertencentes ao
bloco Func organizados numa área de tela a que chamamos Canvas.
A figura 14 mostra a janela de execução. Observe que foi acionado o Form Runtime (veja o título da janela
principal) para executar a aplicação compilada.
Abra o Windows Explorer e verifique no seu diretório de trabalho que foi criado um arquivo com extensão
FMX com o mesmo nome da sua aplicação (FMB).
INCLUSÃO
Quando um Form entra em execução, por default, a ação esperada é a de inclusão, portanto não
precisamos efetuar nenhuma ação adicional para incluir. Basta que façamos o preenchimento dos campos.
Após o preenchimento podemos ou não salvar o registro, isto é, gravá-lo no banco de dados. Para salvar
podemos usar o botão salvar da barra de ferramentas ou usar a opção Salvar do menu Ação.
CONSULTA
A consulta pode ser iniciada de duas formas:
• Botão Entrar com Consulta da barra de ferramentas ou com a opção Entrar do menu
Consultar - será apresenta a tela de execução com os campos vazios para que o usuário
preencha uma restrição às linhas consultadas, na forma: <valor do campo> ou <operador>
<valor> ou [%]<valor> [%].
• Cancelar – para cancelar uma consulta em andamento. Esta ação fica habilitada quando
estamos no modo de Enter-Query, ou seja utilizamos a opção Entrar Consulta para definir um
critério de pesquisa. Após a execução da consulta não há necessidade de cancelamento.
• Último Critério – para apresentar o último critério de restrição efetuado. Esta opção também é
apresentada quando estamos no modo de Enter-Query.
• Contar Acertos – para apresentar a quantidade de linhas retornadas de acordo com o critério
efetuado, sem que haja necessidade de realizarmos a consulta. Esta opção deve ser acionada
no lugar da Executar Consulta, após termos preenchido o critério de restrição desejado (Enter-
Query).
• Extrair Próximo Conjunto – Esta opção faz uma operação de Fetch de dados. Quando
realizamos uma consulta, o Form Runtime não lê todas as linhas do banco de dados de uma
única vez, ele faz leituras parciais. Conforme navegamos para os registros seguintes, ele vai
ao banco de dados e efetua novas leituras. Esta opção força uma leitura no próximo conjunto
de registros sem que haja necessidade de navegarmos um a um até lermos todos os registros
do conjunto.
ALTERAÇÃO
O Form Runtime considerará alterado todo registro que for lido e posteriormente modificado, ou mais
precisamente, todo registro lido e modificado além de todo registro incluído, gravado (salvo) e modificado
em seguida.
Desta forma após uma consulta qualquer modificação que venhamos a fazer em um registro será
considerada para alteração no banco de dados.
Para desistimos de uma alteração realizada devemos limpar o registro. Esta ação terá o efeito de cancelar
a atualização prevista para ele.
• Usar os botões Recortar, Copiar e Colar (da Barra de Ferramentas) ou estas opções presentes
no menu Editar.
• Usar a opção Duplicar do menu Gravar (com a qual duplicaremos todo o registro).
• Usar a opção Duplicar do menu Campo (com a qual duplicaremos apenas o item em foco).
• Editar – esta opção apresenta um editor com o conteúdo do campo que tiver o foco, isto é, do
campo que o cursor estiver posicionado. Esta opção é útil quando a coluna correspondente no
banco de dados é muito grande para ser mostrada integralmente na tela. Quando acionamos o
editor podemos visualizar todo o conteúdo do campo. A edição está limitada ao tamanho do
item.
• Exibir Lista – Esta opção exibe a lista de valores para o campo que tiver o foco, se a este
campo tivermos associado uma lista de valores.
EXCLUSÃO
Para que o Form considere uma ação de exclusão no banco de dados deveremos ter consultado um
determinado registro e em seguida o excluído.
A ação de exclusão pode ser acionada na barra de ferramentas ou através da opção Remover do menu
Gravar.
BLOQUEIO
O Form quando faz um consulta e apresenta os registros para o usuário não efetua bloqueio ( Lock ) nas
linhas consultadas.
Esta ação só é realizada se o usuário efetuar alguma modificação na linha ou pressionar o botão de
Remover.
Tão logo uma destas ações ocorra, o Form dispara um bloqueio para o registro corrente. Isto ocorre antes
da ação de salva.
Se desejarmos bloquear uma linha mesmo antes dela ser modificada, podemos realizar esta ação usando
o botão Bloquear Registro ou a opção Travar do menu Gravar.
NAVEGAÇÃO
A navegação de uma aplicação Form ocorre:
• Entre Itens - podemos pressionar a tecla Tab (navegação para frente), Tab+Shift (navegação
para trás) ou podemos utilizar as opções Anterior e Próximo do menu Campo.
• Entre Registros - pode ser feita através dos botões da barra de ferramentas, através da barra
de rolagem, através das opções Anterior e Próximo do menu Gravar (Registro) e, ainda, com
as teclas Seta para Cima e Seta para Baixo do teclado, se o cursor estiver posicionado sobre
um campo do registro.
• Entre Blocos - pode ser feita com os botões da barra de ferramentas ( Bloco Anterior e
Próximo Bloco ) ou com as opções Anterior e Próximo do menu Bloco. Para que esta ação
tenha efeito devemos ter criado mais de um bloco na aplicação.
MENU AJUDA
No menu Ajuda aparecem três opções:
• Ajuda – esta opção apresenta uma tela contendo as propriedades atuais do item que tiver o
foco (de onde o cursor estiver posicionado).
• Teclas – esta opção apresenta uma tela contendo de um lado uma ação e do outro a tecla a
ser acionada para efetuarmos aquela ação. A lista de ações se refere ao conjunto de ações
que realizamos com o menu e com a barra de ferramentas. A tela apresentada é sensível ao
contexto, isto é, haverá uma variação de acordo com a ação em execução (consulta, inclusão,
etc).
• Erro de Exibição – esta opção apresenta a sintaxe do comando de SQL disparado pelo Form
que deu erro de sintaxe e ainda a mensagem recebida do banco de dados.
SALVA IMPLÍCITA
O Form Runtime tem controle sobre as modificações que efetuamos sobre os registros. Este controle se
dá a nível de bloco e de Form (aplicação).
Este diálogo pode aparecer quando efetuamos as ações: Limpar Bloco, Limpar Tudo (Form), Executar
Consulta, Entrar Consulta ou Sair da Aplicação.
CONCLUSÕES
Até o momento não escrevemos uma linha sequer de código, no entanto, a ferramenta já foi capaz de
realizar as operações básicas de inclusão, exclusão, alteração, consulta e navegação.
Nossa tarefa ao longo deste estudo será perceber como modificar esta funcionalidade básica de acordo
com a nossa vontade.
CAPÍTULO 2 : BLOCOS
Neste capítulo trataremos dos blocos e analisaremos a funcionalidade implícita do Form, ou seja, como
ocorre a decisão de uma inclusão, alteração ou exclusão e como este processamento é realizado.
Propriedades
Cada objeto criado em nossa aplicação possui um conjunto
de propriedades que determinam suas características
básicas.
Quando selecionamos uma das propriedades (basta clicar com o mouse sobre a linha), seu valor torna-se
disponível para modificação e no rodapé da paleta aparece uma pequena explicação sobre a propriedade
selecionada.
CAPÍTULO 2: BLOCOS - 15
BRAVT-TREINAM-9F-061220-LFern
A área de Buffer
Quando criamos um bloco, podemos determinar o tamanho da área de memória reservada para a leitura
das linhas de dados associadas a ele.
Isto é feito através da propriedade Número de Registros Armazenados no Buffer (Number of Records
Buffered).
Esta área contém diversos registros (um para cada linha lida), os quais armazenam os dados relativos a
cada um dos itens pertencentes ao bloco.
HIERARQUIA FUNCIONAL
Desta forma podemos dizer que um item está subordinado a um registro, que por
sua vez está subordinado a um bloco.
Por exemplo para incluirmos linhas na tabela Func (exemplo do tópico anterior),
preenchemos os itens.
Estes dados vão sendo armazenados na área de Buffer (registros) até que
pressionamos o botão Salvar. Fig. 17
Neste momento esta área de Buffer é lida e enviada ao banco de dados para inclusão.
Estas ações são possíveis devido à ligação dos itens com os registros e destes com o bloco.
Quando iniciamos a aplicação, por default, o Form Runtime assume que estamos pretendendo criar
registros, desta forma cria um registro vazio para que iniciemos a etapa de digitação.
O estado deste registro inicial é NEW. Quando modificamos alguma informação em um dos itens
pertencentes a este registro, seu estado passa para INSERT.
Quando realizamos uma consulta e carregamos a área de buffer com linhas vindas da tabela de dados, o
estados dos registros deste bloco é QUERY. Ao efetuarmos alguma modificação em um item deste
registro, seu estado passa para CHANGED.
É desta forma que o Form Runtime controla o que deve ser feito quando comandamos uma ação de
Salvar. O status indica qual ação deve ser feita com cada registro de cada bloco. Em torno deste controle
giram todas as ações realizadas pela ferramenta.
Como um registro não possui representação gráfica na ferramenta, sua propriedade só pode ser obtida ou
modificada por programação, através das rotinas Set_Record_Property e Get_Record_Property.
CAPÍTULO 2: BLOCOS - 16
BRAVT-TREINAM-9F-061220-LFern
Tipos de Blocos
Um Bloco no Form pode ser de dois tipos:
• Data Block (Bloco de Dados) - está associado a dados oriundos do banco de dados seja
através de uma tabela (ou view) ou através de rotinas armazenadas no banco de dados. Este
tipo de bloco possui uma funcionalidade padrão implícita, que garante a inclusão, exclusão,
alteração e consulta sem que tenhamos de escrever uma única linha de código.
• Control Block (Bloco de Controle) - não está associado ao banco de dados e, portanto, não
possui qualquer funcionalidade implícita. São usados freqüentemente para a criação de
botões, itens de cálculo, áreas de trabalho, itens para entrada de valores requeridas pela
aplicação, etc.
Os itens subordinados a cada um destes blocos também possuem tipos que os caracterizam.
• Itens em Blocos de Dados - podemos ter itens associados ao banco de dados ou itens de
controle (ou seja, itens não associados ao banco de dados).
A tabela apresenta para cada tipo de item e de bloco, a evolução do estado do registro quando efetuamos
uma modificação.
Tipo de Bloco Tipo de Item Modificado Estado do Registro Antes da Estado do Registro Depois da
Modificação Modificação
Bloco de Dados Item do banco de dados NEW INSERT
Bloco de Dados Item de controle NEW INSERT
Bloco de Dados Item do banco de dados QUERY CHANGED
Bloco de Dados Item de controle QUERY QUERY
Bloco de Controle Item de controle NEW INSERT
Quando precisamos, por algum motivo, limpar a área de buffer de um Bloco de Dados, o Form analisa a
situação de atualização daquele bloco.
Se existirem registros pendentes de atualização, antes de executar a ação solicitada o Form questiona o
usuário se deseja ou não efetivar as modificações pendentes (figura 15). Neste caso o usuário poderá
tomar três ações :
• Sim (Yes) – Indica que o processo de atualização do banco deve ser efetuado antes da ação
solicitada pelo usuário.
• Não (No) – Indica que os registros pendentes devem ser descartados, mas a ação solicitada,
causadora da limpeza no buffer, deve ser realizada.
• Cancelar (Cancel) – Indica que o usuário está desistindo da ação solicitada. Neste caso a
ação é interrompida e o programa volta para o estado de leitura do teclado aguardando que o
usuário inicie outra ação.
CAPÍTULO 2: BLOCOS - 17
BRAVT-TREINAM-9F-061220-LFern
• Clear Block - A primeira e mais direta é a própria solicitação de limpeza do bloco, opção
Limpar (Clear) do menu Bloco(Block). Esta ação causa a limpeza da área de buffer associada
ao bloco. Também pode ser iniciada com a opção Limpar Bloco (Clear Block – Shift+F5) do
teclado ou, por programação, com o uso da rotina Clear_Block.
• Clear Form - A solicitação de limpeza de toda a aplicação causa a limpeza da área de buffer
de todos os blocos. Se em algum deles houver registros pendentes, ocorrerá a mensagem.
Esta ação pode ser iniciada pelo usuário através da opção Limpar Tudo(Clear All) do menu
Ação(Action), da opção Limpar Form (Clear Form – Shift + F7) do teclado ou, através da
programação, com o uso da rotina Clear_Form.
• Exit Form - O término da aplicação com registros pendentes também causa a presença da
mensagem, apesar de não causar a limpeza direta do buffer e sim a indireta pois toda a
memória da aplicação será liberada para o sistema operacional. Esta ação pode ser solicitada
pelo usuário através da opção Sair (Exit) do menu Ação (Action), do botão Sair (Exit) da barra
de ferramentas, do botão Fechar ( X ) da janela do F50Run, da opção Sair (Exit – Ctrl + q) do
teclado ou, por programação, com o uso da rotina Exit_Form.
• Enter Query - Ao solicitarmos uma nova consulta, o Form Runtime deve limpar o buffer a fim
de carregar os dados da nova consulta solicitada. O usuário poderá causar esta situação ao
escolher a opção Entrar(Enter) ou Último Critério(Last Criteria) do menu Consultar (Query), o
botão Entrar com Consulta (Enter Query) da barra de ferramentas e a opção Entrar com
Consulta (Enter Query – F7) do teclado ou, por programação, com o uso da rotina
Enter_Query.
CAPÍTULO 2: BLOCOS - 18
BRAVT-TREINAM-9F-061220-LFern
Navegação
O que acontece quando, através da navegação, atingimos o último item de um bloco e acionarmos a
navegação para o próximo item ? Qual ação será realizada pelo Form ?
Estas questões serão definidas pelo desenvolvedor ao preencher as propriedades Estilo de Navegação
(Navigation Style), Bloco de Dados Anterior de Navegação (Previous Navigation Data Block) e Próximo
Bloco de Dados de Navegação (Next Navigation Data Block). Todas estas propriedades se encontram
grupadas no nó Navegação (Navigation) da Paleta de Propriedades.
SEQÜÊNCIA DE NAVEGAÇÃO
Quando não especificamos um valor para as propriedades Próximo e Anterior, a seqüência de navegação
relativa aos objetos é dada pela ordem destes objetos no Navegador.
O controle pelo Navegador é mais fácil do que pelas propriedades internas porque ele é visual.
ESTILO DE NAVEGAÇÃO
A propriedade Estilo de Navegação (Navigation Style) possui três valores:
• Mesmo Registro (Same Record) - Opção default. Indica que quando uma operação de
navegação para o próximo item é acionada e o posicionamento do cursor é exatamente no
último item navegável do bloco, o foco deve retornar para o primeiro item navegável deste
mesmo registro.
• Alterar Registro (Change Record) - Indica que quando uma operação de navegação para o
próximo item é acionada e o posicionamento do cursor é exatamente no último item navegável
do bloco, o foco deve se dirigir para o primeiro item navegável do próximo registro.
• Alterar Bloco de Dados (Change Block) - Indica que quando uma operação de navegação
para o próximo item é acionada e o posicionamento do cursor é exatamente no último item
navegável do bloco, o foco deve se dirigir para o primeiro item navegável do próximo bloco.
CAPÍTULO 2: BLOCOS - 19
BRAVT-TREINAM-9F-061220-LFern
• Número de Registros Exibidos (Number of Records Displayed) - que permite que após o
desenvolvimento do bloco modifiquemos a quantidade de registros presentes na canvas (tela).
Quando o número de registros que precisamos armazenar no buffer local(em função da leitura
de uma tabela grande, por exemplo) é maior que o valor especificado por esta propriedade o
Form faz overlay para disco a fim guardar o restante. O valor default de 0 (ou Null) indica que
serão armazenados em memória a mesma quantidade de registros exibidos mais 3 (três).
• Tamanho do Array de Consulta (Query Array Size) – Esta propriedade define a freqüência
com que o Form faz acesso ao banco de dados para obtenção dos dados a serem
apresentados. Um número muito baixo pode dar ao usuário a impressão de uma resposta
imediata melhor se ele estiver analisando os registros passo a passo.
Se ele estiver fazendo navegação uma quantidade maior de registros permitirá que ele
navegue mais rapidamente até haver necessidade do Form obter o próximo conjunto.
Se analisarmos pelo lado da performance, um número maior de registros é mais eficiente, pois
temos de fazer menos acesso ao servidor para obtenção dos dados, porém o tempo de
resposta de cada acesso pode ser maior, apesar do tempo de resposta total, certamente, ser
menor.
CAPÍTULO 2: BLOCOS - 20
BRAVT-TREINAM-9F-061220-LFern
• Bloco de Dados do Banco de Dados (Database Data Block) - indica se o bloco é um bloco
de dados (Sim) ou um bloco de controle (Não). Quando escolhemos Sim, o Form verifica as
informações relativas à origem do dados, ou seja, como se dará a captura das informações a
serem apresentadas. Caso nossa opção seja Não estas informações serão ignoradas pelo
Forms.
• Tipo de Origem de Dados de Consulta (Query Data Source Type) - indica de onde se
originarão os dados para preenchimento dos itens do bloco. As opções válidas são: Nenhum
(para bloco de controle), Tabela(Table), Gatilhos Transacionais (Transactional Triggers),
Procedimento (Procedure) e Consulta da cláusula From (From clause).
• Nome de Origem de Dados de Consulta (Query Data Source Name) - indica o nome da
tabela ou o nome do procedimento para consulta ou a query a ser anexada à cláusula From.
• Colunas de Origem de Dados de Consulta (Query Data Source Columns) - determina os dados
a serem trazidos pela consulta.
• Cláusula Where(Where Clause) - define uma restrição a ser utilizada em todas as consultas.
• Cláusula Order By(Order By Caluse) - define uma ordenação a ser utilizada em todas as
consultas.
• Consulta Permitida (Query Allowed) - indica que o Form poderá realizar consultas aos
dados associados a este bloco.
• Inserção Permitida (Insert Allowed) - indica que o Form adicionará à aplicação a capacidade
de incluir linhas para este bloco e, consequentemente, no banco de dados.
CAPÍTULO 2: BLOCOS - 21
BRAVT-TREINAM-9F-061220-LFern
Por exemplo, podemos definir rotinas para efetuar todas as etapas de atualização e consulta aos dados,
sem que o usuário tenha acesso direto à tabela. Estas rotinas podem completar informações, efetuar
críticas mais elaboradas, enfim qualquer ação desejada de atualização.
Acompanharemos, a seguir, o instrutor na criação de um bloco deste tipo usando o pacote Pfunc.
O PACOTE PFUNC
A parte de especificação do pacote é apresentada a seguir:
Neste pacote incluímos um tipo Cursor(Cfunc) e um tipo Table(Tfunc), ambos fazendo referência à linha da
tabela Func.
Estabelecemos, ainda, a parte de especificação das duas rotinas : uma rotina de consulta e uma rotina de
atualização.
A rotina de consulta recebe como parâmetro a matrícula, o departamento, o cargo e o grau de instrução e
retorna uma variável cursor do tipo Cfunc.
Os parâmetros para esta rotina são opcionais: o usuário poderá fornecer apenas a matrícula ou uma
combinação de cargo com grau de instrução ou nenhum deles e assim por diante. De acordo com estas
informações serão selecionadas as linhas de funcionário que atendem às condições.
CAPÍTULO 2: BLOCOS - 22
BRAVT-TREINAM-9F-061220-LFern
CAPÍTULO 2: BLOCOS - 23
BRAVT-TREINAM-9F-061220-LFern
• pcd_mat - preencheremos a coluna Valor com :cd_mat. Isto significa que quando o usuário
preencher o item cd_mat do bloco, a tempo de Enter-Query, o valor deste item será associado
ao parâmetro pcd_mat para possibilitar a consulta por matrícula.
• pcd_depto - preencheremos a coluna Valor com :cd_depto. Observe que o nome do item do
bloco será obtido da definição do registro Func%Rowtype do qual o parâmetro Ptab (tipo
RefCursor) se origina.
CAPÍTULO 2: BLOCOS - 24
BRAVT-TREINAM-9F-061220-LFern
• Ptipo - receberá a constante I, para indicar a rotina que é uma chamada de inclusão.
5. Os diálogos seguintes a este são preenchidos de forma similar, de acordo com o quadro abaixo:
6. Crie o layout da aplicação com todas as colunas, uma canvas de conteúdo e uma barra de
rolagem (bem simples).
7. Altere o nome do bloco para BFunc para que fique compatível com as informações que passamos.
8. Abra a paleta de propriedades do bloco com o nó Banco de Dados expandido. Analise o resultado
gerado nas propriedades Tipo de Origem de Dados de Consulta(Query Data Source Type), Nome
de Origem de Dados de Consulta (Query Data Source Name), Colunas de Origem de Dados de
Consulta (Query Data Source Columns) e Argumentos de Origem de Dados de Consulta (Query
Data Source Arguments).
CAPÍTULO 2: BLOCOS - 25
BRAVT-TREINAM-9F-061220-LFern
9. Expanda, agora, o nó Banco de Dados Avançado para a especificação das propriedades das
demais rotinas (confira o que está preenchido), da seguinte forma:
• Tipo de Destino dos Dados de DML (DML Data Target Type) – esta propriedade indica para
onde os dados a serem incluídos, alterados, bloqueados ou excluídos serão enviados. No
nosso caso Procedimento.
• Nome do Destino dos Dados de DML (DML Data Target Name) – Se a propriedade anterior
estivesse preenchida com Tabela, nesta propriedade teríamos o nome da tabela. No nosso
caso em cada situação os dados serão enviados para rotinas diferentes, portanto esta
propriedade é irrelevante.
• Os argumentos e retornos nas quatro situações são similares. Desta forma veremos apenas
na situação de inclusão:
• Inserir Colunas de Conjuntos de Resultado (Insert Procedure Result Set Columns) - são
apresentados todos os parâmetro do tipo OUT ou IN OUT. Como nosso parâmetro Table é do
tipo IN OUT, ele é automaticamente listado neste diálogo.
As demais propriedades relativas a argumentos são preenchidas de forma similar. Verifique se os valores
estão corretos.
CAPÍTULO 2: BLOCOS - 26
BRAVT-TREINAM-9F-061220-LFern
Foram criados todos os itens associados ao parâmetro PTAB. No nosso caso este parâmetro é
do tipo CFUNC correspondendo à linha (row) da tabela Func. Caso o tipo CFUNC fosse
derivado de um RECORD com descrição específica, os elementos deste RECORD é que
apareceriam subordinados ao nó Itens do bloco.
Se houver qualquer erro de sintaxe relativamente a elas, devemos retornar à etapa anterior e
verificar o preenchimento das propriedades relativas aos argumentos das rotinas.
- Quando solicitamos a opção Salvar (Commit), caso hajam inclusões a serem realizadas a
rotina de inclusão é acionada uma única vez, recebendo como parâmetro todas as linhas a
serem incluídas. O mesmo ocorre com a rotina de alteração e exclusão.
CAPÍTULO 2: BLOCOS - 27
BRAVT-TREINAM-9F-061220-LFern
• Uma Stored Procedure se comunica com o Form através de uma variável Cursor ou de um tipo
Table. A especificação destes tipos é obrigatória em todos os tipos de procedimento.
• A variável Cursor só pode ser utilizada para Consulta. Já o tipo Table pode ser usado em
ambas as situações.
• Como vantagem de utilização da variável Cursor temos que ela favorece o mecanismo de
transferência de informações (Array Processing), isto significa, que quando usamos este tipo
de variável a leitura dos registros no ambiente Server pode ser feita parcialmente, respeitando-
se os valores estabelecidos de Fetch. Já a tabela recebe todos os dados de uma única vez, o
que pode gerar a necessidade de uma quantidade maior de memória.
• No exemplo utilizamos um único tipo Record contendo todas as colunas necessárias à leitura,
porém a transferência de informações a tempo de bloqueio ou exclusão foi de toda a linha.
Não havia necessidade de trabalharmos desta forma. Podemos utilizar tipos Record diferentes
para leitura, atualização, exclusão e bloqueio, desde que os elementos individuais, presentes
nos tipos tenham os mesmos nomes (entre si), ou seja, a associação é feita por nome.
Retornando Valores
Quando efetuamos uma operação de atualização no banco de dados (inclusão ou alteração), podemos
desejar retornar os valores atualizados.
Isto é muito útil quando temos um trigger associado à tabela que modifica os valores atualizados.
O Form Builder permite que façamos esta operação através da propriedade DML Returning Value (grupo
Advanced Database).
Quando esta propriedade está preenchida com YES e o banco de dados em uso é um Oracle9 database, o
Forms utiliza a cláusula Returning para retornar os valores que tenham sido modificados após as
operações de atualização por causa da execução de triggers no banco de dados.
Desta forma o usuário não terá necessidade de executar a query novamente após uma atualização.
OBS: esta cláusula terá efeito apenas para bancos de dados da versão 9 ou superior e para inserts e
updates.
CAPÍTULO 2: BLOCOS - 28
BRAVT-TREINAM-9F-061220-LFern
Sendo assim os itens estão subordinados, visualmente, à canvas em que são apresentados. Ao tempo de
atualização, crítica, leitura, gravação e todas as ações funcionais estão subordinados aos blocos, porém
itens pertencentes a um mesmo bloco podem ser apresentados em diferentes canvas, da mesma forma
que itens pertencentes a blocos diferentes podem ser apresentados numa mesma canvas.
Para que tenhamos, graficamente, informações a respeito desta hierarquia, o Navegador de Objetos
oferece uma alteração das informações para este padrão através da opção View Visual (Visual View) do
menu Visualizar (View), como apresentado pela figura 20.
Na janela Window1 encontramos a Canvas3 onde se acham subordinados todos os itens visíveis desta
aplicação.
Podemos desta forma concluir que a hierarquia visual é composta de Windows – Canvas – Itens.
A janela Null_Window é uma janela fictícia. Representa a hierarquia de todos os objetos que não serão
visualizados, ou seja, dos objetos que não estão subordinados a uma canvas. Estes objetos são
chamados de Null_Canvas Itens ou objetos que se apresentariam em uma canvas fictícia chamada
Null_Canvas.
Sendo assim a figura 20 apresenta todos os objetos visíveis subordinados às suas canvas e janelas (onde
se apresentarão) e todos os objetos escondidos aparecem subordinados a uma canvas não visível e uma
janela não visível.
Ao retornarmos ao modo View Propriedade (Property View) podemos verificar que o nó Canvas somente
apresenta a Canvas3 e o nó Janelas (Windows) só apresenta a Window1.
Itens
Em uma aplicação gráfica, os dados não se apresentam de uma única forma. Podem ser botões, listas,
imagens, gráficos, etc.
Em uma aplicação Forms, portanto, poderemos apresentar os dados de uma forma mais agradável e
amigável para o nosso usuário, bastando para isto que modifiquemos os tipos de itens em que os dados
são apresentados.
Lembre-se, porém, de que a informação armazenada no buffer associado àquele item continua a mesma,
ou seja, se foi lido do banco o valor 42 para grau de instrução, a forma de visualização pode ser uma lista
de nomes, mas o que está no banco de dados e na memória é 42. Por isto devemos, de acordo com o tipo
do item, estabelecer regras de conversão entre o valor real do dado e o valor apresentado para o usuário.
PROPRIEDADES COMUNS
Ao abrirmos a paleta de propriedades de um item qualquer verificaremos que estes possuem uma
quantidade significativa de características a serem analisadas.
O grupo funcional será o último analisado uma vez que possui características específicas ao tipo do item.
• Tipo de Dado (Data Type) – indica se o dados armazenado é numérico, data, caracter, etc.
• Tamanho Fixo (Fixed Length) – indica que o dado a ser armazenado sempre terá o
comprimento igual ao tamanho máximo. Isto pode ser útil para informações de comprimento
fixo como por exemplo CEP.
• Valor Inicial (Initial Value) – indica qual o valor do item quando estamos fazendo a inclusão
de um novo registro no buffer. O usuário poderá modificar este valor quando vier a digitar os
dados do registro.
• Obrigatório (Required) – indica que o item deve ser preenchido. Não pode ser omitido em
uma inclusão ou apagado em uma alteração.
• Mínimo e Máximo Valor Permitido (Lowest / Highest Allowed Value) – indicam uma
restrição relativa aos valores aceitáveis para o item: o menor e o maior valor permitidos.
Grupo Cálculo(Calculation)
No grupo Cálculo poderemos estabelecer um item que seja um somatório ou uma fórmula resultante dos
itens de outro bloco.
• Número de Itens Exibidos (Number of Items Displayed) – esta informação está preenchida
com zero, o que indica que a quantidade de itens exibidos acompanha a quantidade do bloco.
Na figura 21 vemos o que aconteceu quando alteramos as duas propriedades acima para os itens cd_mat
e nm_func.
• Nome da Coluna (Column Name) – indica o nome da coluna no banco de dados. Isto nos dá
a liberdade de nomear o item como quisermos.
• Somente Consulta (Query Only) – esta propriedade indica que este item não será atualizado
ou alterado nesta aplicação. Sua informação será apenas vista pelo usuário. Esta propriedade
impede que o item seja modificado.
• Consulta Permitida (Query Allowed) – esta propriedade indica que a tempo de Entrar
Consulta (Enter Query), o usuário poderá estabelecer uma restrição de pesquisa neste item.
Só devemos habilitar para pesquisa aqueles itens em que, realmente, permitimos que os
usuários venham a pesquisar. Bloqueie o uso de consulta nos demais itens. Isto pode trazer
modificações significativas na performance.
• Tamanho da Consulta (Query Length) – esta propriedade define que no momento de Entrar
Consulta (Enter Query) este item pode ter o mesmo tamanho da propriedade Tamanho
Máximo (Maximum Length) ou poderá ser maior. Isto é útil pois sabemos que uma restrição
poderia ser preenchida com “> 500”, por exemplo para o item matrícula. Isto precisa de mais
espaço que o tamanho máximo do item (no caso com 3 caracteres).
• Inserção Permitida (Insert Allowed) – esta propriedade indica que quando estivermos
criando um novo registro no buffer, este item estará apto a ser preenchido.
• Atualização Permitida (Update Allowed) – da mesma forma que a anterior, indica que
quando houvermos consultado um item, ou seja, quando não estivermos mais em um novo
registro (com estado de New ou Insert), poderemos modificar o valor deste item.
• Bloquear Registro (Lock Record) – esta propriedade indica que se o item atual for
modificado o Form deve, imediatamente, tentar o bloqueio da linha correspondente no banco
de dados. Esta propriedade pode ser útil quando temos um item no bloco que não pertence ao
banco de dados e, no entanto, desejamos que se seu valor for modificado, toda a linha seja
reservada. Para um item associado ao banco de dados este bloqueio é automático.
O grupo Lista de Valores (Lov) será estudado em tópico específico, assim como o grupo Editor.
• Finalizado (Rendered) – esta propriedade indica se um item que não detém o foco continua
conservando os recursos do sistema. Se a propriedade receber True (default), o item somente
precisará se utilizar dos recursos de apresentação (display) do sistema quando detiver o foco,
caso contrário os recursos são liberados.
• Mostrar Barra de Rolagem Vertical (Show Vertical Scroll Bar) – esta propriedade indica se
o item deve ou não apresentar uma barra de rolagem vertical. Esta propriedade somente faz
sentido para itens que os dados possam ser apresentados em mais de uma linha (texto) ou
imagens.
Grupo Ajuda
• Dica (Hint) – aqui poderemos preencher um texto que indique ao usuário como preencher este
item. Esta informação será apresentada na linha de mensagens quando o usuário navegar
para este item, se a propriedade Exibir Dica (a seguir) estiver habilitada.
• Tooltip (Tooltip) – corresponde a uma etiqueta flutuante que aparece ao lado do item para
indicar seu nome ou alguma informação pequena que indique ao usuário para que serve.
O grupo Prompt diz respeito ao texto que aparece ao lado do item para nomeá-lo ou identificá-lo a fim de
facilitar o preenchimento por parte do usuário. Trabalharemos estas características em um item específico
ainda neste mesmo capítulo.
• Várias Linhas (Multi-Line) – indicando se o texto contido no item poderá ocupar várias linhas.
O uso apenas desta propriedade não é suficiente para que o resultado seja mostrado em
diversas linhas. É necessário que, graficamente, aumentemos o tamanho do item na vertical
para que as demais linhas fiquem visíveis.
• Estilo de Sobreposição (Wrap Style) – definimos aqui como desejamos que o Form efetue a
quebra do texto entre as linhas.
• Ocultar Dados (Conceal Data) – indica que o texto digitado pelo usuário não será refletido no
vídeo. Isto é útil para campos de senha.
• Salto Automático (Automatic Skip) – aqui indicamos que quando o usuário digitar todo o
item, o cursor deverá, automaticamente, “pular” para o próximo campo.
Observe que as propriedades do grupo Funcional relativamente a este item são apenas Tecla de Acesso
(Access Key), Menu Popup (Popup Menu) e:
• Mapeamento de Outros Valores (Mapping of Other Values) – da mesma forma que para a
lista, a ausência de valor neste campo indica que a tempo de leitura ou atribuição por
programação não serão aceitos valores diferentes daqueles mapeados nos botões.
• Tecla de Acesso (Access Key) – indica uma letra da etiqueta que permitirá ao usuário
acionar o item com o uso das teclas Alt + <letra escolhida>.
• Valor do Botão de Rádio (Radio Button Value) – indica o valor que o item assumirá se o
usuário selecionar este botão.
• Estilo da Lista (List Style) – esta propriedade indica o tipo de lista a ser apresentada. Os
estilos Poplist e ComboBox (Caixa de Combinação) precisam que o usuário abra a lista para
selecionar um valor. Já o estilo Tlist pode mostrar mais de uma opção simultaneamente se o
espaço vertical no layout for maior. Apenas o estilo ComboBox permite que o usuário escolha
ou digite um valor. Os demais estilos somente permitem a escolha de valores da lista.
• Elementos da Lista (Elements in List) – esta propriedade deve ser preenchida para
estabelecer uma relação entre os valores apresentados para o usuário na lista e o valor do
dado no banco de dados e na memória (buffer) do bloco.
Nota:
Para incluirmos um elemento novo no meio da lista, devemos
selecionar o elemento imediatamente anterior e pressionar as teclas
ctrl + shift + >.
Se desejarmos excluir um elemento da lista, devemos nos posicionar Fig. 22 – Elementos da Lista
sobre o elemento e pressionar as teclas ctrl + shift + <.
• Mapeamento de Outros Valores (Mapping of Other Values) - indica ao Oracle como deve
ser posicionada a lista quando for lido do banco ou atribuído por programação um valor a este
item que não esteja presente na lista de valores.
Cuidado!
Se deixarmos esta propriedade sem preenchimento, estamos indicando que não serão admitidos outros
valores. Desta forma a tempo de leitura do banco de dados um item com um valor não compatível com a
lista é rejeitado, isto é, não é lido para o programa.
IMAGEM (IMAGE)
• Formato da Imagem (Image Format) – com esta propriedade podemos determinar o formato
no qual a imagem será armazenada no banco de dados. Os valores válidos são: BMP, CALS,
GIF, JFIF, PICT, RAS, TIFF, TPIC.
• Estilo de Dimensionamento (Sizing Style) – indica o que deve ser feito quando a imagem
não cabe no item definido para ela na canvas. A opção Crop (Recortar) indica que será
apresentada uma parte da imagem, ele aparecerá cortada. A opção Adjust (Ajustar) indica que
a imagem será ajustada (sem perder a proporção) para o tamanho definido para o item na
canvas.
TECLA(PUSH BUTTON)
Um botão não armazena dados. Não existem propriedades relativas ao grupo Banco de Dados, nem ao
grupo Dados. Um botão (ou tecla), tem a finalidade de iniciar uma ação.
• Nome do Arquivo de Ícones (Icon Filename) – indica o nome do arquivo que corresponde
ao ícone a ser apresentado.
• Botão Default (Default Button) – indica se este item será default dentre um grupo de botões
disponibilizados.
• Valor quando Assinalado (Value When Checked) – Esta propriedade indica ao Form para
interpretar como checado (ou assinalado) o valor que informarmos. Isto significa que quando
este item receber este valor o usuário verá a caixa marcada.
• Valor quando não-Verificado (Value When Unchecked) – Esta propriedade indica ao Form
para interpretar como não checado (ou não assinalado) o valor que informarmos. Isto significa
que quando este item receber este valor o usuário verá a caixa sem marcação.
Definindo Prompts
Nosso último teste se refere ao posicionamento do prompt do item.
Fig. 23 - Prompt
Atualmente as propriedades do grupo Prompt estão preenchidas da seguinte forma:
• Prompt (Prompt) – nesta propriedade temos o valor “Nome” que corresponde ao texto
exibido.
• Estilo de Exibição do Prompt (Prompt Display Style) – esta propriedade está preenchida
com Primeiro Registro (First Record), indicando que o prompt só deve ser apresentado no
primeiro registro. Para um bloco Multi-Record poderíamos desejar que o Prompt se repetisse
para cada registro.
Tabela 4
Fig. 24 - Prompt
Fig. 25 - Prompt
Da mesma forma, no Form, podemos entender a presença destes dois elementos, sendo a Canvas
considerada a tela e a Janela (Windows) considerada a moldura.
Janelas (Windows)
Quando criamos uma nova aplicação, é criada, automaticamente, uma janela (Window1).
Para que possamos apresentar as diversas telas (Canvas) da aplicação necessitamos montar pelo menos
uma janela. A janela faz a interface com o ambiente Windows.
Grupo Funcional
• Título(Title) - faz com que seja apresentado um título na janela (na barra azul superior).
• Canvas Principal (Primary Canvas) – Nesta propriedade indicaremos a primeira canvas a ser
apresentada nesta Janela. Esta propriedade só é obrigatória de preenchimento se viermos a
acionar a apresentação de uma janela por programação (rotina Show_Window). Caso
contrário a canvas apresentada corresponderá àquela que contém o primeiro item da
seqüência de navegação.
A seqüência de navegação é definida pelos blocos e itens. Um elemento que detém o foco nunca fica
escondido, ele sempre é apresentado, forçando o aparecimento da canvas onde ele está “espetado”.
Mesmo que criemos na aplicação uma canvas deste tipo, se esta propriedade não for
preenchida ela não será apresentada.
• Modal (Modal) – indica se a janela atual pode ou não perder o foco. Quando indicamos que
uma janela é Modal, o Form impede que o usuário navegue para outra janela sem fechar a
janela atual. Esta opção é muito utilizada para a apresentação de mensagens ou informações
de ajuda.
Se preenchermos esta propriedade com Sim e o estilo da janela com Caixa de Diálogo, a
tempo de execução não será possível a navegação para a janela do Forms Runtime, uma vez
que os controles de término (botões e menu) estão presentes nesta janela, haverá
necessidade de abortar a aplicação.
• Ocultar na Saída (Hide on Exit) – determina que se o foco for movido para um item
apresentado em outra janela, a janela atual deve ser posicionada atrás da que deterá o foco.
Caso esta propriedade esteja preenchida com Não, esta ação só ocorrerá se o item que
receberá o foco estiver escondido atrás da janela atual. Se ele estiver visível, a janela atual
continua na frente das demais.
Esta propriedade quando habilitada não fecha a aplicação a menos que tenhamos programado
(When-Window-Closed) esta ação. Isto significa que a aplicação recebe a indicação de que o
usuário tentou fechar a janela, mas como não existe nenhuma ação automática, nada
acontece.
Caso o usuário tente fechar a janela do Forms Runtime, o próprio Form determina o
fechamento da aplicação subordinada executando um comando Do_key(‘exit_form’).
• Título Minimizado (Minimized Title) – informamos aqui o texto a ser apresentado quando a
janela é minimizada.
• Nome do Arquivo de Ícones (Icon Filename) – Indica o ícone a ser usado quando a janela é
minimizada.
• Herdar Menu (Inherit Menu) – Indica se a janela atual deve apresentar o Menu associado à
aplicação.
Canvas
Já sabemos que uma Canvas corresponde à tela de um quadro.
Em uma mesma janela podem ser apresentadas diversas canvas simultaneamente, porém apenas uma
delas pode ser de conteúdo (Content), pois esta é a canvas principal da janela.
Fig. 27 – Simultaneidade
das Canvas
A propriedade que determina o tipo da canvas (Canvas Type) está presente no grupo Geral.
• Posição X do Visor no Canvas – uma canvas pode apresentar uma parte da informação na
janela. Esta parte visível é determinada por um objeto chamado visor (Viewport). O tamanho
deste visor para uma canvas do tipo Conteúdo é determinado pelo tamanho da janela onde se
apresenta a tempo de execução.
No exemplo da figura 28, preenchemos as duas propriedades de posicionamento do visor com 30. Como
resultado, observamos que do trecho visível da Canvas foi omitido uma faixa à esquerda e uma faixa
superior.
Ao acionarmos o editor de Layout observaremos que a área prevista para desenho não foi diminuída, ou
seja, o tamanho da canvas deve ser diminuído manualmente por nós.
Quando definimos que uma canvas é do tipo Barra de Ferramentas Horizontal, o Form a apresenta acima
da canvas do tipo Conteúdo, independente do seu tamanho.
Uma canvas com o tipo de barra de ferramentas (horizontal ou vertical) não possui um Viewport.
• Estilo dos Cantos (Corner Style) – determina o aspecto que o contorno (os cantos) da
etiqueta de cada pasta assumirá. A diferença é sutil. Os valores válidos são: Quadrado,
Chanfrado e Arredondado.
• Estilo da Largura (Width Style) – Indica se a Canvas poderá ou não variar de tamanho. Os
valores válidos são: Fixo e Variável.
• Limite de Conexão de Tab (Tab Attachment Edge) – com esta propriedade determinamos
de que lado da pasta as etiquetas serão apresentadas.
Quadro (Frame)
Na figura 30, subordinado à canvas Canvas2, verificaremos a existência de um objeto chamado Frame5
que se constitui de um objeto exclusivamente gráfico para apresentação de informações em uma canvas.
O grupo Quadro de Layout (Layout Frame) possui algumas propriedades já comentadas anteriormente,
mas que adquirem aspectos particulares neste objeto.
• Bloco de Dados de Layout (Layout Data Block) – Quando esta propriedade possui o valor
preenchido com o nome de um bloco de dados e a propriedade Atualizar Layout (Update
Layout) estiver com o valor Automaticamente (Automatic), qualquer modificação que fizermos
nas propriedades do Frame são refletidas nas propriedades do bloco, do item, etc. Os outros
elementos herdam as características que estabelecermos aqui.
• ShrinkWrap (ShrinkWrap) – Esta propriedade permite que o Form Builder aproxime o Frame
dos objetos internos. Quando aumentamos o tamanho do Frame e esta propriedade está
preenchida com Sim, o Form Builder diminui o Frame para que este fique próximo aos objetos.
• Preenchimento Vertical (Vertical Fill) – Esta propriedade indica se o Form Builder deve ou
não colocar o maior número possível de objetos por linha. Se esta propriedade estiver
preenchida com Sim, a propriedade que determina o número máximo de objetos por linha é
ignorada.
Fig. 31 - Quadro
WORKSPACE
É a área de janela do Layout, ou seja, a área disponível para desenho. Seu tamanho é independente do
tamanho atual da janela, isto é, o Workspace pode ser maior ou menor que a área da janela.
Quando o Workspace é maior que a janela, podemos rolar a janela para ver outras partes do Workspace.
Para alterar o tamanho do Workspace, devemos selecionar no menu Formato (Format) o submenu Opções
de Layout (Layout Settings) e neste a opção Layout.
RÉGUAS (RULERS)
Uma régua horizontal (em cima) e uma vertical (lateral esquerda). Esta régua pode ser apresentada em
unidades diferentes (ex.: centímetros, caracteres, pés, etc.), de acordo com a unidade em vigor no Form.
GUIAS
Podem ser selecionadas guias (tracejadas) horizontais e verticais para referência.
Para selecionarmos uma guia basta que posicionemos o mouse sobre uma das réguas, o pressionemos e
arrastemos até a posição desejada para apresentação da guia.
GRID
Existe uma grade dentro do Workspace para auxílio no posicionamento de objetos. Se desejarmos
visualizar esta grade devemos esconder a visibilidade da canvas. Usar o menu Visualizar (View), opção
Mostrar Canvas (Show Canvas).
Se você testar esta opção e a grade não aparecer, não se assuste. Isto às vezes ocorre quando a
distância entre as linhas da grade é tão grande que dá a impressão que não tem grade.
Para corrigirmos esta situação, devemos selecionar no menu Formato, Opções de Layout, o item Régua
(será apresentado um diálogo que permitirá o espaçamento).
As Barras de Ferramentas
Ao olharmos para a tela do Layout Editor observamos a presença de duas barras de Ferramentas
Superiores e uma Vertical, na lateral esquerda.
• Recortar / Copiar / Colar - estas ações recortam, copiam ou colam objetos no layout. Se
recortarmos um item ele será removido do Layout e do Navegador de Objetos, não sendo
possível seu retorno com o botão Colar.
Os próximos três botões acionam os três Assistentes(Wizards) disponibilizados pelo Form Builder:
Em seguida temos um campo do tipo Lista que mostra uma lista de canvas. Quando selecionamos outra
canvas da lista, imediatamente o editor de Layout apresenta esta nova canvas. Neste editor somente
efetuamos a manipulação de uma canvas de cada vez.
O penúltimo elemento desta barra é um campo do tipo Lista que mostra uma lista de blocos(Contexto de
Bloco).
Esta lista tem a finalidade de indicar o bloco em que se encontra o elemento selecionado. Ao
selecionarmos um determinado elemento e escolhermos outro bloco, o elemento será transferido de bloco,
adquirindo a funcionalidade associada ao outro bloco.
As duas primeiras listas determinam o tipo de letra e tamanho. Para que esta ação tenha efeito devemos
selecionar(clicar o mouse sobre o elemento) o item ou objeto de texto (prompt por exemplo) e modificar
sua letra e tamanho.
Os botões seguintes aumentam ou diminuem o nível de Zoom. A indicação do nível atual se acha presente
no rodapé da tela de layout. Cada vez que pressionamos o botão Ampliar ( + ), o nível de Zoom é
duplicado. Da mesma forma, cada vez que pressionamos o botão Reduzir ( - ), o nível de Zoom é dividido
por dois.
O grupo de botões a seguir realiza alinhamento de elementos uns em relação aos outros. Os três primeiros
realizam o alinhamento horizontal e os três seguintes realizam o alinhamento em relação ao eixo Y
(vertical).
Para realizarmos este alinhamento devemos selecionar simultaneamente (clique com o mouse e mantenha
o botão Ctrl pressionado) os itens para os quais desejamos realizar o alinhamento (os quais devem estar
posicionados verticalmente uns acima dos outros) e pressionar um dos botões de alinhamento (esquerda,
central ou direita).
Para realizarmos o alinhamento horizontal, os itens selecionados devem estar lado a lado, caso contrário
serão posicionados uns sobre os outros.
O layout do Form é construído em duas camadas (Layers) principais. A primeira camada é a camada de
itens. A segunda camada é a camada de objetos gráficos.
Os itens podem ser sobrepostos entre si, assim como os objetos gráficos, porém um objeto gráfico não fica
sobre um item. Um item sempre tem precedência.
Os dois últimos botões desta barra de ferramentas possuem as ações de trazer para frente e enviar para
trás e se aplicam a objetos gráficos.
O primeiro grupo contém botões que se aplicam a diversos tipos de objetos, são gerais para os diversos
elementos presentes nas canvas:
• Girar (Rotate) - gira os objetos (gráficos, itens não podem ser rodados). Para girarmos um
elemento devemos selecioná-lo, clicar na ferramenta e, com o mouse, pressionar um dos
indicadores de tamanho (presentes nos cantos do objeto) e sem soltar o botão esquerdo do
mouse rodar .
• Ampliar (Magnify) - aumenta ou reduz a apresentação do Layout (fator - 2x), isto é, zoom.
Para obtermos este efeito devemos clicar sobre o botão e em seguida sobre a canvas. O efeito
inverso é obtido com os mesmos movimentos, porém, a tecla Ctrl (ou Shift) deve esta
pressionada simultaneamente.
• Reformar (Reshape) - permite que se modifique um objeto (gráfico) selecionado (ex.: ângulo
de um arco). Para efetuarmos um teste com esta ferramenta, devemos criar um objeto do tipo
Arco, selecione-o na paleta de ferramentas e faça um arco. Com este objeto selecionado
pressione o botão Reformar. Você perceberá que apenas dois pontos ficam indicados no
elemento. Utilize o mouse para arrastar um destes pontos e modificar o ângulo do arco.
O terceiro grupo cria itens. Da mesma forma que fizemos no Navegador podemos criar itens diretamente
na Canvas desejada.
O único cuidado adicional a ser tomado é a identificação do bloco em que o item será criado.
Para que o elemento seja adicionado ao bloco desejado, devemos posicionar a lista que
contém os nomes dos blocos no bloco que pretendemos (Block Context). Esta lista se
encontra na Barra de Ferramentas Horizontal Superior.
Fig. 35 – Botões da
Paleta de Ferramentas.
• Botão (Button) - cria itens do tipo botão (Button)
• Botão de Rádio (Rádio Button) - cria itens do tipo Botão de Rádio. Ao criarmos um item
deste tipo o Form Builder criará um Grupo de Rádios (Radio Group) se não existir nenhum no
bloco definido ou apresentará uma lista de grupos para que façamos uma seleção entre os
existentes ou optemos pela criação de um novo.
• Item de Gráfico (Chart Item) - cria um item do tipo gráfico(Chart) desenhado no Oracle
Graphics.
• Recipiente OLE (OLE2 Object) - cria um item do tipo OLE2 para interface com outras
aplicações do ambiente Windows.
• Controle X Ativo (ActiveX Control) - cria um item do tipo Controle X Ativo (ActiveX) para
interface com um objeto OCX do ambiente Windows.
Neste conjunto ainda existem dois botões referentes à criação da Canvas Tab(Tab) e da Canvas
Empilhado(Stack). A vantagem da definição da Canvas diretamente no Layout é que podemos definir,
visualmente, seu posicionamento sobre uma canvas de Conteúdo (Content).
• Canvas de Guia (Canvas Tab) – cria uma canvas do tipo Tab (Pasta) e permite seu
posicionamento sobre a canvas Content desejada.
• Canvas Sobreposto (Canvas Stack) – cria uma canvas do tipo Empilhado (Stack) e permite
seu posicionamento sobre a canvas Content desejada.
O último grupo de botões contém o que chamamos de paleta de atributos visuais, pois os
botões presentes nesta paleta tem a finalidade de atribuir cor aos objetos (itens e
boilerplates).
Fig. 36 – Paleta de
Atributos Visuais
• Cor de Linha (Line Color) - Indica as características da linha que envolve o objeto (borda).
Pode ser preenchido com um dos seguintes valores:
• Cor de Texto (Text Color) - Indica a cor do texto. Podemos escolher uma das opções a
seguir:
Nota
A informação de cor de cada objeto é armazenada com um índice para localização de cor na paleta. Se
alterarmos a paleta, a conseqüência será a modificação involuntária da cor do objeto.
REDIMENSIONAR A CANVAS
O redimensionamento é feito com o cursor, clicando-se no canto inferior direito da canvas e arrastando-se
o mouse até a posição desejada, podemos modificar seu tamanho.
O Viewport aparecerá como um retângulo com os cantos pretos (quadrado preto). Esta opção só é válida
para Canvas do tipo Empilhado (Stack).
MOVER O VIEWPORT
Para mover o viewport, usamos o mouse ou o teclado (teclas de setas para direita, para esquerda, para
cima ou para baixo). Esta opção irá alterar as coordenadas do Viewport, que podem ser verificadas no
conjunto de propriedades da canvas.
Para tal, devemos abrir o editor de Layout com a Canvas de Conteúdo e, no menu Visualizar (View),
escolher a opção Views Sobrepostas (Stacked Views). Será, então, apresentado um diálogo contendo uma
lista de Canvas do tipo Tab ou Empilhado (Stack) definidas em sua aplicação.
Para apresentarmos uma destas canvas, devemos clicar sobre ela (ficará em azul) e apertar o botão OK.
O Layout será novamente mostrado com a Canvas apresentada sobre a outra.
Para escondermos novamente esta Canvas devemos abrir o diálogo anterior novamente (opção Views
Sobrepostas do menu Visualizar). Será apresentada uma lista com a Canvas em questão marcada (azul).
Para desmarcá-la, devemos pressionar a tecla Ctrl e clicar sobre a linha contendo o nome da Canvas. Em
seguida apertar o botão OK.
Se desejarmos efetuar seu dimensionamento devemos selecioná-la (canto esquerdo inferior), para que
sejam apresentados os indicadores de tamanho e possamos dimensioná-la adequadamente.
Uma maneira mais fácil de identificarmos o posicionamento desta Canvas é antes de iniciar este processo
pintá-la de outra cor para sua visualização ser total.
A movimentação requer que a Canvas esteja selecionada. Utilize o teclado (seta para cima, seta para
baixo, seta para direita e seta para esquerda) para a movimentação.
CRIANDO ITENS
Para criarmos um novo item, devemos cumprir os seguintes passos:
• Selecionar o bloco onde o item será criado (Barra de Ferramentas Horizontal Superior).
• Na paleta de ferramentas, selecionar a ferramenta para o tipo de item que desejamos criar.
• Posicionar o cursor na canvas onde desejamos que seja o canto esquerdo superior do item
seja posicionado.
• Pressionar o mouse uma vez para criação de itens no tamanho default ( de acordo com a fonte
selecionada) ou pressionar e arrastar o mouse até o desenho atingir o tamanho desejado.
O Form Builder vai associar o novo item ao bloco corrente. se este bloco for do tipo multi-record, mostrará
“n” desenhos do item, um para cada registro do bloco.
MOVER ITENS
Para mover um item, usamos o mouse. Esta opção irá alterar as coordenadas do item, que podem ser
verificadas no conjunto de propriedades do item selecionado.
Este valor pode ser fornecido nas unidades: polegadas, centímetros, pontos ou caracteres.
Posteriormente, podemos reutilizar as opções definidas sem necessidade de reabrir o diálogo usando a
opção Repetir Dimensionamento (Repeat Sizing) do mesmo menu Organizar (Arrange).
• Verticalmente temos: topo, base, centralizar, distribuir (espaços entre objetos verticalmente
iguais) e pilha (objetos colados lateralmente uns nos outros).
O alinhamento também pode ser repetido com a opção Repetir Alinhamento (Repeat Alignment) do menu
Organizar (Arrange).
BOILERPLATE GRÁFICO
Para adicionarmos um boilerplate gráfico a uma Canvas, usamos as ferramentas adequadas da paleta de
ferramentas.
O modo de criação é semelhante ao visto anteriormente para Boilerplate de Texto, Items, etc.
Fig. 39 – Diálogo
Fonte
Neste diálogo podemos determinar a fonte, estilo de letra, tamanho
e efeitos para o item ou boilerplate selecionado.
MODIFICANDO A LINHA
Existem cinco opções para customização de linha:
ALINHAMENTO E ESPACEJAMENTO
O alinhamento e espacejamento dos textos dos itens pode ser feito com as
opções Espacejamento de Texto (Spacing) e Justificar (Alignment).
OPERAÇÕES
As seguintes operações podem ser feitas com objetos (itens e boilerplates):
• Recorte - após a seleção, devemos escolher a opção Recortar (Cut) ou Copiar (Copy) do
menu Editar (Edit). A opção Recortar, quando aplicada a um item age como a opção Limpar
(Exclusão).
• Exclusão - usar a opção Limpar (Clear) do menu Editar (Edit )ou apertar a tecla Delete.
• Duplicação - após a seleção, usar a opção Duplicar (Duplicate) do menu Editar (Edit).
Quando duplicamos um item, no mesmo bloco, o Form Builder associa um novo nome a este item, uma
vez que os nomes devem ser únicos dentro de um bloco.
Quando duplicamos um item, todos os triggers(veremos no próximo capítulo) associados a ele são
duplicados também.
Para que a associação seja estabelecida, devemos selecionar simultaneamente os dois elementos e
pressionar o botão Prompt Associado, presente na barra de ferramentas inferior da janela do Editor de
Layout (último botão à direita) ou usar a opção Prompt Associado do menu Organizar.
Conceitos
EVENTOS
Uma aplicação Form é sensível a eventos ou orientada a eventos. Isto significa que quando determinadas
situações ocorrem a aplicação recebe uma indicação e pode efetuar uma ação.
Por exemplo, suponhamos que o usuário tenha pressionado o mouse sobre um item do tipo botão. A
aplicação recebe uma indicação de que esta situação (evento) ocorreu e pode ou não realizar uma ação.
Para usarmos a nomenclatura da ferramenta diremos que um trigger é ativado pelo Form em resposta a
um evento.
GATILHOS(TRIGGERS)
Gatilhos (Triggers) são blocos de código PL/SQL que escrevemos para adicionar funcionalidade a uma
aplicação. Gatilhos (Triggers) são ativados ou acionados pelo Form em resposta a um evento.
Os nomes dos gatilhos (triggers) correspondem aos eventos. É o nome que estabelece a associação entre
o evento e o código do trigger.
Destas três afirmativas concluímos que quando um evento ocorre o Form verifica se adicionamos algum
código de PL/SQL a este evento (ou seja a um trigger). Caso isto tenha ocorrido ele executa o código que
tivermos definido.
O escopo, ou abrangência, determina quando um evento deve ocorrer para que o trigger seja acionado.
ITEM
Um trigger definido a nível de item, isto é, associado a um determinado item, só é acionado se o evento
ocorrer enquanto o foco estiver exatamente no item escolhido.
BLOCO
Um trigger definido a nível de bloco, isto é associado a
um determinado bloco, só é acionado se o evento
ocorrer enquanto o foco estiver em algum dos itens ou
em algum dos registros do bloco escolhido.
MÓDULO
Um trigger definido a nível de módulo é o mais
abrangente. O trigger será acionado se o evento ocorrer
enquanto o foco estiver em qualquer dos itens, registros
ou blocos da aplicação (módulo).
Na figura 41 encontramos uma imagem do Navegador de Objetos (Object Navigator) contendo três
gatilhos (triggers) criados nos três níveis disponíveis: When-New-Form-Instance (a nível de módulo),
When-Validate-Record (a nível de bloco - Func) e When-Validate-Item (a nível de item – cd_mat).
ORDEM DE EXECUÇÃO
Quando definimos o mesmo trigger em diferentes níveis, normalmente o Form define que o trigger de nível
mais baixo, ou seja, aquele mais específico seja acionado.
Suponhamos que tivéssemos definido um mesmo trigger para o item cd_mat e para o bloco Func.
Se o evento ocorresse enquanto o foco estivesse sobre o item cd_mat, o trigger acionado seria aquele
definido a nível de item, porém, se o evento ocorresse enquanto o foco estivesse em qualquer outro item
do bloco Func, o evento acionado seria aquele definido a nível de bloco.
Esta é a forma normal de ação da ferramenta. Podemos, no entanto, desejar que quando o evento ocorrer
no item cd_mat, ambos os gatilhos (triggers) (a nível de item e a nível de bloco) sejam acionados. Esta
opção é uma das propriedades que poderemos definir para um trigger (hierarquia de execução).
RESTRIÇÕES
Alguns gatilhos (triggers) somente podem ser definidos em um nível específico, ou seja, não podemos criar
sua definição em todos os três níveis.
Para que não haja dúvidas e erros de definição, o Form não disponibiliza todos os gatilhos (triggers) em
todos os níveis.
Quando criamos um trigger escolhemos de uma lista pré definida a qual evento faremos referência. Na
lista apresentada somente os eventos válidos para o nível particular são mostrados.
• O próximo passo será a definição do texto de PL/SQL associado ao gatilho, pois que o editor
de PL/SQL será acionado neste momento.
O EDITOR DE PL/SQL
A janela do editor nos apresenta algumas informações a respeito do código de PL/SQL em definição.
• Novo (New) – cria um novo gatilho (trigger) com o mesmo escopo do atual. Um diálogo
contendo a lista de eventos é apresentada.
- Se o gatilho (trigger) foi criado a nível de módulo, a primeira lista estará preenchida com o
texto “Nível de Form”(Form Level) e a segunda lista ficará vazia.
- Se o gatilho (trigger) foi criado a nível de bloco, a primeira lista estará preenchida com o
nome do bloco e a segunda lista com “Nível de Bloco de Dados” (Data Block Level).
- Se o gatilho (trigger) foi criado a nível de item, a primeira lista estará preenchida com o
nome do bloco e a segunda lista com o nome do item.
Finalmente a última linha de informações apresenta o nome do gatilho (trigger), da unidade de programa
(program unit) ou do item de menu (menu item).
Estas listas também podem ser utilizadas para navegação entre os diversos códigos de PL/SQL da
aplicação. Basta que modifiquemos o elemento da lista.
Neste tópico incluiremos gatilhos de diversos tipos na aplicação para que tenhamos condições de verificar
o momento exato de sua execução.
O Form percebe uma grande quantidade de eventos. Por este motivo eles foram subdivididos em grupos
que facilitam nosso entendimento sobre o momento de sua ocorrência.
Existem duas formas de subdividirmos os triggers: Por Nome e Por Categoria Funcional.
• Key-<evento> - possuem uma ligação direta com o teclado. O evento é causado quando o
operador pressiona uma seqüência de teclas pré definidas. Um gatilho para este tipo de
evento faz a substituição do processamento default do Forms. Isto significa que quando
adicionamos este tipo de gatilho estamos indicando ao Forms que a ação implícita será
suprida por programação.
• Interface – neste grupo se encontram todos os eventos ligados a ações do usuário, sejam elas
realizadas com o mouse ou com o teclado. Alguns eventos deste grupo são acionados apenas
quando o usuário efetua uma ação (pressiona o mouse sobre um botão, por exemplo), outros
são acionados quando o usuário efetua uma ação ou por programação (redimensionamento de
uma janela, por exemplo).
• Transação – este grupo de eventos encontra-se ligado ao momento em que o Form realiza a
comunicação com o banco de dados seja para efetivação da transação, leitura de dados
(Select), início e fim de conexão ou bloqueio (lock). Deste grupo os gatilhos mais importantes
são aqueles ligados à efetivação da transação. São a estes que daremos especial atenção.
ROTINAS PRÉ-DEFINIDAS
O Form possui mais de 100 rotinas que permitem a realização de diversas ações por programação, tais
como:
O Form valida individualmente os itens e os registros. Quando o Form tem necessidade de efetuar uma
validação, podemos incluir nossas próprias regras de validação em adição (e após) àquelas estabelecidas
por ele.
Um gatilho associado a este evento é ideal quando desejamos adicionar algum tipo de validação a
um determinado item (neste caso podemos criar este gatilho a nível de item) ou quando desejamos
adicionar algum tipo de validação comum a qualquer um dos itens do registro (neste caso
podemos criar este gatilho a nível de bloco).
• When-Validate-Record – Este evento é causado todas as vezes que o Form percebe que
houve alguma mudança no registro e este precisa ser validado novamente.
Esta validação ocorre no momento em que o usuário tenta navegar para outro registro ou quando
ocorre o processamento padrão do Form (um Commit por exemplo) e, ainda, quando causamos
uma destas duas situações por programação.
Como todos estes gatilhos começam com When, eles serão acionados após o evento padrão, isto é, após
a validação padrão do Forms, em adição a esta.
• que o gatilho está a nível de item (o nome do bloco e o nome do item estão preenchidos).
• que não precisamos definir um bloco de PL/SQL completo pois o Form adiciona um Begin
antes destes comandos incluídos no gatilho e um End no fim. Desta forma se desejarmos
incluir uma variável ou qualquer tipo de código mais complexo podemos considerar que
estamos dentro de um bloco de PL/SQL, ou seja, podemos definir quantos blocos
independentes ou aninhados desejarmos.
• que a rotina message recebe dois parâmetros (no entanto só informamos um).
Quando ocorrem mudanças na situação de um registro ou mesmo de todo o buffer, temos condições de
incluir ações em adição àquelas já realizadas por ele.
• When-Create-Record – Este gatilho será acionado quando o Form cria um novo registro em
um bloco.
• When-Clear-Block – Este gatilho será acionado quando o Form limpa o bloco corrente,
esvazia a área de buffer.
Como todos estes gatilhos começam com When, eles serão acionados após o evento padrão, isto é, após
a remoção do registro ou após o registro ter mudado de estado ou após a criação do registro, etc. Podem
ser acionados pelo usuário ou por programação.
Estes gatilhos podem ser adicionados a nível de item, bloco ou Forms. Seu uso mais comum, no entanto,
é a nível de bloco.
Quando incluímos um gatilho (trigger) a nível de item, por exemplo When-Database-Record, estamos
indicando que somente se a mudança de estado do registro ocorrer enquanto o foco estiver no item
específico é que o gatilho será acionado.
Quando incluímos a nível de Form indicamos que se ocorrer mudança no estado de qualquer registro de
qualquer bloco o gatilho deverá ser acionado. A nível de bloco indicamos que quando ocorrer uma
modificação para qualquer registro daquele bloco o gatilho deverá ser acionado.
Nota
Quando indicamos ao Form para remover um registro (do banco de dados) ele o retira do buffer e
armazena seu rowid em uma lista de linhas a serem removidas.
Sendo assim, todas as vezes que retiramos uma linha do buffer seja lá qual for o motivo estaremos
acionando o gatilho When-Remove-Record.
Alguns eventos deste grupo são acionados apenas quando o usuário efetua uma ação (pressiona o mouse
sobre um botão, por exemplo), outros são acionados quando o usuário efetua uma ação ou por
programação (redimensionamento de uma janela, por exemplo) :
• When-List_Activated – Inicia uma ação quando um operador efetua uma click duplo em uma
lista do tipo T-List.
• When-Mouse-Up - Este gatilho é acionado quando o operador solta o botão do mouse após
um click em qualquer item do módulo ou em qualquer canvas se o gatilho estiver a nível de
módulo. Se o gatilho estiver a nível de bloco ou a nível de item, somente se o operador soltar o
botão do mouse no item específico ou em um dos itens do bloco específico.
Observe que os gatilhos associados e este grupo começam com When e, portanto, adicionam ações ao
procedimento padrão. Devido ao grande número de opções faremos apenas alguns testes.
Neste grupo ainda se encontram alguns gatilhos acionados exclusivamente pelo teclado. O quadro a
seguir apresenta a lista de gatilhos disponíveis, a ação padrão associada e a tecla necessária para o
acionamento da ação no Windows.
Os gatilhos deste grupo começam com Key, portanto já possuem uma funcionalidade padrão implícita.
Quando incluímos um trigger deste conjunto em nossa aplicação a ação padrão associada deixa de ser
executada.
Por este motivo, o Form Builder possui um conjunto de rotinas que executam as ações padrões, tanto de
teclado como também transacionais (veremos num dos próximos tópicos).
Em versões anteriores do Form o usuário contava apenas com o teclado para efetuar as ações que
desejasse. Com a introdução do mouse nas aplicações, o usuário conta agora com duas formas de efetuar
as ações: por teclado ou por botões (ou menus).
A diferença entre estas duas formas é que na segunda é necessário que o programador inclua um botão
na tela para realizar uma determina ação ou que inclua um item em um menu para executar o
procedimento desejado (considerando-se que retiraremos o menu e a barra de ferramentas padrão da
aplicação).
Desta forma as lógicas incluídas são validadas e verificadas. Não podemos nos esquecer, porém, que as
mesmas ações (Consultar, Salvar, Navegar, etc) podem ser feitas exclusivamente com o teclado, sem que
haja necessidade de nenhuma programação adicional.
Estes gatilhos permitirão que sejam desabilitadas (por exemplo) todas as teclas em que um botão ou item
de menu possua uma programação mais complexa e não desejemos que o usuário pule esta programação
ao acionar uma tecla de função. Poderemos incluir a mesma programação na tecla para que o usuário
tenha opções de executar a mesma ação de formas diferentes.
Nota
O importante é que durante a programação não venhamos a esquecer que isto pode acontecer e sejamos
surpreendidos por uma ação do usuário não prevista na programação.
Key-Others
O Form possui uma trigger neste grupo muito especial, criada para nos dar mais segurança na
programação. Ela se chama Key-Others. Quando incluímos esta trigger em nossa aplicação, toda e
qualquer ação de teclado fica desabilitada por default. Apenas serão válidas aquelas ações que forem
incluídas explicitamente na programação, ou seja, apenas aqueles gatilhos do tipo Key que tivermos
definido no Form.
Esta forma de trabalhar garante que não seremos surpreendidos pelo usuário na implantação do sistema.
Principalmente para aqueles programadores que estão começando a usar esta ferramenta, o uso do Key-
Others é mais seguro e mais documentável (pois torna os gatilhos usados visíveis na aplicação).
Quando, a tempo de execução listamos o conjunto de teclas (menu Ajuda-Help, opção Teclas-Keys)
percebemos que aparecem na lista ações que não foram mencionadas acima.
Isto ocorre porque nem todas as ações do teclado são passíveis de controle ou da criação de gatilhos
associados.
Ações normalmente executadas pelo gerenciador do ambiente (e não pelo Form), dentre outras não são
passíveis de intervenção.
• Pre-Query – Este gatilho é acionado imediatamente antes do Form preparar o comando Select
a ser enviado para o banco de dados. Isto permitirá que façamos uma intervenção neste
processo e modifiquemos por programação as condições da consulta a ser realizada.
• Post-Query – Este gatilho é acionado a cada linha lida do banco de dados. Isto permitirá que
façamos modificações no registro lido, completemos dados, cálculos, leitura de informações,
etc.
Os triggers deste grupo começam com Pre e Post, marcando momentos imediatamente antes ou depois
do evento (ou do When) onde estaremos adicionando funcionalidade. A consulta será executada de
qualquer forma.
Esta mudança pode ocorrer entre itens de um mesmo registro, de registros diferentes, de blocos diferentes
e, ainda para fora da aplicação ou na entrada de uma aplicação.
De acordo com o tipo de navegação um conjunto particular de eventos é causado. Quem causa este tipo
de evento pode ser o usuário ao mudar de item ou a programação ao comandar a mudança.
Este grupo de triggers pode ser subdividido em duas subcategorias: Pre / Post e When-New-Instance.
Os triggers deste grupo iniciam com Pre ou Post, portanto adicionam funcionalidade imediatamente antes
ou depois do evento ou When.
• Pre-Form – Inicia uma ação imediatamente antes do Form navegar para o módulo atual vindo
de outro módulo. Funciona como um Startup (só a primeira vez que o módulo ganha o foco).
• Pre-Block – Inicia uma ação quando o Form navega para o nível de bloco, tendo vindo do
nível de módulo.
• Pre-Record – Inicia uma ação quando o Form navega para o nível de registro, tendo vindo do
nível de bloco.
• Pre-Text-Item – Inicia uma ação quando o Form navega para o nível de item, tendo vindo do
nível de registro.
• Post-Text-Item – Inicia uma ação quando o Form deixa o nível de item e navega para o nível
de registro.
• Post-Record – Inicia uma ação quando o Form deixa o nível de registro e navega para o nível
de bloco.
• Post-Block – Inicia uma ação quando o Form deixa o nível de bloco e navega para o nível de
módulo.
• Post-Form – Inicia uma ação antes do Form navegar para fora do módulo.
Quando o Form navega de um objeto para o outro ele retorna ao nível superior. Por exemplo, quando ele
navega entre itens ele retorna ao nível de registro e seleciona o próximo item na seqüência de navegação.
Isto faz com que os gatilhos de Post-Text-Item (associados ao item anterior) e Pre-Text-Item associados
ao item atual sejam executados (mas não os gatilhos associados a registro – Post-Record e Pre-Record).
Estes gatilhos são acionados em diferentes situações de acordo com a navegação realizada. Por exemplo
entre dois itens de um mesmo registro ou entre dois itens em registros diferentes ou entre dois itens em
blocos diferentes ou quando iniciamos ou encerramos a aplicação.
Nestes triggers, no entanto, não podemos incluir rotinas que causem um desvio no processo de
navegação padrão (por exemplo, go_item).
Isto ocorre porque o Form é responsável por efetuar a navegação entre os objetos e enquanto esta
navegação estiver em andamento, não podemos interferir no processo, isto é, não podemos desviar o
caminho a ser seguido pelo Form.
Em vista disso e havendo necessidade de desvio o Form Builder possui um conjunto de triggers criados
especificamente para que possamos realizar desvios durante o processo de navegação.
Subcategoria When-New-Instance
Estes gatilhos podem receber comandos que desviem a ação normal de navegação. São executados após
o processo de navegação ter sido concluído e imediatamente antes do controle retornar ao usuário.
• When-New-Record-Instance – Inicia uma ação após o foco se mover para um novo registro.
Se o novo registro estiver também em um novo bloco, este gatilho é acionado após When-
New-Block-Instance, mas antes do When-New-Item-Instance.
As triggers deste grupo serão vistas no próximo capítulo quando estudaremos o relacionamento entre
blocos.
• On-Error – Este evento é acionado quando o Form recebe um erro. Podemos incluí-lo na
aplicação se desejarmos substituir a mensagem de erro padrão do Form por uma mensagem
de erro customizada.
• On-Message - Este evento é acionado quando o Form recebe um aviso. Podemos incluí-lo na
aplicação se desejarmos substituir a mensagem de aviso padrão do Form por uma mensagem
de erro customizada.
Observe que os gatilhos deste grupo começam com On. Sendo assim possuem uma funcionalidade
implícita que podemos substituir.
Se desejarmos incluir um destes triggers em nossa aplicação deveremos capturar a mensagem que seria
apresentada para que possamos modificá-la. Desta forma o Form Builder disponibiliza um conjunto de
rotinas com esta finalidade:
• Message_Type - Obtém o tipo do erro: FRM, PLS, etc em um gatilho On- Message.
• Dbms_Error_Code - Obtém o código (numérico) do erro enviado pelo banco de dados para o
Forms.
• Dbms_Error_Text - Obtém o texto da mensagem de erro enviado pelo banco de dados para o
Forms.
No exemplo da listagem 3, o trigger On-Error criado apresenta tanto a mensagem do Forms quanto a
mensagem que o Forms recebeu do banco de dados (quando isto ocorrer).
DECLARE
COD NUMBER := ERROR_CODE;
TEXTO VARCHAR2(2000) := ERROR_TEXT;
TIPO VARCHAR2(10) := ERROR_TYPE;
DBCOD NUMBER := DBMS_ERROR_CODE;
DBTEXTO VARCHAR2(2000) := DBMS_ERROR_TEXT;
BEGIN
MESSAGE(COD || '*' || TIPO || '*' || TEXTO);
MESSAGE(DBCOD || '#' || DBTEXTO);
END;
Listagem 3
As rotinas utilizadas neste gatilho obtém as mensagens de erro padrão do Form (error-xxx) e do banco de
dados (dbms-xxx).
A mensagem fornecida pelo Form é diferente daquela enviada pelo banco de dados.
Quando desejamos obter exatamente qual o erro de informado pelo banco devemos utilizar as funções
Dbms-Error-Code e Dbms-Error-Text.
Deste grupo os gatilhos mais importantes são aqueles ligados à efetivação da transação. São a estes que
daremos especial atenção.
O momento de efetivação da transação é aquele em que o Form percebe que existem modificações feitas
nos buffers dos blocos de dados e é chegado o momento de refleti-las no banco de dados. Podemos
simplesmente adicionar funcionalidade a este momento ou até mesmo interferir neste processo e alterar a
ação a ser feita para o banco de dados.
Os gatilhos deste grupo são acionados em função do Form ter entrado na fase transacional na aplicação,
ou seja alguma situação ocorreu que fez com que o Form tivesse necessidade de efetivar as modificações
realizadas nos registros para o banco de dados.
• Foi acionada, explicitamente, a salva. Esta ação pode ser iniciada por teclado ou por botão ou
por menu ou por programação (em um botão por exemplo).
• Foi acionada a limpeza de um bloco com registros pendentes de atualização. Quando isto
ocorre é apresentada uma tela de mensagem indicando que o usuário deve escolher entre
salvar as pendências ou ignorá-las. Se for escolhido salvar, o processo transacional é
acionado. Esta ação (de limpeza) pode ser disparada por teclado, menu, botão ou por
programação.
• Foi acionada a limpeza do Form e haviam registros pendentes de atualização em algum dos
blocos desta aplicação. Quando isto ocorre é apresentada uma tela de mensagem indicando
que o usuário deve escolher entre salvar as pendências ou ignorá-las. Se for escolhido salvar,
o processo transacional é acionado. Esta ação (de limpeza) pode ser disparada por teclado,
menu, botão ou por programação.
• Foi feita uma tentativa de encerramento aplicação sem salvar e haviam registros pendentes.
Quando isto ocorre é apresentada uma tela de mensagem indicando que o usuário deve
escolher entre salvar as pendências ou ignorá-las. Se for escolhido salvar, o processo
transacional é acionado. Esta ação (de limpeza) pode ser disparada por teclado, menu, botão
ou por programação.
• Foi feita uma tentativa de Consulta (Entrar Consulta ou Executar Consulta) e o bloco continha
registros pendentes de atualização. Quando isto ocorre é apresentada uma tela de mensagem
indicando que o usuário deve escolher entre salvar as pendências ou ignorá-las. Se for
escolhido salvar, o processo transacional é acionado. Esta ação (de limpeza) pode ser
disparada por teclado, menu, botão ou por programação.
Quando o processo transacional é disparado o Form pesquisa em cada um dos blocos em que
existam registros pendentes e inicia a montagem dos comandos Insert, Update e Delete e os
executa.
• Post-Delete – é acionado após uma determinada linha ter sido removida do banco de dados.
Adiciona ações ao processamento padrão após o evento. É executado uma vez para cada
linha a ser removida.
• Post-Insert - é acionado após uma determinada linha ter sido incluída no banco de dados.
Adiciona ações ao processamento padrão após o evento. É executado uma vez para cada
linha a ser incluída.
• Post-Update - é acionado após uma determinada linha ter sido alterada no banco de dados.
Adiciona ações ao processamento padrão após o evento. É executado uma vez para cada
linha a ser alterada.
• Pre-Commit – é acionado antes do Form iniciar o processo de Post. É executado uma única
vez no início de todo o processo.
• Pre-Delete - é acionado antes uma determinada linha ser removida do banco de dados.
Adiciona ações ao processamento padrão antes do evento. É executado uma vez para cada
linha a ser removida.
• Pre-Insert – é acionado antes de uma determinada linha ser incluída no banco de dados.
Adiciona ações ao processamento padrão antes do evento. É executado uma vez para cada
linha a ser incluída.
• Pre-Update – é acionado antes de uma determinada linha ser alterada no banco de dados.
Adiciona ações ao processamento padrão antes do evento. É executado uma vez para cada
linha a ser alterada.
2) Pre-delete, On-Delete e Post-delete para cada linha a ser removida, independente da ordem
em que esta ação foi feita ou da ordem dos registros no buffer.
4) Pre-insert, On-Insert e Post-insert para cada linha a ser incluída, independente da ordem em
que esta ação foi feita ou da ordem dos registros no buffer.
6) Commit.
7) Post-database-commit.
Nota
Como restrição temos que não podemos navegar durante o período transacional. O desvio é inválido da
mesma forma que nos gatilhos de navegação.
Durante o processo transacional o Form percorre os blocos e registros de acordo com seu próprio
algoritmo, que não pode ser modificado pela programação.
• Estilo do Gatilho (Trigger Style) – esta propriedade não deve ser alterada. Todo texto a ser
escrito deve ser feito em PL/SQL. O estilo V2 foi mantido para compatibilidade com versões
anteriores.
• Texto do Gatilho (Trigger Text) – esta propriedade contém o texto de PL/SQL que tivermos
escrito.
• Hierarquia de Execução (Execution Hierarchy) – indica se o gatilho atual deve substituir, ser
acionado antes ou ser acionado depois de um outro gatilho associado ao mesmo evento,
porém de mais alto nível. Por exemplo, suponhamos a criação de um gatilho Key-Down no
item cd_mat e um gatilho Key-Down no bloco Func. A propriedade de hierarquia do gatilho
Key-Down do item cd_mat poderia ser alterada para que sua execução ocorresse antes do
outro gatilho. O padrão do Form, neste caso, é a substituição.
• Texto da ‘Ajuda do Teclado’ (‘Keyboard Help’ Text) - Texto a ser apresentado na tela de
ajuda (Teclas – Keys) a tempo de execução.
Em função disso o Form Builder possui uma condição de erro (exception) com o nome
Form_Trigger_Failure.
Quando causamos (Raise Form_Trigger_Failure) esta condição de erro o restante do gatilho não é
executado e, ainda, a ação que causou seu disparo é interrompida.
Por exemplo, se causarmos esta condição de erro durante um processo de navegação (em qualquer dos
triggers de navegação ou nos triggers de validação, pois são executados durante o processo de
navegação) a navegação é interrompida. Isto faz com que o usuário fique preso ao item original. Não
consegue navegar.
Da mesma forma se causarmos esta condição de erro durante o processo transacional este é
interrompido.
Edição de PL/SQL
Uma vez que começamos a tratar da parte de programação, neste tópico analisaremos o editor de
PL/SQL.
INDENTAÇÃO AUTOMÁTICA
A cada linha digitada o posicionamento do cursor na linha subseqüente acompanha a indentação da linha
que lhe é superior. Digite o seguinte trecho de programa e avalie o resultado da digitação.
INDENTAÇÃO MANUAL
Para indentação manual contamos com as opções Endentar e Endentar Invertido do menu Editar (se
usarmos o mouse) e com as teclas Tab e Shift + Tab, respectivamente, se usarmos o teclado.
CORES
Ocorre variação no colorido das informações. As palavras chaves, comentários, constantes strings e
numéricas, os símbolos de atribuição ( := ) e de concatenação ( || ) são destacados com cores diferentes
que os identificam facilitando a localização das informações.
SELEÇÃO
Podemos selecionar tanto linhas de texto quanto colunas.
Para selecionar uma linha, posicione o mouse no canto esquerdo da linha (sobre a faixa existente na
lateral esquerda) até que o formato do ícone seja a seta e clique no botão esquerdo.
Para selecionar uma coluna pressione a tecla ALT e com o mouse selecione (“pinte”) as coluna(s)
desejada(s).
Para realizar estas ações basta que façamos a seleção do trecho de código desejado (linha) e em seguida
soltemos o mouse. Quando aproximarmos o mouse novamente sobre a área selecionada o desenho do
cursor mudará para seta (em vez do i ).
Neste momento se desejarmos efetuar uma movimentação, simplesmente arrastamos o mouse (sem soltar
o botão) para o ponto desejado e, em seguida, soltamos o botão do mouse.
Notaremos que o cursor mudará de posição indicando a localização onde o trecho será incluído. Durante a
movimentação o desenho do ícone do mouse ganhará um retângulo sob a seta.
Se desejarmos copiar o trecho em vez de apenas movimenta-lo, devemos pressionar a tecla Ctrl e efetuar
as mesmas ações descritas anteriormente.
Neste caso o desenho do ícone do mouse além do retângulo apresentará também um quadrado
preenchido com o sinal +, ambos sob a seta.
Na lateral direita, acima da seta da barra de rolagem vertical a existe uma pequena barra de split. Ao
clicarmos sobre ela e arrastarmos o mouse para baixo (sem soltar o botão), dividiremos a tela.
No canto inferior esquerdo, ao lado da seta da barra de rolagem horizontal encontramos a mesma barra de
split. Se repetirmos a operação de divisão obteremos o resultado da figura 43.
OPÇÃO DESFAZER
A opção desfazer (Undo) pode ser repetida muitas vezes (e não apenas uma). O Form Builder guarda
todas as modificações realizadas no código desde a última operação de Salvar.
Paleta de Sintaxe
Para edição de trechos de PL/SQL ou para obtenção da chamada
de uma rotina pré-definida contamos, agora, com a ajuda de uma
paleta de sintaxe.
Quando usamos o Assistente de Bloco de Dados para estabelecer o relacionamento, o diálogo da figura
45 deve ser preenchido para estabelecermos as colunas necessárias à relação.
Fig. 45 - Relacionamento
Master-Detail
Durante a construção do bloco detalhe (no exemplo bloco Func), preencheremos o diálogo do Assistente
conforme apresentado na figura 45. Observe que o bloco mestre (no exemplo Depto) já está criado
previamente.
Será criado, subordinado ao bloco mestre (no Navegador), no nó Relação, um objeto que será responsável
pela coordenação da leitura entre os dois blocos e pela coordenação da atualização.
Abra as propriedades deste objeto para que possamos entender as regras da relação.
Propriedades da Relação
Estudemos, a seguir, as propriedades (ou regras) do relacionamento entre estes dois blocos.
Grupo Funcional
• Bloco de Dados Detalhado (Detail Data Block) - determina qual o nome do bloco de dados
detalhe (uma vez que este objeto está pendurado no mestre).
• Condição de Junção (Join Condition) - qual a ligação entre estes blocos, ou seja, qual a
coluna ou colunas PK no bloco mestre e quais as colunas (ou coluna) FK no bloco detalhe
correspondentes.
- Isolado – indica que o Form deve enviar para o banco de dados apenas o comando de
Delete dos registros do bloco mestre mesmo que haja registro no detalhe. Esta ação é útil
quando o relacionamento entre as tabelas a nível de banco de dados é do tipo Cascade
Delete. Isto significa que quando solicitamos ao banco de dados uma remoção em alguma
linha da tabela mestre ele, automaticamente, remove todas as linhas correspondentes na
tabela detalhe. Neste caso não temos necessidade de repetir esta ação no Form, pois o
banco de dados se encarrega de fazê-la.
• Impedir Operações sem Mestre (Prevent Masterless Operation) – esta propriedade indica
quando o operador estará apto a consultar ou inserir registros no bloco detalhe. Esta
propriedade pode ser preenchida com:
- Sim – indicando que não são permitidas inclusões no bloco detalhe se não houver um
registro associado no bloco mestre e, ainda, não são permitidas consultas no bloco
detalhe se não houver um registro lido e associado no bloco mestre.
- Não – pode-se consultar ou incluir registros no detalhe sem restrições. Esta é a opção
default.
Grupo Coordenação
As propriedades deste grupo se referem à forma de leitura das informações.
• Diferido (Deferred) – Indica se a consulta no bloco detalhe deve ou não ser adiada após a
identificação do registro no bloco mestre.
Quando esta propriedade recebe o valor Não, tão logo seja feita uma consulta ou navegação para
o próximo registro no bloco principal, ocorrerá a consulta no bloco detalhe. Neste caso a
propriedade Consulta Automática (Automatic Query) é ignorada.
• Consulta Automática (Automatic Query) – Para que esta propriedade tenha efeito, a
propriedade Diferido (Deferred) deve estar preenchida com Sim.
Se esta propriedade for preenchida com Sim, estamos indicando que a consulta será feita
automaticamente, porém somente quando o usuário navegar para o bloco detalhe. Enquanto ele
permanecer no bloco principal não será feita nenhuma pesquisa no detalhe.
Se esta propriedade for preenchida com Não, o usuário além de navegar para o bloco detalhe,
deverá, explicitamente, acionar uma consulta (Entrar Consulta e/ou Executar Consulta).
Os triggers são criados em função da propriedade Excluir Comportamento do Registro (Delete Record
Behavior).
Alguns dos gatilhos mostrados acima não foram vistos no tópico anterior e serão estudados agora.
São eles:
• On-Populate-Details – Este gatilho é acionado quando o Form precisa obter registros para o
bloco detalhe em função da coordenação de leitura entre os blocos mestre-detalhe.
De um modo geral não precisamos intervir nos triggers gerados em função da presença da relação.
Se desejarmos incluir alguma funcionalidade específica podemos adicionar código aos gatilhos criados.
Devemos tomar cuidado, no entanto, se viermos a modificar alguma característica da relação, pois os
gatilhos podem ser modificados independentemente de os termos alterado ou não, podendo ocasionar a
perda de código na aplicação.
Sabemos que a PL/SQL é uma linguagem estruturada em blocos. Sabemos, ainda, que com a PL/SQL
podemos criar blocos de código com nome, isto é, procedimentos, funções e pacotes.
Sendo assim, uma aplicação Form não poderia deixar de possuir formas de estruturação de código. Locais
em que pudéssemos escrever códigos de PL/SQL que pudessem ser utilizados em diversos pontos da
aplicação. Este é o assunto do tópico Rotinas.
O assunto do tópico Variáveis vai tratar de todos os tipos de variáveis que podemos usar em uma
aplicação: variáveis definidas dentro de um trigger, variáveis de sistema, itens de trabalho (fora da
canvas), variáveis de pacotes, variáveis globais e parâmetros.
Rotinas
Dentro do Form podemos acionar três tipos de rotinas:
Cada uma destas formas de armazenamento possui uma abrangência e utilidade específica.
ROTINAS LOCAIS
São aquelas armazenadas dentro da própria aplicação. São utilizadas para estruturação do código e não
tem utilização em outros módulos.
• Pacotes (Packages) - Nos pacotes podemos criar procedures, functions e ainda variáveis e
cursores globais (declarados na especificação) ou de uso apenas no pacote (declarado no
corpo). Pacotes favorecem a organização, utilize-os sempre. Use e abuse de sua
funcionalidade para grupar rotinas afins.
Quando aceitarmos este diálogo, o editor de PL/SQL será acionado para que possamos escrever o código
desejado.
Aquele código pode ser aproveitado (reutilizado) por diversas aplicações estejam elas no ambiente cliente
(módulos de tela ou relatório) ou no ambiente servidor (outras rotinas armazenadas no banco de dados).
Porém o compartilhamento também é possível com bibliotecas (Libraries). Armazenadas fora do banco de
dados (no ambiente de rede).
• a rotina executa ações de leitura e atualização no banco de dados (local ou remoto), de tal
forma que sua performance seja melhorada em função da diminuição do tráfego na rede.
• a rotina não está associada a ações específicas do ambiente cliente (tela, navegação, etc).
• a rotina será utilizada por aplicativos em batch (PL/SQL, PRO*C, etc) apesar de não fazer
acesso a estruturas do banco de dados. Neste caso específico deve-se analisar o impacto de
se duplicar esta rotina. Uma para utilização por aplicativos online (no ambiente de cliente) e
outra para os aplicativos em batch (no ambiente servidor).
A criação ou manutenção de uma stored procedure pode ser feita com o próprio Form Builder, da seguinte
forma:
Se desejarmos dar manutenção a uma rotina gravada no banco de dados ou quisermos incluir uma nova
rotina, devemos selecionar o nó Unidades de Programa Armazenadas (Stored Program Units) e expandi-lo
para encontrar a rotina desejada ou pressionar o botão Criar (Create) para que seja apresentado
novamente o diálogo da figura 44.
Para que possamos visualizar o editor de PL/SQL, abriremos uma rotina qualquer cadastrada no banoc de
dados.
Observaremos que a janela do editor de PL/SQL é ligeiramente diferente daquelas vistas anteriormente.
Ela mostra quem é o usuário dono da rotina (Owner), o nome e tipo da rotina.
• Novo (New) – Com este botão podemos criar uma nova unidade de programa. O diálogo da
figura 44 será apresentado novamente.
• Fechar (Close) – Fecha o diálogo. Esta opção pede confirmação se forem detectadas
alterações no código. Se você não modificou o código e ainda assim a tela de confirmação for
apresentada, escolha a opção Reverter (revert) deste diálogo apresentado.
• a rotina não utiliza estruturas do banco de dados ou utiliza apenas para atualização, não
causando impacto no tráfego da rede.
• a rotina está associada a ações específicas do ambiente cliente (usa built-ins do Form ou do
Report).
A criação de bibliotecas no ambiente será vista em um capítulo à parte, pois, trata-se de um módulo. Não é
um objeto de dentro da aplicação Form.
EMPACOTAMENTO DA LÓGICA
As formas de empacotamento (procedimentos, funções e pacotes) apresentadas acima existem tanto no
ambiente cliente quanto no ambiente servidor.
Com todas estas opções não há justificativa para um código não modular, não estruturado.
• Considere quebrar sua trigger (no Forms) em um pacote (da trigger X) se a visualização do
texto ultrapassar 3 páginas (em torno de 80 linhas).
• Crie uma biblioteca com rotinas que você possa utilizar em diversos sistemas. Podem existir
soluções já criadas em um sistema que facilitem sua programação em outro.
• Considere a utilização de pacotes em seu Forms, grupando rotinas referentes a uma mesma
trigger ou relativas a uma mesma ação.
• Documente sempre.
A lista acima são apenas sugestões. Você, certamente, encontrará a forma mais adequada para o
desenvolvimento das suas aplicações.
Variáveis
Neste tópico trataremos dos diversos tipos de variáveis de uma aplicação Form. Estão subdivididas em
dois grandes grupos: Variáveis do Usuário e Variáveis de Sistema.
Variáveis do Usuário
As variáveis do Usuário podem ser de diversos tipos, com características e abrangências diferentes:
• Variáveis Locais
• Itens fora de Canvas
• Variáveis Globais
• Parâmetros
• Variáveis de Pacotes no Form
Variáveis de Sistema
As variáveis de Sistema não podem ser alteradas pela aplicação, somente consultadas e fornecem
diversas informações sobre a aplicação em desenvolvimento.
VARIÁVEIS LOCAIS
São aquelas declaradas dentro de um gatilho ou rotina. Os valores desta variável são acessíveis apenas
dentro do trecho de PL/SQL em que é declarada.
Ao término do bloco de PL/SQL onde ela é declarada ela deixa de existir. Tem sua vida útil associada ao
procedimento no qual estão declaradas.
De um modo geral o tipo destas variáveis é similar aos tipos válidos em PL/SQL (number, char, varchar2,
date, <tabela ou cursor>%rowtype, <coluna>%type, tipos do usuário, etc), porém, o Form disponibiliza
alguns tipos especiais: Alert, Block, Canvas, Groupcolumn, Editor, Formmodule, Item, Recordgroup, Lov,
Menuitem, Paramlist, Relation, Timer, Viewport, Window, etc.
Estes tipos são criados para a obtenção do ID do objeto. Quando criamos qualquer objeto (canvas, item,
janela, bloco, etc) com o Form Builder, ele atribui um ID (interno) para este objeto.
Quando fornecemos o nome de um objeto (em uma rotina pré-definida, por exemplo), o Form é obrigado a
fazer uma pesquisa prévia para obter o identificador (ID) e só então fazer acesso ao objeto desejado.
Sendo assim, quando em uma mesma rotina viermos a utilizar diversas vezes o mesmo objeto, pode ser
interessante, obter o ID inicialmente e utilizar apenas o identificador. Para isto o Form Builder disponibiliza
uma série de rotinas Find_<objeto> que recebem como parâmetro o nome do objeto e retornam o
identificador.
Listagem 6 - exemplo
DECLARE
de utilização.
JANELA WINDOW := FIND_WINDOW('WINDOW1');
BEGIN
SET_WINDOW_PROPERTY(JANELA, TITLE, 'Janela da Aplicação');
SET_WINDOW_PROPERTY(JANELA, WINDOW_STATE, MAXIMIZE);
SET_WINDOW_PROPERTY(JANELA, HIDE_ON_EXIT, PROPERTY_TRUE);
END;
Podem ser utilizadas em qualquer rotina ou gatilho do Form. Seu uso é restrito ao módulo no qual está
declarada porém, podem ser utilizadas por Menus ou Libraries através das rotinas pré definidas Name-In e
Copy.
Caso venham a ser usadas como variáveis de trabalho devem ser declaradas em um bloco de controle
criado para este fim.
Caso venham a ser usadas para armazenamento temporário de informações de um determinado bloco,
devem ser declaradas no próprio bloco, por exemplo, o resultado de um cálculo referente a dados do
registro.
Quando as criamos em um bloco de controle, invisível pelo usuário, não corremos o risco deste bloco ser
limpo pelo usuário com as opções Bloco – Limpar do menu pois o usuário não tem acesso a este bloco
porque nenhum item está na canvas, então, ele não recebe foco.
A ação de Limpar Tudo, porém, pode ser feita sem que haja necessidade de foco em nenhum objeto.
Neste caso todos os itens definidos em todos os blocos são apagados.
As variáveis de pacote possuem os mesmos tipos de uma variável local, inclusive aqueles associados ao
ID dos objetos.
PACKAGE AREA_TRAB IS
JANELA WINDOW := FIND_WINDOW('WINDOW1');
V1 NUMBER := 0;
MAT FUNC.CD_MAT%TYPE := 0;
END;
Listagem 7
As variáveis definidas na parte de especificação de um pacote tem a mesma abrangência de um item fora
da canvas, com a vantagem de não serem afetadas por Clear_Block nem Clear Form.
Na listagem 8 apresentamos a utilização de uma variável de pacote na mesma rotina vista anteriormente
na listagem 7. Para utilizarmos uma variável de pacote em vez da variável local devemos usar o nome do
pacote como qualificador da variável.
PARÂMETROS
Até este momento estudamos variáveis usadas dentro da aplicação como área de trabalho e em
circunstâncias especiais referenciadas em outros módulos.
Um parâmetro é uma variável (com tipo, tamanho e valor inicial) definida na aplicação receptora, com a
finalidade de modificar a forma de atuação da aplicação.
Dentro da aplicação onde o parâmetro está definido, deve-se fazer referência a ele como se existisse um
bloco com o nome de Parameter, isto é, :Parameter.<parâmetro>.
DECLARE
LISTA PARAMLIST := CREATE_PARAMETER_LIST('LISTA_DE_PARAMETROS');
BEGIN
ADD_PARAMETER(LISTA, 'PDEPTO', TEXT_PARAMETER, 'A00');
ADD_PARAMETER(LISTA, 'PMAT', TEXT_PARAMETER, '0');
NEW_FORM('RELACAO', TO_SAVEPOINT, NO_QUERY_ONLY, LISTA);
END;
Listagem 9
Para que o trecho de programa da listagem 9 fosse válido deveríamos ter criado sob o nó Parâmetros (no
navegador) os dois parâmetros referenciados: Pdepto e Pmat.
Na aplicação chamada (Relação) usamos os parâmetros na cláusula Where do bloco Depto (propriedade
Cláusula Where).
A utilização de parâmetro é útil quando desejamos somente enviar uma informação. Não precisamos que
haja retorno de resultado.
Como último lembrete no uso de parâmetros, devemos destruir a Parameter List criada no exemplo da
listagem 9 ao término do uso uma vez que a lista não é destruída automaticamente ao término do bloco.
No nosso caso isto não foi necessário porque o programa se encerra naquele ponto pois a rotina
New_Form passa o controle para a aplicação chamada e encerra a atual.
Se a chamada for feita com Call_Form ou Open_Form, é conveniente que a lista seja destruída ao término
da utilização. Use a rotina Destroy_Parameter_List.
VARIÁVEIS GLOBAIS
Uma variável global não é definida explicitamente em uma aplicação Form. Sua criação é feita com a
primeira atribuição ou com o uso da rotina Default_Value.
Variáveis Globais são sempre alfanuméricas com comprimento máximo de 255 caracteres.
Possuem a vantagem de ficar na memória até que sejam explicitamente destruídas, desta forma podem
ser usadas para passagem de informações entre aplicações, tanto de ida quanto de volta.
Possuem como desvantagem não ter tipo opcional, são sempre Char. Isto significa que qualquer atribuição
de um valor não alfanumérico implicará em uma operação de conversão.
Como ela não tem definição de tamanho, da mesma forma não podemos utilizar restrições de tamanho,
seu comprimento está fixado em 255 caracteres.
De um modo geral a utilização de parâmetros é mais interessante que o uso de globais pois eles tem tipo,
tamanho e até valor inicial.
DOWN;
:GLOBAL.V1 := 'ABC';
DEFAULT_VALUE('RIO DE JANEIRO', 'GLOBAL.CIDADE');
IF :GLOBAL.CIDADE = 'RIO DE JANEIRO' THEN
MESSAGE(:GLOBAL.CIDADE || ' - ' || :GLOBAL.V1);
END IF;
Listagem 11
• A atribuição à variável V1 será feita todas as vezes que o gatilho for executado.
• A atribuição à variável Cidade só ocorrerá a primeira vez que o gatilho for executado. Se o
valor da variável global não for Null a rotina Default_Value não tem efeito. Se a variável não
existir, o Form cria a variável e atribui o valor especificado.
A referência, como vimos na listagem 11, é feita sempre com a palavra reservada Global (como se fosse
um bloco).
Para destruirmos uma variável Global, devemos usar a rotina Erase. Isto liberará memória local.
COMPARANDO AS VARIÁVEIS
O quadro a seguir apresenta de forma resumida as características dos tipos de variáveis vistos até agora.
VARIÁVEIS DE SISTEMA
O Form possui um conjunto de variáveis às quais ele atribui valores automaticamente. Estas variáveis são
chamadas de variáveis de sistema.
Fornecem um conjunto de informações sobre a aplicação. Em sua maioria são apenas legíveis (read-only).
Veremos apenas aquelas que são mais utilizadas nas aplicações de um modo geral.
- NORMAL – indica que o Form está no estado de digitação, entrada de dados, alteração.
- ENTER_QUERY – indica que o Form está aguardando que o usuário informe restrições
para a consulta a ser realizada.
- QUERY – indica que o Form está lendo dados do banco de dados. Este estado será
perceptível nos triggers de Post-Query, por exemplo.
- CHANGED – indica que o registro foi alterado e deve ser enviado para o banco de dados.
- INSERT – indica que um registro New foi modificado e deve ser incluído no banco de
dados.
- NEW – indica que o registro foi criado no buffer, mas ainda não foi modificado.
- QUERY – indica o registro é válido e foi recuperado do banco de dados.
Database Triggers
Já vimos que a atualização de objetos do banco de dados é possível com a ferramenta Form Builder.
Veremos a manutenção de um trigger do banco de dados.
Acionaremos, então a ferramenta Criar (Create) para que seja mostrado o diálogo da figura 48.
Fig. 48 - Atualização de um
Gatilho do Banco de Dados
Neste diálogo pressionaremos o botão Novo (New) para que a tela seja habilitada.
• Indicação de trigger de comando ou de linha. Se marcarmos o check box “Para Cada Linha”
(For each Row) estamos indicando um trigger de linha, o que faz com que os dois campos
abaixo fiquem habilitados.
• Alteração do nome das áreas de trabalho (quando usamos trigger de linha). Ao preenchermos
o campo Referenciando Antigo como (Referencing Old as) e Novo como (New as).
Alertas
Quando enviamos uma mensagem para a linha de mensagem (no rodapé da aplicação) ela aparece de
forma bastante discreta.
O Form Builder nos oferece uma forma bem menos discreta de enviar mensagens, avisos, etc para o
usuário, o objeto Alerta.
Um alerta é uma janela Modal, isto é, uma janela que o usuário deve responder e se fechar para que seja
possível o prosseguimento da aplicação. Quando o usuário receber uma mensagem em uma janela Modal
ele não poderá continuar a aplicação a menos que responda à questão apresentada pela janela. A
aplicação fica parecendo congelada.
Esta forma de trabalho pode ser utilizada por nós para envio de qualquer mensagem que desejarmos,
bastando que coloquemos esta mensagem em um alerta.
• Título (Title) – corresponde ao título da janela a ser apresentada (será mostrado na barra azul
da janela).
• Estilo de Alerta (Alert Style) - determina o ícone a ser apresentado ao lado da mensagem.
Pode ser: Parar (Caution), Precaução (Warning) ou Observação (Informational).
• Etiqueta de Botão (Button Label) - determina o texto a ser apresentado no botão (em um dos
três) de uma janela de Alerta. Os valores defaults para as etiquetas são: OK, Cancel e Null.
Quando um botão não recebe etiqueta significa que não será apresentado na janela de Alerta.
Ao menos um dos botões de um Alerta deve ter etiqueta.
• Botão de Alerta Default (Default Alert Button) - determina o botão default. O usuário poderá
acionar este botão com a tecla [Enter].
DECLARE
BOTAO NUMBER;
BEGIN
BOTAO := SHOW_ALERT('ERRO');
IF BOTAO = ALERT_BUTTON1 THEN
MESSAGE('Usuário escolheu o primeiro botão');
ELSIF BOTAO = ALERT_BUTTON2 THEN
MESSAGE('Usuário escolheu o segundo botão');
ELSE
MESSAGE('Usuário escolheu o terceiro botão');
END IF;
END;
Listagem 12
A rotina Show_Alert é uma função que retorna um código numérico indicativo do botão que o usuário
selecionou. Isto nos permitirá tomar ações diferentes de acordo com o botão escolhido.
Fig. 50 - Show_Alert
A figura 50 mostra o resultado da montagem do alerta.
Suponhamos que a mensagem a ser apresentada não fosse fixa. Que desejássemos mostrar todas as
mensagens de erro do Form em janelas de alerta. Precisaríamos alterar o texto da mensagem.
DECLARE
BOTAO NUMBER;
ALERTA ALERT := FIND_ALERT('ERRO');
BEGIN
CHANGE_ALERT_MESSAGE(ALERTA, ERROR_TYPE ||
TO_CHAR(ERROR_CODE)||':'||ERROR_TEXT);
BOTAO := SHOW_ALERT('ERRO');
END;
Listagem 13
A listagem 13 mostra esta ação. Alteramos o alerta para que fosse apresentado um único botão e a
mensagem a ser apresentada é modificada antes da apresentação do alerta.
Quando definimos um atributo visual não somos obrigados a especificar todas as propriedades visuais,
podemos definir apenas aquelas que desejamos padronizar.
Fig.51 - Propriedades de um
Atributo Visual
Na figura 51 apresentamos um atributo visual (de nome Corrente) no qual modificamos apenas a primeira
Cor de Fundo (BackGround Color) para DarkGreen (Verde Escuro) e a segunda propriedade Cor de Fundo
(Foreground Color) para White (Branco).
Após a criação deste objeto devemos fazer referência a ele em outro objeto para que se torne útil.
Poderíamos, por exemplo, preencher seu nome na propriedade Grupo de Atributos Visuais do Registro
Corrente (Current Record Visual Attribute Group) do grupo Registros (Records) dos blocos em uso em
uma determinada aplicação.
Fig. 52 - Utilização de
Atributo Visual
Editores
Um editor é uma janela para digitação de texto pelo usuário. Em vez de ficar restrito ao tamanho da área
delimitada para o item na tela, o editor apresenta uma janela para digitação livre até o tamanho definido
para o campo.
O Form fornece um editor padrão, pré-definido, que não precisa de nenhuma programação especial para
ser apresentado. Basta que o usuário posicione o cursor sobre o item que deseja editar e pressione o
conjunto de teclas correspondente à ação Editar (CTRL+e). Isto fará com que seja apresentada a janela de
edição.
A criação de um outro editor dentro da aplicação nos oferece a possibilidade de alterarmos algumas de
suas características (do editor padrão), como veremos por suas propriedades:
• Título de Base (Bottom Title) - título a ser apresentado abaixo do campo de edição na janela
do editor.
• Estilo de Sobreposição (Wrap Style) - Especifica como o texto será apresentado quando seu
conteúdo exceder à largura especificada para a janela do editor. Os valores válidos para esta
propriedade são: Nenhum (None), Caractere (Character) ou Palavra (Word). Se escolhermos
Palavra (Word), o texto quebrará de linha somente em término de palavra.
O grupo Físico permite a determinação de uma posição para apresentação desta janela, além de tamanho
da janela e presença ou não de barra de rolagem.
Não é suficiente, no entanto, a criação do objeto. Temos de associá-lo aos itens que desejamos que ele
apareça.
O grupo Editor(do item) deve ser preenchido para que a apresentação seja feita nas condições desejadas.
A propriedade Editor pode ser preenchida com o nome do editor criado, o texto System_Editor ou <Nulo>:
Fig. 53 - Editor
Se desejássemos efetuar o acionamento do editor através de um botão e não pelo teclado, algumas
etapas deveriam ser cumpridas:
Na listagem 14 somente quando o foco estiver sobre o item nm_depto do bloco depto, o editor será
acionado.
DECLARE
TEXTO VARCHAR2(2000);
RETORNO BOOLEAN;
BEGIN
SHOW_EDITOR('EDITOR', :NM_DEPTO, 180, 90, TEXTO, RETORNO);
IF RETORNO THEN
:NM_DEPTO := TEXTO;
END IF;
END;
Listagem 15
Na listagem 15 apresentamos a rotina Show_Editor que aciona o editor da mesma forma que vimos
anteriormente, porém não precisamos associar o editor ao item a tempo de desenvolvimento e o usuário
não precisa estar com o cursor posicionado sobre o item a ser editado.
Tomamos este cuidado (em vez que atribuir diretamente à variável :nm_depto) pois se o usuário
pressionar a tecla Cancelar (Cancel) da janela do editor o texto retornado é Null.
Assim para que não seja perdido o conteúdo da variável nm_depto, recebemos o texto editado em uma
variável de trabalho e em seguida verificamos o valor do boleano retorno.
Se o usuário escolher OK, o boleano retorna True (e devolvemos o valor para nm_depto). Caso contrário
não sujamos o item da tela.
Os dados apresentados nesta lista estão armazenados em uma estrutura chamada Grupo de Registros
(Record Groups).
Uma Lov está sempre associada a um Record Group. A Lov é um mapeamento dos dados do Record
Group, disponibilizada para o usuário selecionar uma das opções da lista.
Podemos associar a Lov a um ou mais itens da aplicação, de tal forma, que quando o usuário navegar
para um destes itens será mostrado um indicador “Lista de Valores” (List of Values) na linha de status (no
rodapé da tela, abaixo da linha de mensagem) indicando a existência de uma lista para aquele item.
Quando isto ocorre o usuário poderá acionar a lista por teclado (Lista de Valores – F9) para que a janela
seja apresentada.
O primeiro diálogo apresentado corresponde à tela de Boas Vindas do editor, que pode ser descartado.
No segundo diálogo, devemos indicar se a lista de valores será criada a partir de um novo Record Group a
ser criado simultaneamente ou se baseará em um Record Group já existente.
Se não tivermos nenhum Record Group em nossa aplicação, a segunda opção já aparece desabilitada.
No terceiro diálogo devemos informar o comando Select a ser incluído no Record Group. Podemos digitar
o comando, importar o texto de um arquivo em disco, estabelecer conexão com o banco de dados, acionar
o Query Builder para auxílio na montagem da sintaxe adequada e, finalmente, verificar a sintaxe
preenchida.
Após preenchermos este diálogo nos é apresentado o quarto diálogo, no qual indicamos quais as colunas
do Record Group devem fazer parte da lista de valores.
São apresentados dois campos, um contendo a lista de colunas existentes no Record Group (Colunas do
Grupo de Registros) e outro contendo a lista de colunas existentes na Lov. Usando os botões centrais
podemos transferir as colunas do Record Group para a Lov (> e >>) ou da Lov para o Record Group (< e
<<).
No quinto diálogo indicamos o texto a ser apresentado como cabeçalho de coluna, o tamanho de cada
coluna (ou a opção de dimensionamento automático) e o nome do item (ou itens) para onde deve ser feito
o retorno dos valores referentes à linha selecionada pelo usuário.
Neste diálogo encontramos um botão identificado como “Pesquisar item de retorno...” que nos apresenta
uma lista com os itens presentes na aplicação para que possamos, mais facilmente, indicar para que itens
devem ser copiados os valores referentes à linha selecionada pelo usuário.
No sexto diálogo temos a possibilidade de informar um título para a janela da Lov, suas dimensões
(largura e altura) e seu posicionamento na tela a tempo de execução.
O próximo diálogo (sétimo) permite a indicação da quantidade de linhas a serem lidas de cada vez (para
carga da Lov), da freqüência com que esta leitura deve ser feita e da utilização de filtro para diminuição da
quantidade de linhas lidas.
No diálogo seguinte (oitavo) podemos (ou não) estabelecer a associação da Lov a um item. São
apresentados, opcionalmente, todos os itens indicados como retorno (em diálogo anterior). Este diálogo é
opcional, ou seja, se não indicarmos a associação, a Lov deve ser acionada por programação. Quando
estabelecemos a associação, o usuário poderá acionar a Lov usando a tecla [List] (F9).
Quando teclamos o botão Avançar neste diálogo, nos é apresentado o diálogo de encerramento, sendo,
em seguida, criada a lista de valores e o Record Group.
Quando acionamos o Assistente de Lov com um Record Group já presente na aplicação, no segundo
diálogo podemos indicar que a Lov se utilizará de um Record Group previamente criado (e presente).
Em seguida aparece um diálogo intermediário onde indicamos se a Lov se baseará no Record Group
existente (podemos até modificar este Record Group) ou se a Lov se baseará em um novo Record Group,
porém copiando a definição do Record Group criado anteriormente.
Nossa primeira reação é achar que a ligação entre os dois objetos é feita pelo nome. Isto não é verdade.
Em uma das propriedades da lista de valores indicamos qual o grupo de registros à que ela se refere.
PROPRIEDADES DA LOV
Analisemos as propriedades da lista (Lov) presentes no grupo funcional.
• Tipo de Lista (List Type) – indica se a lista é baseada em um Record Group ou em uma
tabela do estilo V2. Trabalharemos sempre com Record Group.
• Grupo de Registros (Record Group) – define o nome do record group ao qual a lista se
refere.
• Filtrar Antes da Exibição (Filter Before Display) – quando marcamos esta opção com Sim, a
tempo de execução é apresentada uma tela para que o usuário digite algum texto que restrinja
a pesquisa na base de dados. O texto digitado pelo usuário é completado com ‘%’ e utilizado
em uma cláusula Where adicionada à query. Esta restrição è montada para a primeira coluna
visível (não é a primeira coluna da lista) na janela da Lov.
• Exibição Automática (Automatic Display) – indica que quando o item ao qual a Lov está
associada receber o foco, a lista é apresentada automaticamente.
• Renovação Automática (Automatic Refresh) – indica que a cada vez que o usuário acionar
a Lov, o comando Select associado com o Record Group será executado para “refrescar” os
dados armazenados em memória.
• Seleção Automática (Automatic Select) – indica que se a lista apresentada contiver apenas
uma linha, a seleção é automática. A janela da Lov é fechada e a linha selecionada.
• Salto Automático (Automatic Skip) – indica que após a seleção de uma das opções da lista
o cursor deve navegar automaticamente para o próximo campo.
• Posição Automática (Automatic Position) – especifica que o Form deve posicionar a janela
da Lov próxima ao campo de onde foi acionado.
Pode-se preencher o grupo Físico com o posicionamento da Lov, se desejarmos uma posição fixa, ou
preencher apenas na associação com o item, ou ainda deixar o posicionamento a cargo do Form (com a
propriedade Posição Automática).
• Validar a partir da Lista – indica que se o usuário digitar um valor no item (em vez de acionar
a Lov), este valor será verificado no Record Group associado à lista.
Poderemos, então, criar um botão para acionamento da lista a partir do item na qual ela está associada.
DECLARE
BLISTA BOOLEAN;
BEGIN
BLISTA := SHOW_LOV;
END;
Listagem 16
Show_Lov é uma função que retorna um boleano True ou False indicando se a janela (da lista) foi
apresentada ou não.
Na sintaxe desta rotina observaremos que ela pode receber como parâmetro o posicionamento da lista e o
nome da lista, caso não venhamos a fazer a associação com o item (propriedades do item).
Se desejarmos fazer uma atualização dos valores da lista eventualmente, podemos usar a built-in
Populate-Group.
• Filtrar Antes da Exibição (Filter Before Display) - Quanto maior a quantidade de elementos
apresentados em uma Lov, pior a performance, uma vez que as linhas a serem apresentadas
para o usuário devem trafegar pela rede para chegar ao ambiente cliente e, ainda, ser
armazenadas (em memória ou disco) enquanto forem úteis para a Lov.
Desta forma devemos nos restringir a uma quantidade máxima de 300 linhas (aproximadamente)
por Lov (avalie o número ideal para a sua instalação). Ou seja, caso haja necessidade de
apresentação de uma quantidade superior de linhas, temos 2 alternativas:
- Criar um novo bloco multirecord e efetuar tratamento de leitura parcial com a rotina Enter-
Query.
- Usar a propriedade Filtrar Antes da Exibição (Filter Before Display) para que seja
apresentado um diálogo restritivo. O texto digitado no diálogo é completado com o caracter
%, para que todas as linhas que comecem com o texto digitado sejam apresentadas.
A COLUNA DE PESQUISA
A primeira coluna que especificamos em uma Lov será usada para pesquisa:
• Seleção Automática (Automatic Select) – ocorre quando o operador digita alguma letra e a
janela da LOV está ativa.
• Loc. – a pesquisa será realizada a partir do caracter mais à esquerda somente na primeira
coluna, a não ser que o operador inicie o texto com %. Neste caso todas as colunas serão
pesquisadas.
Record Groups
Um Grupo de Registros (Record Group) é uma estrutura interna do Form capaz de armazenar dados como
se fosse uma tabela (ou uma matriz), isto é contendo linhas e colunas. Este armazenamento, a princípio é
feito em memória.
• Query Record Group – corresponde a um grupo de registros que contém um comando Select
associado.
Ao tempo de desenvolvimento podemos criar os dois primeiros tipos (Query e Static). Durante a execução
podemos criar (ou popular) Query e Non-Query.
• Tipo de Grupo de Registros (Record Group Type) - determina o tipo do Grupo de Registros
(Record Group). Podemos preencher com Estático (Static) ou Consulta (Query).
• O último campo deste diálogo (Valores de Coluna) corresponde aos valores a serem
atribuídos a cada coluna. Desta forma, quando selecionamos a coluna nr_git no campo
superior, devemos preencher neste local os valores relativos, no caso do exemplo, ao código
de grau de instrução e quando selecionamos ds_git no vampo superior, devemos preencher
com as descrições de grau de instrução.
Para tal devemos selecionar o nó Lov, pressionar o botão Criar (Create) e no diálogo apresentado (figura
54) marcar a opção Grupo de Registros Existentes (Existing Record Group).
Em seguida, pressionar o botão Selecionar (Select) para escolher, na lista apresentada, o grupo de
registros desejado.
Nesta versão ainda não está disponível a utilização de coleções, desta forma nos objetos utilizados não
poderemos manipular com Nested Tables ou Varrays.
Lobs
No Oracle8 temos a possibilidade de criar objetos muito grandes, chamados Lobs (Large Objects).
Estes tipos de dados podem ser utilizados em uma aplicação Form que estabeleça conexão com um
banco de dados Oracle8.
Em nosso ambiente já contamos com uma tabela (Tlob) disponível para trabalho com este tipo de objeto.
• Um item Lob (por exemplo C_Clob1) é criado com tamanho 240 (é o default), mas pode ser
ampliado até 65534 bytes (limite para o ambiente cliente, por enquanto).
• A propriedade Tipos de Dados (Datatype) recebe o valor de Lob, porém, no ambiente cliente o
item é texto(ou imagem), ou seja, na aplicação Forms temos o dado a ser armazenado.
• Internamente o Form armazena o Locator (que será utilizado para indicação da localização
exata da parte de dado no banco de dados).
• Desta forma o pacote Dbms_Lob não é aplicável aos itens Lob no ambiente cliente, porém
podemos utilizar as demais rotinas de PL/SQL como se ele fosse um texto escalar(varchar2,
char, etc) ou uma imagem (read_image_file, write_image_file).
A inclusão e alteração de itens deste tipo é feita com o uso da cláusula Returning.
Restrições
Como restrição ao uso de Lobs (nesta versão) temos:
• Os lobs do tipo Bfiles são read-only uma vez que são arquivos armazenados fora do banco de
dados (no ambiente servidor).
O servidor armazena apenas o endereçamento do arquivo, desta forma, os Bfiles não podem
participar de transações do banco de dados e, portanto, podem ser utilizados apenas para leitura
em aplicações Forms.
Objetos
No Oracle8 além de Lobs podemos criar objetos e armazená-los em uma Object Table.
O Form Builder 6i além de ter acesso e atualizar Lobs também permite a manutenção de objetos criados
no banco de dados, de acordo com as seguinte regras:
• uma coluna objeto em uma tabela relacional, onde esta coluna está baseada em um objeto.
Fig. 59 - Assistente
de Bloco de Dados
(Objetos)
Observe, na figura 59, que no campo Colunas Disponíveis foram apresentadas as colunas cd_mat (com
um ícone à esquerda indicando que se trata de um escalar numérico), nm_depto (com um ícone à
esquerda indicando que se trata de um escalar alfanumérico), cd_depto_ctb (com um ícone à esquerda
indicando que se trata de uma referência pois aponta para outra linha) e cd_gerente (idêntico a
cd_depto_ctb).
Para as duas colunas de referência você também encontra o sinal de + do lado esquerdo indicando que
temos um nó e que podemos expandi-lo.
Na figura 59, apresentamos o nó cd_gerente já expandido. Observe que podemos escolher colunas da
tabela Tb_Depto diretamente ou colunas da tabela tb_Func (apontada pelo atributo REF cd_gerente).
Desta forma, com muita facilidade, podemos apresentar na tela, os dados do Departamento e dados do
gerente do departamento correspondente, sem que tenhamos de manter esta informação com triggers
(post-query, por exemplo).
Esta expansão de atributos não pára no primeiro nível. O objeto apontado pelo REF também possui um
REF(cd_depto) que aponta para outro objeto(Tb_Depto), podemos expandi-lo e repetir esta operação
diversas vezes, enquanto encontrarmos referências.
O atributo Nr_Tel (em Tb_Func), no entanto, não está disponibilizado para expansão, pois se trata de uma
coleção (ainda não disponível para uso nesta versão).
Quando criamos um bloco que utiliza um item REF para outro objeto, surge um diálogo durante a
construção do bloco para que indiquemos se desejamos que seja criada uma Lov para acesso aos dados
referenciados que venham a permitir a atualização da referência (endereço).
Observe que o comando Select obtém a referência da linha para que quando o usuário escolha um novo
gerente, sua referência seja atualizada no item cd_gerente do bloco.
O campo de retorno deste OID (veja na especificação da LOV) é o item cd_gerente, presente na lista de
itens criados subordinado ao bloco Tb_Depto.
Se abrirmos a tela de propriedades deste item verificaremos que sua propriedade Tipo de Dados
(Datatype) está preenchida com REF do Objeto, indicando que se trata de um item do tipo REF.
Os usuários poderão expandir ou contrair nós na hierarquia, obtendo visualização de sub nós e elementos
folha.
Podemos preencher esta árvore com valores oriundos de um Record Group ou com dados obtidos
diretamente por uma query.
Além da árvore hierárquica contamos com um pacote chamado Ftree que contém diversas rotinas para
que possamos manipular, a tempo de execução, os elementos da árvore, permitindo a adição, remoção,
modificação ou avaliação destes elementos.
Um item do tipo Árvore Hierárquica deve estar presente em um bloco com 1 linha e como único item. Caso
contrário, a tempo de execução receberemos a mensagem apresentada na listagem 17.
Nas propriedades relativas ao grupo Funcional deste item Árvore Hierárquica(as demais são similares a
itens de um modo geral), encontramos:
• Ativado (Enabled) – determina se o usuário final poderá usar o mouse para manipular o item.
• Permitir Ramificações Vazias (Allow Empty Branches) – indica se podem existir nós sem
filhos. Se esta opção estiver habilitada, os nós sem filhos serão convertidos para elementos
(ou seja “folhas”). Caso esta propriedade esteja desabilitada, um nó vazio será apresentado
como um nó não expandido.
• Mostrar Linhas (Show Lines) – determina se as linhas de ligação entre os nós devem ser
apresentadas.
• Grupo de Registros (Record Group) – indica o nome do Record Group de onde os dados
serão originados para o preenchimento do item.
• Consulta de Dados (Data Query) – indica o texto da query de onde os dados serão
originados para o preenchimento do item.
O layout da query ou do Record Group para preenchimento da árvore hierárquica deve obedecer ao
especificado na tabela a seguir:
O comando SELECT (incluído na propriedade Consulta de Dados - Data Query do item Árvore
Hierárquica) e descrito na listagem 18 simula a montagem de uma árvore para os dados da tabela Depto.
Simulamos a hierarquia com o uso da cláusula Connect By em nossa tabela Depto (temos um auto-
relacionamento nesta tabela).
Na primeira coluna fizemos uso da pseudo-coluna Level para indicar o estado inicial do nó. Portanto, se o
nível for 1, o nó aparecerá expandido, se o nível for 2, o nó aparecerá contraído e se o nível for 3
indicamos que se trata de uma “folha” (um elemento).
Da mesma forma para a indicação do ícone escolhemos três ícones quaisquer no diretório default
(c:\orawin95\tools\devdem60\bin\icon) e os associamos a cada um dos níveis.
FTREE.POPULATE_TREE ('arvore');
Listagem 19
Nota
A rotina Break do pacote Standard Extensions era a forma utilizada na versão 4.5 para produzirmos uma
interrupção definida estaticamente.
DOWN;
FOR I IN 1..10 LOOP
:NR_GIT := :NR_GIT + 1;
IF I >= 7 THEN
DEBUG.SUSPEND;
END IF;
END LOOP;
Listagem 20
Para entrarmos em estado de depuração devemos executar a aplicação usando o botão Executar
Depuração de Form, presente na paleta de ferramentas do Navegador.
A Janela de Depuração
Fig. 62 – Janela de
Depuração
• Painel de Fonte – O painel superior nos mostrará trechos dos blocos de PL/SQL presentes na
aplicação quando fizermos a seleção da unidade de programa.
- Stack – este nó será preenchido pelo Form durante a depuração de um trecho de PL/SQL.
Estarão presentes todas as variáveis locais com seus respectivos valores e também todas
as rotinas (procedures e funções) em execução na ordem de chamada, como uma pilha.
• Painel de Comandos – Neste painel aparece uma linha de comando em que podemos
executar comandos diretamente no ponto de interrupção, alterando o valor de variáveis,
executando ações, etc. Corresponde a uma linha de comando de PL/SQL.
Com este painel teremos acesso a todas as variáveis e a toda a parte de código da aplicação.
• Gatilho (Trigger) – determina um ponto em que o código poderá ser interrompido se a lógica
definida no trigger determinar.
Quando a interrupção ocorre o controle sai da aplicação e passa para o depurador permitindo uma
verificação da execução passo a passo.
BREAKPOINT
Para a marcação de um ponto de
interrupção devemos selecionar a
linha em que ocorrerá a interrupção
(posicionando o cursor sobre a linha) e
escolher no menu Depurar (Debug) a
opção Interromper (Break).
Fig. 63 – Ponto
de Interrupção
• Unidade de Programa (Program Unit) – identifica a unidade de programa. Nome dado pelo
Forms.
• Gatilho (Trigger) – define um código de PL/SQL para o ponto de interrupção. Este código
será acionado cada vez que o ponto de interrupção for atingido.
O pacote Debug contém rotinas que nos permitirão alterar o valor das variáveis locais do trecho de código
que estamos analisando. No caso do exemplo, quando o ponto de interrupção for atingido, a variável local
V1 receberá o valor 5.
Quando pressionarmos o botão OK (no diálogo da figura 58), o ponto de interrupção é criado. No Painel de
Fonte aparecerá o texto B(01) em vez do número da linha. No nó Ações de Depuração no Painel do
Navegador, encontraremos a criação do ponto de interrupção.
Se não desejarmos preencher nenhum texto a ser executado juntamente com o ponto de interrupção,
podemos selecionar a linha que desejamos interromper e efetuar um click duplo. O ponto de interrupção
será marcado da mesma forma.
Para desmarcar o ponto de interrupção devemos selecionar a linha em que o ponto está marcado e efetuar
um click duplo.
TRIGGER
Um gatilho funciona ligeiramente diferente de um ponto de interrupção. No gatilho escreveremos uma
lógica que determinará se a interrupção ocorrerá ou não.
- Toda Instrução (Every Statement) – faz com que o trecho de PL/SQL seja avaliado antes
de cada linha de PL/SQL da aplicação.
• Unidade de Programa (Program Unit) – identifica a unidade de programa. Nome dado pelo
Forms.
• Linha (Line) – especifica a linha dentro da unidade de programa em que o gatilho foi marcado.
Quando aceitarmos este diálogo (OK), retornaremos à janela de depuração com a linha selecionada
preenchida com T(01) no lugar do número da linha.
Isto fará com que o controle retorne ao programa normalmente. Devemos, então, forçar a execução da
parte do programa em que marcamos o ponto de interrupção.
Na figura 65 podemos verificar que o ponto em que o programa está parado é marcado no Painel de Fonte
com o sinal =>.
O nó Stack contém o valor das variáveis locais deste trecho de código. A variável V1 possui o valor 5. Isto
significa que o código anexado ao ponto de interrupção já foi executado.
Na parte superior da janela encontramos diversos botões, agora habilitados, que nos permitirão executar
uma linha de cada vez. São eles:
• Entrar (Step Into) – esta opção executa cada linha do programa passo a passo. Ocorre a
interrupção a cada comando. Se o código acionar uma unidade de programa esta também é
acompanhada passo a passo.
• Transpor (Step Over) – esta opção também executa cada linha do programa passo a passo,
porém se houver chamada a uma unidade de programa, esta não é detalhada. A subrotina é
executada como se fosse uma linha simples.
• Sair (Step Out) – esta opção é para ser usada dentro de uma unidade de programa chamada,
pois ela termina a unidade de programa atual e retorna a quem a chamou. Se estivermos no
código principal esta opção encerrará a depuração. O trecho de código final é executado.
• Ir (Go) – esta opção encerra a execução passo a passo voltando para a forma normal do
programa. O restante do código é executado.
• Reinicializar (Reset) – esta opção desiste da execução passo a passo. O restante do código
não é executado.
Todas estas formas de interrupção vistas até o momento se perdem quando retornamos ao
desenvolvimento, porque não foram criadas no fonte da aplicação e sim durante a execução.
Se tivermos, porém, um problema mais complexo para analisar desejaremos que o ponto de interrupção
se fixe para que possamos executar mais de uma vez a ação até descobrirmos o problema.
DOWN;
FOR I IN 1..10 LOOP
:NR_GIT := :NR_GIT + 1;
IF I >= 7 THEN
DEBUG.SUSPEND;
END IF;
END LOOP;
Listagem 21
Nota
Esta forma de utilização
também pode ser utilizada
com a procedure Break
presente no pacote
Extensões Padrões (já
disponível no Forms 4.5).
As demais ações de depuração (acompanhamento passo a passo, avaliação do valor das variáveis, etc)
se desenvolvem da mesma forma que anteriormente.
Quando uma aplicação executa com a característica FRD habilitada, é gerado um arquivo contendo ações
internas e ações externas(ações do usuário como por exemplo teclas acionadas) em ordem cronológica
que nos permitirão acompanhamento das ações realizadas.
Se o trigger estiver incluído a nível de bloco a linha referente ao item não será apresentada. A nível de
Form, as linhas de bloco e item não serão apresentadas.
Além destas informações é apresentado um conjunto de informações sob o título de State Delta (como no
exemplo da listagem 23), onde é apresentado o nome da aplicação, do bloco, do item corrente (se houver),
o estado do Form, do bloco, do registro, o nome de cada item e seu valor.
Este “State Delta” é gravado para o arquivo após o trigger ser acionado. Corresponde a um dump das
informações que tenham sido alteradas desde a ocorrência do estado delta anterior. O primeiro estado
delta faz um dump de todo o Forms para o arquivo.
State Delta:
FORM TESTE_FRD
CURFIELD ""
STATUS QUERY
BLOCK FUNC
STATUS QUERY
RECSTATUS QUERY
FIELD ROWID
VALUE 000000D2.0000.0002
FIELD NM_FUNC
VALUE CRISTINA
Listagem 23
Para Built-ins
Executing <nome da Built-in> Built-in:
In Argument 0 - Type: <tipo do argumento> Value: <valor do argumento>
In Argument 1 - Type: <tipo do argumento> Value: <valor do argumento>
...
Out Argument 0 - Type: <tipo do argumento> Value: <valor do argumento>
...
Listagem 24
Quando uma built-in é executada, são mostrados seus argumentos de entrada e saída incluindo os valores
informados e recebidos, de acordo com o padrão mostrado na listagem 24.
Para Mensagens
Error Message: <mensagem>
Listagem 25
Qualquer mensagem produzida pela opção aparece no arquivo de acordo com o padrão mostrado na
listagem 25.
Para Arquivos
Opened file : <nome do arquivo>
ou
Failed to open file: <nome do arquivo>
Listagem 26
Exceptions
UNHANDLED EXCEPTION: <NOME DA EXCEPTION>
ou
UNHANDLED EXCEPTION: ORA-<NÚMERO DA EXCEPTION>
Listagem 27
Eventos externos
Os eventos externos efetuados pelo usuário a tempo de execução são registrados precedidos pelo
caracter # seguido de um número que indica a ordem cronológica do evento.
Cada evento contém dois blocos de informação: no primeiro é caracterizado o evento e no segundo o
State Delta.
CONSTRUÇÃO DE UM EXEMPLO
Para verificarmos o conteúdo de um arquivo produzido, criaremos uma aplicação que contenha as colunas
Nm_Func, Cd_Depto, Nr_Ramal, Dt_Adm e In_Sexo, formato tabular com 3 registros na tela.
Para ativarmos esta opção devemos incluir na linha de comando os parâmetros Record=Collect e
Log=<nome de um arquivo>, como apresentado na listagem 28 a seguir.
C:\ORACLE\BIN\IFRUN60.EXE MODULE=TESTE_FRD.FMX
USERID=ALUNO/ALUNO@ORACLE
RECORD=COLLECT LOG=FRD.TXT
Listagem 28
Resultado Gerado
Na listagem 29 apresentamos o trecho final do arquivo gerado.
# 6 - TESTE_FRD:FUNC.NM_FUNC
VALUE TESTE_FRD FUNC NM_FUNC 4 João
# 7 - TESTE_FRD:FUNC.NM_FUNC - MENU
FORM TESTE_FRD
STATUS CHANGED
BLOCK FUNC
STATUS CHANGED
RECSTATUS CHANGED
END
# 7 - TESTE_FRD:FUNC.NM_FUNC
MENU DEFAULT Ação Salvar
# 8 - TESTE_FRD:FUNC.NM_FUNC - MENU
FORM TESTE_FRD
STATUS QUERY
BLOCK FUNC
STATUS QUERY
RECSTATUS QUERY
END
# 8 - TESTE_FRD:FUNC.NM_FUNC
MENU DEFAULT Ação Sair
Listagem 29
No primeiro registro 7 encontramos o State Delta indicativo do estado em que o registro ficou após a
modificação. No segundo registro 7 encontramos a execução da ação Salvar presente no submenu Ação
do menu padrão (Default).
Em seguida encontramos a mensagem fornecida pelo programa e o State Delta posterior à gravação.
Finalmente no registro 8 encontramos a última ação executada (Sair do submenu Ação do menu Default).
Esta forma de trabalho resolvia parte dos problemas de integração, pois permitia a utilização de objetos de
diferentes aplicações em um único documento.
Esta tecnologia foi estendida para uma maior interface e compartilhamento de serviços, passando a se
chamar Component Object Model (COM) conhecida como OLE2.
Hoje ActiveX substitui OLE como o termo indicativo de tecnologia baseada em COM. OLE voltou a ser
considerado apenas Object Linking and Embedding em documentos.
Controles ActiveX, originalmente conhecidos como controles OLE ou OCX fazem uso de ambas as
tecnologias ActiveX e OLE.
Um controle ActiveX é um componente padrão de software que fornece uma interface para o usuário e
envia eventos de acordo com os padrões definidos pelo COM.
Ele é uma aplicação OLE Server inteiramente embutida em uma aplicação com capacidades de OLE
cliente.
Um item do tipo ActiveX cria um container para o controle ActiveX. O controle não é uma aplicação em
separado, devemos considerá-la como um serviço ligado (conectado, plugado) a um ActiveX container
(que é o nosso item).
Cada controle ActiveX possui um conjunto de propriedades, métodos e eventos que caracterizam lógica e
fisicamente o controle e permitem que executemos ações e percebamos alterações na situação do
controle.
Uma aplicação cliente manipula um controle ActiveX fazendo acesso diretamente a suas propriedades
(obtendo e modificando), acionando métodos e interceptando ou causando eventos.
Um arquivo OCX é uma biblioteca. Pode conter uma ou mais classe de objetos ActiveX. Um VBX é similar
a um OCX em muitos aspectos:
O que fundamentalmente muda de um para o outro é a tecnologia, ActiveX é baseado no modelo COM.
Como restrição para os controles VBX (no Form Builder) temos que um controle VBX funciona
estritamente em aplicações 16 bits, não funciona sob um ambiente 32. Podemos, porém fornecer a mesma
funcionalidade de um controle VBX em um ambiente de 32 bits ao utilizarmos OCX.
Este tipo de tecnologia pode tornar uma aplicação Form altamente sofisticada e complexa. Necessita,
porém de um pleno conhecimento das propriedades, métodos e eventos dos objetos que viermos a anexar
à aplicação.
VBX
Infelizmente não poderemos fazer um exemplo que execute perfeitamente, pois, o nosso ambiente é de 32
bits (Windows95), porém podemos estudar a nível teórico e mostrar onde podemos interferir.
A interface de um VBX em uma aplicação Form é feita através de um item do tipo VBX. No conjunto de
propriedades deste item é que preenchemos as informações necessárias para que o Form Builder faça a
ligação com o controle desejado.
• VBX Control File – onde definiríamos o nome do arquivo físico cuja extensão é VBX.
• VBX Control Name – onde definiríamos o nome do controle pertencente ao arquivo VBX que
desejaríamos usar.
Estas propriedades não estão visíveis no conjunto de propriedades no item criado, provavelmente pelo fato
de estarmos em um ambiente de 32bits. Se você estiver num ambiente de 16-bits (Windows 3.11),
provavelmente encontrará as propriedades referenciadas aqui.
Na propriedade VBX Control Value devemos indicar o nome da propriedade do controle que recebe o valor
do item. É desta forma que poderemos atribuir valor ao item, como fazemos com os demais itens em
PL/SQL.
Esta é a sintaxe padrão da PL/SQL. O controle, no entanto, precisa que o valor seja atribuído à
propriedade “TEXT” (por exemplo), sendo assim, preencheríamos a propriedade VBX Control Value com o
valor “TEXT”.
Desta forma, quando executarmos o comando de atribuição na PL/SQL o Form faz a atribuição à
propriedade “TEXT” do controle.
Além das propriedades no Forms, o controle possui suas próprias propriedades, métodos e eventos.
A manipulação deste item é feita com o uso do pacote VBX, que possui :
Para que o item VBX fique sensível a um evento causado, devemos criar um trigger (em qualquer nível),
chamado When-Custom-Item-Event que será causado todas as vezes que um evento do controle for
causado.
Para sabermos qual o evento e, termos condições de tomar as medidas adequadas, devemos utilizar a
variável de sistema System.Custom_Item_Event que identificará o evento acionado.
OLE CONTAINER
Este item implementa um controle container de objetos, ou seja, um controle que poderá receber objetos
dentro dele.
Este item armazena objetos de uma das categorias OLE registradas no Windows (por exemplo uma
planilha do Excel, documento do Word, figura do PaintBrush ou qualquer objeto de uma aplicação que
implemente OLE como Server).
• Linked – quando o objeto estiver num arquivo em disco independente do Form ou do banco
de dados. Dentro da aplicação (ou da coluna do banco de dados) estão armazenadas apenas
as informações de identificação do objeto.
Para estudarmos estas características básicas devemos analisar as propriedades de um item deste tipo.
No grupo funcional, encontraremos:
• Ativado (Enabled) - indica se o objeto poderá receber foco, seja através da navegação
padrão (tecla TAB) ou através de rotinas pré definidas (Next_Item, Go_Item, etc).
• Classe OLE (OLE Class) – indica a classe do objeto. Se deixarmos esta propriedade sem
valor (Null), podemos inserir qualquer tipo de objeto registrado por uma aplicação OLE Server
instalada no computador. Se preenchermos com algum valor somente objetos com a classe
especificada poderão ser inseridos neste container.
• Estilo de Ativação de OLE (OLE Activation Style) – aqui definiremos qual o evento que
acionará o objeto OLE. As opções válidas são:
• Ativação Local de OLE (OLE In-place Activation) – especifica se a ativação será local, isto
é, se o PaintBrush(por exemplo) será ativado dentro do espaço delimitado pela definição do
item na Canvas. Se preenchermos com Não, o PaintBrush (por exemplo) abrirá uma outra
janela para que o usuário possa desenhar.
• Tipos de Inquilinos de OLE (OLE Tenant Types) – Esta propriedade identifica os tipos de
objetos que podem ser inseridos, ou seja inquilinos do item OLE Container. Os valores válidos
são:
- Qualquer (Any) – é a opção default. Qualquer objeto OLE pode ser residente do
Container.
- Nenhum (NONE) – nenhum objeto pode ser residente do Container.
- Estático (STATIC) – somente objetos OLE estáticos podem ser residentes. Um objeto
OLE estático é uma imagem congelada de um objeto Linked cuja ligação foi perdida de
sua origem. Este tipo de objeto não pode ser modificado.
- Embutido (Embedded) – somente um objeto OLE embutido pode ser residente.
- Ligado (LINKED) – somente um objeto Linked pode ser residente.
• Mostrar Tipo Inquilino de OLE (Show OLE Tenant Types) – determina se uma borda em
torno do OLE deve ser apresentada. O tipo de borda varia de acordo com o tipo de objeto.
• Aspecto Inquilino de OLE (OLE Tenant Aspect) – indica o aspecto (aparência) do objeto
OLE no Container (item). As opções válidas são :
• Estilo de Redimensionamento de OLE (OLE Resize Style) – indica como o objeto OLE será
mostrado na área reservada para ele (quando ativo). Os valores válidos são:
- Corte (Clip) – É apresentada uma parte do objeto. Ele é cortado. A navegação é feita com
barra de rolagem.
- Escala (Scale) – O objeto é escalado.
- Inicial (Initial) – O objeto é redimensionado a tempo de criação.
- Dinâmico (Dynamic) – O objeto é redimensionado toda vez que seu tamanho muda.
• Mostrar Menu Pop up de OLE (Show OLE Popup Menu) – indica se um menu (apresentado
com o botão direito do mouse) deve ou não ser apresentado para o Container (Item). As ações
deste menu estão ligadas ao OLE Server.
• Itens de Menu Pop up de OLE (OLE Popup Menu Items) – nesta opção poderemos definir
quais as ações pré – definidas desejamos habilitar. Quando selecionarmos esta opção será
apresentada uma lista para que indiquemos para cada item da lista se ele estará ativo e
habilitado.
Podemos, também, fazer a manipulação de um item do tipo OLE por programação. O Form Builder possui
um pacote chamado Forms_Ole para executar determinadas ações:
• rotinas para manipulação de ações (da lista de ações disponíveis no menu popup) –
Exec_Verb (executar uma ação específica), Get_Verb_Count(para obter a quantidade de
ações disponíveis), Get_Verb_Name(para obter o nome do verbo ou da ação em função de um
indexador seqüencial), Find_OLE_Verb (retorna o índice em função do nome do verbo).
As interfaces VBX e OLE Container estão mantidas em função de versões anteriores do produto, mas num
ambiente 32-bits passaremos a trabalhar com a interface OCX.
A Oracle recomenda que este item seja criado em um bloco single-record para que sua
inicialização ocorra tão logo o foco recaia sobre o bloco.
• Passo 2 - Inserir um objeto dentro deste Container (como fizemos com o item OLE).
No editor de Layout, devemos pressionar o botão direito do mouse e selecionar a opção Insert
Object. A partir da lista apresentada escolher um item.
Para, mais facilmente, sabermos os nomes das propriedades e sua utilidade, devemos selecionar
a propriedade Ajuda de Controle (Control Help), no grupo Funcional. Esta propriedade acionará o
Help do fabricante do controle. Devemos, então, procurar o texto de ajuda relativo ao controle
incluído.
A terceira forma sintática é montada pelo Form Builder dentro dos pacotes adicionados à
aplicação. No nosso caso específico o pacote adicionado contém apenas referência aos eventos e
não às propriedades.
Este trigger (On-Dispatch-Event) será acionado se algum dos eventos do objeto for acionado.
Quando criarmos este gatilho. O Form Builder, automaticamente, o preenche com uma lista dos
possíveis eventos associados a este objeto, se o trigger for criado a nível de item.
Se este gatilho for criado a nível de bloco ou de módulo o preenchimento deve ser manual.
A propriedade básica do controle Spin é a propriedade Value. Cada vez que pressionamos o botão
da direita o valor desta propriedade é adicionado de 1 e cada vez que pressionamos o botão da
esquerda a propriedade Value é subtraída de 1. Os valores mínimo e máximo são fornecidos pelas
propriedades Min e Max, que nós atribuímos 1 e 5 respectivamente. Assim sendo enquanto o
botão for sendo acrescido, fizemos uma adição ao item da canvas nr_git e da mesma forma
quando este foi sendo decrementado.
Para a utilização de um objeto OCX é indispensável que você conheça bem o que faz o objeto que
você incluiu na sua aplicação.
Pacotes Embutidos
Falaremos, agora, nos pacotes que aparecem sob o nó Pacotes Embutidos (Built-in Packages).
Conheceremos o objetivo de todos eles, mas exemplificaremos apenas alguns.
STANDARD EXTENSIONS
Este é o pacote que contém as rotinas básicas para utilização dentro de uma aplicação Forms.
Com ele podemos alterar as propriedades de um objeto (item, janela, canvas, etc), obter propriedades,
navegar na aplicação e muitas outras funcionalidades, algumas delas já utilizadas ao longo dos exemplos
e exercícios.
DDE
Este pacote permite a utilização do suporte a Dynamic Data Exchange (DDE) dentro dos componentes do
Oracle Developer 6.
DDE é um mecanismo pelo qual aplicações podem se comunicar e trocar dados em um ambiente
Windows.
As funções DDE habilitadas para as aplicações Oracle (Client) se comunicarem com outras aplicações do
ambiente Windows compatíveis com DDE (Server) compreendem 3 ações:
• Importação de dados.
• Exportação de dados.
• Execução de comandos para o servidor DDE (a outra aplicação).
DEBUG
O pacote Debug oferece um conjunto de rotinas, funções e condições de erro para realizarmos depuração
em aplicações Forms.
OLE2
Conjunto de rotinas PL/SQL APIs para criação, manipulação e acesso a tributos de objetos OLE2
Automation.
Os objetos OLE2 Automation encapsulam um conjunto de atributos e métodos que podem ser
manipulados ou invocados de um OLE2 Automation Client. O pacote OLE2 permite que façamos acesso
aos objetos OLE2 Automation Servers diretamente do PL/SQL.
ORA_FFI
Este pacote provê uma interface de uso de funções C (terceira geração) diretamente dentro do PL/SQL.
No ambiente Windows as funções externas devem ser DLLs que, depois de registradas via funções
ORA_FFI podem ser usadas em uma aplicação Forms.
• usar a função Load_Library para obter um handle da DLL, ou seja, uma identificação física
(nome diretório, etc).
• usar a função Register_Function para obter um handle da função, ou seja, uma identificação
no ambiente da função (C) a ser usada. Deve-se especificar o nome da função e sua
localização (o handle da DLL).
• usar a função Register_Parameter para registrar cada parâmetro e estabelecer a paridade com
os tipos de parâmetro da PL/SQL.
ORA_NLS
Este pacote permite que obtenhamos informações sobre o ambiente corrente.
DECLARE
ALERTA ALERT := FIND_ALERT('ALERTA');
BOTAO NUMBER;
BEGIN
IF NOT ORA_NLS.AMERICAN_DATE THEN
CHANGE_ALERT_MESSAGE(ALERTA, 'Formato local da data : '||
ORA_NLS_GET_LANG_STR(ORA_NLS.LOCAL_DATE_FMT));
BOTAO := SHOW_ALERT(ALERTA);
END IF;
CHANGE_ALERT_MESSAGE(ALERTA, 'Linguagem : '||
ORA_NLS_GET_LANG_STR(ORA_NLS.LANGUAGE));
BOTAO := SHOW_ALERT(ALERTA);
CHANGE_ALERT_MESSAGE(ALERTA, 'Território : '||
ORA_NLS.GET_LANG_STR(ORA_NLS.TERRITORY));
BOTAO := SHOW_ALERT(ALERTA);
END;
Listagem 32
Na listagem 32 utilizamos duas rotinas do pacote Ora_Nls: a função American_Date, que retorna um
boleano indicando se o formato de data corresponde ao padrão americano e a função Get_Lang_Str que
pode fornecer diversas características do ambiente, tais como o nome da linguagem, do território, do
character set, abreviaturas de dias, de meses, etc.
O parâmetro recebido por esta rotina corresponde a uma constante definida no pacote. Os nomes e
significados destas constantes estão na a ajuda do Form Builder sob o título Ora_Nls Character Constants.
ORA_PROF
Este pacote contém procedimentos, funções e condições de erro que nos permitirão verificar o tempo de
execução de uma determinada unidade de programa.
DECLARE
ALERTA ALERT := FIND_ALERT('ALERTA');
BOTAO NUMBER := 0;
TEMPO NUMBER;
BEGIN
ORA_PROF.CREATE_TIMER('TEMPO');
ORA_PROF.START_TIMER('TEMPO');
FOR I IN 1..10000 LOOP
BOTAO := BOTAO + 1;
END LOOP;
ORA_PROF.STOP_TIMER('TEMPO');
TEMPO := ORA_PROF.ELAPSED_TIMER('TEMPO');
ORA_PROF.DESTROY_TIMER('TEMPO');
CHANGE_ALERT_MESSAGE(ALERTA, 'Tempo transcorrido : '||TEMPO);
BOTAO := SHOW_ALERT(ALERTA);
END;
Listagem 33
Na listagem 33 decidimos determinar o tempo total de somar 1 a uma variável 10000 vezes. Para isto
criamos o timer, iniciamos a contagem (start), executamos a operação desejada, interrompemos a
contagem (stop), destruímos a área de contagem do tempo e obtivemos o valor do tempo transcorrido
(retornado em milisegundos).
Poderíamos criar este controle no início da aplicação e contabilizar diversas ações internas que
julgássemos muito demoradas. Para reinicializar o contador de tempo devemos usar a rotina Reset_Timer
deste pacote.
TEXT_IO
Este pacote permitirá que venhamos a ler ou gravar informações para um arquivo do ambiente. É
equivalente ao pacote Utl_File da PL/SQL, com a diferença que o arquivo lido ou gravado se encontra no
ambiente cliente.
DECLARE
ARQ TEXT_IO.FILE_TYPE;
BUFFER VARCHAR2(1000);
BEGIN
ARQ := TEXT_IO.FOPEN('C:\TESTE\SAIDA.TXT', 'A');
FIRST_RECORD;
LOOP
BUFFER := LPAD(:CD_MAT, 3) || RPAD(:NM_FUNC,12) ||
LPAD(:NR_CARGO,3)|| LPAD(:NR_GIT,3);
TEXT_IO.PUT_LINE(ARQ, BUFFER);
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
EXIT;
END IF;
NEXT_RECORD;
END LOOP;
TEXT_IO.FCLOSE(ARQ);
END;
Listagem 34
A listagem 34 nos mostra a criação de um arquivo com o nome de saída com todos os registros que
estiverem no buffer naquele momento.
É executada a rotina First_Record (do pacote Standard) para que seja feito o posicionamento do cursor no
primeiro registro e a cada registro navegado é feita a gravação no arquivo até que a variável de sistema
Last_Record (é uma variável caracter, não é boleana) indicará se atingimos o último registro do buffer.
Após a gravação deste últimos registro, então, fechamos o arquivo.
TOOL_ENV
Permite que obtenhamos informações das variáveis de ambiente do Oracle.
DECLARE
BUFFER VARCHAR2(1000);
TEXTO VARCHAR2(1000);
ALERTA ALERT := FIND_ALERT('ALERTA');
BOTAO NUMBER;
BEGIN
TOOL_ENV.GETVAR('ORACLE_HOME', BUFFER);
TEXTO := BUFFER || '; ';
TOOL_ENV.GETVAR('ORACLE_SID', BUFFER);
TEXTO := TEXTO || BUFFER || '; ';
TOOL_ENV.GETVAR('NLS_LANG', BUFFER);
TEXTO := TEXTO || BUFFER || '; ';
CHANGE_ALERT_MESSAGE(ALERTA, TEXTO);
BOTAO := SHOW_ALERT(ALERTA);
END;
Listagem 35
Na listagem 35 utilizamos a única rotina do pacote, na qual solicitamos o nome de algumas variáveis do
ambiente.
Podemos ver o nome destas variáveis no registrador do Windows com o RegEdit (nó
Hkey_Local_Machine, subnó Software, subnó Oracle).
TOOL_ERR
O pacote Tool_Err fornece um conjunto de informações a respeito do erro acontecido em uma área
chamada “Error Stack”. Esta área contém códigos e mensagens de erro organizadas em uma área
indexada de 0 a n-1 (onde n é o número de erros). Este pacote permitirá a manipulação desta área de
stack.
Não desenvolveremos exemplos com este pacote. Para maiores informações utilize a ajuda do Form
Builder para exemplos e forma de utilização.
TOOL_RES
Este pacote fornece um mecanismo para extrairmos informações de um arquivo de recursos.
Os arquivos de recursos são providos pelas ferramentas (Form Builder, Report Builder, etc) e contém
informações diversas utilizadas pelos softwares.
Podemos gerar nossos próprios arquivos de recursos com o utilitário ResPa21 a partir de um texto com
extensão PRN. Este utilitário é fornecido juntamente com o Oracle*Terminal.
PECS
Este pacote fornece ao desenvolvedor ou ao administrador do sistemas meios de análise da performance
tanto do Form Builder quando das aplicações geradas.
VBX
Este pacote contém um conjunto de rotinas relacionadas à interface com controles VBX, que podem ser
anexadas a uma aplicação de 16-bits.
WEB
Este pacote, composto por uma única rotina, tem a finalidade de definir a URL do documento a ser
carregado em aplicações Web.
FORMS_OLE
Este pacote contém um conjunto de rotinas para acionamento e manipulação de um item do tipo OLE
Container.
STANDARD
Este pacote é utilizado implicitamente por nós todas as vezes que trabalhamos com PL/SQL, corresponde
ao conjunto de rotinas de PL/SQL válidas no ambiente.
Está sendo utilizado em praticamente todos os exemplos e exercícios vistos até agora.
Estudando o Módulo
Neste capítulo estudaremos as propriedades da aplicação como um todo. Algumas das propriedades
apresentadas já foram comentadas em outros níveis. As informações que estabelecermos a nível de
módulo podem vir a funcionar como default.
No grupo funcional vemos diversas propriedades relativas a menu. São elas: Origem de Menu (Menu
Source), Módulo de Menu (Menu Module), Menu Inicial (Initial Menu), Estilo de Menu (Menu Style).
Estas propriedades têm o objetivo de definir qual o menu a ser utilizado com a aplicação atual. Até o
momento trabalhamos sempre com o menu padrão do Form (Default&SmartBar). Quando criarmos nosso
próprio menu voltaremos a estudar estas propriedades com mais detalhes.
• Janela Console (Console Window) – indica o nome da janela em que serão mostradas as
mensagens e a linha de status.
No Microsoft Windows, a janela de console é sempre a MDI, ou seja, a janela do Form Runtime.
No entanto, devemos deixar esta propriedade preenchida se quisermos manter a informação
visível. Caso contrário podemos atribuir Null.
Se a preenchermos com Sim (Yes), para todos os itens que possuam a propriedade Obrigatório
(Required) preenchida com Sim (Yes), haverá o adiamento da validação até que ocorra a
validação do registro.
Isto modifica a funcionalidade default relativa a validação que ocorre tão logo ocorra a navegação
para fora daquele item. Quando marcamos esta propriedade o usuário poderá navegar livremente
entre os itens, sendo a verificação de preenchimento verificada apenas a tempo de validação de
registro.
• Limite de Navegação do Mouse (Mouse Navigation Limit) – que indica qual ação de
navegação o usuário poderá fazer com o mouse. Os valores válidos são:
- Form - permite ao operador navegar para qualquer item no Form corrente, mudando de
bloco, de registro, etc com o mouse.
- Bloco de Dados(Data Block) - permite ao operador navegar para qualquer item dentro de
um mesmo bloco, não é possível a troca de bloco com o mouse.
- Item - esta opção impede que o usuário navegue para fora do item com o mouse, ou seja,
impede o uso do mouse.
Se esta propriedade não for preenchida, será utilizada a seqüência do Navegador. Podemos modificar
esta propriedade a tempo de execução até a trigger When-New-Form-Instance, antes da navegação
para o primeiro bloco ocorrer.
No grupo Registros encontramos a propriedade Grupo de Atributos Visuais do Registro Corrente (Current
Record Visual Attribute Group), que funciona como um valor default para os níveis inferiores.
Indica o que o usuário poderá digitar antes de iniciar o processo de validação. O default é Item, ou
seja, o usuário poderá digitar o texto de um item. Tão logo ele navegue para outro haverá o
disparo dos eventos de validação.
As propriedades Tempo máximo para Consulta (Maximum Query Time) e Máximo de Registros
Extraídos (Maximum Records Fetched) quando declaradas a nível de Form funcionam como um
valor default.
Com esta opção é possível a execução de leituras repetidas (repeatable reads) e obtenção dos
mesmos resultados. Ela não é recomendada para ambientes de alta concorrência. O valor default
é Submetido a Commit de Leitura (Read Committed), o que indica que em uma leitura consistente
serão vistas todas as modificações Commited antes do início da leitura e todas as modificações
realizadas pela transação atual.
Preferências
Para obtermos as preferências do Form Builder, devemos escolher o menu Ferramentas e neste a opção
Preferências.
PASTA GERAL
A pasta Geral contém características que afetam a salva e compilação dos módulos desenvolvidos
utilizando este Form Builder.
Fig. 68 – Preferências
(Pasta Geral)
• Salvar Antes de Desenvolver (Save Before Building) – esta opção, se marcada, indica que
antes de gerar um FMX, o Form Builder deverá salvar o fonte da aplicação.
• Desenvolver Antes de Executar (Build Before Running) – esta opção, se marcada, indica
que quando solicitarmos a execução da aplicação o Form Builder deverá, automaticamente,
gerar o FMX. Esta opção, porém, não compila automaticamente nem Menus e nem Bibliotecas
(Libraries) associadas ao módulo. Esta compilação deve ser feita em separado.
• Suprimir Dicas (Suppress Hints) – indica se os hints (dicas) serão mostradas ou não na linha
de mensagem no Form Builder.
• Usar Editor do Sistema (Use System Editor) – esta opção determina se o Form Builder deve
apresentar seu editor default ou o editor default do sistema quando acionarmos o editor de um
campo multi-line.
• Paleta de Cores(Color Palette) – indica o nome da paleta de cores que deve ser carregada
quando criamos uma nova aplicação. Se esta opção estiver em branco será carregada a
paleta de cores default do Form. A extensão de uma paleta de cores é Pal.
• Modo das Cores (Color Mode) – esta opção determina como será feita a carga da paleta de
cores para a aplicação. Quando criamos ou abrimos ou carregamos uma aplicação a paleta de
cores associada a ela é carregada na tabela de cores do sistema. Como esta tabela possui
uma quantidade de espaços limitado, o Form Builder pode encontrar dificuldade em dar
manutenção a aplicações utilizando diferentes paletas. Os valores válidos para esta opção
são:
- Editável (Editable) – indica que desejamos editar, ou seja, criar nossas próprias
combinações de cores.
Quando a propriedade Color Mode está preenchida com este valor a paleta de cores fica
vulnerável a modificações, da nossa parte e involuntariamente em função da necessidade de
carga de uma nova paleta.
Somente devemos utilizá-la quando desejarmos fazer uma modificação na paleta. Ao término
devemos retornar ao estado normal, que é Read Only – Shared. Para que esta opção tenha
efeito devemos salvar as preferências e fechar o Form Builder.
Ao ativarmos novamente o Form Builder, devemos acionar o Editor de Layout e usar no menu
Formato (Formato), opções de Layout (Layout Options), Paleta de Cores (Color Palette).
O Form Builder utiliza uma paleta de cores padrões cujo arquivo se chama default.pal com as
seguintes características:
A segunda parte da paleta (região inferior esquerda) é composta de 8 células vazias em que
podemos definir cores customizadas.
As próximas 5 colunas são compostas de variações de cinza. Cada cor tem o formato
‘gray<valor>’, onde o valor varia de acordo com a percentagem de cinza. Os valores válidos
estão no intervalo de 4 a 96, com incremento de 4. Por exemplo: ‘gray4’, ‘gray8’, ‘gray12’,
‘gray16’, ‘gray20’, ‘gray24’, ‘gray28’, ‘gray32’, ...., ‘gray96’.
O restante da paleta de cores contém cores especificadas por variações percentuais das cores
vermelha, verde e azul (RGB). Sendo que os valores percentuais para vermelho ou verde são:
0, 25, 50, 75, 88 ou 100, enquanto que os valores percentuais para a cor azul são: 0, 50, 75,
88 ou 100.
Para sabermos o nome de uma determinada cor basta que a selecionemos na paleta.
Para editar uma cor, selecione uma das cores na parte vazia (branca), click sobre o botão
editar. Será apresentado um diálogo com cores básicas e matizes. Selecione uma cor básica,
varie seu matiz, saturação e luminosidade, clique sobre o botão Adicionar Cores
Personalizadas e dê OK. A cor definida ocupará a posição selecionada inicialmente na tabela.
Salve esta nova paleta de cores (Menu Arquivo – File, opção Exportar - Export, Paleta de
Cores – Color Palette), volte ao modo Read Only – Shared, preencha o nome do novo arquivo
na opção Paleta de Cores, feche o Form Builder e torne a abri-lo com esta nova paleta.
• Somente Leitura – Compartilhado (Read Only – Shared) – nesta opção ao fazer a carga da
paleta de cores para a tabela de cores do sistema o Form Builder verifica através do nome se
uma determinada cor já existe na tabela de cores do sistema para fazer o posicionamento
similar.
Se a cor não existir, será adicionada à tabela de cores do sistema. Isto diminui a probabilidade de
ao utilizarmos aplicações com paletas de cores diferentes termos problemas de falta de espaço na
tabela de cores.
• Somente Leitura – Privado (Read Only – Private) – esta opção não tem efeito no Form
Builder, é apenas para compatibilidade com o Graphics Builder.
Fig. 69 – Preferências
(Pasta Acesso)
• Mostrar – esta opção filtra o que deve ser apresentado no caso de uma leitura.
• Caminho da Divisão em Subclasses – esta opção indica se o caminho (path) deve ser
retirado dos objetos referenciados. Podemos escolher remover, manter ou solicitar (causará o
aparecimento de um diálogo cada vez que indicarmos que um objeto na aplicação é uma
referência a outro).
Fig. 70 – Preferências
(Pasta Assistentes)
PASTA RUNTIME
As opções desta pasta afetam à execução de uma aplicação através do Form Builder. Cada uma das
opções marcadas aqui possui uma palavra chave que pode ser passada como parâmetro para Form
Runtime e que é enviada automaticamente quando iniciamos a execução através do Form Builder. São
elas:
Fig. 71 – Preferências
(Pasta Runtime)
• Modo de Depuração (Debug Mode) – Esta opção ativará o Depurador a tempo de execução.
Com esta opção marcada ocorrerá uma interrupção se a procedure Break do pacote Debug for
usada em algum trigger ou se usarmos o comando Ajuda, Depurar (Help, Debug) do menu
principal do Form Runtime.
• Depurar Mensagens (Debug Messages) - Esta opção fará com que a tempo de execução
sejam mostradas mensagens que indiquem qual o trigger em execução atualmente.
• Otimizar Processamento SQL (Optimize SQL Processing) - Especifica que o Form irá
otimizar os comados SQL processados no estilo V2 pelo compartilhamento de cursores. Por
default o Form associa um cursor para cada comando SQL executado em V2. Isto otimiza a
performance, uma vez que o parse só é executado uma vez, ou seja, somente a primeira vez
for executado para a sessão.
Quando desmarcamos esta opção, o Form associa um único cursor para todos os comandos SQL
executados em V2. Isto economiza memória, por outro lado perde-se em performance uma vez
que o parse será executado cada vez que o comando for executado. Esta opção não tem efeito
para triggers escritos em PL/SQL.
Quando desmarcamos esta opção, o Form irá associar um cursor separado apenas para cada
query Select. Todos os outros comando SQL implícitos compartilharão cursores. Isto significa que
todos os Insert, Update, Delete e Select For Update devem ser parsed cada vez que forem
executados.
Esta opção também habilita a seguinte informação para o database: Alter Session Set Sql-Trace =
True. Este comando habilita o acompanhamento do Sql Trace no servidor.
• Exibir Menu do Bloco (Display Block Menu) - Automaticamente mostra o Menu de Blocos
como primeira tela (após a tela de login).
• Modo Somente Consulta (Query Only Mode) - Executa o Form em modo somente de
consulta.
• Modo Silencioso (Quiet Mode) – Neste modo as mensagens não produzem Beep audível. Se
desejarmos chamar a atenção do usuário em determinado momento podemos acionar a rotina
Bell que produzirá um som, se esta opção estiver desmarcada.
O usuário pode criar um arquivo de preferências utilizando a sintaxe: Keyword = <Valor> | ON | OFF
OPÇÕES DE EXECUÇÃO
Estas opções determinam as características de execução para o Form Runtime. Podemos definir estas
opções de duas formas:
No exemplo, utilizamos apenas os parâmetros Module e Userid. A lista a seguir relaciona todos os
parâmetros disponíveis:
Palavra-Chave Descrição
Term Este parâmetro determina o nome do arquivo de recursos para o Oracle terminal. Se não for especificado o
Form Runtime utilizará o padrão específico para a plataforma. Por exemplo FrmUsw para ambientes Windows.
Debug Executar em modo de Depuração.
Debug_Messages Depurar Mensagens.
Keyout Determina o nome de um arquivo onde serão gravadas todas as teclas utilizadas durante a execução da
aplicação. Só aplicável a terminais Character Mode.
Keyin Determina o nome de um arquivo de onde serão lidas todas as ações a serem executadas durante a execução
da sessão. Este arquivo deve conter toda a seqüência de teclas para execução, salva, navegação, etc.
Aplicável apenas a terminais Character Mode.
Output_File Determina o nome de um arquivo onde todas as respostas para o vídeo serão gravadas. Aplicável apenas a
terminais Character Mode.
Interactive Boleano (True ou False). Indica se as respostas (telas de saída) deverão ou não ser mostradas no vídeo. Pode
ser utilizada juntamente com as opções Keyin e Output_File. Aplicável apenas a terminais Character Mode.
Array Mecanismo de Array Processing.
Buffer_Records Armazenar Registros no Buffer do Arquivo.
Logon_Screen Este parâmetro, quando True, força a presença da tela de Login. Neste caso o Form Runtime ignora o userid e
password informados.
Block_Menu Exibir Menu do Bloco.
OptimizeSQL Otimizar Processamento SQL (estilo V2)
OptimizeTP Otimizar Processamento do Modo da Transação.
Quiet Modo Silencioso
Statistics Estatística.
UseSdi Indica se o Form Runtime deve utilizar o padrão SDI. O default é NO, indicando que o padrão a ser utilizado é o
MDI, onde a janela do Form Runtime é visível. No padrão SDI será mostrada apenas a janela da aplicação.
Query_Only Modo Somente Consulta.
Help Mostra diálogos com a sintaxe destes parâmetros.
Window_State Determina o estado da janela MDI no início da aplicação. Podemos informar: Maximize, Minimize ou Normal .
Pecs Executa o Form Runtime com Performance Event Collection Services (Pecs) habilitada para coleta de
informações para análise de performance.
Options_Screen Mostra a janela com esta lista de opções a tempo de execução.
Session Especifica se será possível a execução de uma operação de Open_Form com uma sessão em separado. O
valor default para esta opção é NO. A forma mais segura, no entanto, de efetuarmos esta operação é através
da variáveis de ambiente Forms50_Session, que habilita esta situação para todas as aplicações que vierem a
executar daquela estação.
Este tópico abordará as diversas formas de reutilização seja com objetivo de padrão ou de simples
aproveitamento de código.
Template
Quando iniciamos uma aplicação a tela inicial do Wizard pergunta se queremos criar uma aplicação
baseada em um gabarito.
Isto significa que criaremos uma aplicação copiando todas as informações de outra aplicação, (exceto seu
nome).
Esta forma de trabalho é similar a abrir a outra aplicação e usar a opção Salvar Como (Save As) do menu
Arquivo (File), com a diferença que oferece mais segurança. Não corremos o risco de esquecer e salvar
por cima do original.
Para estabelecer um padrão poderíamos criar um esqueleto com objetos padrões de uso da sua
instalação, por exemplo, a barra de ferramentas, o bloco de controle com os botões da barra e suas
respectivas triggers, atributos visuais mais comuns, alertas, etc.
Classe de Propriedades
A Classe de Propriedades é uma outra forma de estabelecermos uma padronização a nível de objeto.
Suponhamos que desejemos que todos os botões sejam apresentados no formato icônico, com um
tamanho padrão de 18 por 18 e que não sejam navegáveis nem por teclado e nem por mouse.
Com este objetivo devemos criar um padrão (classe de propriedades) e em seguida atribuir esta classe a
todos os objetos da aplicação compatíveis com a classe criada.
A criação de uma classe é feita no nó Classes de Propriedade (Property Class). Quando abrimos as
propriedades de uma classe recém criada observamos que esta só contém o grupo Geral. Não aparecem
outras propriedades.
Fig. 74 – Classe de
Propriedades
Por exemplo, ao selecionarmos um botão qualquer de nossa aplicação, podemos abrir sua tela de
propriedades, expandir todos os nós em que se encontram as propriedades desejadas.
Com estas propriedades selecionadas (usando-se as teclas CTRL ou SHIFT simultaneamente), devemos
pressionar o botão Classe de Propriedades (Property Class) da barra de ferramentas da própria janela de
propriedades.
Ocorrerá a criação de uma classe contendo todas as propriedades marcadas além de todas as
propriedades do grupo geral.
Se pressionarmos o botão para que seja mostrada a situação de União, todas as propriedades
pertencentes a cada um dos objetos selecionados é apresentada, mesmo que a propriedade pertença
apenas a um dos objetos.
Para realizar esta operação, devemos selecionar um objeto. Na tela de propriedades serão apresentadas
as propriedades deste objeto. Ao congelarmos esta tela pressionando o botão Congelar/Descongelar a
seleção de outro elemento qualquer não alterará a lista de propriedades presente nesta janela.
Ao selecionarmos outro objeto da aplicação e utilizarmos o botão direito do mouse, abriremos outra paleta
de propriedades.
Isto significa que podemos criar gatilhos padrões e associá-los aos objetos que receberão a padronização
da classe.
Quando atribuirmos esta classe ao objeto desejado, este herda não só as propriedades como também o
trigger.
Fig. 75 – Informações
sobre a Divisão
Devemos escolher o botão de rádio Classe de Propriedade (Property Class). Em seguida, escolher a
classe de propriedade desejada e dar OK.
O trigger criado pode ser modificado localmente. Isto dá uma enorme flexibilidade, pois podemos
estabelecer um padrão básico e completar com definições locais em cada objeto.
O BOTÃO HERDAR
Quando modificamos, no objeto destino uma das propriedades herdadas da classe, a indicação de
herança fica modificada.
Se desejarmos recuperar, novamente, o valor original a partir da classe, devemos selecionar a propriedade
desejada e pressionar o botão Herdar para que o valor seja restaurado.
Biblioteca de Objetos
Outra forma de padronização é a biblioteca de objetos. Uma biblioteca de objetos é um outro tipo de
arquivo gerado pelo Form Builder, não é parte integrante da aplicação. O objetivo desta biblioteca é
armazenar objetos que possam ser aproveitados em outras aplicações.
Para visualizarmos a janela da biblioteca podemos efetuar um click duplo em uma das pastas ou usar a
opção Biblioteca de Objetos(Object Library) do menu Ferramentas(Tools). Inicialmente as pastas estão
vazias.
Para preenchê-las, devemos abrir uma aplicação Forms e arrastar objetos desta aplicação para a pasta
desejada. Ao realizarmos esta operação estamos criando objetos padrões que podem ser reusados em
outras aplicações.
Cópia
Com esta forma de reuso,
copiamos um objeto já existente
para dentro de nossa aplicação
sem vínvulo com o original.
Referência
Se utilizarmos, porém, a opção SubClasse ocorrerá um vínculo entre o objeto copiado e o original.
Qualquer modificação no item armazenado na Biblioteca afeta os objetos referenciados nas aplicações.
Podemos modificar qualquer das propriedades que desejarmos, inclusive aquelas com sinal indicativo de
referência.
O símbolo será apenas modificado indicando que a propriedade não é mais igual àquela presente na
Biblioteca de Objetos.
Excetuando-se o nó Bibliotecas Anexadas (Attached Libraries), objetos de todos os demais nós de uma
aplicação podem ser armazenados em uma Biblioteca de Objetos.
SMARTCLASS
As bibliotecas de objetos podem ser usadas para a especificação de
classes que sejam freqüentemente utilizadas.
Se selecionarmos um elemento da aplicação que tenha tipo correspondente a uma das classes intelientes,
com o botão direito do mouse (na opção Classes Inteligentes) veremos a lista de classes disponíveis para
aquele tipo objeto. Esta situação não acontece com um objeto da biblioteca que não seja SmartClass.
Para que a indicação apareça é necessário que a biblioteca esteja aberta simultaneamente com a
aplicação.
REFERÊNCIA
Com o mouse, fazendo as operações de clicar e arrastar, devemos arrastar um objeto da aplicação origem
para a aplicação destino. No diálogo apresentado devemos escolher a opção Subclasse.
A propriedade Divisão em Subclasses (SubClass Information), quando o objeto faz referência a outro,
indica qual o objeto origem e de que módulo.
CÓPIA
Da mesma forma que anteriormente, podemos copiar objetos de uma aplicação para outra, porém, sem
estabelecer vínculo.
Quando realizamos uma cópia, são trazidos, juntamente com o objeto copiado, os objetos subordinados,
ou seja, triggers e itens.
Os demais objetos (referenciados) não são copiados. Após uma cópia devemos, portanto, fazer as
adaptações necessárias para que os objetos copiados estejam compatíveis com o novo ambiente.
Eles não tem nenhuma relação com os objetos originais. Se analisarmos a propriedade Divisão em
Subclasses (SubClass Information) comprovaremos esta situação.
Na aplicação origem criamos o grupo de objetos e anexamos a este grupo diversos objetos, tais como:
triggers, blocos, alertas, unidades de programas, etc.
Em vez de arrastarmos um objeto de cada vez para outra aplicação, arrastamos todo o grupo de uma
única vez (para o nó Grupo de Objetos na aplicação Destino).
Quando concluímos o processo, veremos que na aplicação destino, o nó Grupo de Objetos está
preenchido e também todos os nós originais dos objetos copiados (ou referenciados), ou seja, cada objeto
é incluído em seu próprio nó.
Conclusões
O Form Builder pôs a nossa disposição diversas formas de aproveitarmos as especificações de objetos
pertencentes a outras aplicações ou presentes em uma biblioteca de objetos.
Podemos estabelecer todos os tipos de padrões desejados, desde cópia de uma aplicação esqueleto
(template), grupos de objetos ou um único objeto.
Estas rotinas grupadas em um arquivo podem ser compartilhadas, no ambiente cliente, por diversas outras
aplicações sejam elas Forms, Menus, outras Biblioteca (Libraries) ou até mesmo Reports.
A biblioteca criada deve ser associada a cada módulo no qual desejamos utilizá-la (Attach).
Uma vez anexada, podemos fazer referência às rotinas presentes na biblioteca em qualquer gatilho
(trigger), unidade de programa (program unit) ou itens de menu (inclusive de popup menu).
Para adicionarmos uma rotina à biblioteca, devemos selecionar o nó Unidades de Programa (Program
Units) e usar o botão Criar.
Quando salvarmos a biblioteca, estaremos salvando todas as rotinas criadas dentro desta biblioteca.
Para executar esta ação devemos utilizar a opção do menu Arquivo (File), Salvar Como (Save As).
Pressionaremos o botão Pesquisar (Select) para encontrar a biblioteca em disco. Após identificarmos a
biblioteca, devemos pressionar o botão anexar.
Neste momento será apresentado um diálogo indicando que podemos armazenar internamente na
aplicação apenas o nome da biblioteca (no nosso caso LibPL.PLL) ou podemos armazenar todo o caminho
(no nosso caso C:\Teste\LibPL.PLL).
De um modo geral é preferível que façamos a remoção do caminho (Path), ou seja, que a informação
armazenada contenha apenas o nome da biblioteca, porque esta aplicação certamente será executada em
um ambiente de produção com características de diretório diferentes daquelas encontradas no ambiente
de teste.
Quando retiramos o diretório do nome da biblioteca, a tempo de execução o Form Runtime procurará esta
biblioteca nos diretórios que estiverem preenchidos na variável de ambiente Forms60_Path.
Após a anexação a utilização das rotinas presentes na biblioteca é similar à utilização de uma Unidade de
programa local.
Podemos, porém, fazer referência indireta a estes elementos usando a função Name_In para obter o valor
de variáveis ou a função Copy para atribuir valor a variáveis.
De uma forma geral, se você deseja ter independência de código, isto é, suas rotinas ficarem totalmente
independentes da aplicação, o ideal é tratar toda e qualquer informação por parâmetro.
Quando decidimos pelo cadastramento de uma determinada rotina em bibliotecas da rede, desejamos o
compartilhamento apenas para o ambiente cliente. Aquele código pode ser aproveitado (reutilizado) por
diversas aplicações no ambiente cliente (módulos de tela ou relatório).
• a rotina não utiliza estruturas do banco de dados ou utiliza apenas para atualização, não
causando impacto no tráfego da rede.
• a rotina está associada a ações específicas do ambiente cliente (usa built-ins do Form ou do
Report).
• Form (vazio)
• Menus (Menu_Principal)
• Bibliotecas PL/SQL (vazio) Fig. 81 - Módulo Menu
• Bibliotecas de Objetos (vazio)
Se, após a criação do módulo Menu, pesquisarmos no Windows Explorer encontraremos um arquivo com
a extensão MMB (o “executável” é MMX). Os nós internos do Menu são:
• Grupos de Objetos – se desejarmos grupar objetos deste módulo para enviar para outros
módulos ou tivermos copiado dados de outro módulo para o atual.
• Parâmetro – quando desejamos que um item deste módulo receba parâmetro (será visto).
Desta lista identificada, a novidade é o nó Menu. Os demais já foram vistos no estudo do módulo Form e
são exatamente iguais àqueles presentes em uma aplicação deste tipo.
• O módulo Menu.
• Menus (subordinados ao nó Menus).
• Itens de Menu (subordinados a cada Menu criado).
• Parâmetros (utilizados pelos itens de menu).
A criação destes elementos pode ser feita de duas formas: via Navegador ou via Editor.
• Tipo de Item de Menu (Menu Item Type) – determina o aspecto visual do item. Pode receber
um dos seguintes valores:
- Plano (Plain) – O usuário verá o texto que preenchemos na propriedade etiqueta (label). É
a situação mais comum. É a opção default.
- Rádio (Radio) – Este item também mostra o texto da etiqueta (label). Lateralmente será
apresentado um indicador de selecionado ou não. Este tipo de item pertence a um grupo,
dentro do qual somente um dos itens de rádio pode estar selecionado de cada vez.
- Separador (Separator) – Este item não mostra o texto da etiqueta, em vez disso o que é
mostrado no menu é uma linha separadora. Normalmente utilizada para separar ações de
menu não relacionadas.
- Mágico (Magic) – este tipo de item de menu, possui algum tipo de funcionalidade padrão
em relação ao ambiente Windows, tal como Copy ou Cut. Algumas das ações possíveis são
implementadas implicitamente e não precisaremos efetuar programação para o item.
• Grupo de Rádios de Item de Menu (Menu Item Radio Group) – se o item de menu for do
tipo Radio, esta propriedade deve ser preenchida com o nome de um Item de Menu que
corresponderá ao grupo de Radios. Devemos preencher o mesmo nome para todos os itens
Radio que pertençam ao mesmo conjunto lógico.
- os itens de menu do tipo radio devem ser adjacentes, uns em relação aos outros;
- somente um item de menu correspondente ao grupo poderá ser indicado por Menu.
• Item Mágico (Magic Item) – Se o tipo de item for Magic, devemos preencher esta propriedade
com um dos apresentados na lista. Alguns deles já possuem uma funcionalidade implícita, não
precisando de programação.
• Tipo de Comando (Command Type) – esta propriedade determina o tipo de ação a ser
realizada quando o usuário escolher o item em questão. Os valores válidos para esta
propriedade são:
- Nulo (Null) – indica que nenhuma ação será realizada por aquele item de menu. Devemos
escolher esta opção para todos os itens do tipo separador (separator).
- Menu (Menu) – indica que este item de menu acionará um outro menu. Na área reservada
para o texto do comando deveremos preencher com o nome do menu.
- PL/SQL – neste caso poderemos escrever um bloco de PL/SQL que realize uma ação, tal
como, acionar um Form, um Report, efetuar um cálculo, executar um procedimento, etc.
As demais opções da lista foram mantidas para compatibilidade com versões anteriores e não devem ser
usadas.
• Código do Item de Menu (Menu Item Code) – indica o texto do PL/SQL quando o tipo do
comando é PL/SQL.
As próximas 4 propriedades determinam se o item de menu será mostrado em uma barra de ferramentas
horizontal e/ou vertical e com que ícone.
A figura 83 apresenta o editor com um menu preenchido. As seguintes características são apresentadas
no desenho:
• Aparecem duas linguetas: uma na linha principal (ao lado do item Aplicação) e outra abaixo do
item Aplicação. Elas representam a presença de Menus (um Raiz) e o outro Aplic_Submenu.
A associação entre o menu Aplicação_Menu e o item de menu Aplicação é feito através das
propriedades do item Aplicação, que é do tipo Menu e cujo comando se refere ao menu
Aplicação_menu.
• Na barra de Ferramentas aparecem dois botões para a criação de submenus : Create Down e
Create Right. Com estes botões podemos criar itens de menu ou novos menus.
• O texto que aparece para cada item é o texto da etiqueta(label). Não é o nome do item.
Para efetuarmos a compilação de um módulo menu (a fim de gerarmos o arquivo extensão MMX),
devemos escolher CTRL+T ou Menu Arquivo, Administração, Compilar Arquivo.
Na tela de propriedades do módulo Form, no grupo Funcional existem três propriedades a serem
preenchidas neste momento:
• Módulo de Menu (Menu Module) – Devemos preencher com o nome do módulo |gerado, ou
seja, o módulo que possui a extensão MMX. No caso do exemplo seria Menu_Principal.MMX.
• Menu Inicial (Initial Menu) – Devemos indicar o nome do nó menu (dentro do módulo Menu)
que deve ser apresentado inicialmente. No exemplo escolheríamos Raiz.
Fig. 84 - Associação
de Menu
Existe, porém, outra forma de fazermos a associação chamada de Procura no Banco de Dados (Database
Lookup).
Nesta forma de associação as informações sobre nome e localização do módulo estão armazenadas no
banco de dados, dentro do módulo Menu.
A terceira propriedade Menu Inicial (Initial Menu) continua sendo preenchida com o nome do Menu a ser
apresentado como o Menu Principal (Inicial) da aplicação.
Estas informações, no entanto, são insuficientes para que o Form Runtime encontre o módulo MMX em
disco para executar. Desta forma há necessidade de informarmos o diretório e o nome do módulo gerado
(MMX).
Isto é feito nas propriedades do módulo Menu, portanto, abra a tela de propriedades do módulo Menu.
• Diretório do Menu (Menu Directory) – nesta propriedade indicamos o diretório onde o Form
Runtime deve procurar pelo MMX.
Se esta propriedade não for preenchida, o Form Runtime inicialmente pesquisará no diretório local
e, se não encontrar o MMX, procurará nos caminhos definidos pela variável de ambiente
Forms60_Path, presente no registrador do Windows.
CALL_FORM X NEW_FORM
Neste tópico analisaremos a diferença na chamada das rotinas Call_Form e New_Form. Ambas as rotinas
acionam a execução de uma aplicação Form, mas possuem algumas diferenças na forma de chamada.
• A rotina Call_Form, ativa uma outra aplicação sem fechar a anterior. O Menu se mantém o
mesmo para todas as aplicações chamadas. Isto ocorre porque as aplicações subordinadas
herdam o menu da aplicação anterior.
• Quando usamos a rotina New_Form a aplicação anterior é fechada para que a atual seja
acionada. Não existe ligação entre as duas, assim o menu utilizado na segunda será o menu
que estiver preenchido nas propriedades do módulo desta aplicação. Não há herança.
Concluímos, então que Call_Form aciona outra aplicação sem fechar a atual, tendo como conseqüência a
herança do menu. Já a rotina New_Form aciona outra aplicação, fechando, primeiramente, a aplicação
atual.
O comando associado a um item de menu do tipo Check é executado todas as vezes que o operador
coloca o item em um estado oposto ao atual.
A rotina Get_Menu_Item_Property pode ser usada para verificarmos se o estado atual do item é checado
ou não checado.
Caso contrário, seu estado será não checado (Unchecked). Em função disto devemos colocar em primeiro
lugar do grupo aquele item que reflete o estado inicial da situação em questão na aplicação.
O comando associado a um item de menu do tipo Radio é executado quando o operador seleciona o item.
Mesmo se o item escolhido for exatamente o que esteja atualmente checado.
A rotina Get_Menu_Item_Property pode ser usada para verificarmos se o estado atual do item é checado
ou não checado.
RESTRIÇÃO
Não devemos usar itens de menu do tipo Check, Radio ou Separator no menu principal ou em um menu
que venha a ser apresentado no nível mais alto.
Propriedades de um Menu
A seguir apresentamos as propriedades de um menu (não é do módulo):
• Título (Title) - Especifica o título a ser apresentado para o menu. Limitado a 40 caracteres.
Aparece no topo de um menu do tipo Full-Screen.
• Subtítulo (SubTitle) - Nesta propriedade especificamos um texto que será apresentado logo
abaixo do título para menus que usem o formato Full Screen. Está limitado a 40 caracteres.
• Título de Base (Bottom Title) - Nesta propriedade especificamos um texto que será
apresentado acima da linha de mensagem e da linha de status para menus que usem o
formato Full Screen. Está limitado a 72 caracteres.
• Menu Tirar (Tear-off Menu) - É um submenu que os operadores podem retirar da barra de
menu e reposicionar em qualquer lugar da tela. Pode-se habilitar a funcionalidade tear-off para
qualquer submenu, porém, somente no estilo pull-down e quando o gerenciador de janelas
suportar esta característica.
• Menu Principal (Main Menu) - Nesta propriedade determinamos o nome de um menu definido
dentro deste módulo que será o menu principal ou inicial a tempo de execução. Útil para
menus apresentados no formato Full-Screen.
As propriedades Diretório do Menu (Menu Directory) e Nome do Arquivo do Menu (Menu Filename)
dizem respeito à forma como o Form Runtime estabelecerá a ligação entre o módulo Form e o
módulo Menu. Foram abordadas no tópico Associando um Módulo de Menu a um Form.
• Compartilhar Biblioteca com o Form (Share Library with Form) - Esta propriedade indica
que o Menu deve utilizar a mesma cópia em memória da biblioteca associada (Attached
Library) se esta for a mesma em uso pelo Módulo Form ativo. Esta propriedade pode ser
interessante para economizar memória e aumentar a performance no ambiente cliente.
• Usar Segurança (Use Security) - Marcando esta propriedade indicamos que o Form Runtime
deve assegurar a segurança do módulo menu através do uso de roles. Esta propriedade pode
ser marcada com Não (No) a tempo de desenvolvimento para que sejam possíveis os testes
das diversas opções de menu e com Sim (Yes) no momento em que o sistema for para
produção.
• Papéis do Módulo (Module Roles) - Nesta propriedade incluímos uma lista das Roles
(estabelecidas no banco de dados) que podem ter acesso a este módulo de menu.
Para que esta situação seja efetiva deve existir no banco de dados uma view de nome
Frm60_Enabled_Roles.
Caso esta view não seja encontrada em seu ambiente, o DBA da instalação deverá executar o
script Frm60sec.Sql (presente no CD de instalação) no usuário System.
• UN – username corrente.
• PW – password corrente.
• AD – diretório onde o MMX está armazenado, obtido das propriedades Menu FileName e
Menu Directory.
• SO – item de menu corrente.
• TT – tipo de terminal utilizado para conexão.
• LN – linguagem corrente, obtido da variável de ambiente NLS_LANG.
PARÂMETROS DO USUÁRIO
No nó Parâmetros (Parameters) podemos criar nossos próprios parâmetros.
Podemos atribuir valor a eles ou solicitar que os operadores forneçam os dados necessários.
Quando um usuário seleciona um item de menu que faz menção a um parâmetro, o Form Runtime mostra
o diálogo Enter Parameter Values para que o usuário forneça o valor do parâmetro desejado. Em seguida
o Form Runtime executa o comando de menu solicitado.
• Etiqueta (Label) – Indica um texto a ser apresentado para o parâmetro quando este for
solicitado.
• Ocultar Dados (Conceal Data) – esta propriedade determina se o valor informado pelo
usuário aparecerá ou não na tela.
No grupo Ajuda (Help) encontramos a propriedade Dica (Hint), na qual, podemos definir um texto descritivo
que indique ao usuário o que deve ser preenchido para o parâmetro, uma vez que esta informação ficará
visível quando o parâmetro for solicitado.