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á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