CÁLCULO DíGITO - MOD 10

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
hervalg
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Qui, 02 Jul 2009 10:46 am
Localização: Salto - SP

Pessoal, bom dia!´
Estou com uma function que faz o cálculo do dígito verificador no modelo MOD 10.
O que está ocorrendo de erro? Meu banco possui um nr de registro que contém 4 caracteres (6567) e também 5 caracteres (14639) no mesmo campo. Eu preciso criar o digito verificador destes números, só que não está calculando corretamente. Fiz uma conferência, com 4 caracteres eles está calculando corretamente, mas quando é cinco não está. Abaixo a function:

Selecionar tudo

CREATE OR REPLACE FUNCTION "MOD10" ( pOrgCalculo IN VARCHAR2) return number
as
   VSoma                Number  (04) ;
   VOrgCalculo          Varchar2(20) ;
   VDgMultiplicador     Varchar2(02) ;
   vTamOrgCalc		Number(2);
   vDGNosso_Numero	Number  (1) ;
begin
   vDGNosso_numero:=9;
   vOrgCalculo:=pOrgCalculo;
   vTamOrgCalc:=Length(pOrgCalculo);
   -- CALCULANDO O DIGITO VERIFICADOR
   VSoma := 0  ;
   For X In 1..vTamOrgCalc Loop
      If Mod(X,2)=0 Then
         If To_Number(Substr( VOrgCalculo , X , 1 )) * 2 >= 10 Then
	          VDgMultiplicador := To_Number(Substr(VOrgCalculo     ,X,1))*2;
	          VSoma            := VSoma + To_Number(Substr(VDgMultiplicador,1,1))   ;
	          VSoma            := VSoma + To_Number(Substr(VDgMultiplicador,2,1))   ;
         Else
    		     VSoma := VSoma + ( To_Number ( Substr ( VOrgCalculo , X , 1 )) *2 )   ;
         End If ;
      Else
         VSoma    := VSoma + ( To_Number ( Substr ( VOrgCalculo , X , 1 )) *1 )   ;
      End If ;
   End Loop ;
   IF  Mod ( VSoma ,10)=0 Then
    	 vDGNosso_Numero:=0 ;
   Else
    	 vDGNosso_Numero:=TO_NUMBER(10-Mod(VSoma,10)) ;
   End If ;
   Return (vDGNosso_Numero);
End;
Se alguém puder me ajudar!!!!
Agradeço!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Tem que multiplicar por 2 e 1 alternando, vindo do dígito menos significativo para o mais significativo. Tenta trocar a linha abaixo:

Selecionar tudo

If Mod(X,2)=0 Then
para:

Selecionar tudo

If Mod((vTamOrgCalc + X), 2)=0 Then
hervalg
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Qui, 02 Jul 2009 10:46 am
Localização: Salto - SP

fsitja,

Realmente era isso mesmo. Funcionou.

Eu tb tentei usar a mesma function sem esta alteração, porém colocando "0" no início dos registros:

009494
094944

Também funcionou...
Obrigado!!!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante