Sim, é possível! Porém, não serve para todas as aplicações… Essa rotina seria mais usada em alguns form que fazem integração entre os sistemas, etc…
Digamos que você tenha um software responsável pelo controle de créditos telefônicos em um banco separado da sua aplicação principal.

o cliente paga um valor, esse valor é creditado e através de um usuário e senha você consegue usar ligar normalmente até acabar os créditos.

Com isso, no meu sistema principal, preciso ter a informação do quanto de crédito já foi utilizado ou algo parecido, então, a cada ligação, faço o débito da conta do cliente.

Como não tenho uma integração direta entre as aplicações, vou precisar de um Robô que faça a leitura de um lado e jogue no outro, porém, por algum motivo, esse robô perdeu a conexão e ninguém foi avisado, então, teremos que ficar nos preocupando vendo se o robô está sempre ativo, etc…

Vamos lá!

Preciso criar 3 parâmetros para receber os valores de usuário, senha, banco. Depois de criado e alimentado esses parâmetros (se é um robô, usuário e senha ficam fixados nesses parâmetros. caso desejem, podem passar esses valores por linha de comando como vou mostrar mais pra frente).
Preciso então criar uma trigger WHEN-NEW-FORM-INSTANCE e então atribuir esses valores ao seu bloco de login.
ex:

IF :parameter.usuario IS NOT NULL 
AND :parameter.senha IS NOT NULL 
AND :parameter.banco IS NOT NULL THEN
  :BlLogin.Usuario := UPPER(:parameter.usuario) ;
  :BlLogin.Senha := UPPER(:parameter.senha);
  :BlLogin.Banco := UPPER(:parameter.banco);
  EXECUTE_TRIGGER( 'On-Logon' ) /* Chamo a trigger ON-LOGON */
END IF;

Próximo passo é implementar a trigger ON-LOGON.

BEGIN
  Logon( :BlLogin.Usuario, :BlLogin.Senha || '@' || :BlLogin.Banco, False );
  -- Este procedimento está sendo chamado duas vezes a cada Logon
  IF vConectado IS NULL THEN
    IF Form_Failure Then
      vConectado := False;
    ELSE
      vConectado := True;
    END IF;
  END IF;
END;

No próximo passo vamos implementar a trigger que irá nos ajudar a identificar os tipos de erro, é a ON-ERROR.
Todo erro existente no forms, passa por ela para que seja possível um tratamento… se não tem nada ali, o erro aparece normalmente…

--Faixa de erros que se referem a perda de conexão, 
--caso alguém saiba mais alguns, pode me enviar que faço inclusão aqui
IF DBMS_ERROR_CODE IN (-03114,-03113,-00028,-01012,-01041) THEN 
  vTimer := Find_Timer( 'RELOG' );
  --Caso exista algum timer com nome de RELOG, 
  --deleto o time para recriar o mesmo
  If Not Id_Null( vTimer ) Then
    Delete_Timer( vTimer );
  END IF;
  --Criando timer que irá disparar rotina de reconectar
  vTimer := Create_Timer( 'RELOG', 1500, Repeat ); 
END IF;

Agora que tudo foi criado e tratado, resta apenas a rotina final e mais importante… que é fazer a rotina para quando o timer disparar, fazer a abertura do novo form por linha de comando…

então, na trigger WHEN-TIMER-EXPIRED, vamos ter o seguinte código.

if Get_Application_Property( Timer_Name ) = 'RELOG' Then
  If :parameter.usuario Is Not Null 
  and :parameter.senha Is Not Null 
  and :parameter.banco Is Not Null Then
    --Preencho a variável com o valor da chave ORACLE_HOME
    Tool_Env.Getvar('ORACLE_HOME', v); 
    --Pego o nome do modulo em execução
    vModulo := UPPER( GET_FORM_PROPERTY( GET_APPLICATION_PROPERTY( CURRENT_FORM_NAME), FILE_NAME  ));
    --Monto aqui a linha de comando que irá abrir o novo form
    v := v|| '\bin\ifrun60.exe ' || vModulo || ' usuario=' || :parameter.login || ' banco='|| :parameter.banco || ' senha=' || :parameter.senha; 
    --Faço a abertura do mesmo
    Win_API_Shell.WinExec( v , WIN_API.SW_SHOWMINIMIZED, false); 
    WIN_API_UTILITY.SLEEP(2000);/*Delay de 2 segundos*/
    --fecho o form que deu erro de conexão
    exit_form(no_validate); 
  End If;
End If;

Pronto, Dessa forma, não preciso me preocupar tanto com a rotina do robô responsável pela integração… se a conexão parar, ele mesmo identifica isso, abre novo form e tudo resolvido! 🙂

Essa solução ajuda para aqueles casos em que sua empresa trabalha em RAC, pois, se uma instância cair, automaticamente ele fecha a que deu erro e abre outra na instância que ficou ativa.

Rodrigo Valentim é Analista de Sistemas Oracle Developer
http://www.rodrigovalentim.com/blog

Comments are closed.