SQL - Monto Escrito SQL

 
Vista:

Monto Escrito SQL

Publicado por JAN (6 intervenciones) el 14/11/2007 18:26:29
Quisiera conocer si me pueden enviar una rutina de monto escrito para SQL
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Monto Escrito SQL

Publicado por Isaias (5072 intervenciones) el 14/11/2007 22:51:33
¿1250.00 = UN MIL DOSCIENTOS CINCUENTA?

¿Que motor de base de datos ocupas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por JAN (6 intervenciones) el 15/11/2007 12:43:15
Gracias Isaias, estoy usando Oracle pero me sirve una guia en cualquier SQL y poder probar para ver como se porta

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por Isaias (5072 intervenciones) el 15/11/2007 19:18:43
SQL SERVER (Microsoft), cualquier duda, me lo dices y tal vez hagamos algo para Oracle:

CREATE PROCEDURE sp_Num2Let @Numero NUMERIC(20,2) AS
BEGIN
SET NOCOUNT ON
DECLARE @lnEntero INT,
@lcRetorno VARCHAR(512),
@lnTerna INT,
@lcMiles VARCHAR(512),
@lcCadena VARCHAR(512),
@lnUnidades INT,
@lnDecenas INT,
@lnCentenas INT,
@lnFraccion INT
SELECT @lnEntero = CAST(@Numero AS INT),
@lnFraccion = (@Numero - @lnEntero) * 100,
@lcRetorno = '',
@lnTerna = 1
WHILE @lnEntero > 0
BEGIN /* WHILE */
-- Recorro terna por terna
SELECT @lcCadena = ''
SELECT @lnUnidades = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnDecenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnCentenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
-- Analizo las unidades
SELECT @lcCadena =
CASE /* UNIDADES */
WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena
WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena
WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
ELSE @lcCadena
END /* UNIDADES */
-- Analizo las decenas
SELECT @lcCadena =
CASE /* DECENAS */
WHEN @lnDecenas = 1 THEN
CASE @lnUnidades
WHEN 0 THEN 'DIEZ '
WHEN 1 THEN 'ONCE '
WHEN 2 THEN 'DOCE '
WHEN 3 THEN 'TRECE '
WHEN 4 THEN 'CATORCE '
WHEN 5 THEN 'QUINCE '
ELSE 'DIECI' + @lcCadena
END
WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena
WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena
ELSE @lcCadena
END /* DECENAS */

-- Analizo las centenas
SELECT @lcCadena =
CASE /* CENTENAS */
WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena
WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN 'CIENTO ' + @lcCadena
WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
ELSE @lcCadena
END /* CENTENAS */
-- Analizo la terna
SELECT @lcCadena =
CASE /* TERNA */
WHEN @lnTerna = 1 THEN @lcCadena
WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + ' MILLON '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + ' MILLONES '
WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL MILLONES '
ELSE ''
END /* TERNA */
-- Armo el retorno terna a terna
SELECT @lcRetorno = @lcCadena + @lcRetorno
SELECT @lnTerna = @lnTerna + 1
END /* WHILE */
IF @lnTerna = 1
SELECT @lcRetorno = 'CERO'
SELECT RTRIM(@lcRetorno) + ' CON ' + LTRIM(STR(@lnFraccion,2)) + '/100'
END

GO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por JAN (6 intervenciones) el 16/11/2007 12:41:59
Muchas gracias, funcionó perfecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por JAN (6 intervenciones) el 16/11/2007 20:41:26
Hola Isaias, traté de probar en Oracle y tuve que cambiar algunas cosas y no me funciona podrías echarme una ayudita con esa rutina.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por Isaias (5072 intervenciones) el 20/11/2007 22:42:56
Indicame la rutina, te digo que hace y lo traduces a oracle
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por Luna (1 intervención) el 22/01/2008 21:59:50
Hola, yo lo necesitaba para ORacle 10g, entonces lo "traducí", algunos montos me los esta dando con cierto grado de inexactitud, como que me repite la palabra millones, pero si alguien lo necesita y quiere usarlo aqui esta.

FUNCTION MONTOLETRASF
(
PMONTO IN NUMBER
) return varchar2

IS
Begin
DECLARE
lnEntero INT;
lcRetorno VARCHAR2(512);
lnTerna INT;
lcMiles VARCHAR2(512);
lcCadena VARCHAR2(512);
lnUnidades INT;
lnDecenas INT;
lnCentenas INT;
lnFraccion INT;

BEGIN

lnTerna := 1;
lnEntero := PMONTO;
lnFraccion := (PMONTO - lnEntero) * 100;
lcRetorno := '';


WHILE lnEntero > 0 Loop

lcCadena := '';
-- Recorro terna por terna
lnUnidades := MOD(lnEntero, 10);
lnEntero := TRUNC(lnEntero/10);
lnDecenas := MOD(lnEntero, 10);
lnEntero := TRUNC(lnEntero/10);
lnCentenas := MOD(lnEntero, 10);
lnEntero := TRUNC(lnEntero/10);

-- Analizo las unidades
lcCadena :=
CASE lnUnidades /* UNIDADES */
WHEN 1 then
CASE lnTerna
WHEN 1 THEN
'UNO ' || lcCadena
ELSE
'UN ' || lcCadena
END
WHEN 2 THEN 'DOS ' || lcCadena
WHEN 3 THEN 'TRES ' || lcCadena
WHEN 4 THEN 'CUATRO ' || lcCadena
WHEN 5 THEN 'CINCO ' || lcCadena
WHEN 6 THEN 'SEIS ' || lcCadena
WHEN 7 THEN 'SIETE ' || lcCadena
WHEN 8 THEN 'OCHO ' || lcCadena
WHEN 9 THEN 'NUEVE ' || lcCadena
ELSE lcCadena
END ; /* UNIDADES */

-- Analizo las decenas
lcCadena :=
CASE lnDecenas /* DECENAS */
WHEN 1 THEN
CASE lnUnidades
WHEN 0 THEN 'DIEZ '
WHEN 1 THEN 'ONCE '
WHEN 2 THEN 'DOCE '
WHEN 3 THEN 'TRECE '
WHEN 4 THEN 'CATORCE '
WHEN 5 THEN 'QUINCE '
ELSE 'DIECI' || lcCadena
END
WHEN 2 THEN
CASE lnUnidades
WHEN 0 THEN 'VEINTE ' || lcCadena
ELSE 'VEINTI' || lcCadena
END

WHEN 3 THEN
CASE lnUnidades
WHEN 0 THEN 'TREINTA ' || lcCadena
ELSE 'TREINTA Y ' || lcCadena
END
WHEN 4 THEN
CASE lnUnidades
WHEN 0 THEN 'CUARENTA ' || lcCadena
ELSE 'CUARENTA Y ' || lcCadena
END
WHEN 5 THEN
CASE lnUnidades
WHEN 0 THEN 'CINCUENTA ' || lcCadena
ELSE 'CINCUENTA Y ' || lcCadena
END
WHEN 6 THEN
CASE lnUnidades
WHEN 0 THEN 'SESENTA ' || lcCadena
ELSE 'SESENTA Y ' || lcCadena
END
WHEN 7 THEN
CASE lnUnidades
WHEN 0 THEN 'SETENTA ' || lcCadena
ELSE 'SETENTA Y ' || lcCadena
END
WHEN 8 THEN
CASE lnUnidades
WHEN 0 THEN 'OCHENTA ' || lcCadena
ELSE 'OCHENTA Y ' || lcCadena
END
WHEN 9 THEN
CASE lnUnidades
WHEN 0 THEN 'NOVENTA ' || lcCadena
ELSE 'NOVENTA Y ' || lcCadena
END
ELSE lcCadena
end;

-- Analizo las centenas
lcCadena :=
CASE lnCentenas /* CENTENAS */
WHEN 1 THEN
CASE
WHEN (lnUnidades = 0 and lnDecenas = 0) then
'CIEN ' || lcCadena
WHEN (lnUnidades = 0 and lnDecenas <> 0) then
'CIENTO ' || lcCadena
ELSE ''
END

WHEN 2 THEN 'DOSCIENTOS ' || lcCadena
WHEN 3 THEN 'TRESCIENTOS ' || lcCadena
WHEN 4 THEN 'CUATROCIENTOS ' || lcCadena
WHEN 5 THEN 'QUINIENTOS ' || lcCadena

WHEN 6 THEN 'SEISCIENTOS ' || lcCadena
WHEN 7 THEN 'SETECIENTOS ' || lcCadena
WHEN 8 THEN 'OCHOCIENTOS ' || lcCadena
WHEN 9 THEN 'NOVECIENTOS ' || lcCadena
ELSE lcCadena
END ; /* CENTENAS */


-- Analizo la terna
lcCadena :=
CASE lnTerna /* TERNA */
WHEN 1 THEN
lcCadena

WHEN 2 THEN
CASE (lnUnidades + lnDecenas + lnCentenas)
WHEN 0 then
lcCadena

ELSE lcCadena || ' MIL '
END

WHEN 3 THEN
case
when (lnUnidades + lnDecenas + lnCentenas) <> 0 AND
lnUnidades = 1 AND lnDecenas = 0 AND lnCentenas = 0 THEN
lcCadena || ' MILLON '

else case
when (lnUnidades + lnDecenas + lnCentenas) <> 0 AND
NOT (lnUnidades = 1 AND lnDecenas = 0 AND lnCentenas = 0 ) THEN
lcCadena || ' MILLONES '
else lcCadena
end

end

WHEN 4 THEN
case (lnUnidades + lnDecenas + lnCentenas )
WHEN 0 THEN
lcCadena
ELSE
lcCadena || ' MIL MILLONES '
END

ELSE lcCadena

END; /* TERNA */


-- Armo el retorno terna a terna
lcRetorno := lcCadena || lcRetorno;
lnTerna := lnTerna + 1;
dbms_output.put_line(lcCadena);
END Loop; /* WHILE */


IF lnTerna = 1 then
lcRetorno := 'CERO';
else
lcRetorno := RTRIM(lcRetorno);
lcRetorno := lcRetorno || ' CON ' || lnFraccion || '/100';
end if;


--PMONTOLETRAS := RTRIM(lcRetorno);
return RTRIM(lcRetorno);

END;
END;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Monto Escrito SQL

Publicado por JAN (6 intervenciones) el 23/01/2008 19:29:02
Muchas gracias la probaré y te aviso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar