Fazer o Forms abrir um novo Form ao perder conexão, é possível?
30/07/2009
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
Tags: conexão, Oracle Forms
