Cálculo do Módulo10 para o Nosso Número
Autor: Marcos G.A | Publicado: 2012-03-29T07:26:00-07:00


Neste exemplo, criei em plpgsql, uma função para o cálculo do módulo10, para usar na geração do "Nosso Número" para a remessa e bloquetos do banco do brasil.&nbsp;

CREATE OR REPLACE FUNCTION "TS_CalculaModulo10BancoBrasili"(xdocumento character varying)
&nbsp; RETURNS character varying AS
$BODY$
declare&nbsp;
&nbsp; XNumero &nbsp; &nbsp; Varchar;
&nbsp; XNumeroOrg &nbsp;Varchar;&nbsp;
&nbsp; XCont &nbsp; &nbsp; &nbsp; Integer;
&nbsp; XParcial &nbsp; &nbsp;Integer;
&nbsp; XParcialPosterior Integer;
&nbsp; XDivisorM10 Integer;
&nbsp; XResto &nbsp; &nbsp; &nbsp;Integer;
&nbsp; XDigVerM10 &nbsp;Varchar(1);
&nbsp; XMultiplo &nbsp; Integer;
&nbsp; XTotalM10 &nbsp; Integer;&nbsp;
begin
&nbsp; /*
&nbsp; &nbsp;Função responsável por calcular o módulo 10&nbsp;
&nbsp; &nbsp;para os campos da linha digitável cobrança banco do brasil
&nbsp; */
&nbsp; --Pegando somente os números do documentos
&nbsp; XNumeroOrg = regexp_replace(XDocumento, '[^[:digit:]]', '', 'g');

&nbsp; /*&nbsp;
&nbsp; *** Calculando Módulo "10" ***&nbsp;
&nbsp; */
&nbsp; XDivisorM10 = 2;
&nbsp; XParcial &nbsp; &nbsp;= 0;
&nbsp; XNumero &nbsp; &nbsp; = trim(XNumeroOrg);
&nbsp; XCont &nbsp; &nbsp; &nbsp; = length(XNumero);
&nbsp; loop
&nbsp; &nbsp; XTotalM10 = Cast(SubStr(trim(XNumero),XCont,1) as Integer) * XDivisorM10;
&nbsp; &nbsp; if XTotalM10 &lt; 10 then
&nbsp; &nbsp; &nbsp; &nbsp;XParcial &nbsp; &nbsp;= XParcial &nbsp; &nbsp;+ XTotalM10;
&nbsp; &nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp;XParcial &nbsp; &nbsp;= XParcial &nbsp; &nbsp;+ (Cast(SubStr(XTotalM10,1,1) as Integer) + Cast(SubStr(XTotalM10,2,1) as Integer));
&nbsp; &nbsp; end if;
&nbsp; &nbsp; XCont &nbsp; &nbsp; &nbsp; = XCont - 1;
&nbsp; &nbsp; if XCont = 0 then
&nbsp; &nbsp; &nbsp; &nbsp;Exit;&nbsp;
&nbsp; &nbsp; end if;
&nbsp; &nbsp; --Pegando número a número e multiplicando por 2 e 1 e acumulando o resultado linha a linha
&nbsp; &nbsp; if XDivisorM10 = 1 then
&nbsp; &nbsp; &nbsp; &nbsp;XDivisorM10 = 2;
&nbsp; &nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp;XDivisorM10 = 1;
&nbsp; &nbsp; end if;

&nbsp; end loop;
&nbsp; /*
&nbsp; Após achar o resto da divisão, encontrar o maior&nbsp;
&nbsp; valor da soma e fazer a subtração
&nbsp; */
&nbsp; if Length(XParcial) &lt;= 2 then
&nbsp; &nbsp; &nbsp;XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,1)||'0');
&nbsp; elsif Length(XParcial) = 3 then &nbsp;
&nbsp; &nbsp; &nbsp;XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,2)||'0');
&nbsp; elsif Length(XParcial) = 4 then &nbsp;
&nbsp; &nbsp; &nbsp;XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,2)||'0');
&nbsp; end if; &nbsp;&nbsp;
&nbsp;&nbsp;
&nbsp; if (XParcialPosterior-XParcial) = 10 &nbsp;then -- Se maior que 9 desmembrar o número e soma-los Resto = 18 fazer 1 + 8 = 9
&nbsp; &nbsp; &nbsp;Return (0);
&nbsp; else &nbsp;&nbsp;
&nbsp; &nbsp; &nbsp;Return (XParcialPosterior-XParcial);
&nbsp; end if;&nbsp;
end;
$BODY$
&nbsp; LANGUAGE 'plpgsql' VOLATILE;



*** Para executar esta função digite: ***
Select&nbsp;"TS_CalculaModulo10BancoBrasili"('12345678')



No próximo post, mostrarei a função que cálcula o DV, usando o módulo11.&nbsp;