Fórum Função para Calculo DV Modulo 11 e DV Modulo 10 - PostgreSQL #26517

11/02/2006

0

Pessoal, Boa Noite!!
Desenvolvi duas funções para PostgreSql para calcular digito verificador (modulo 10 e modulo 11).
Com certeza muitos usuários já passaram aperto quando precisaram calcular esses DV´s, sendo assim estou copiando para o corpo dessa msg o codigo dos mesmos e, qualquer problema ou melhoria no codigo por favor compartilhar com todos.
Um grande abraço e espero ter contribuido.

---------------------- DV modulo 11 PostgreSQl
CREATE OR REPLACE FUNCTION ´public´.´modulo11´ (varchar) RETURNS integer AS´
/* New function body */
DECLARE

--Parametro
pString alias for $1; /* $1 refere-se ao parametro Varchar */

--Variaveis
v_Soma int4;
v_Reg int4;
v_Multi int4;
v_Resto int4;
v_I int4;
v_J int4;
v_H int4;

BEGIN
v_Soma := 0;
v_Reg := 0;
v_Multi := 2;
v_I:= length(pString);
v_H := v_I;
v_J := 1;

while (v_J <= v_I) loop
begin
v_Reg := cast(substr(pString,v_H,1) as int4)*v_Multi;
v_Soma:=v_Soma+v_Reg;
if(v_Multi = 9) then
v_Multi :=2;
else
v_Multi := v_Multi+1;
end if;
v_J:= v_J+1;
v_H:= v_H-1;
end;
end loop;
v_Resto:= mod(v_Soma,11);
v_Resto:=11-v_Resto;
if(v_Resto>=10) or (v_Resto=1) or (v_Resto=0) then
RETURN 0;
else
RETURN v_Resto;
end if;
END;
´LANGUAGE ´plpgsql´ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


-------------------------------------------------------------------------------------

------ DV modulo 10
CREATE OR REPLACE FUNCTION ´public´.´modulo10´ (varchar) RETURNS integer AS´
/* New function body */
DECLARE

--Parametro
pString alias for $1; /* $1 refere-se ao parametro Varchar */

--Variaveis
v_Soma int4;
v_Reg int4;
v_Multi int4;
v_Resto int4;
v_Aux char(2);
v_Aux1 char(1);
v_Aux2 char(1);
v_I int4;
v_J int4;
v_H int4;

BEGIN
v_Soma := 0;
v_Reg := 0;
v_Multi := 2;
v_I:= length(pString);
v_H := v_I;
v_J := 1;

while (v_J <= v_I) loop
begin
v_Reg := cast(substr(pString,v_H,1) as int4)*v_Multi;
while (v_Reg > 9) Loop
begin
v_Aux := cast(v_Reg as char(2));
v_Aux1 := substr(v_Aux,1,1);
v_Aux2 := substr(v_Aux,2,1);
v_Reg := int4(v_Aux1)+int4(v_Aux2);
end;
end loop;
v_Soma:=v_Soma+v_Reg;
if(v_Multi = 2) then
v_Multi :=1;
else
v_Multi := v_Multi+1;
end if;
v_J:= v_J+1;
v_H:= v_H-1;
end;
end loop;
v_Resto:= mod(v_Soma,10);
v_Resto:=10-v_Resto;
if(v_Resto>=10) then
RETURN 0;
else
RETURN v_Resto;
end if;
END;
´LANGUAGE ´plpgsql´ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
-----------------------------------------------------------------------------------


Gordonsp

Gordonsp

Responder

Posts

12/02/2006

Gordonsp

Pessoal,

Acabei fazendo uma correção na função modulo11, onde ele também calcula o dv do nosso numero e numero do cliente (ambos indicando 2 na função)

CREATE OR REPLACE FUNCTION ´public´.´modulo11´ (varchar, integer) RETURNS integer AS´
/* New function body */
DECLARE

--Parametro
pString alias for $1; /* $1 refere-se ao parametro Varchar */
pTipo alias for $2; /* $2 refere-se ao parametro integer */
/* Se pTipo = 1 -> calculo do dv do codigo de barras
Se pTipo = 2 -> calculo do dv numero do cliente
e do nosso numero */

--Variaveis
v_Soma int4;
v_Reg int4;
v_Multi int4;
v_Resto int4;
v_I int4;
v_J int4;
v_H int4;

BEGIN
v_Soma := 0;
v_Reg := 0;
v_Multi := 2;
v_I:= length(pString);
v_H := v_I;
v_J := 1;

while (v_J <= v_I) loop
begin
v_Reg := cast(substr(pString,v_H,1) as int4)*v_Multi;
v_Soma:=v_Soma+v_Reg;
if(v_Multi = 9) then
v_Multi :=2;
else
v_Multi := v_Multi+1;
end if;
v_J:= v_J+1;
v_H:= v_H-1;
end;
end loop;
v_Resto:= mod(v_Soma,11);
v_Resto:=11-v_Resto;
if pTipo = 1 then
if(v_Resto>=10) or (v_Resto=1) or (v_Resto=0) then
RETURN 1;
else
RETURN v_Resto;
end if;
else
if(v_Resto>=10) or (v_Resto=0) then
RETURN 0;
else
RETURN v_Resto;
end if;
end if;
END;
´LANGUAGE ´plpgsql´ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Responder

Gostei + 0

30/05/2014

Wanessa Nascimento

Muito bom esse post me ajudou muito.

Pela documentação (FEBRABAN) o valor de calculo é decrescente ou seja:

para o numero : 01230067896
temos: 43298765432

Se for esse padrão que esta seguindo, sua variavel v_J deve ser iniciada com o valor igual ao tamanho do seu parametro (pString).
v_J := length(pString);

Fiz só essa alteração é deu certo.

Obrigado e continue nos ajudando.
Responder

Gostei + 0

30/05/2014

Alex Lekao

Parabens pela iniciativa!!!

Abraco.

Alex - Lekao
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar