Casimiro:
O no te sabes explicar
, o yo no te entiendo..... porque no te sabes explicar.... (je, je, je) una pequeña broma.
Código SQL
[-]
create or alter procedure PROPER_VOWEL (
C char(1))
returns (
VOWEL char(1))
AS
begin
vowel = C;
if (C in ('Á', 'a', 'á')) then vowel = 'A';
if (C in ('É', 'e', 'é')) then vowel = 'E';
if (C in ('Í', 'i', 'í')) then vowel = 'I';
if (C in ('Ó', 'o', 'ó')) then vowel = 'O';
if (C in ('Ú', 'u', 'ú')) then vowel = 'U';
end
Procedimiento almacenado que convierte un vocal acentuado a una vocal sin acento.... (se puede extender fácilmente para vocales con acento circunflejo en caso de idiomas como el Francés y el Portugués (creo).
Código SQL
[-]
create or alter procedure CALC_RFC (
A_PATERNO varchar(25),
A_MATERNO varchar(25),
NOMBRE varchar(30),
F_NACIMIENTO date)
returns (
RFC varchar(13))
AS
declare variable dd char(2);
declare variable mm char(2);
declare variable aa char(2);
declare variable pv char(1) = '';
declare variable cadena varchar(24);
declare variable i smallint = 1;
declare variable len smallint;
begin
dd = lpad(cast(extract(day from :f_nacimiento) as varchar(2)), 2, '0');
mm = lpad(cast(extract(month from :f_nacimiento) as varchar(2)), 2, '0');
aa = right(cast(extract(year from :f_nacimiento) as varchar(4)), 2);
cadena = substring(a_paterno from 2);
len = char_length(cadena);
i = 1;
while (i < len) do
begin
execute procedure proper_vowel(substring(cadena from 1 for 1))
returning_values pv;
if (pv in ('A', 'E', 'I', 'O', 'U')) then leave;
cadena = substring(cadena from 2);
i = i + 1;
end
rfc = left(:a_paterno, 1) || pv || coalesce(left(:a_materno, 1), 'X') ||
left(:nombre, 1) || aa || mm || dd;
end
Procedimiento almacenado que calcula (en automático) el RFC de una persona utilizando su Nombre, Apellido Paterno, Apellido Materno y su fecha de nacimiento. Como te puedes dar cuenta, este último procedimiento almacenado uso la función CHAR_LENGTH. Si utilizo UTF8 la longitud de la cadena es errónea, además de no encontrar las vocales acentuadas puesto que ahora se representa en dos bytes, ¿me explico?
Saludos,
Gerardo Suárez Trejo