Fórum Função para Calculo DV Modulo 11 e DV Modulo 10 - PostgreSQL #26517
11/02/2006
0
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
Curtir tópico
+ 0Posts
12/02/2006
Gordonsp
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;
Gostei + 0
30/05/2014
Wanessa Nascimento
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.
Gostei + 0
30/05/2014
Alex Lekao
Abraco.
Alex - Lekao
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)