<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>glufke.net &#187; conexão</title>
	<atom:link href="http://glufke.net/tag/conexao/feed/" rel="self" type="application/rss+xml" />
	<link>http://glufke.net</link>
	<description></description>
	<lastBuildDate>Mon, 16 Apr 2012 19:33:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fazer o Forms abrir um novo Form ao perder conexão, é possível?</title>
		<link>http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/</link>
		<comments>http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 13:02:32 +0000</pubDate>
		<dc:creator>Rodrigo Valentim</dc:creator>
				<category><![CDATA[Oracle Forms]]></category>
		<category><![CDATA[conexão]]></category>

		<guid isPermaLink="false">http://glufke.net/?p=98</guid>
		<description><![CDATA[
			
			
			
			
			
			
			
						
			Sim, é possível! Porém, não serve para todas as aplicações&#8230; Essa rotina seria mais usada em alguns form que fazem integração entre os sistemas, etc&#8230;
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 [...]]]></description>
			<content:encoded><![CDATA[<div class="bottomcontainerBox" style="">
			<div style="float:left; width:50px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fglufke.net%2F2009%2F07%2F30%2Ffazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel%2F&amp;layout=button_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:50px; height:21px;"></iframe></div>
			<div style="float:left; width:60px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/"></g:plusone>
			</div>
			<div style="float:left; width:70px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/"  data-text="Fazer o Forms abrir um novo Form ao perder conexão, é possível?" data-count="horizontal" data-via="glufke"></a>
			</div><div style="float:left; width:110px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/" data-counter="right"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div><p>Sim, é possível! Porém, não serve para todas as aplicações&#8230; Essa rotina seria mais usada em alguns form que fazem integração entre os sistemas, etc&#8230;<br />
Digamos que você tenha um software responsável pelo controle de créditos telefônicos em um banco separado da sua aplicação principal.</p>
<p>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.</p>
<p>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.</p>
<p>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&#8230;</p>
<p>Vamos lá!<br />
<span id="more-98"></span></p>
<div id="ads_336x280"><script type="text/javascript"><!--
google_ad_client = "pub-8964513116661040";
google_alternate_color = "ffffFF";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-09-07: wp_quadrado_gra
google_ad_channel = "0247072216";
google_color_border = "FFFFFF";
google_color_bg = "FFFFff";
google_color_link = "4F82CB";
google_color_text = "000000";
google_color_url = "4F82CB";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>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).<br />
Preciso então criar uma trigger WHEN-NEW-FORM-INSTANCE e então atribuir esses valores ao seu bloco de login.<br />
ex:</p>
<pre class="brush: sql;">
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;
</pre>
<p>Próximo passo é implementar a trigger ON-LOGON.</p>
<pre class="brush: sql;">
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;
</pre>
<p>No próximo passo vamos implementar a trigger que irá nos ajudar a identificar os tipos de erro, é a ON-ERROR.<br />
Todo erro existente no forms, passa por ela para que seja possível um tratamento&#8230; se não tem nada ali, o erro aparece normalmente&#8230;</p>
<pre class="brush: sql;">
--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;
</pre>
<p>Agora que tudo foi criado e tratado, resta apenas a rotina final e mais importante&#8230; que é fazer a rotina para quando o timer disparar, fazer a abertura do novo form por linha de comando&#8230;</p>
<p>então, na trigger WHEN-TIMER-EXPIRED, vamos ter o seguinte código.</p>
<pre class="brush: sql;">
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;
</pre>
<p>Pronto, Dessa forma, não preciso me preocupar tanto com a rotina do robô responsável pela integração&#8230; se a conexão parar, ele mesmo identifica isso, abre novo form e tudo resolvido! <img src='http://glufke.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>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.</p>
<p><em>Rodrigo Valentim é Analista de Sistemas Oracle Developer</em><br />
<a href="http://www.rodrigovalentim.com/blog">http://www.rodrigovalentim.com/blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2009/07/30/fazer-o-forms-abrir-um-novo-form-ao-perder-conexao-e-possivel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

