terça-feira, 3 de maio de 2022

APEX - APLICAÇÃO COM BARRA DE PESQUISA

Uma funcionalidade interessante que encontramos em algumas aplicações é a barra de pesquisa, que permite fazer pesquisas em toda a aplicação. Existem várias maneiras de implementá-la em apex. Nesse artigo, gostaria de compartilhar uma implementação simples dessa funcionalidade.


Uma aplicação de exemplo pode ser acessada em: APP COM BUSCA







São 3 passos principais:

  1. Criar as tabelas e a aplicação. 
  2. Criar uma view para a pesquisa.
  3. Criar itens e ações dinâmicas na página global.

CRIAR TABELAS E APLICAÇÃO


Para o nosso exemplo, criaremos 3 tabelas , TB_PROFESSORES, TB_TURMAS e TB_ALUNOS. 


TABELAS


Copie o código abaixo e navegue para Sql Workshop -> Sql Scripts -> Create. Dê um nome para   o script em  Script Name. Cole o código que foi copiado e clique em Run. Depois clique em Run Now. Permaneça nesta página, pois agora criaremos nossa aplicação.

Obs: Por favor, certifique-se de copiar o inteiro código para não ter problemas na execução do script.





APLICAÇÃO


Depois de verificar que o script foi executado com êxito, clique em Create App. Ele criará uma aplicação com base nos objetos que acabamos de criar. Dê uma nome para a aplicação e clique em Create Application.

Logue na aplicação com o seu usuário do Workspace.

Obs: Edite as páginas 2, 4 e 6. Em cada uma vá em Navigation e desabilite a função Warn on Unsaved Changes. Em Securit -> Page Acess Protection selecione Unrestricted .


CRIAR VIEW


Antes de criar a view que usaremos para a pesquisa, vamos inserir alguns dados em nossas tabelas. Copie o código abaixo em navegue para Sql Workshop -> Sql CommandsCole o código que foi copiado e clique em Run.




Agora criaremos a view que usaremos como fonte para fazer as pesquisas. Copie o código abaixo em navegue para Sql Workshop -> Sql CommandsCole o código que foi copiado e clique em Run.


Obs: As informações da coluna pagina devem corresponder às páginas dos relatórios da aplicação. No exemplo, o relatório de professores está na página 2, o de turmas, ná página 4 e o de alunos, na página 6.


PÁGINA GLOBAL


Criaremos uma região com 3 itens e ações dinâmicas na página global, ou página 0, da nossa aplicação. 

REGIÃO


Identification

  • Title: Buscar
  • Type: Static Content

Layout

  • Position: Before Navigation Bar

Appearance

  • Template: Interactive Report
  • Template Options:
    •         Remove Borders
    •         Heading Level: Default
    •         Item Spacing: None
    •         Item Size: Default
    •         Item Width: Strech Form Fields    
    •         Label Alignment Right
    •         Label Position: Inline - Default
    •         Top Margin: None
    •         Bottom Margin: None
    •         Left Margin: None
    •         Right: None

Advanced

  • Static ID: buscar
  • Custom Attributes:  style=" background-color: #f0f0f0;  width: 100%;"

























ITENS

Na regiao "buscar" que acabamos de criar vamos criar 3  itens: P0_ITEM_BUSCA, P0_PAGINA_BUSCA e P0_CONTEUDO_BUSCA. 


P0_ITEM_BUSCA

Será o item onde será digitada a pesquisa. Terá as seguintes características:


Identification

  • Name: P0_ITEM_BUSCA
  • Type: Text Field with autocomplete

Label

  • Pesquisar ...

Settings

  • Search: Contains & Ignore Case

Appearance

  • Template Optional - Floating
  • Template Options
    • Stretch Form Item
    • Size: Default
    • Item Pre Text: Default
    • Item Post Text Default
    • Top Margin: None
    • Bottom Margin: None
    • Left Margin: None
    • Right Margin: None
    • Item Group Display: Default

List of Values

  • Type: SQL Query
  • SQL Query:
    • SELECT NOME FROM VW_BUSCA

Advanced

  • Post Text:
    • <button type="button"  title="Pesquisar" aria-label="Pesquisar" id="btnBuscar" style="height: 100%;" class="t-Button t-Button--noLabel t-Button--icon t-Button--large"><span aria-hidden="true" class="t-Icon fa fa-search"></span></button>

Source

  • Type: Null
  • Used: Always, replacing any existing value in session state

Security

  • Session State Protection: Unrestricted
  • Store value encrypted in session state: off
  • Escape special characters: on

























P0_PAGINA_BUSCA 

Esse item receberá o número da página para a qual o usuário deverá ser redirecionado. Ele terá as seguintes características:

Identification

  • Name: P0_PAGINA_BUSCA
  • Type: Hidden

Settings

  • Value Protected: off

Source

  • Type: Null
  • Used: Only when current value in session state is null

Security

  • Session State Protection: Unrestricted
  • Store value encrypted in session state: off





















P0_CONTEUDO_BUSCA

A pesquisa feita no item P0_ITEM_BUSCA é perdida quando há redirecionamento para outra página, por isso vamos salvar o seu valor em P0_CONTEUDO_BUSCA. Ela terá as seguintes características:

Identification

  • Name: P0_CONTEUDO_BUSCA
  • Type: Hidden

Settings

  • Value Protected: off

Source

  • Type: Null
  • Used: Only when current value in session state is null

Security

  • Session State Protection: Unrestricted
  • Store value encrypted in session state: off





















AÇÕES DINÂMICAS


Ainda na página global, vamos criar 2 ações dinâmicas. A primeira será do tipo Click e fará o redirecionamento pra a página onde se encontra o conteúdo pesquisado:


AÇÃO CLICK


Identification

  • Name: Buscar

When

  • Event: Click
  • Select Type: jQuery Selector
  • jQuery Selector: #btnBuscar

Client-side-Condition

  • Type: Item is not null
  • Item: P0_ITEM_BUSCA 


Crie uma ação verdadeira com essa características:

Identification

  • Action: Execute Server-side Code

Settings

  • Language: PL/SQL
  • PL/SQL Code:

:P0_CONTEUDO_BUSCA := :P0_ITEM_BUSCA;

        BEGIN

 
   SELECT PAGINA
   INTO   :P0_PAGINA_BUSCA
   FROM   VW_BUSCA
   WHERE  NOME = :P0_ITEM_BUSCA;

EXCEPTION WHEN NO_DATA_FOUND THEN

    :P0_PAGINA_BUSCA := 0;

           END;

  • Items to Submit: P0_ITEM_BUSCA
  • Items to Return: P0_CONTEUDO_BUSCA,P0_PAGINA_BUSCA

Execution Options 

  • Fire on Initialization: off



Crie outra ação verdadeira com essa características:



Identification

  • Execute Javascript Code

Settings

  • Code
    • let pagina = apex.item("P0_PAGINA_BUSCA").getValue();
    • if (pagina != 0 && pagina != "") {  window.location.href = " f?p=&APP_ID.:"+pagina+":&APP_SESSION.::NO:: "; }



AÇÃO PAGELOAD


Essa ação filtrará os relatórios. Terá as seguintes características:

Identification  

  • Name: Filtrar Relatórios                                 

When

  • Event: Page Load                                      

Client-side-Condition

  • Type: Javascript expression
  • Javascript expression:
    • apex.item("P0_PAGINA_BUSCA").getValue() != "" && 
    • apex.item("P0_PAGINA_BUSCA").getValue() != 0 && 
    • apex.item("P0_CONTEUDO_BUSCA").getValue() != "" && 
    • apex.item("P0_CONTEUDO_BUSCA").getValue().toUpperCase() != document.title.toUpperCase() &&  
    • document.getElementsByClassName('.a-IRR-search-field') != "" 












    
                                                     

Crie uma ação verdadeira:


Identification

  •     Javascript Code

Settings

  • Code
    • let buscar = apex.item("P0_CONTEUDO_BUSCA").getValue();
    • $('.a-IRR-search-field').val(buscar);
    • $('.a-IRR-button--search').click();





Crie outra ação verdadeira:

Identification

  •    Execute Serve-side Code     

Settings

  • Language: PL/SQL
  • PL/SQL Code
    •         :P0_CONTEUDO_BUSCA := NULL;




Agora nossa barra de pesquisa está pronta. Poderemos ser redirecionados para a página desejada, inclusive filtrando a pesquisa dentro de um reltório interativo. Talvez pareça desnecessário em uma aplicação tão pequena. No entanto, essa é apenas uma aplicação de exemplo. As aplicações crescem e essa ferramenta poderá ser realmente útil.


















terça-feira, 19 de abril de 2022

ORACLE - CRIAR DIRETÓRIO NO BANCO DE DADOS


Quando criamos um diretório no oracle, estamos atribuindo um alias, apelido, a um diretório real criado no sistema operacional. Com esse alias, poderemos acessar o diretório do sistema operacional a partir de nossa aplicação.

São 3 passos simples:

  1. Criar diretório no sistem operacional.
  2. Criar diretório no oracle.
  3. Conceder os privilégios ao usuário que acessará o diretório.

DIRETÓRIO NO SISTEMA OPERACIONAL


Crie o diretório no sistema operacional onde os arquivos serão armazenados.

mkdir -p /home/oracle/apex/app_files

Obs: Certifique-se de que o diretório do sistema operacional tenha as permissões corretas de leitura e gravação para os processos do oracle.


DIRETÓRIO NO ORACLE


Como SYS ou SYSTEM logue no container desejado e crie o diretório no oracle que será o alias para nosso diretório no sistema operacional.

alter session set container = pdb1;

create directory app_files as '/home/oracle/apex/app_files';

Obs: No exemplo, o diretório no oracle, app_files, tem o mesmo nome do diretório no sistema operacional, mas isso não é obrigatório.


CONCEDER PRIVILÉGIOS


Conceda privilégios ao usuário que acessará o diretório.

grant read,write on directory app_files to app;

Agora, se logar no usuário APP e consultar a view all_directories notará que ele tem acesso ao diretório app_files.



Mais informações sobre directories no oracle:

CREATE DIRECTORY

domingo, 17 de abril de 2022

OBTER CERTIFICADOS A PARTIR DO NAVEGADOR WEB


Para fazer requisições seguras a partir do código PL/SQL é necessário obter o certificado da url que queremos acessar via código. A maneira mais fácil é obtê-lo é através do navegador. No exemplo, a url será https://www.google.com. Vejamos como baixar o certificado usando o chrome.


Clique no ícone do cadeado. Depois em "A conexão é segura". E em "o certificado é válido".



 

Clique em "Caminho de certificação", selecione o certificado e clique em "Exibir Certificado". Depois em "Detalhes" e "Copiar para arquivo".




Será aberta uma tela de boas-vindas. Clique em "Avançar" e selecione a opção "Base-64 encoded X.509 (.CER)" 



            
      
Clique em "Procurar". Dê um nome para o certificado e depois clique em "Concluir".








  






PL/SQL - COMO FAZER REQUISIÇÕES HTTPS

  

Um belo dia, estamos desenvolvendo nosso sistema e nos deparamos com a necessidade de fazer requisições https a partir do código PL/SQL. Daí pensamos: Sem problemas! Sendo bons profissionais, pesquisamos, como manda o figurino, na documentação oficial, mas, ao folhear dezenas de páginas, logo bate a sensação de que ela é demasiado densa para uma tarefa aparentemente tão simples. Sendo realistas com nossos prazos, buscamos aquele bloco de código amigo que deve estar nos esperando perdido em algum lugar da internet. Afinal, não é possível que ninguém nunca tenha feito uma requisição dentro de um bloco PLSQL! A felicidade que sentimos ao encontrá-lo rapidamente é substituída pela decepção de ver os erros explodindo na tela. Sendo assim, entendemos que é hora de tomar uma água e fazer o café porque a tarefa não será tão simples.

Nesse artigo vamos descrever os passos necessários para fazer nossas tão desejadas requisições. São 3 ações principas: 

  1. O usuário que fará a requisição precisa de grant de execução na package utl_http.
  2. É necessário configurar ACLs.
  3. Para requisições https, cada url alvo deverá ter seu certificado guardado no servidor de banco de dados em um wallet.

PACKAGE UTL_HTTP


Logue no banco de dados como SYS e conceda ao usuário que fará as requisições grant de execução na package utl_http.


grant execute on utl_http to APP;
Obs: Não esqueça de se certificar de que está no container ao qual o usuário pertence. Se não estiver, uma forma de conectar é:
alter session set container = pdb1;


CONFIGURAR ACL

A partir do Oracle 11g, o acesso a serviço de rede se dá por ACL, Listas de Controle de Acesso. Essas listas indicam quais usuários acessam quais recursos de rede. Para isso, utilizamos a package DBMS_NETWORK_ACL_ADMIN. Basicamente, vamos criar uma Lista de Controle de Acesso e atribuir o host, ou os hosts, a essa lista. Execute o comando abaixo como SYS ou SYSTEM.

    

Obs: Perceba que usamos o mesmo nome de arquivo, network_services.xml, tanto em dbms_network_acl_admin.create_acl como em dbms_network_acl_admin.assign_acl.

Se, posteriormente, você desejar criar ACL para outro usuário do banco, pode executar apenas o seguinte trecho:
Agora nosso código amigo já consegue fazer requisições http!



CRIAR WALLETS


Chegou a hora de fazer requisições https. Mas, para isso, vamos precisar de alguns passos adicionais:
  1. Obter o certificado da url que desejamos acessar.
  2. Criar um oracle wallet para armazenar o certificado.

Se não souber como obter o certificado, leia o artigo: OBTER CERTIFICADOS A PARTIR DO NAVEGADOR WEB

Agora que temos nosso certificado, vamos salvá-lo em algum diretório no nosso servidor. Nesse exemplo, em /home/oracle. 

Vamos criar um diretório onde adicionaremos nosso wallet. 

mkdir -p u01/app/oracle/admin/cdb/wallet

Usando o utilitário orapki, vamos criar o wallet propiamente dito.

orapki wallet create -wallet /u01/app/oracle/admin/cdb/wallet -pwd Adm1n@2022 -auto_login


Atenção!
Aqui usamos a senha Adm1n@2022. O erro "Unable to save wallet at u01/app/oracle/admin/cdb/wallet" pode ser disparado se a senha não satisfizer os requisitos necessários que são: mínimos de 8 caracteres com letras e números.

Vamos adicionar o certificado que baixamos e está em /home/oracle no wallet.

orapki wallet add -wallet /u01/app/oracle/admin/cdb/wallet -trusted_cert -cert "/home/oracle/google-certificado.cer" -pwd Adm1n@2022

Se quisermos adicionar mais certificados ao nosso wallet, basta repetir esse útimo passo.

Tudo pronto para fazer nossa requisição https! Mas, antes, um último detalhe. Precisamos acrescentar uma linha ao nosso código.

utl_http.set_wallet('file:/u01/app/oracle/admin/cdb/wallet', 'Adm1n@2022');


Por fim, nosso código pronto para a tão esperada requisição https:

  

Espero que tenha ajudado a superar esse desafio. Seguem alguns links que podem ajudar a entender mais sobre o assunto:

    

UTL_HTTP and SSL (HTTPS) using Oracle Wallets

Fine-Grained Access to Network Services in Oracle Database 11g Release 1

Oracle UTL_HTTP Package

Oracle ACL Tips


    

    



    












APEX - APLICAÇÃO COM BARRA DE PESQUISA

Uma funcionalidade interessante que encontramos em algumas aplicações é a barra de pesquisa, que permite fazer pesquisas em toda a apli...