Oracle - funcion valida rut

 
Vista:

funcion valida rut

Publicado por hsantander (24 intervenciones) el 11/02/2005 14:00:13
Hola, alguien tiene una funcion para validar el rut?

yo tengo esta pero me arroja eerror al ingresar un rut con digito verificador k

create or replace function vrut(prut in varchar)
return integer is
vdig integer :=0;
vsuma integer :=0;
resultado integer :=0;
begin
vsuma := substr(prut,1,1) * 3;
vsuma := vsuma + substr(prut,2.1) * 2;
vsuma := vsuma + substr(prut,4.1) * 7;
vsuma := vsuma + substr(prut,5.1) * 6;
vsuma := vsuma + substr(prut,6.1) * 5;
vsuma := vsuma + substr(prut,8.1) * 4;
vsuma := vsuma + substr(prut,9.1) * 3;
vsuma := vsuma + substr(prut,10.1) * 2;
while (vsuma > 11) loop
vsuma := vsuma - 11;
end loop;
vdig := 11 - vsuma;
if(vdig = 11) and (substr(prut,12,1) = 'k') then
resultado := 1;
if(vdig = 10) and (substr(prut,12,1) = 0) then
resultado := 1;
else
resultado := 0;
end if;
return(resultado);
end;
/

espero que alguien me pueda ayudar, el rut para probarla es 11.111.112-k
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:funcion valida rut

Publicado por Rodrigo (26 intervenciones) el 11/02/2005 15:32:01
Estás haciendo la pregunta al revés. Si vdig=11 el DV debería ser "0", no la letra "K".
Fíjate también que tienes que ingresar una "k" minúscula siempre para que no haya error.
Para independizarte del formato de entrada (puntos y guiones), lo mejor es entrar sólo el número (sin DV) y obtener el DV dentro de la función, para luego compararlo con lo que te habían ingresado.
Usa siempre comparación de mayúsculas - upper() - para independizarte también del formato de la letra (si es "K")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:funcion valida rut

Publicado por hsantander (24 intervenciones) el 11/02/2005 17:10:32
si, pero lo que me acabas de decir no responde a mi duda, lo que quiero es saber como tengo que hacer para que no me arroje un error al momento de ingresar un rut con digito verificador k
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

funcion valida rut

Publicado por Nilton Salazar (2 intervenciones) el 21/09/2017 16:58:58
Función corregida: (recién vi el post... no pude ayudar antes). Para RUTs menores a 10 millones se debe rellenar con ceros al principio. Obviamente no es lo óptimo, pero no quería cambiar tu función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
create or replace function test__vrut(prut in varchar) return integer as
   vdig integer :=0;
   vsuma integer :=0;
   resultado integer :=0;
begin
   vsuma := substr(prut,1,1) * 3;
   vsuma := vsuma + substr(prut,2,1) * 2;
   vsuma := vsuma + substr(prut,4,1) * 7;
   vsuma := vsuma + substr(prut,5,1) * 6;
   vsuma := vsuma + substr(prut,6,1) * 5;
   vsuma := vsuma + substr(prut,8,1) * 4;
   vsuma := vsuma + substr(prut,9,1) * 3;
   vsuma := vsuma + substr(prut,10,1) * 2;
   while (vsuma >= 11) loop
      vsuma := vsuma - 11;
   end loop;
   vdig := 11 - vsuma;
   --raise_application_error(-20900,'DIG: '|| vdig || ' SUM: ' ||vsuma);
   if(vsuma = 0) and (substr(prut,12,1) = '0') then
      resultado := 1;
   elsif(vsuma = 1) and (upper(substr(prut,12,1)) = 'K') then
      resultado := 1;
   elsif(vdig = substr(prut,12,1)*1) then
      resultado := 1;
   else
      resultado := 0;
   end if;
   return resultado;
end;
/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

funcion valida rut

Publicado por Nilton Salazar (2 intervenciones) el 21/09/2017 17:52:04
Versión óptima (no depende de puntos ni largo del RUT, pero si del guión)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
create or replace function test__vrut(prut in varchar) return integer as
   vdig integer :=0;
   vsuma integer :=0;
   resultado integer :=0;
   largoRut integer := length(prut)-2;  -- Sin DV
   factor integer := 2;
   caracter varchar2(1) := '';
begin
 
   while largoRut > 0 loop
      caracter := substr(prut,largoRut,1);
      if (caracter <> '.') then
         vsuma := vsuma + caracter * factor;
         if (factor = 7) then
            factor := 2;
         else
            factor := factor + 1;
         end if;
      end if;
      largoRut := largoRut - 1;
   end loop;
 
   vsuma := mod( vsuma, 11);
 
   vdig := 11 - vsuma;
 
   largoRut := length(prut);
 
   if(vsuma = 0) and (substr(prut,largoRut,1) = '0') then
      resultado := 1;
   elsif(vsuma = 1) and (upper(substr(prut,largoRut,1)) = 'K') then
      resultado := 1;
   elsif(trim(vdig) = substr(prut,largoRut,1)) then
      resultado := 1;
   else
      resultado := 0;
   end if;
   return resultado;
end;
/

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar