pu

Buscar este blog

lunes, 6 de enero de 2014

Funcion Valida Rut Chile Oracle

/* Bueno aki le dejo una funcion para validar el rut en oracle espero les sirva */



Anotacion: Funcion Valida Rut Chile Oracle


hay momentos en que para que inventar la rueda y ya esta inventada o no? todos los jiles dicen eso... pero te reto a que construyas tu propio algoritmo de rut tomando las consideraciones basicas que exije este.. ojala lo hicieras en algún lenguaje que no sea conocido phyton, sap o cualquier tipo de lenguaje y lo compartas con nosotros.



create or replace FUNCTION VALIDARUT(RUT IN VARCHAR2)RETURN VARCHAR2

AS

TOTAL VARCHAR2(12); -- largo total del string a ingresar (rut)

VRUT VARCHAR2(12); -- rut modificado para ajustar el largo



UNO VARCHAR2(2); -- primer valor del rut

DOS VARCHAR2(2); -- segundo valor del rut

TRES VARCHAR2(2);-- tercer valor del rut

CUATRO VARCHAR2(2); -- cuarto valor del rut

CINCO VARCHAR2(2); -- quinto valor del rut

SEIS VARCHAR2(2); -- ..

SIETE VARCHAR2(2); -- ..

OCHO VARCHAR2(2); -- ..



DV VARCHAR2(2); -- digito verificador

ULTIMO VARCHAR2(2); -- ultimo valor del rut ingresado

ESTADO NUMBER(2); -- estado simulacion booleano



BEGIN



ESTADO := 0; -- iniciamos el estado por defecto en falso

TOTAL := LENGTH(RUT); -- tomamos el total de la cadena



IF TOTAL = 12 OR TOTAL = 11 THEN -- comprovamos que no sea mayor a 12 y menor a 11

IF TOTAL <= 11 THEN -- verificamos

VRUT:=LPAD(RUT,12,0); -- agregamos 0 para ajustar a la nececidad de 12 digitos

ELSE

VRUT := RUT; -- asignamos valor final

END IF;

-- En VRUT se guardara el RUT FINAL



-- FILTRO "AMATEUR" PARA QUE EL FORMATO SEA EL CORRECTO

-- SOLO SE PERMITE EL SIGUIENTE FORMATO XX.XXX.XXX-X SI NO ES ASI DEVUELVE 0.

-- BASADO EN LOS VALORES ASCII DE CADA DIGITO.

IF

ASCII(SUBSTR(TO_CHAR(VRUT),1,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),1,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),2,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),2,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),3,1))= 46 AND

ASCII(SUBSTR(TO_CHAR(VRUT),4,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),4,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),5,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),5,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),6,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),6,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),7,1))= 46 AND

ASCII(SUBSTR(TO_CHAR(VRUT),8,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),8,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),9,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),9,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),10,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),10,1)) <= 57 AND

ASCII(SUBSTR(TO_CHAR(VRUT),11,1))= 45 AND

ASCII(SUBSTR(TO_CHAR(VRUT),12,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),12,1)) <= 57

OR ASCII(SUBSTR(TO_CHAR(LOWER(VRUT)),12,1))=107 THEN --K



-- ALGORTIMO 2 DE http://www.dcc.uchile.cl/~mortega/microcodigos/validarrut/algoritmo.html

UNO := (SUBSTR(VRUT,1,1)*8); -- 1

DOS := (SUBSTR(VRUT,2,1)*9); -- 1

TRES := (SUBSTR(VRUT,4,1)*4); -- 2

CUATRO := (SUBSTR(VRUT,5,1)*5); --2

CINCO := (SUBSTR(VRUT,6,1)*6); --2

SEIS := (SUBSTR(VRUT,8,1)*7); --3

SIETE := (SUBSTR(VRUT,9,1)*8); --3

OCHO := (SUBSTR(VRUT,10,1)*9); -- 3



TOTAL := UNO + DOS + TRES + CUATRO + CINCO + SEIS + SIETE + OCHO; --SUMAMOS TODOS LOS VALORES



DV :=MOD(TOTAL,11); -- OBTENEMOS EL DV



--####-K 10699370-K

ULTIMO:= SUBSTR(VRUT,12,1); -- OBTENEMOS EL ULTIMO DIGITO DEL RUT

--- K

IF ASCII(SUBSTR(TO_CHAR(SUBSTR(LOWER(VRUT),12,1)),1,1)) = 107 THEN --OBTENEMOS SI EL VALOR INGRESADO TERMINA EN K

IF DV = 10 THEN

RETURN(1);

END IF;

END IF;

 





IF ULTIMO = DV THEN --COMPROVAMOS SI EL ULTIMO DIGITO ES IGUAL AL DV

ESTADO:=1; -- CAMBIAOS EL ESTADO DE FALSO A VERDADERO

RETURN(ESTADO); -- RETORNAMOS EL ESTADO SI TODO ESTA OK

END IF;

END IF;

END IF; -- end if, si el largo esta en el rango de 11 u 12

RETURN(ESTADO); -- RETORNAMOS EL VALOR FALSO.

END;


dejen comentarios....

1 comentario: