terça-feira, 12 de abril de 2022

Como ativar e consultar o log de atividades no APEX

 Prezados,

hoje vamos falar sobre como ativar e consultar o log de atividades no APEX.

Como tudo no APEX, é muito fácil!

Você pode ativar o log de atividades do usuário no nível da sua instância do APEX ou da sua aplicação.

Para ativar o log no nível da instância, acesse com seu login e senha de administrador de instância o ambiente de administração usando a URL: https://seudomíniodoapex/ords/apex_admin ou digitando INTERNAL como o workspace na tela de login do ambiente de desenvolvimento do APEX.




Após isso, acesse: Gerenciar Instância >  Configuração de Recursos e na seção Monitoramento, defina a propriedade "Log de Atividades do Aplicativo" com o valor desejado.


Por padrão, o APEX deixa que cada aplicativo defina se vai gerar o log de atividades, mas caso queira que todas as aplicações gerem log (o desenvolvedor não consegue desativar a nível de aplicação), você pode definir a propriedade como "Sempre".

Outras opções são definir como "Nunca" gerar log ou para que ao criar uma aplicação, inicialmente a aplicação não gere log a não ser que o desenvolvedor ative o log ("Inicialmente Desativado para Novos Aplicativos").

Portanto, ao definir a propriedade como "Sempre" ou deixar como padrão ("Usar Definições do Aplicativo"), a sua aplicação poderá gerar log de atividades.


Caso no nível de instância seja definido como "Padrão", o desenvolvedor pode ativar a geração de log de atividades no nível da aplicação.

Obs: O APEX antes chamava de "aplicação", mas as novas versões estão chamando de "aplicativo".

Para definir no nível da aplicação, o desenvolvedor deve logar no espaço de trabalho, acessar a aplicação no AppBuilder, nos Componentes Compartilhados, acessar "Atributos de Definição do Aplicativo" na seção Propriedades, você pode ativar a opção "Log" (conforme imagem abaixo). 


Isso faz com que os logs de atividades sejam gerados pelo APEX.

E como posso acessar essa informação?

O log é salvo internamente e fica acessível por meio da view APEX_WORKSPACE_ACTIVITY_LOG quando consultada no esquema APEX correspondente. 

Vamos fazer uma consulta no SQL Workshop de exemplo.

select * from apex_workspace_activity_log



O log do APEX registra as visualizações e submissões de página, além de chamadas ajax (normalmente ações dinâmicas) e contém diversas informações interessantes, tais como: workspace,  usuário logado, id e nome da aplicação, id e nome da página, data de visualização, tempo de execução, IP, Agent (Browser), Sessão APEX, mensagens de erro etc.

Caso tenha dúvidas do que alguma coluna significa, você pode consultar o comentário de cada coluna usando o dicionário do APEX usando a seguinte consulta:

select * from apex_dictionary 
where apex_view_name = 'APEX_WORKSPACE_ACTIVITY_LOG'


E quais são os pontos negativos desse log de atividades?

Na minha opinião os principais pontos negativos são:
1) O log é armazenado apenas por duas semanas.
2) Não armazena informações do estado da sessão. Por exemplo, a gente sabe que um usuário acessou uma página de uma aplicação em determinado dia/hora, mas não sabemos que informações estavam nos itens da página.
3) Aplicações com muitos acessos vão gerar logs gigantescos que ocupam muito espaço.

Como minimizar estes pontos negativos?
1) Criar alguma job para armazenar em tabela o log.
2) Criar algum mecanismo para salvar o valor dos itens das páginas críticas em relação a segurança em alguma tabela (Muito cuidado ao fazer isso, pois poderá estar expondo dados sigilosos)
3) Desligar o log em aplicações com muitos acessos caso não seja necessário.

Antes de finalizar, vale lembrar que esse log NÃO salva informações de alterações em tabelas. O melhor mecanismo para isso no Oracle provavelmente será o FDA (Flashback Data Archive).

Se seu interesse é em log de alterações de tabelas, seguem alguns links interessantes sobre FDA:
Vídeo do Tércio no canal do GUOB (Português): https://youtu.be/TdJTNc28jxk?t=3016
Vídeo do Connor McDonald (inglês):   https://youtu.be/FpRAc-FEWbE

Espero que tenha gostado.
Até a próxima!

quarta-feira, 23 de março de 2022

Minhas impressões sobre o Oracle APEX no Brasil

 Olá pessoal,

como vocês devem saber, o GUOB lançou uma pesquisa sobre o Oracle APEX no Brasil.

Caso não tenha participado da pesquisa, pode responder no seguinte link (ficará indisponível em breve): https://docs.google.com/forms/u/2/d/1CrKA9QgQp5MUTtGvk910aKsy0vf-wlcCF25Mux9ZOu4

A grande vantagem de participar é que ao final você terá acesso ao resultado completo com as respostas consolidadas de todos os participantes.

De qualquer forma, abaixo faço um compilado das minhas principais impressões sobre o resultado da pesquisa GUOB APEX:

1) Há uma concentração de uso nas regiões Sul, Sudeste e Centro-oeste (Regiões mais ricas?).

2) É muito utilizado na iniciativa privada, mas também em instituições públicas.

3) Para todos os tipos de projeto.

4) A maioria dos sistemas se inicia em APEX (não de migrações).

5) Principal fator de uso é a produtividade low code e o aproveitamento de conhecimento existente (PLSQL, banco Oracle etc)

6) Achei bem interessante o fato de pessoas dizerem que tem poucas vagas de APEX e outros dizerem que está difícil contratar, pois é difícil encontrar profissionais APEX. (Falta alguma ponte esse essas pessoas?)

7) Praticamente metade trabalha 100% home office.

8) Mais da metade das pessoas começou no APEX há menos de 5 anos.

9) Há um empate técnico entre Oracle On Premise e Oracle Cloud na hospedagem.

10) Maioria ainda está usando a versão 20.

11) A certificação mais obtida é a de SQL.

12) O YouTube parece ser o canal mais utilizado para aprender.

13) As pessoas usam muito o "APEX puro" (sem uso de ferramentas acessórias de versionamento do APEX ou versionamento do BD, logging, modelagem, automação de testes, build etc).

14) Apesar dos problemas, o Jasper Reports é a ferramenta mais utilizada para impressão.

15) O lugar mais utilizado para dúvidas é a Oracle Communities.

16) Comunidades mais usadas: Oracle APEX Brasil no Linkedin, GUOB, e apex.world.


Se tiver interesse, participei de uma live do GUOB com especialistas em Oracle APEX para debater os resultados da pesquisa. Segue o link: https://www.youtube.com/watch?v=XD47oi4fUmQ


Deixe seu comentário se interpretou algo de diferente. 

Não deixe de responder a pesquisa. Você vai ter acesso a resultados bem legais.

Espero que tenha gostado.

Até a próxima!

quarta-feira, 31 de março de 2021

Como disparar ação dinâmica quando fecho o modal no X

 Olá pessoal,

espero que todos estejam bem.

Hoje vamos falar sobre uma dúvida recorrente que é como disparar uma ação dinâmica quando fechamos a caixa de diálogo modal no X.

Antes de dar a solução, primeiro vamos explicar alguns conceitos.

Há duas opções de ações que podem ocorrem quando uma caixa de diálogo é fechada: Close Dialog (Fechar Caixa de Diálogo) e Cancel Dialog (Cancelar Caixa de Diálogo).


O Close Dialog é um evento que deve ser acionado quando você fez alguma ação na página modal e agora quer fechá-la. Este evento é disparado normalmente quando você pressiona um botão, por exemplo o botão "Criar", "Excluir", "Aplicar alterações" etc.

O Cancel Dialog é um evento que deve ser acionado quando você simplesmente quer fechar sem ter feito ação alguma no modal. Normalmente ocorre quando o modal é fechado no "X" ou no botão de "Cancelar".

Um problema comum é que muitos usuários querem disparar ação dinâmica quando o evento Cancel Dialog é disparado, normalmente quando o usuário fecha a caixa de diálogo modal no "X". Como os dois eventos (Close Dialog e Cancel Dialog) internamente são acionados pelo evento javascript personalizado "dialogclose" do APEX, a solução é bem simples: você deve criar na página que abre o modal uma ação dinâmica que seja acionada pelo Evento Personalizado: "dialogclose" para o Seletor JQuery: body.


Espero que tenha gostado!

Até a próxima.

[Atualização: O APEX 21 possui esse recurso agora de maneira nativa]


sábado, 7 de novembro de 2020

Itens do aplicativo - diferença entre escopo global vs aplicativo

 Olá pessoal,


sabia que o valor de um item do aplicativo pode ser compartilhado entre aplicações do mesmo espaço de trabalho?

Para demonstrar isso, iremos criar duas aplicações em que cada uma delas conterá 2 itens: um com escopo global e outro de aplicativo.

Veremos que o item com escopo de aplicativo só é válido em uma sessão de um único aplicativo e o item com escopo global pode ser compartilhado com outra aplicação desde que compartilhe a mesma sessão.

Detalhe: o compartilhamento de sessão só é permitido entre aplicações do mesmo espaço de trabalho!

Iremos criar um processo para incrementar o valor dos itens e apresentar os valores na tela para ver a diferença.

(Caso queira apenas ver o resultado final, acesse os Passos 8, 12, 13, 14)

Para isso vamos fazer o seguinte:

Criação da aplicação 1

Passo 1 - Acesse "App Builder" > "Criar" > "Novo Aplicativo", defina o Nome para "Aplicação 1" e pressione "Criar Aplicativo".




Após isso, vamos criar um item de aplicativo com escopo global

Passo 2 - Acesse "Componentes compartilhados" > "Itens do Aplicativo" >  "Criar", defina o Nome como "G_GLOBAL", o Escopo para "Global" e pressione "Criar Item do Aplicativo".

Após isso, vamos criar um item de aplicativo com escopo de aplicativo

Passo 3 - Acesse "Componentes compartilhados" > "Itens do Aplicativo" >  "Criar", defina o Nome como "G_APLICATIVO", o Escopo para "Aplicativo" e pressione "Criar Item do Aplicativo".

Para poder compartilhar um item global é necessário habilitar o compartilhamento de sessão.

Passo 4 - Acesse "Componentes compartilhados" > "Esquemas de Autenticação" > Selecione o esquema de autenticação atual > Em Compartilhamento de Sessão escolha o Tipo: "Compartilhamento de Espaço de Trabalho" e clique em "Aplicar Alterações".

Agora vamos criar uma região para exibir o valor dos itens.

Passo 5 - Acesse a página 1 no Designer de Página, clique com o botão direito do mouse em Content Body, escolha "Criar Região", defina como Texto de Origem da região com o código abaixo. (IMPORTANTE: Substitua XYZ pelo id da aplicação que será criada nos próximos passos.


<a href="f?p=XYZ::&APP_SESSION.">Acessar outra aplicação na mesma sessão</a>

<p><p>Global: &G_GLOBAL.

<p>Aplicativo:&G_APLICATIVO.



Agora vamos criar um botão para manipular o valor dos itens.

Passo 6 - Crie um botão na nova região e coloque como Nome do Botão: "INCREMENTAR".

Vamos agora definir o processo que será executado ao clicar no botão.

Passo 7 - Na aba Processamento, crie um Processo chamado "Incrementa itens" e defina para executar o código abaixo:

:G_GLOBAL := NVL(:G_GLOBAL,0) + 1;

:G_APLICATIVO := NVL(:G_APLICATIVO,0) + 1;


Passo 8 Execute a aplicação e clique 5 vezes no botão para incrementar os dois itens para o valor 5.


Agora vamos duplicar a aplicação

Passo 9 - Acesse a página de edição do aplicativo e no canto direito clique em "Copiar este Aplicativo", siga o wizard definindo o novo nome do aplicativo para "Aplicação 2" e o id do aplicativo para o mesmo id definido como XYZ no Passo 5.


Vamos trocar as referências ao termo "Aplicação 1" para "Aplicação 2".

Passo 10 - Na Aplicação 2, clique no ícone de pesquisa no canto superior direito e pesquise pelo termo "Aplicação 1". No relatório que aparece vá clicando no botão "Exibir" e troque todas as referências ao termo "Aplicação 1" por "Aplicação 2".



Agora na Aplicação 2 vamos trocar o link que se encontra na página 1 para que aponte para a Aplicação 1.

Passo 11 - Acesse a página 1 no Designer de Página, na região nova, altere o link para ABC, onde ABC representa o id da Aplicação 1.



Vamos testar?


Passo 12 - Volte para a Aplicação 1 e clique no link para ir para a Aplicação 2 e repare que o item global já está com o valor 5, ou seja, o item foi compartilhado entre as aplicações na mesma sessão. Entretanto, o item de aplicativo não foi inicializado ainda.


Passo 13 - Clique em Incrementar 10 vezes até o item Global ter o valor 15 e o item de aplicativo o valor 10.


Passo 14 - Clique no link para voltar para a Aplicação 1 e veja que o valor do item global também estará 15 e o valor do item com escopo de aplicativo permaneceu com o valor 5.



Espero que tenha gostado.

Até a próxima!


sexta-feira, 25 de setembro de 2020

Explorando o código das páginas do APEX

 Olá,


já precisou saber como o APEX implementa determinada funcionalidade?

Recentemente precisei saber como o App Builder do APEX fazia a exportação e importação de uma aplicação, entretanto, como consultar o código do App Builder?

Como você deve saber, o App Builder é uma aplicação APEX. Basta reparar na URL o "f?p=4000".





Para entender como as aplicações do APEX (App Builder, SQL Workshop etc) funcionam por dentro faça o seguinte:

1) Baixe o arquivo de instalação da versão desejada do APEX em http://apex.oracle.com/download

2) Descompacte o arquivo baixado

3) Acesse a pasta apex > builder

Repare acima que os arquivos na pasta "apex > builder" são fXXXX.sql onde XXXX é o número da aplicação APEX. Essas aplicações são acessadas quando você utiliza o APEX.

4) Logue em algum espaço de trabalho, acesse o App Builder e clique no botão "Importar"

5) Selecione o arquivo desejado e clique em "Próximo >". 

(Na imagem abaixo foi selecionado o AppBuilder, que é a aplicação f4000.sql)

Obs: Esta tela de importação é do APEX 20.1. Em outras versões do APEX a tela pode ser ligeiramente diferente.

6) Clique novamente em "Próximo >"



7) Como sugestão é interessante alterar o ID do aplicativo para um número similar ao da aplicação APEX original. Para isso, selecione "Alterar ID da aplicação" e no campo "Novo Aplicativo" digite 100 antes do número do aplicativo original. No nosso exemplo 1004000, pois a aplicação original tinha o ID 4000.



8) Clique em "Instalar Aplicativo"


Pronto! Agora você pode acessar a aplicação recém-instalada e verificar o código de cada uma das páginas.

Um detalhe é que você provavelmente não conseguirá executar a aplicação, pois deverá faltar privilégios nos objetos de banco internos do APEX, mas isso não impedirá de explorar o código de cada uma das páginas!

Espero que tenha sido útil!

Até a próxima!

terça-feira, 21 de julho de 2020

Número máximo de requisições de serviços Web por espaço de trabalho

Olá pessoal,

A partir da versão 18, o APEX implantou funcionalidade de serviços Web que utiliza recursos do ORDS (Oracle REST Data Service).

Como segurança, uma das alterações que foram implementadas foi o controle no número máximo de requisições de serviços Web por espaço de trabalho.

Quando o número máximo de requisições é atingido, ocorre o erro:

ORA-20001: Você excedeu o número máximo de mensagens de solicitações de serviço Web por espaço de trabalho.

A mesma mensagem em inglês é:

ORA-20001: You have exceeded the maximum number of web service requests per workspace


Para verificar quantas requisições foram feitas nas últimas 24 horas, utilize  a seguinte consulta no Comandos SQL:

select count(*)
from APEX_WEBSERVICE_LOG 
where REQUEST_DATE > sysdate - 1

Caso seja necessário, aumente o número máximo de requisições de serviços Web permitidos em 24 horas para todos os espaços de trabalho nesta instância do APEX. Esta definição é feita em um único local e vale para todos os espaços de trabalho. Entretanto, é possível configurar um valor mais específico para um determinado espaço de trabalho.


Para fazer o aumento do número máximo de requisições permitidas para todos os espaços de trabalho no nível da instância, acesse o Internal > "Gerenciar Instância" > "Segurança" na seção "Isolamento de Espaço de Trabalho" defina para o valor desejado a propriedade "Número Máximo de Solicitações de Serviço Web"



No exemplo acima, definimos para 100000 o número máximo de requisições para cada espaço de trabalho.

Caso queira definir um valor diferenciado apenas para um determinado espaço de trabalho, acesse o Internal > "Gerenciar Espaços de Trabalho" > "Espaços de Trabalho Existentes", pesquise pelo espaço de trabalho desejado, clique no link da coluna "Nome do Espaço de Trabalho", na seção "Isolamento de Espaço de Trabalho" defina para o valor desejado a propriedade "Número Máximo de Solicitações de Serviço Web"



Na imagem acima, definimos para 500.000 o número máximo de requisições de Solicitações de Serviço Web para um espaço de trabalho específico, enquanto os outros continuam como o número máximo em 100.000.

Espero que tenha gostado.

Até a próxima!