<?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; Oracle Forms</title>
	<atom:link href="http://glufke.net/category/forms/feed/" rel="self" type="application/rss+xml" />
	<link>http://glufke.net</link>
	<description></description>
	<lastBuildDate>Wed, 30 Nov 2011 17:41:41 +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[<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>
		<item>
		<title>Bloco do Forms baseado numa VIEW</title>
		<link>http://glufke.net/2007/09/13/bloco-do-forms-baseado-numa-view/</link>
		<comments>http://glufke.net/2007/09/13/bloco-do-forms-baseado-numa-view/#comments</comments>
		<pubDate>Thu, 13 Sep 2007 14:30:26 +0000</pubDate>
		<dc:creator>glufke</dc:creator>
				<category><![CDATA[Oracle Forms]]></category>
		<category><![CDATA[Bloco]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://glufke.net/2007/09/13/bloco-do-forms-baseado-numa-view/</guid>
		<description><![CDATA[Uma coisa muito útil no Forms é poder basear os blocos em Views. Vamos a um breve exemplo: Digamos que uma tabela contenha os itens de um pedido. Obviamente, apenas o código do produto estará nesta tabela e não a descrição do produto. Como fazer para mostrar a descrição ?
Estrutura das tabelas:
ITENS_PEDIDO
  IT_COD  [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa muito útil no Forms é poder basear os blocos em Views. Vamos a um breve exemplo: Digamos que uma tabela contenha os itens de um pedido. Obviamente, apenas o código do produto estará nesta tabela e não a descrição do produto. Como fazer para mostrar a descrição ?<span id="more-15"></span></p>
<pre class="brush: sql;">Estrutura das tabelas:
ITENS_PEDIDO
  IT_COD    NUMBER(5),
  PROD_COD  NUMBER(5),
  QUANT     NUMBER(10,2)

PRODUTO
  PROD_COD  NUMBER(5),
  PROD_DSC  VARCHAR2(60)
</pre>
<p><strong>POUCO EFICIENTE</strong></p>
<p>Podemos usar a trigger POST_QUERY, que é disparada em cada linha do bloco. Dentro desta trigger, coloca-se uma consulta assim:</p>
<pre class="brush: sql;">
select prod_dsc
into :BLOCO_ITENS_PED.PROD_DSC
from produto
where prod_cod=:BLOCO_ITENS_PED.PROD_COD;</pre>
<p>Este select rodará em cada linha do bloco, buscando a descrição do Produto. Temos que deixar a propriedade do item Database Item No.<br />
Isto é <strong>pouquíssimo eficiente</strong>! Imaginem se o bloco for buscar 500 linhas? O cliente vai fazer 500 consultas de descrição!!! Resultado: Queda de performance do banco, trafego inútil na rede, etc.</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><strong>MUITO EFICIENTE</strong></p>
<p>Vamos basear nosso bloco numa View! Como fazemos isso?</p>
<p>1. Criamos uma VIEW_ITENS_PEDIDO com a descrição do Produto.</p>
<pre class="brush: sql;">
create or replace view VIEW_ITENS_PEDIDO as
select
  a.*,
  b.prod_dsc
from
  itens_pedido A,
  produto      B
where a.prod_cod=b.prod_cod</pre>
<p>2. Criamos o bloco com base nesta view. Agora vamos tornar esta view &#8220;alterável&#8221;<br />
3. Na propriedade do bloco DML Data Target Name, colocamos o nome da tabela onde será feita a alteração. (no caso, a própria ITENS_PEDIDO)<br />
4. Vamos definir agora qual será o campo chave da tabela. Clicamos no item IT_COD, e vamos para a propriedade Primary Key. Colocamos YES nela.<br />
5. Agora vamos dizer ao Forms que o campo PROD_DSC não faz parte da tabela! Alteramos a propriedade Query Only para Yes!<br />
E Pronto!!!<br />
Agora o Forms sabe que o campo PROD_DSC não deve ser gravado quando a tabela for modificada. Ele sabe que este campo não pertence diretamente a ITENS_PEDIDO! </p>
<p>Comente <a href="http://glufke.net/oracle/viewtopic.php?t=5">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://glufke.net/2007/09/13/bloco-do-forms-baseado-numa-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

