Skip to Content

Buena noche comparto una funcion que me sirvio para aplicarla en un campo de usuario que trae el total de la factura, esto me sirvio para un campo que requeria para un addon de factura electronica.

ejemplo:

SELECT DB_Util.dbo.NumeroEnLetra(CONVERT(NUMERIC,a.DocTotalFC))  FROM oinv a

WHERE a.DocEntry =$[OINV.DocEntry]

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 número 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 número en las funciones de apoyo. 

--Función para unidades 

--Función que devuelve en letra las unidades. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 

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

--Función para decenas 

--Función que devuelve en letra las decenas. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 

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

--Función para centenas 

--Función que devuelve en letra las centenas. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 

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

--Función para millares 

---Función que devuelve en letra los millares. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 

---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 
To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply