Aprenda PL/SQL

[Dica] Bloco baseado em VIEW

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
  

Mensagemem Sáb, 15 Mai 2004 7:14 pm

Uma coisa muito útil no Forms é poder basear os blocos em Views. Vamos a um breve exemplo:
    Digamos que uma tabela contenha os itens de um pedido. Obviamente, apenas o código do produto estará nesta tabela e não a descrição do produto. Como fazer para mostrar a descrição ?

Código: Selecionar todos
Estrutura das tabelas:
ITENS_PEDIDO
  IT_COD    NUMBER(5),
  PROD_COD  NUMBER(5),
  QUANT     NUMBER(10,2)

PRODUTO
  PROD_COD  NUMBER(5),
  PROD_DSC  VARCHAR2(60) 


POUCO EFICIENTE

Podemos usar a trigger POST_QUERY, que é disparada em cada linha do bloco. Dentro desta trigger, coloca-se uma consulta assim:

Código: Selecionar todos
select prod_dsc
into :BLOCO_ITENS_PED.PROD_DSC
from produto
where prod_cod=:BLOCO_ITENS_PED.PROD_COD;


Este select rodará em cada linha do bloco, buscando a descrição do Produto. Temos que deixar a propriedade do item Database Item No.

Isto é pouquíssimo eficiente! Imaginem se o bloco for buscar 500 linhas? O cliente vai fazer 500 consultas de descrição!!! Resultado: Queda de performance do banco, trafego inútil na rede, etc.

MUITO EFICIENTE

Vamos basear nosso bloco numa View! Como fazemos isso?

1. Criamos uma VIEW_ITENS_PEDIDO com a descrição do Produto.
Código: Selecionar todos
create or replace view VIEW_ITENS_PEDIDO as
select
  a.*,
  b.prod_dsc
from
  itens_pedido A,
  produto      B
where a.prod_cod=b.prod_cod

2. Criamos o bloco com base nesta view.
Agora vamos tornar esta view "alterável"
3. Na propriedade do bloco DML Data Target Name, colocamos o nome da tabela onde será feita a alteração. (no caso, a própria ITENS_PEDIDO)
4. Vamos definir agora qual será o campo chave da tabela. Clicamos no item IT_COD, e vamos para a propriedade Primary Key. Colocamos YES nela.
5. Agora vamos dizer ao Forms que o campo PROD_DSC não faz parte da tabela! Alteramos a propriedade Query Only para Yes!

E Pronto!!!
Agora o Forms sabe que o campo PROD_DSC não deve ser gravado quando a tabela for modificada. Ele sabe que este campo não pertence diretamente a ITENS_PEDIDO!

Desta forma é possível também que o usuário use a descrição pra filtrar coisas no forms. (com F7 e F8 ).
dr_gori
Localização: Porto Alegre - RS

Mensagemem Seg, 12 Mai 2008 1:49 pm

Isso aí funciona bem só que não consigo inserir dados na Tabela. Só consigo alterar dados que já existem.
Quando carrego numa nova linha para inserir um registo novo, não da...
alguém pode dar uma ajuda?


Obrigado, galera.
sandkiller
Localização: Poços de Caldas

Mensagemem Seg, 12 Mai 2008 3:15 pm

Confirmou se o INSERT ALLOWED do bloco ta yes?
Estranho...Já usei várias vezes isso e nunca me deparei com esse problema.
dr_gori
Localização: Porto Alegre - RS

Thomas F. G
https://www.patreon.com/glufke

Mensagemem Seg, 12 Mai 2008 5:01 pm

qualquer coisa tambem mande a mensagem que ele retorna quando você tenta inserir um registro
rodfbar
Localização: Batatais - SP

Mensagemem Ter, 13 Mai 2008 5:55 am

Insert Allowed está a Yes e consigo alterar os dados numa boa...

Mas não há mensagem de erro porque quando carrego num campo em branco, o cursor fica piscando mas quando escrevo algo desaparece logo e fica em branco outra vez...

:(
sandkiller
Localização: Poços de Caldas

Mensagemem Ter, 13 Mai 2008 6:08 am

E já descobri que se não fizer o query ao data block consigo adicionar dados mas depois de executar o query já não consigo.
sandkiller
Localização: Poços de Caldas

Mensagemem Qua, 20 Mai 2009 2:33 pm

Uma dúvida...

Criei o bloco com baseado em um view. Mais sempre que se tenta digitar alguma coisa nos campos deste bloco aparece a seguinte mensagem:

FRM-40602: não pode inserir ou atualizar dados na view.

Eu sei que não se pode inserir ou modificar estes campos, mais queria criar uma forma para que esta mensagem não aparecesse.

Alguém sabe como fazer?
rog3rk
Localização: Sapiranga RS

Mensagemem Qua, 20 Mai 2009 3:00 pm

Achei uma maneira de fazer o que eu queria. Criei uma trigger ON-ERROR no nível de bloco da view não coloquei nada como código (somente um NULL;). Não sei se é a forma mais correta de se fazer isto, mais funciona.. hehe
rog3rk
Localização: Sapiranga RS

Mensagemem Qua, 20 Mai 2009 3:02 pm

Bom, aconselho o uso de Views somente para casos de Consultas como o Thomas sugeriu, o motivo é que para trabalhar com Views é necessário um certo cuidado no desenvolvimento do Forms. Um deles é, se a view tem uma função de grupo, matou aí a possibilidade de qualquer alteração de dados.. o motivo é que não vai se saber qual registro está sendo alterado, deletado... Ontem mesmo tive um exemplo disso. Uma tela que era de Consulta e foi preciso inserir um campo que sofrerá alterações constantes... ao tentar aproveitar a tela, não foi possível e será necessário fazer uma nova tela quase que do zero.

Eu, particularmente, prefiro usar o POST_QUERY e sempre restringindo o fetch de 20 linhas.
RodrigoValentim
Localização: Salvador - BA

Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Mensagemem Qua, 20 Mai 2009 3:08 pm

Só uma correção... como respondo a muitos posts, me atrapalhei.

Esse post não foi o que Thomas sugeriu e sim o que eu aconselho fazer no uso de Views em FORMS.

Descupem aí! :)
RodrigoValentim
Localização: Salvador - BA

Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Mensagemem Sáb, 05 Jun 2010 10:55 am

Desculpa subir o topico, mas tenho duvidas em relacao a view.

- Eu gostaria de saber se essa viu estabelece um lock na tabela onde está setada para ser alterada ?.

- No caso de Insert, tem algum jeito de popula o item prod_dsc automaticamente aproveitando a view ou tenho que fazer um select em When validate Item ?

- Existe algum sentindo criar uma view que usa uma só tabela ?

- Sempre e sempre é melhor usar forms referenciados em views ?

Obrigada !!!!
paulaholti
Localização: sp

iniciante oracle pl/sql forms reports

Mensagemem Sáb, 05 Jun 2010 11:02 am

Eu gostaria de saber se essa viu estabelece um lock na tabela onde está setada para ser alterada ?

SIM, pois na realidade a view só é usada pelo forms pra buscar os dados. Depois que já populou o bloco, ele usa a propriedade "DML Data Target Name" e aplica tudo normalmente (locks, etc) nessa tabela.

No caso de Insert, tem algum jeito de popula o item prod_dsc automaticamente aproveitando a view ou tenho que fazer um select em When validate Item ?

Bem, o objetivo disso tudo é trazer informações de outras tabelas sem ter que ficar fazendo POST_QUERY e buscando linha por linha... Pra inserir descrições, se for na mesma tabela, não tem problema. Com isso você não vai conseguir inserir DSC em outra tabela. (nem faz sentido), dai você usa outro cadastro dessa outra tabela.

Existe algum sentindo criar uma view que usa uma só tabela ?
Existe sim, se seu objetivo é restringir informações de tabelas. Exemplo: você tem uma tabela com os funcionários e um dos campos é o salário. Dai você NÃO QUER liberar esse campo pra qualquer um ver. Dai você cria uma view sem o salário, e dá GRANT pra quem quiser dessa view.

Sempre e sempre é melhor usar forms referenciados em views ?
Na minha opinião, SIM... Primeiro porque evita post-query. Segundo porque você pode FILTRAR pelo campo descrição. (se for o método de post-query, não tem como, pois o campo não é consultável). Terceiro porque é mais fácil de programar! É só definir ali os campos e não precisa fazer código nenhum. Se tem essa feature no forms, porque não usar?

:-o
dr_gori
Localização: Porto Alegre - RS

Thomas F. G
https://www.patreon.com/glufke

Mensagemem Sáb, 05 Jun 2010 11:18 am

Bem esclarecido, Obrigada dr. Gori.

Sabe, eu não conheço Oracle Application, mas fique sabendo que qualquer forms dele é feito com views e todo controle das triggers (lock,delete,insert, update) também é feito "manualmente". O que mais achei "complicado" é que parece que nenhuma tabela possui constraints (fk) .

Deve ser bem trabalhoso mexer com Application.

Obrigada !!!

* vou usar view sempre que puder.
paulaholti
Localização: sp

iniciante oracle pl/sql forms reports

Mensagemem Sáb, 05 Jun 2010 1:55 pm

SIM, o oracle applications não pode ter constraints porque ele é todo configurável pelo usuário. (conceito de flex-field).
dr_gori
Localização: Porto Alegre - RS

Thomas F. G
https://www.patreon.com/glufke

Mensagemem Sáb, 05 Jun 2010 2:20 pm

Corrigindo:

fique sabendo = FIQUEI sabendo (rss)..

Obrigada mais uma vez pelas explicações.

Obrigada!!!
paulaholti
Localização: sp

iniciante oracle pl/sql forms reports

Mensagemem Ter, 08 Jun 2010 9:01 am

Espero que some ao conteúdo do tópico.

Quando há necessidade de sua view inserir, excluir ou alterar linhas de MAIS DE UMA TABELA.. no caso uma view com 2 ou mais tabelas relacionadas, temos a possibilidade de criar triggers pra view com os famosos(ou não tão famosos) "instead of"

exemplo de cabeçalho da trigger na view para insert em mais de uma tabela:

Código: Selecionar todos
create or replace
trigger TG_VWFRTE00_INSERT
instead of insert on VWFRTE00


Dentro desta trigger você faz todo o tratamento para inserção em amis de uma tabela..pois ela substitui o comportamento de "insert" da view

espero ter ajudado.
NightSpy
Localização: SP

Mensagemem Ter, 03 Mai 2011 2:21 pm

galera, voltando o tópico aqui, estou com uma dúvida

fiz um forms baseado em view, e está funcionando tudo certinho, insert, update, delete e tal..

mas na documentação aqui do projeto eles dizem pra também trazer o ROW_ID que seria o identificador da tabela base da view, até fiz minha view trazendo o ROW_ID, mas retirei esse campo do forms, por não saber o que fazer com ele, mas mesmo assim está funcionando, alguém sabe se realmente há a necessidade do ROW_ID e como eu devo tratá-lo no Forms, o que tenho que fazer com ele?

Código: Selecionar todos
CREATE OR REPLACE VIEW XXAR_EVENTO_ANALITICA_V AS
SELECT xea.rowid xea_rowid
      , xea.evento_analitica_id
      , xea.evento...
Porva
Localização: São Paulo/SP

Rafael S. Nunes
São Paulo/SP


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem