--CREATE FUNCTION NumeroEnLetra(@NumeroAProcesar as varchar(30))
create FUNCTION NumeroEnLetra(@NumeroAProcesar as varchar(30))
RETURNS varchar(500) AS
BEGIN
DECLARE @Numero bigint
DECLARE @Decimal varchar(30)
DECLARE @Texto varchar(500)
DECLARE @EstiloMillares bit
SELECT @Texto=''
/* Obtenemos parte entera */
IF patindex('%.%', @NumeroAProcesar)>0
BEGIN
SELECT @Numero=LEFT(@NumeroAProcesar,
patindex('%.%', @NumeroAProcesar)-1)
END
ELSE
BEGIN
SELECT @Numero=CONVERT(bigint, @NumeroAProcesar)
END
SELECT @EstiloMillares=CONVERT(bit,LEN(@Numero)-7)
/* Proceso nmero negativos */
IF @Numero<0
BEGIN
SELECT @Texto='menos '
SELECT @Numero=ABS(@Numero)
END
/* Proceso parte entera */
SELECT @Texto= @Texto +
CASE
WHEN @Numero=1000000 THEN 'MILLON'
WHEN @Numero>1000000 AND @Numero<1000000000000 THEN
dbo.F_Millares(
LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-6),
@EstiloMillares) +
' MILLONES ' +
dbo.F_Millares(RIGHT(CONVERT(varchar, @Numero), 6), 1)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, 1)
WHEN @Numero<1000000 THEN dbo.F_Millares(@Numero, 1)
END
/* Proceso parte decimal */
IF patindex('%.%', @NumeroAProcesar)>0
BEGIN
SELECT @Decimal=
RIGHT(@NumeroAProcesar,
LEN(@NumeroAProcesar)-patindex('%.%', @NumeroAProcesar))
SELECT @Numero=@Decimal
SELECT @Texto= @Texto + 'CON ' +
CASE
WHEN @Numero=1000000 THEN 'MILLON'
WHEN @Numero>1000000 AND @Numero<1000000000000 THEN
dbo.F_Millares(
LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-6),
@EstiloMillares) +
' MILLONES ' +
dbo.F_Millares(RIGHT(CONVERT(varchar, @Numero), 6), 1)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, 1)
WHEN @Numero<1000000 THEN dbo.F_Millares(@Numero, 1)
END
SELECT @Texto = @Texto +
CASE
WHEN LEN(@Decimal)=1 THEN ' CENTAVOS DE DOLAR'
WHEN LEN(@Decimal)=2 THEN ' CENTAVOS DE DOLAR'
WHEN LEN(@Decimal)=3 THEN ' CENTAVOS DE DOLAR'
END
END
RETURN @Texto
END
go
--En el proceso principal se delega el procesado de la parte entera y decimal de
un nmero en las funciones de apoyo.
--Funcin para unidades
--Funcin que devuelve en letra las unidades. El prametro @Estilo permite identific
ar los distintos valores que puede tener un mismo nmero.
--Figura 2.
--CREATE FUNCTION F_Unidades(@Numero as bigint, @Estilo as bit=0)
create FUNCTION F_Unidades(@Numero as bigint, @Estilo as bit=0)
RETURNS varchar(500) AS
BEGIN
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto=
CASE
WHEN @Numero=0 THEN 'CERO '
WHEN @Numero=1 THEN 'UNO '
WHEN @Numero=2 AND @Estilo=0 THEN 'DOS '
WHEN @Numero=2 AND @Estilo=1 THEN 'DOS '
WHEN @Numero=3 AND @Estilo=0 THEN 'TRES '
WHEN @Numero=3 AND @Estilo=1 THEN 'TRES '
WHEN @Numero=4 THEN 'CUATRO '
WHEN @Numero=5 THEN 'CINCO '
WHEN @Numero=6 AND @Estilo=0 THEN 'SEIS '
WHEN @Numero=6 AND @Estilo=1 THEN 'SEIS '
WHEN @Numero=7 THEN 'SIETE '
WHEN @Numero=8 THEN 'OCHO '
WHEN @Numero=9 AND @Estilo=0 THEN 'NUEVE '
WHEN @Numero=9 AND @Estilo=1 THEN 'NOVE '
END
RETURN @Texto
END
go
--Funcin para decenas
--Funcin que devuelve en letra las decenas. El prametro @Estilo permite identifica
r los distintos valores que puede tener un mismo nmero.
--Figura 3.
---CREATE FUNCTION F_Decenas(@Numero as bigint, @Estilo as bit=0)
create FUNCTION F_Decenas(@Numero as bigint, @Estilo as bit=0)
RETURNS varchar(500) AS
BEGIN
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto=
CASE
WHEN @Numero=0 THEN ' '
WHEN @Numero=10 THEN 'DIEZ '
WHEN @Numero=11 THEN 'ONCE '
WHEN @Numero=12 THEN 'DOCE '
WHEN @Numero=13 THEN 'TRECE '
WHEN @Numero=14 THEN 'CATORCE '
WHEN @Numero=15 THEN 'QUINCE '
WHEN @Numero>15 and @Numero<19 THEN 'DIECI' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 1)
WHEN @Numero=19 THEN 'DIECINUEVE'
WHEN @Numero=20 THEN 'VEINTE'
WHEN @Numero>20 and @Numero<30 THEN 'VEINTI' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 1)
WHEN @Numero=30 THEN 'TREINTA'
WHEN @Numero>30 and @Numero<40 THEN 'TREINTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=40 THEN 'CUARENTA'
WHEN @Numero>40 and @Numero<50 THEN 'CUARENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=50 THEN 'CINCUENTA'
WHEN @Numero>50 and @Numero<60 THEN 'CINCUENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=60 THEN 'SESENTA'
WHEN @Numero>60 and @Numero<70 THEN 'SESENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=70 THEN 'SETENTA'
WHEN @Numero>70 and @Numero<80 THEN 'SETENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=80 THEN 'OCHENTA'
WHEN @Numero>80 and @Numero<90 THEN 'OCHENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=90 THEN 'NOVENTA'
WHEN @Numero>90 and @Numero<100 THEN 'NOVENTA Y ' +
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, @Estilo)
END
RETURN @Texto
END
go
--Funcin para centenas
--Funcin que devuelve en letra las centenas. El prametro @Estilo permite identific
ar los distintos valores que puede tener un mismo nmero.
--Figura 4.
--CREATE FUNCTION F_Centenas(@Numero as bigint, @Estilo as bit=0)
create FUNCTION F_Centenas(@Numero as bigint, @Estilo as bit=0)
RETURNS varchar(500) AS
BEGIN
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto=
CASE
WHEN @Numero=000 THEN ' '
WHEN @Numero=100 THEN 'CIEN'
WHEN @Numero>100 and @Numero<200 THEN 'CIENTO ' +
dbo.F_Decenas(RIGHT(CONVERT(varchar, @Numero), 2), 0)
WHEN (@Numero>=200 and @Numero<500) or
(@Numero>500 and @Numero<1000) THEN
dbo.F_Decenas(LEFT(CONVERT(varchar, @Numero), 1), 1) +
'CIENTOS ' +
dbo.F_Decenas(RIGHT(CONVERT(varchar, @Numero), 2), 1)
WHEN @Numero=500 THEN 'QUINIENTOS'
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, @Estilo)
END
RETURN @Texto
END
go
--Funcin para millares
---Funcin que devuelve en letra los millares. El prametro @Estilo permite identifi
car los distintos valores que puede tener un mismo nmero.
---Figura 5.
--CREATE FUNCTION F_Millares(@Numero as bigint, @Estilo as bit=0)
create FUNCTION F_Millares(@Numero as bigint, @Estilo as bit=0)
RETURNS varchar(500) AS
BEGIN
DECLARE @Texto varchar(500)
DECLARE @EstiloCentenas bit
SELECT @EstiloCentenas=CONVERT(bit,LEN(@Numero)-4)
SELECT @Texto=
CASE
WHEN @Numero=0000 THEN ' '
WHEN @Numero=1000 THEN 'MIL'
WHEN @Numero>1000 and @Numero<2000 THEN 'MIL ' +
dbo.F_Centenas(RIGHT(CONVERT(varchar, @Numero), 3), 1)
WHEN @Numero>2000 and @Numero<1000000 THEN
dbo.F_Centenas(LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-3),
@EstiloCentenas) +
' MIL ' +
dbo.F_Centenas(RIGHT(CONVERT(varchar, @Numero), 3), 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, @Estilo)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, @Estilo)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, @Estilo)
END
RETURN @Texto
END