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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
2 | |
2 | |
2 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 |