pu

Buscar este blog

Mostrando entradas con la etiqueta Funcion Valida Rut Chile Oracle. Mostrar todas las entradas
Mostrando entradas con la etiqueta Funcion Valida Rut Chile Oracle. Mostrar todas las entradas

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