CREATE PROCEDURE sp_numero_a_letras
@monto NUMERIC(14, 2),
@moneda CHAR(10),
@letras CHAR(255) OUTPUT
AS
BEGIN
DECLARE @unidades CHAR(255),
@decenas CHAR(255),
@centenas CHAR(255),
@especiales CHAR(108),
@decimales CHAR(25),
@valor_entero CHAR(9),
@longitud INT,
@caracteres CHAR(3),
@contador INT,
@posicion INT,
@flag INT,
@decimal INT
SET NOCOUNT ON
SELECT @unidades = 'un dos tres cuatro' +
'cinco seis siete ocho ' +
'nueve '
SELECT @especiales = 'once doce trece ' +
'catorce quince diez y seis ' +
'diez y sietediez y ocho diez y nueve'
SELECT @decenas = 'diez veinte treinta cuarenta ' +
'cincuentasesenta setenta ochenta ' +
'noventa '
SELECT @centenas = 'ciento doscientos trescientos cuatrocientos' +
'quinientos seiscientos setecientos ochocientos ' +
'novecientos '
SELECT @decimal = (@monto - CAST(@monto AS INT)) * 100
SELECT @monto = ROUND(@monto, 0, 1)
SELECT @longitud = LEN(RTRIM(CAST(CAST(@monto AS INT) AS CHAR)))
SELECT @valor_entero = RTRIM(CAST(CAST(@monto AS INT) AS CHAR))
SELECT @valor_entero = REPLICATE('0', 9 -@longitud) + SUBSTRING(@valor_entero, 1, @longitud)
SELECT @contador = 1,
@letras = REPLICATE(' ', 255)
WHILE @contador < 8
BEGIN
/* 0 */
SELECT @caracteres = SUBSTRING(@valor_entero, @contador, 3)
IF @caracteres <> '000'
BEGIN
/* 1 */
IF SUBSTRING(@caracteres, 1, 1) <> '0'
-- CENTENAS
BEGIN
/* 2 */
SELECT @posicion = CAST(SUBSTRING(@caracteres, 1, 1) AS INT)
IF @posicion = '1'
AND CAST(SUBSTRING(@caracteres, 2, 2) AS INT) = 0
BEGIN
/* 3 */
SELECT @letras = RTRIM(@letras) +
' Cien '
END/* 3 */
ELSE
BEGIN
/* 4 */
SELECT @letras = RTRIM(@letras) +
' ' +
SUBSTRING(@centenas, 13 * (@posicion - 1) + 1, 13)
END /* 4 */
END /* 2 */
SELECT @flag = 0
IF CAST(SUBSTRING(@caracteres, 2, 2) AS INT) > 10
AND CAST(SUBSTRING(@caracteres, 2, 2) AS INT) < 20
-- ESPECIALES
BEGIN
/* 5 */
SELECT @posicion = CAST(SUBSTRING(@caracteres, 3, 1) AS INT)
SELECT @letras = RTRIM(@letras) +
' ' +
SUBSTRING(@especiales, 12 * (@posicion - 1) + 1, 12)
SELECT @flag = 1
END /* 5 */
IF @flag = 0
-- DECENAS
BEGIN
/* 6 */
IF SUBSTRING(@caracteres, 2, 1) <> '0'
BEGIN
/* 7 */
SELECT @posicion = CAST(SUBSTRING(@caracteres, 2, 1) AS INT)
IF @posicion <> 2
OR SUBSTRING(@caracteres, 3, 1) = '0'
BEGIN
/* 8 */
SELECT @letras = RTRIM(@letras) +
' ' +
SUBSTRING(@decenas, 9 * (@posicion - 1) + 1, 9)
END/* 8 */
ELSE
BEGIN
/* 9 */
SELECT @letras = RTRIM(@letras) +
' veinti'
END /* 9 */
END /* 7 */
IF SUBSTRING(@caracteres, 3, 1) <> '0'
-- UNIDADES
BEGIN
/* 10 */
SELECT @posicion = CAST(SUBSTRING(@caracteres, 3, 1) AS INT)
IF SUBSTRING(@caracteres, 2, 1) <> '0'
AND SUBSTRING(@caracteres, 3, 1) <> '0'
BEGIN
/* 11 */
IF SUBSTRING(@caracteres, 2, 1) = '2'
SELECT @letras = RTRIM(@letras) +
SUBSTRING(@unidades, 6 * (@posicion - 1) + 1, 6)
ELSE
SELECT @letras = RTRIM(@letras) +
' y ' +
SUBSTRING(@unidades, 6 * (@posicion - 1) + 1, 6)
END/* 11 */
ELSE
SELECT @letras = RTRIM(@letras) +
' ' +
SUBSTRING(@unidades, 6 * (@posicion - 1) + 1, 6)
END/* 10 */
END /* 6 */
IF @contador = 1
BEGIN
/* 12 */
IF @posicion = 1
AND SUBSTRING(@caracteres, 1, 2) = '00'
BEGIN
/* 13 */
SELECT @letras = RTRIM(@letras) +
' millón '
END/* 13 */
ELSE
-- if @posicion = 1
BEGIN
/* 14 */
SELECT @letras = RTRIM(@letras) +
' millones '
END /* 14 */
END/* 12 */
ELSE
BEGIN
/* 15 */
IF @contador = 4
BEGIN
/* 16 */
SELECT @letras = RTRIM(@letras) +
' mil '
END/* 16 */
END /* 15 */
END /* 1 */
SELECT @contador = @contador + 3
END /* 0 */
-- CIENTOS
IF RIGHT(RTRIM(@letras), 6) = 'ciento'
BEGIN
/* 17 */
SELECT @letras = SUBSTRING(@letras, 1, LEN(RTRIM(@letras)) -6) +
'cien '
END /* 17 */
-- DECIMALES
IF @decimal > 0
SELECT @decimales = ' ' + @moneda + ' con ' +
REPLICATE('0', 2 - LEN(RTRIM(LTRIM(CAST(@decimal AS CHAR(2))))))
+
LTRIM(RTRIM(CAST(@decimal AS CHAR(2)))) +
'/100'
ELSE
SELECT @decimales = ' ' + @moneda + ' exactos'
-- FINAL
SELECT @letras = '** ' +
RTRIM(SUBSTRING(@letras, 1, 255)) +
RTRIM(@decimales) +
' **'
SELECT 'letras' = UPPER(@letras)
END
No hay comentarios:
Publicar un comentario