Página 1 de 1

RUC Paraguay

Enviado: 29 Nov 2011 13:31
por TerraSoftware
Caros colegas.

Preciso validar documentos paraguaios (RUC), tanto de pessoa fisica como juridica, alguem pode me ajudar?

RUC Paraguay

Enviado: 02 Dez 2011 10:33
por TerraSoftware
Caros colegas.
Já consegui validar o RUC pessoa juridica.
Ainda me falta o RUC pessoa fisica.
Alguem pode me ajudar?

RUC Paraguay

Enviado: 02 Dez 2011 16:46
por rochinha
Amiguinho

O que acontece ao validar PF, algum erro, invalidação?

RUC Paraguay

Enviado: 03 Dez 2011 08:50
por fladimir
Colega....

Poderia mostrar como fez para validar o RUC pessoa jurídica??

[]´s

RUC Paraguay

Enviado: 06 Dez 2011 18:43
por TerraSoftware
Caros colegas.

A validacao do RUC juridica é assim:

Código: Selecionar todos

// onde vg é o RUC digitado com 9 digitos
nBaseMax  := 11
cNumero_al:= left(vg,8)
nDicer := substr(vg,9,1)
k  := 2
aux:= 0
v_total:= 0
for i:= len(cNumero_al) to 1 step -1
    if k > nBaseMax
       k:= 2
    endif
    aux:= val(substr(cNumero_al, i, 1))
    v_total:= v_total + (aux * k)
    k:= k + 1   
next i
resto:= mod(v_total, 11)
dv:= 0
if resto > 1
   dv:= 11 - resto
endif
if nDicer # strzero(int(dv),1)
   alert("RUC incorreto.")
endif
No caso do RUC fisica a validação sempre retorna um digito verificador diferente do certo. Provavelmente por que o RUC fisica tem 8 digitos e o juridica tem 9.
Deve haver outra formula para o RUC fisica.
Resta agora descobri-la.

RUC Paraguay

Enviado: 06 Dez 2011 18:57
por rochinha
Amiguinho

Pelo jeito voce ja tem a resposta mas ainda não enxergou na função.

Se o RUC fisica tem 8 digitos e o juridica tem 9 voce pode testar antes e alterar as linhas abaixo:

Código: Selecionar todos

cNumero_al:= left(vg,8)
nDicer := substr(vg,9,1)
Cálculo:

Código: Selecionar todos

//
lRUCFisica := iif( len(alltrim(vg))=8, .t., .f. )
//
cNumero_al:= left(vg,iif( lRUCFisica, 7, 8 ))
nDicer := substr(vg,iif( lRUCFisica, 8, 9 ),1)
Resposta:

Código: Selecionar todos

if nDicer # strzero(int(dv),1)
   alert("RUC "+iif( lRUCFisica, "Fisico", "Juridico" )+" incorreto.")
endif
Se a formula de codigo for a mesma o que mudará será apenas o tamanho da string à ser calculada.

RUC Paraguay

Enviado: 12 Dez 2011 15:20
por TerraSoftware
Caro colega Rochinha.
Sua ideia nao deu certo, obrigado pela tentativa.
Acredito que para RUC fisica realmente exista outra formula, o problema é que nao estou encontrando a bendita.

RUC Paraguay

Enviado: 12 Dez 2011 16:46
por rochinha
Amiguinho,

Este trecho me deixou numa duvida:

Código: Selecionar todos

resto:= mod(v_total, 11)
dv:= 0
if resto > 1
   dv:= 11 - resto
endif
Nele:
- se resto for 0 ou 1 então o digito será sempre 0?
- não seria o caso de usar if resto >= 1?

Ainda assim no entanto encontrei a seguinte função, um pouco diferente da sua mas não especifica nada em relação a RUC Juridica ou Fisica:

Código: Selecionar todos

// Funcion para calcular el digito verificador de un ruc - py
// @author en PL/SQL: www.set.gov.py
// @author en Power Builder: Robert Galeano Fernandez - rgfpy - www.sourcepy.com
/*
  ARGUMENTOS
  Arg1(string): vruc: numero de cedula o numero de ruc sin dv
  Arg2(integer): vbase_max: numero max que puede obtener el digito verificador
  Return: retorna el numero de digito verificador
*/
 
double vnuevo_ruc_aux = 0
double vresto
long i1
long k = 2
string vnuevo_ruc
string vletra_ruc
integer vdigito
 
// generamos nuevo ruc, comprobamos si el caracter obtenido es numerico o string si es string convertimos en su valor ascii
FOR i1 = 1 to len(vruc)
  vletra_ruc = upper(mid(vruc,i1,1))
  IF not (vletra_ruc >= "0" and vletra_ruc <= "9") then
    vnuevo_ruc += string(asc(vletra_ruc))
  ELSE
    vnuevo_ruc += vletra_ruc
  END IF
NEXT
 
// generamos el nuevo numero de ruc aux partiendo en orden DESC de acuerdo al nuevo ruc generado, tomando cada letra en el ciclo y multiplicarlo por el acumulador k
FOR i1 = len(vnuevo_ruc) to 1 step -1
  IF k > vbase_max then k = 2
 
    vnuevo_ruc_aux += integer(mid(vnuevo_ruc,i1,1)) * k
    k += 1
NEXT
 
// obtener el resto de la division de vnuevo_ruc_aux entre 11
vresto = mod(vnuevo_ruc_aux, 11)
 
// si el resto es mayor a 1 restamos con 11 sino igualamos a 0
IF vresto > 1 then
  vdigito = 11 - vresto
ELSE
  vdigito = 0
END IF
 
return vdigito