[Dica] Bloco baseado em VIEW

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:

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 ?

Selecionar tudo

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:

Selecionar tudo

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.

Selecionar tudo

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 ).
sandkiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 12 Mai 2008 1:44 pm
Localização: Poços de Caldas

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.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Confirmou se o INSERT ALLOWED do bloco ta yes?
Estranho...Já usei várias vezes isso e nunca me deparei com esse problema.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

qualquer coisa tambem mande a mensagem que ele retorna quando você tenta inserir um registro
sandkiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 12 Mai 2008 1:44 pm
Localização: Poços de Caldas

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
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 12 Mai 2008 1:44 pm
Localização: Poços de Caldas

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.
Avatar do usuário
rog3rk
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Sex, 18 Jul 2008 8:06 am
Localização: Sapiranga RS

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?
Avatar do usuário
rog3rk
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Sex, 18 Jul 2008 8:06 am
Localização: Sapiranga RS

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
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

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

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
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

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

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í! :)
paulaholti
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Sex, 29 Jan 2010 4:02 pm
Localização: sp
iniciante oracle pl/sql forms reports

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 !!!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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
paulaholti
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Sex, 29 Jan 2010 4:02 pm
Localização: sp
iniciante oracle pl/sql forms reports

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.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

SIM, o oracle applications não pode ter constraints porque ele é todo configurável pelo usuário. (conceito de flex-field).
paulaholti
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Sex, 29 Jan 2010 4:02 pm
Localização: sp
iniciante oracle pl/sql forms reports

Corrigindo:

fique sabendo = FIQUEI sabendo (rss)..

Obrigada mais uma vez pelas explicações.

Obrigada!!!
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

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:

Selecionar tudo

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.
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

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?

Selecionar tudo

CREATE OR REPLACE VIEW XXAR_EVENTO_ANALITICA_V AS
SELECT xea.rowid xea_rowid
      , xea.evento_analitica_id
      , xea.evento...
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes