Ver Mensaje Individual
  #12  
Antiguo 10-08-2011
amerika111 amerika111 is offline
Miembro
 
Registrado: nov 2009
Posts: 168
Reputación: 0
amerika111 cantidad desconocida en este momento
Nomas no veo por donde...

Código SQL [-]
SET TERM ^^ ;
CREATE PROCEDURE P_CALCULO_RFC (
  NOMBRES_AUX VarChar(100), 
  APATERNO_AUX VarChar(100), 
  AMATERNO_AUX VarChar(100), 
  FECHANACIMIENTO Date)
 returns (
  RFC_OUT Char(16))
AS
/*
  You can change this template in the template editor:
  File | Preferences | Object Templates
  Procedure:
  Author   : , 
  Date     : 2010-06-14 10:47:01 a.m.
  Purpose  :
  Params
  ------
    : 
*/
DECLARE NOMBRES VARCHAR(100);
DECLARE APATERNO VARCHAR(100);
DECLARE AMATERNO VARCHAR(100);
DECLARE T_NOMTOT CHAR(52);
DECLARE NOMBRE1 VARCHAR(100); /*PRIMER NOMBRE */
DECLARE NOMBRE2 VARCHAR(100); /*DEMAS NOMBRES */
DECLARE NOMBRES_LONGITUD INT; /*LONGITUD DE TODOS @NOMBRES */
DECLARE NOMBRE1_LONGITUD INT ;/*LONGITUD DEL PRIMER NOMBRE(MAS UNO,EL QUE SOBRA ES UN ESPACIO EN BLANCO) */
DECLARE APATERNO1 VARCHAR(100); /*PRIMER NOMBRE */
DECLARE APATERNO2 VARCHAR(100); /*DEMAS NOMBRES */
DECLARE APATERNO_LONGITUD INT; /*LONGITUD DE TODOS @NOMBRES */
DECLARE APATERNO1_LONGITUD INT ;/*LONGITUD DEL PRIMER NOMBRE(MAS UNO,EL QUE SOBRA ES UN ESPACIO EN BLANCO) */
DECLARE AMATERNO1 VARCHAR(100); /*PRIMER NOMBRE */
DECLARE AMATERNO2 VARCHAR(100); /*DEMAS NOMBRES */
DECLARE AMATERNO_LONGITUD INT ;/*LONGITUD DE TODOS @NOMBRES */
DECLARE AMATERNO1_LONGITUD INT ;/*LONGITUD DEL PRIMER NOMBRE(MAS UNO,EL QUE SOBRA ES UN ESPACIO EN BLANCO) */
DECLARE VARLOOPS INT ;/*VARIABLE PARA LOS LOOPS, SE INICIALIZA AL INICIR UN LOOP */
DECLARE RFC CHAR(16);
DECLARE T_NOMNUM CHAR(102); /*Nombre numerico */
DECLARE T_SUMA INT ;
DECLARE T_DIVID INT; /* Dividendo */
DECLARE T_MOD INT; /* MOD de la division */
DECLARE T_HOMOCLV CHAR(3); /* Homoclave */
DECLARE T_NUMERO INT ;/* Numero ASC asignado a un caracter */
DECLARE T_PARCIAL INT ;/* Acumulado de la suma de los caracteres del RFC */
begin
/*INICIALZA VARIABLES */
NOMBRES = TRIM(NOMBRES_AUX);
APATERNO = TRIM(APATERNO_AUX);
AMATERNO = TRIM(AMATERNO_AUX);
T_NOMTOT =APATERNO||' '||AMATERNO||' '||NOMBRES;
/*PROCESAR NOMBRES DE PILA */
VARLOOPS = 0  ;
WHILE VARLOOPS <> 1  do
BEGIN
NOMBRES_LONGITUD = CHAR_LENGTH (NOMBRES);
NOMBRE1_LONGITUD = position('% %',NOMBRES);
IF (NOMBRE1_LONGITUD = 0)    then
NOMBRE1_LONGITUD = NOMBRES_LONGITUD;
NOMBRE1 = TRIM(LEFT(NOMBRES,NOMBRE1_LONGITUD));
NOMBRE2 = TRIM(RIGHT(NOMBRES,NOMBRES_LONGITUD - NOMBRE1_LONGITUD));
/*SE QUINTAN LOS NOMBRES DE JOSE, MARIA,MA,MA. */
IF (NOMBRE1 IN ('JOSE','MARIA','MA.','MA','DE','LA','LAS','MC','VON','DEL','LOS','Y','MAC','VAN') AND NOMBRE2 <> '') then
BEGIN
NOMBRES = NOMBRE2;
END 
ELSE
BEGIN
VARLOOPS = 1 ;
END
END
/*PROCESAMOS APELLIDOS, PATERNO EN UN LOOP */
VARLOOPS = 0;
WHILE VARLOOPS <> 1 do
BEGIN
APATERNO_LONGITUD = CHAR_LENGTH (APATERNO) ;
APATERNO1_LONGITUD =position('% %',APATERNO);
IF (APATERNO1_LONGITUD = 0 ) then
APATERNO1_LONGITUD = APATERNO_LONGITUD;
APATERNO1 = TRIM(LEFT(APATERNO,APATERNO1_LONGITUD))
APATERNO2 = TRIM(RIGHT(APATERNO,APATERNO_LONGITUD - APATERNO1_LONGITUD))
/*SE QUINTAN LOS SUFIJOS */
IF APATERNO1 IN ('DE','LA','LAS','MC','VON','DEL','LOS','Y','MAC','VAN') AND APATERNO2 <> ''
BEGIN
APATERNO = APATERNO2;
END 
ELSE
BEGIN
VARLOOPS = 1 ;
END
END
/*PROCESAMOS APELLIDOS, MATERNO EN UN LOOP */
VARLOOPS = 0;
WHILE VARLOOPS <> 1  do
BEGIN
AMATERNO_LONGITUD = LEN(AMATERNO);
AMATERNO1_LONGITUD = PATINDEX('% %',AMATERNO);
IF AMATERNO1_LONGITUD = 0
AMATERNO1_LONGITUD = AMATERNO_LONGITUD ;
AMATERNO1 = TRIM(LEFT(AMATERNO,AMATERNO1_LONGITUD));
AMATERNO2 = TRIM(RIGHT(AMATERNO,AMATERNO_LONGITUD - AMATERNO1_LONGITUD));
/*SE QUINTAN LOS SUFIJOS */
IF (AMATERNO1 IN ('DE','LA','LAS','MC','VON','DEL','LOS','Y','MAC','VAN') AND AMATERNO2 <> '')then
BEGIN
AMATERNO = AMATERNO2;
END 
ELSE
BEGIN
VARLOOPS = 1  ;
END
END
/*SE OBTIENE DEL PRIMER APELLIDO LA PRIMER LETRA Y LA PRIMER VOCAL INTERNA */
RFC = LEFT(APATERNO1,1);
APATERNO1_LONGITUD= LEN(APATERNO1) ;
VARLOOPS = 1 ;/*EMPIEZA EN UNO POR LA PRIMERA LETRA SE LA VA A SALTAR */
WHILE APATERNO1_LONGITUD > VARLOOPS  do
BEGIN
VARLOOPS = VARLOOPS + 1;
IF (SUBSTRING(APATERNO1,VARLOOPS,1) IN ('A','E','I','O','U')) then
BEGIN
RFC = RTRIM(RFC)+CONVERT(CHAR(1),SUBSTRING APATERNO1,@VARLOOPS,1));
VARLOOPS = APATERNO1_LONGITUD ;
END
END
/*SE OBTIENE LA PRIMER LETRA DEL APELLIDO MATERNO SI NO TIENE APELLIDO MATERNO SE PONE UNA X */
/*DICE QUE SI NO TIENE APELLIDO MATERNO LE PONGAS LA PRIMER LETRA DEL APELLIDO PATERNO EN EL RFX */
IF (IS NULL(AMATERNO1,'') = '') then
BEGIN
RFC = RTRIM(RFC)+CONVERT(CHAR(1),SUBSTRING(APATERNO1,1,1)) ;
END
ELSE
BEGIN
RFC = RTRIM(RFC)+CONVERT(CHAR(1),SUBSTRING(AMATERNO1,1,1));
END
/*SE LE AGREGA LA PRIMER LETRA DEL NOMBRE */
RFC = TRIM(RFC)+CONVERT(CHAR(1),SUBSTRING(NOMBRE1,1,1));
/*CHEAS QUE NO SEA UNA PALARA INCONVENIENTE */
/*
IF EXISTS ( SELECT INC_PALINC FROM NINCO WHERE INC_PALINC = @RFC )
BEGIN
SELECT @RFC = LTRIM(RTRIM (SUBSTRING (@RFC , 1 , 3))) + 'X'
END
*/
/*SE LE AGREGA LA FECHA DE NACIMIENTO */
RFC = RTRIM(RFC) + CONVERT(CHAR,FECHANACIMIENTO,12) ;
/*HOMOCLAVE */
T_NOMNUM = '0';
/*SACA NOMBRE NUMERICO */
VARLOOPS = 1 ;
WHILE VARLOOPS <= 52  do
BEGIN
T_NOMNUM = LTRIM(RTRIM (T_NOMNUM)) +
CASE
WHEN SUBSTRING (T_NOMTOT , VARLOOPS, 1) = 'A' THEN '11'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'B' THEN '12'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'C' THEN '13'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'D' THEN '14'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'E' THEN '15'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'F' THEN '16'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'G' THEN '17'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'H' THEN '18'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'I' THEN '19'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'J' THEN '21'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'K' THEN '22'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'L' THEN '23'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'M' THEN '24'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'N' THEN '25'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'O' THEN '26'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'P' THEN '27'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'Q' THEN '28'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'R' THEN '29'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'S' THEN '32'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'T' THEN '33'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'U' THEN '34'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'V' THEN '35'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'W' THEN '36'
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) = 'X' THEN '37'
SUBSTRING (T_NOMTOT , VARLOOPS , 1) <= '9' THEN CONVERT(VARCHAR,CONVERT(INT, SUBSTRING (T_NOMTOT , VARLOOPS , 1)) , 2)
WHEN SUBSTRING (T_NOMTOT , VARLOOPS , 1) IN ('&','Ñ') THEN '10'
ELSE '00'
END
VARLOOPS = VARLOOPS + 1;
END
VARLOOPS = 1 ;
T_SUMA = 0;
while VARLOOPS <= 99  do
T_SUMA = T_SUMA + ((CONVERT(INT,SUBSTRING (T_NOMNUM , VARLOOPS , 1))*10) + CONVERT(INT,SUBSTRING (T_NOMNUM , VARLOOPS+1 , 1))) * CONVERT(INT,SUBSTRING (T_NOMNUM , VARLOOPS+1 , 1));
VARLOOPS = VARLOOPS + 1 ;
end
/* Obtener HOMOCLAVE */
SELECT T_DIVID = T_SUMA%1000 /* Obtener residuo de los ultimos 3 digitos */
SELECT T_MOD = T_DIVID%34 /* Obtener el residuo de los ultimos 3 digitos-- entre 34 */
SELECT T_DIVID = (T_DIVID - T_MOD) / 34 /* Obtener el Cociente entero */
/*select @T_DIVID,@T_MOD */
/* Checar Cociente y residuo */
VARLOOPS = 0;
WHILE VARLOOPS <= 1  do
BEGIN
T_HOMOCLV =
CASE CASE VARLOOPS WHEN 0 THEN T_DIVID ELSE T_MOD END
WHEN 0 THEN '1' 
WHEN 1 THEN '2'
WHEN 2 THEN '3'
WHEN 3 THEN '4'
WHEN 4 THEN '5'
WHEN 5 THEN '6'
WHEN 6 THEN '7'
WHEN 7 THEN '8'
WHEN 8 THEN '9' 
WHEN 9 THEN 'A'
WHEN 10 THEN 'B'
WHEN 11 THEN 'C'
WHEN 12 THEN 'D'
WHEN 13 THEN 'E'
WHEN 14 THEN 'F'
WHEN 15 THEN 'G'
WHEN 16 THEN 'H'
WHEN 17 THEN 'I'
WHEN 18 THEN 'J'
WHEN 19 THEN 'K'
WHEN 20 THEN 'L'
WHEN 21 THEN 'M'
WHEN 22 THEN 'N'
WHEN 23 THEN 'P'
WHEN 24 THEN 'Q'
WHEN 25 THEN 'R'
WHEN 26 THEN 'S'
WHEN 27 THEN 'T'
WHEN 28 THEN 'U'
WHEN 29 THEN 'V'
WHEN 30 THEN 'W'
WHEN 31 THEN 'X'
WHEN 32 THEN 'Y'
ELSE 'Z'
END
VARLOOPS = VARLOOPS + 1;
/* Incluir la parte de la homoclave */
RFC = LTRIM(RTRIM (RFC)) + LTRIM(RTRIM (T_HOMOCLV));
END

/* --------------------------------------------- */
/* Obtener Digito Verificador */
/* --------------------------------------------- */
VARLOOPS = 0  ;
 T_PARCIAL = 0;
WHILE VARLOOPS < 12  do
BEGIN
SELECT VARLOOPS = VARLOOPS + 1
T_NUMERO =
CASE
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'A' THEN 10
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'B' THEN 11
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'C' THEN 12
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'D' THEN 13
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'E' THEN 14
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'F' THEN 15
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'G' THEN 16
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'H' THEN 17
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'I' THEN 18
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'J' THEN 19
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'K' THEN 20
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'L' THEN 21
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'M' THEN 22
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'N' THEN 23
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'O' THEN 25
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'P' THEN 26
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'Q' THEN 27
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'R' THEN 28
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'S' THEN 29
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'T' THEN 30
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'U' THEN 31
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'V' THEN 32
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'W' THEN 33
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'X' THEN 34
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'Y' THEN 35
WHEN SUBSTRING (RFC , VARLOOPS , 1) = 'Z' THEN 36
WHEN SUBSTRING (RFC , VARLOOPS , 1) >= '0' AND 
SUBSTRING (RFC , VARLOOPS , 1) <= '9'
THEN CONVERT(INT,SUBSTRING (RFC , VARLOOPS , 1))
WHEN SUBSTRING (RFC , VARLOOPS , 1) = ''
THEN 24
WHEN SUBSTRING (RFC , VARLOOPS , 1) = ' '
THEN 37
ELSE 0
END
/* Contabilizar el nuevo digito */
SELECT T_PARCIAL = T_PARCIAL + (T_NUMERO * (14 - VARLOOPS))
END 
T_MOD = ROUND(T_PARCIAL%11,1);
IF (T_MOD = 0 ) then
RFC = LTRIM(RTRIM (RFC)) + '0' ;
ELSE
BEGIN
T_PARCIAL = 11 - T_MOD ;
IF (T_PARCIAL = 10 ) then
SELECT RFC = LTRIM(RTRIM (RFC)) + 'A'
ELSE
SELECT RFC = LTRIM(RTRIM (RFC)) + CONVERT(VARCHAR ,T_PARCIAL)
END

/*SELECT T_NOMTOT,T_SUMA */
:RFC_OUT = :RFC;
SELECT :RFC AS 'RFC'

end ^^
SET TERM ; ^^
Responder Con Cita