<?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>Dia a dia Oracle &#187; inscricao estadual</title>
	<atom:link href="http://www.diaadiaoracle.com.br/tag/inscricao-estadual/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diaadiaoracle.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 08 Apr 2010 17:33:36 +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>Validando Digito Verificador Inscrição Estadual Bahia (BA)</title>
		<link>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 12:15:26 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle 10g]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[digito verificador IE]]></category>
		<category><![CDATA[inscricao estadual]]></category>
		<category><![CDATA[validar dig verificador]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=39</guid>
		<description><![CDATA[Fala PessoAll,
Bom, como toda e boa pessoa normal, de vez em quando bate a saudade das épocas de desenvolvimento, de quebrar cabeça para fazer alguns códigos &#8220;ninja&#8221; pra resolver alguns problemas do nosso Dia a Dia (Oracle, rsrs).
Otem me deparei com a demanda de um amigo, precisando fazer uma validação do dígito da Inscrição estadual [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Bom, como toda e boa pessoa normal, de vez em quando bate a saudade das épocas de desenvolvimento, de quebrar cabeça para fazer alguns códigos &#8220;ninja&#8221; pra resolver alguns problemas do nosso Dia a Dia (Oracle, rsrs).</p>
<p>Otem me deparei com a demanda de um amigo, precisando fazer uma validação do dígito da Inscrição estadual da Bahia, em PL/SQL. Vamos lá!</p>
<p>Primeiro passo: Pesquisar como se faz a validação do dígito verificador da inscrição estadual da BAHIA!! BAHIA!! Ninguém melhor que a Sefaz/BA pra me dizer isso. Então, fui no site da SEFAZ/BA e achei como fazer a validação, depois foi só cair no PL/SQL de cabeça e colocar pra funcionar. A página que diz como deve ser feita a validação é: <a href="http://www.sefaz.ba.gov.br/contribuinte/informacoes_fiscais/doc_fiscal/calculodv.htm" target="top">http://www.sefaz.ba.gov.br/contribuinte/informacoes_fiscais/doc_fiscal/calculodv.htm</a>.</p>
<p>Segue abaixo a function utilizada para fazer esta validação. Essa function retorna &#8216;S&#8217; caso esteja OK e &#8216;N&#8217; caso não seja validado o dígito verificador.</p>
<p><code><br />
create or replace function valida_dig_inscest_BA(pInscEstadual varchar2) return varchar2 is<br />
   v_IE varchar2(10);</p>
<p>   idig1 number;<br />
   idig2 number;</p>
<p>   iRes1 number;<br />
   iRes2 number;</p>
<p>   cBase1 number;<br />
   cBase2 number;<br />
begin<br />
   v_IE := rtrim(replace(replace(replace(pInscEstadual, '.', ''), '-', ''), '/', ''));</p>
<p>   if length(v_IE) <> 8 then<br />
      return('N');<br />
   end if;</p>
<p>   iRes1  := 0;<br />
   iRes2  := 0;</p>
<p>   cBase1 := substr(v_IE, 1, 6);<br />
   iDig1  := substr(v_IE, 7, 1);<br />
   iDig2  := substr(v_IE, 8, 1);</p>
<p>   --Se o primeiro dígito for um dos testados, modulo 10, senao, modulo 11<br />
   if(substr(cBase1, 1, 1) in (0, 1, 2, 3, 4, 5, 8)) then<br />
      --Faz um loop de 7 até 2...<br />
      for i in reverse 2 .. 7 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires2 := mod(ires2, 10);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires2 = 0) then<br />
         ires2 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires2 := 10 - ires2;<br />
      end if;</p>
<p>      --O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2<br />
      cBase2 := cBase1||ires2;</p>
<p>      --Faz um loop de 8 até 2...<br />
      for i in reverse 2 .. 8 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires1 := mod(ires1, 10);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires1 = 0) then<br />
         ires1 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires1 := 10 - ires1;<br />
      end if;</p>
<p>      --Se resultado 1 e 2 iguais a digitos 1 e 2, é válido<br />
      if(ires1 = idig1 and ires2 = idig2) then<br />
         return('S');<br />
      else<br />
         return('N');<br />
      end if;<br />
   --Se começa com 6, 7 ou 9<br />
   else<br />
      --Faz um loop de 7 até 2...<br />
      for i in reverse 2 .. 7 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 11<br />
      ires2 := mod(ires2, 11);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires2 = 0) then<br />
         ires2 := 0;<br />
      --Se não for zero, subtrai o valor de 11<br />
      else<br />
         ires2 := 11 - ires2;<br />
      end if;</p>
<p>      --O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2<br />
      cBase2 := cBase1||ires2;</p>
<p>      --Faz um loop de 8 até 2...<br />
      for i in reverse 2 .. 8 loop<br />
         --Verifica se o numero encontrado é válido.<br />
         if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then<br />
            --Sendo válido, já soma com a multiplicação pelo indice.<br />
            ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);<br />
         else<br />
            return('N');<br />
         end if;<br />
      end loop;</p>
<p>      --Recupera o resto do calculo realizado por 10<br />
      ires1 := mod(ires1, 11);</p>
<p>      --Se for 0, o digito é zero.<br />
      if(ires1 = 0) then<br />
         ires1 := 0;<br />
      --Se não for zero, subtrai o valor de 10<br />
      else<br />
         ires1 := 11 - ires1;<br />
      end if;</p>
<p>      if(ires1 = idig1 and ires2 = idig2) then<br />
         return('S');<br />
      else<br />
         return('N');<br />
      end if;<br />
   end if;<br />
end;<br />
</code></p>
<p>É isso aí gente, espero que seja útil.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/10/22/validando-digito-verificador-inscricao-estadual-bahia-ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
