Se você já precisou desenvolver uma tela customizada no Forms onde o bloco precisava mostrar informações de colunas que não eram de base, ou seja, colunas de uma tabela que não era a principal do bloco, vai adorar essa dica.
Nas tabelas geralmente temos informações de outras tabelas, mas não a informação completa, apenas uma chave para que possamos relacionar com a tabela original.
Essa chave pode ser um ID ou código de outra tabela.
Por exemplo, na tabela de pedidos do OM temos o ID do cliente, mas não faz sentido mostrar esse ID na tela, então precisamos ir até a tabela de clientes, buscar o nome dele e mostrar na tela, junto com as outras informações do pedido.
As maneiras mais comuns de fazer isso são utilizando a trigger POST-QUERY do bloco ou views.
Mas essas opções tem algumas desvantagens, como não ter a possibilidade de efetuar pesquisas por esses campos (no caso do POST-QUERY) ou não ser possível efetuar alterações (no caso da view).
Mas a boa notícia é que existe uma outra opção, bem mais simples e funcional. Estou utilizando há bastante tempo nos meus forms e até o momento tem atendido perfeitamente.
Inclusive quem me deu a dica foi o meu amigo Genilto Vanzin, que sabe tudo de Forms.
Se interessou? Então me acompanhe até o final aqui nesse artigo pois vou mostrar:
- Problemas das soluções existentes
- Uma nova opção: Como configurar um bloco totalmente funcional
Vamos lá?
Problemas das soluções existentes
Como mencionei anteriormente, as opções mais utilizadas (pelo menos é o que eu vejo por aí) tem alguns probleminhas.
Vamos a eles:
Trigger POST-QUERY
Talvez essa seja a mais utilizada.
A configuração é simples, é criada uma trigger POST-QUERY no bloco e nessa trigger é feita uma query para buscar as informações das outras tabelas.
Para cada registro que está sendo retornado no form, essa query é executada e os campos são preenchidos.
O problema…
Como esses campos serão populados pela query, eles não são de base, então não é possível efetuar pesquisar por eles. Serão apenas campos de DISPLAY.
Para contornar, é necessário implementar outras triggers, como a PRE-QUERY.
View
Para resolver o problema acima do POST-QUERY, podemos criar uma view que relacione todas as informações desejadas, assim o bloco terá como base essa view e todos os campos poderão ser utilizados para pesquisas.
O problema…
Apenas utilizando a view da maneira tradicional, o bloco não poderá sofrer alterações, ou seja, será apenas um bloco de consulta.
Para contornar, é necessário implementar triggers como: ON-INSERT, ON-UPDATE, ON-DELETE, ON-LOCK, etc.
Uma nova opção: Como configurar um bloco totalmente funcional
Agora quero mostrar a você a nova opção, ela também usa uma view como base mas não é necessário implementar triggers e o bloco fica totalmente funcional, permitindo consultas e alterações (na tabela base da view).
Vamos ao passo a passo:
#1. Configure a view normalmente no bloco:
#2. Agora que vem o segredo, nós vamos utilizar a propriedade do bloco chamada DML Data Target Name, na área Advanced Database:
Nessa propriedade nós informamos qual a tabela base da view, ou seja, qual a tabela principal que vai receber as alterações.
#3. Pelo menos um campo do bloco deve estar configurado como chave primária:
#4. Os campos que não fazem parte da tabela principal, ou seja, os campos que são apenas para visualização, devem estar como QUERY ONLY = “Yes”:
E é isso, simples não?
Agora com esse bloco é possível realizar pesquisa por todos os campos e efetuar alterações nos campos da tabela base.
Conclusão
O Forms é uma ferramenta incrível, possui uma infinidade de recursos.
É muito difícil conhecer 100% da ferramenta.
Trabalho com ele há mais de 18 anos e vez outra ou outra acabo descobrindo uma coisa nova.
Estou utilizando essa solução há bastante tempo e não tenho do que reclamar, muito fácil de implementar e de dar manutenção.
Sem contar que o cliente adora, já que tem um bloco totalmente funcional.
O que achou desse artigo? Gostou? Tem outras sugestões para esse tipo de necessidade? Deixe nos comentários.
E se achou útil esse guia, não esqueça de compartilhar com a sua rede de contatos.