Monto en letras

zuny
16 de Junio del 2005
Hola,
Necesito colocar el monto en letras en un reporte por favor alguien que me ayude.
Gracias

axelopez
16 de Junio del 2005
Yo tengo una funcion para eso, pero se necesita insertar 999 datos en una tabla si estas interesada abisame

zuny
16 de Junio del 2005
Hola,
por supuesto que estoy interasada, por favor enviamela a mi dirección de correo.
Gracias.

Ricardo Franco
16 de Junio del 2005
Usa esta función a ver si te sirve, tal vez requieras realizar algunos cambios, suerte
CREATE OR REPLACE FUNCTION FN_NUMERO_A_TEXTO (p_Numero_Entrada IN NUMBER, p_Decimales IN NUMBER )
RETURN VARCHAR2
AS
nNumero NUMBER;
cNumero VARCHAR2(50);
nPosicion NUMBER;
cParteEntera VARCHAR2(50);
cParteDecimal VARCHAR2(50);
nLongitud NUMBER;
nResiduo NUMBER;
nCociente NUMBER;
nCeros NUMBER;
nContador1 NUMBER;
nContador2 NUMBER;
nDigito NUMBER(1);
nCentena NUMBER(1);
nDecena NUMBER(1);
nUnidad NUMBER(1);
cCentena VARCHAR2(30);
cDecena VARCHAR2(30);
cUnidad VARCHAR2(30);
cLeyenda VARCHAR2(50);
cCantidadFinal VARCHAR2(200);

BEGIN
nNumero := p_Numero_Entrada;
IF nNumero < 0 THEN
nNumero := ABS(nNumero);
END IF;

-- Se formatea el numero para dejarlo como cadena numerica --
nNumero := ROUND(nNUMERO,2);
cNumero := TRIM(TO_CHAR(nNumero));

-- Se sustituyen comas por puntos
cNumero := REPLACE(cNumero,',','.');

nPosicion := INSTR(cNumero,'.');

IF nPosicion = 0 THEN
cParteEntera := cNumero;
cParteDecimal := '00';
ELSE
cParteEntera := SUBSTR(cNumero,1,nPosicion-1);
cParteDecimal := SUBSTR(cNumero,nPosicion+1);
IF LENGTH(cParteDecimal) = 1 THEN
cParteDecimal := cParteDecimal || '0';
END IF;
END IF;

-- Se complementa la parte entera para trabajar con grupos de 3 digitos (centenas, decenas, unidades)
nLongitud := LENGTH(cParteEntera);
nResiduo := MOD(nLongitud,3);
nCociente := TRUNC(nLongitud / 3);
IF nResiduo <> 0 THEN
nCociente := nCociente + 1;
END IF;

-- Se da formato: 1==>001, 12==>012, 123==>123, 1234==>001234, 12345==>012345 ....
nCeros := 3*nCociente;
cParteEntera := LPAD(cParteEntera,nCeros,'0');
nLongitud := LENGTH(cParteEntera);

-- Comienza el ciclo de formateo
nNumero := nLongitud / 3;
nPosicion := nLongitud;
-- Ciclo externo (grupos de tres cifras)
nContador1 := 1;
cCantidadFinal := '';
cLeyenda := '';
WHILE nContador1 <= nNumero LOOP
-- Se separan centenas, decenas y unidades
nContador2 := 3;
WHILE nContador2 >= 1 LOOP
-- Se extrae un digito a la vez (de izquierda a derecha)
nDigito := TO_NUMBER(SUBSTR(cParteEntera,nPosicion,1));
IF nContador2 = 1 THEN
nCentena := nDigito;
ELSIF nContador2 = 2 THEN
nDecena := nDigito;
ELSE
nUnidad := nDigito;
END IF;
nContador2 := nContador2 - 1;
nPosicion := nPosicion - 1;
END LOOP;

-- Se formatean las centenas
cCentena := '';
IF nCentena > 0 THEN
IF nCentena = 1 THEN
IF nDecena + nUnidad = 0 THEN
cCentena := 'cien ';
ELSE
cCentena := 'ciento ';
END IF;
ELSIF nCentena = 2 THEN
cCentena := 'doscientos ';
ELSIF nCentena = 3 THEN
cCentena := 'trescientos ';
ELSIF nCentena = 4 THEN
cCentena := 'cuatrocientos ';
ELSIF nCentena = 5 THEN
cCentena := 'quinientos ';
ELSIF nCentena = 6 THEN
cCentena := 'seiscientos ';
ELSIF nCentena = 7 THEN
cCentena := 'setecientos ';
ELSIF nCentena = 8 THEN
cCentena := 'ochocientos ';
ELSE
cCentena := 'novecientos ';
END IF;
END IF;

-- Se formatean las decenas
cDecena := '';
IF nDecena > 0 THEN
IF nDecena = 1 THEN
IF nUnidad = 0 THEN
cDecena := 'diez ';
ELSIF nUnidad = 1 THEN
cDecena := 'once ';
ELSIF nUnidad = 2 THEN
cDecena := 'doce ';
ELSIF nUnidad = 3 THEN
cDecena := 'trece ';
ELSIF nUnidad = 4 THEN
cDecena := 'catorce ';
ELSIF nUnidad = 5 THEN
cDecena := 'quince ';
ELSE
cDecena := 'dieci';
END IF;
ELSIF nDecena = 2 THEN
IF nUnidad = 0 THEN
cDecena := 'veinte ';
ELSE
cDecena := 'veinti';
END IF;
ELSIF nDecena = 3 THEN
cDecena := 'treinta ';
ELSIF nDecena = 4 THEN
cDecena := 'cuarenta ';
ELSIF nDecena = 5 THEN
cDecena := 'cincuenta ';
ELSIF nDecena = 6 THEN
cDecena := 'sesenta ';
ELSIF nDecena = 7 THEN
cDecena := 'setenta ';
ELSIF nDecena = 8 THEN
cDecena := 'ochenta ';
ELSIF nDecena = 9 THEN
cDecena := 'noventa ';
END IF;
END IF;
IF nUnidad > 0 AND nDecena > 2 THEN
cDecena := cDecena || 'y ';
END IF;

-- Se formatean las unidades
cUnidad := '';
IF nDecena <> 1 THEN
IF nUnidad = 1 THEN
cUnidad := 'un ';
ELSIF nUnidad = 2 THEN
cUnidad := 'dos ';
ELSIF nUnidad = 3 THEN
cUnidad := 'tres ';
ELSIF nUnidad = 4 THEN
cUnidad := 'cuatro ';
ELSIF nUnidad = 5 THEN
cUnidad := 'cinco ';
END IF;
END IF;
IF nUnidad = 6 THEN
cUnidad := 'seis ';
ELSIF nUnidad = 7 THEN
cUnidad := 'siete ';
ELSIF nUnidad = 8 THEN
cUnidad := 'ocho ';
ELSIF nUnidad = 9 THEN
cUnidad := 'nueve ';
END IF;

-- Despues, se formatean por grupos de tres
IF nContador1 = 1 THEN
IF nCentena + nDecena + nUnidad >= 1 THEN
cLeyenda := '';
END IF;
ELSIF nContador1 = 2 THEN
IF nCentena + nDecena + nUnidad >= 1 THEN
cLeyenda := 'mil ';
END IF;
ELSIF nContador1 = 3 THEN
IF nCentena + nDecena = 0 AND nUnidad = 1 THEN
IF nLongitud > 9 THEN
cLeyenda := 'millones ';
ELSE
cLeyenda := 'millon ';
END IF;
ELSIF nCentena > 0 OR nDecena > 0 OR nUnidad > 1 THEN
cLeyenda := 'millones ';
END IF;
ELSIF nContador1 = 4 THEN
IF nCentena + nDecena + nUnidad >= 1 AND TO_NUMBER(SUBSTR(cParteEntera,nLongitud-((nContador1-1)*3)+1,3)) = 0 THEN
cLeyenda := 'mil Millones ';
ELSIF nCentena + nDecena + nUnidad >= 1 THEN
cLeyenda := 'mil ';
END IF;
ELSIF nContador1 = 5 THEN
IF nCentena + nDecena + nUnidad = 1 THEN
cLeyenda := 'billon ';
ELSIF nCentena + nDecena + nUnidad > 1 THEN
cLeyenda := 'billones ';
END IF;
END IF;

nContador1 := nContador1 + 1;

cCantidadFinal := cCentena || cDecena || cUnidad || cLeyenda || cCantidadFinal;

cLeyenda := '';
cCentena := '';
cDecena := '';
cUnidad := '';
END LOOP;

IF TO_NUMBER(cParteEntera) = 0 THEN
cLeyenda := 'cero pesos ';
ELSIF TO_NUMBER(cParteEntera) = 1 THEN
cLeyenda := 'peso ';
ELSIF (nNumero = 3 AND TO_NUMBER(SUBSTR(cParteEntera,-6)) = 0) OR (nNumero = 5 AND TO_NUMBER(SUBSTR(cParteEntera,-12)) = 0) THEN
cLeyenda := 'de pesos ';
ELSE
cLeyenda := 'pesos ';
END IF;

cCantidadFinal := cCantidadFinal || cLeyenda;

IF p_Decimales = 1 THEN
cCantidadFinal := cCantidadFinal || cParteDecimal || '/100 ';
END IF;

cCantidadFinal := cCantidadFinal || 'M.N.';

RETURN cCantidadFinal;

END;
/

zuny
16 de Junio del 2005
Gracias Ricardo, voy a probar y luego te cuento.

axelopez
16 de Junio del 2005
post data, te mando el script para crear la tabla e insertar los datos asi como la funcion ...