Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Stored function de numero a letras

Estas en el tema de Stored function de numero a letras en el foro de Mysql en Foros del Web. Hola he estado probando pero me da un error me dice que Xnumero no existe como un campo ya cambié Xnumero por un campo que ...
  #1 (permalink)  
Antiguo 20/03/2014, 07:31
 
Fecha de Ingreso: marzo-2014
Mensajes: 2
Antigüedad: 10 años, 1 mes
Puntos: 0
Stored function de numero a letras

Hola he estado probando pero me da un error me dice que Xnumero no existe como un campo ya cambié Xnumero por un campo que existe en mi base de datos pero sigue a apareciendo igual.
No entiendo como ejecutar esta función en un Query.
Si alquien me puede ayudar estaría muy agradecido.
Saludos a todos.
Cita:
Iniciado por dalyla Ver Mensaje
Bien gracias por la ayuda, la verdad es que si entiendo la diferencia entre procedure y function, lo que pasa es que es la primera que hago o modifico en este caso.

Pero me sirvio de mucho tu ayuda, muchas gracias y aqui esta el codigo por los interesados.

Código PHP:

Create 
FUNCTION letras(Numero NUMERIC(20,2),  XMoneda VARCHAR(100)) RETURNS VARCHAR(512)
DETERMINISTIC

BEGIN
DECLARE XlnEntero INT;
DECLARE 
XlcRetorno VARCHAR(512);
DECLARE 
XlnTerna INT;
DECLARE 
XlcMiles VARCHAR(512);
DECLARE 
XlcCadena VARCHAR(512);
DECLARE 
XlnUnidades INT;
DECLARE 
XlnDecenas INT;
DECLARE 
XlnCentenas INT;
DECLARE 
XlnFraccion INT;
DECLARE 
Xresultado varchar(512);

SET XlnEntero FLOOR(XNumero);
SET XlnFraccion = (XNumero XlnEntero) * 100;
SET XlcRetorno '';
SET XlnTerna ;
    WHILE( 
XlnEntero 0) DO

        
#Recorro terna por terna
        
SET XlcCadena '';
        
SET XlnUnidades XlnEntero MOD 10;
        
SET XlnEntero FLOOR(XlnEntero/10);
        
SET XlnDecenas XlnEntero MOD 10;
        
SET XlnEntero FLOOR(XlnEntero/10);
        
SET XlnCentenas XlnEntero MOD 10;
        
SET XlnEntero FLOOR(XlnEntero/10);

        
#Analizo las unidades
        
SET XlcCadena =
            CASE 
# UNIDADES
                
WHEN XlnUnidades AND XlnTerna 1 THEN CONCAT('UNO 'XlcCadena)
                
WHEN XlnUnidades AND XlnTerna <> 1 THEN CONCAT('UN 'XlcCadena)
                
WHEN XlnUnidades 2 THEN CONCAT('DOS 'XlcCadena)
                
WHEN XlnUnidades 3 THEN CONCAT('TRES 'XlcCadena)
                
WHEN XlnUnidades 4 THEN CONCAT('CUATRO 'XlcCadena)
                
WHEN XlnUnidades 5 THEN CONCAT('CINCO 'XlcCadena)
                
WHEN XlnUnidades 6 THEN CONCAT('SEIS 'XlcCadena)
                
WHEN XlnUnidades 7 THEN CONCAT('SIETE 'XlcCadena)
                
WHEN XlnUnidades 8 THEN CONCAT('OCHO 'XlcCadena)
                
WHEN XlnUnidades 9 THEN CONCAT('NUEVE 'XlcCadena)
                ELSE 
XlcCadena
            END
#UNIDADES

        #Analizo las decenas
        
SET XlcCadena =
            CASE 
#DECENAS
                
WHEN XlnDecenas 1 THEN
                    
CASE XlnUnidades
                        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 CONCAT('DIECI'XlcCadena)
                    
END
                WHEN XlnDecenas 
AND XlnUnidades 0 THEN CONCAT('VEINTE 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('VEINTI'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('TREINTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('TREINTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('CUARENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('CUARENTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('CINCUENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('CINCUENTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('SESENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('SESENTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('SETENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('SETENTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('OCHENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('OCHENTA Y 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades 0 THEN CONCAT('NOVENTA 'XlcCadena)
                
WHEN XlnDecenas AND XlnUnidades <> 0 THEN CONCAT('NOVENTA Y 'XlcCadena)
                ELSE 
XlcCadena
            END
#DECENAS

        # Analizo las centenas
        
SET XlcCadena =
            CASE 
# CENTENAS
                
WHEN XlnCentenas AND XlnUnidades AND XlnDecenas 0 THEN CONCAT('CIEN 'XlcCadena)
                
WHEN XlnCentenas AND NOT(XlnUnidades AND XlnDecenas 0THEN CONCAT('CIENTO 'XlcCadena)
                
WHEN XlnCentenas 2 THEN CONCAT('DOSCIENTOS 'XlcCadena)
                
WHEN XlnCentenas 3 THEN CONCAT('TRESCIENTOS 'XlcCadena)
                
WHEN XlnCentenas 4 THEN CONCAT('CUATROCIENTOS 'XlcCadena)
                
WHEN XlnCentenas 5 THEN CONCAT('QUINIENTOS 'XlcCadena)
                
WHEN XlnCentenas 6 THEN CONCAT('SEISCIENTOS 'XlcCadena)
                
WHEN XlnCentenas 7 THEN CONCAT('SETECIENTOS 'XlcCadena)
                
WHEN XlnCentenas 8 THEN CONCAT('OCHOCIENTOS 'XlcCadena)
                
WHEN XlnCentenas 9 THEN CONCAT('NOVECIENTOS 'XlcCadena)
                ELSE 
XlcCadena
            END
#CENTENAS

        # Analizo la terna
        
SET XlcCadena =
            CASE 
# TERNA
                
WHEN XlnTerna 1 THEN XlcCadena
                WHEN XlnTerna 
AND (XlnUnidades XlnDecenas XlnCentenas <> 0THEN CONCAT(XlcCadena,  'MIL ')
                
WHEN XlnTerna AND (XlnUnidades XlnDecenas XlnCentenas <> 0) AND XlnUnidades AND XlnDecenas AND XlnCentenas 0 THEN CONCAT(XlcCadena'MILLON ')
                
WHEN XlnTerna AND (XlnUnidades XlnDecenas XlnCentenas <> 0) AND NOT (XlnUnidades AND XlnDecenas AND XlnCentenas 0THEN CONCAT(XlcCadena'MILLONES ')
                
WHEN XlnTerna AND (XlnUnidades XlnDecenas XlnCentenas <> 0THEN CONCAT(XlcCadena'MIL MILLONES ')
                ELSE 
''
            
END#TERNA

        #Armo el retorno terna a terna
        
SET XlcRetorno CONCAT(XlcCadenaXlcRetorno);
        
SET XlnTerna XlnTerna 1;
    
END WHILE; # WHILE

    
IF XlnTerna 1 THEN SET XlcRetorno 'CERO'END IF;

SET Xresultado CONCAT(RTRIM(XlcRetorno), ' CON 'LTRIM(XlnFraccion), '/100 'XMoneda);

RETURN 
Xresultado;

END 
Espero que el encabezado este bien ya que a final de cuentas lo termine con navicar

y gracias por tu ayuda, sin eso no creo haberlo terminado muchas gracias de veras.
  #2 (permalink)  
Antiguo 20/03/2014, 07:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Stored function de numero a letras

El problema es que no estás entendiendo ni el código de ese SP, ni su uso.

Una función, en una consulta, se invoca pro su nombre, junto con los parámetros, al igual que una función interna. Eso al menos debnerías entenderlo.
Si quieres la fecha y hora actual usas NOW(), si quieres la longitud de una cadena de texto, LENGTH('cadena de texto').
En este caso es igual:
Código MySQL:
Ver original
  1. SELECT letras(campodelvalor, 'PESOS') valor_final
  2. FROM tabla;
Si te fijas con cuidado, en el cuerpo de ese código no existe ninguna invocación a una tabla, ningún SELECT, porque esa funcion no hace consultas... hace una conversión de dato en base a valores concretos.

Postea lo que estás intentando, y por favor, no resucites posts con preguntas propias.
Crea un tema nuevo y en todo caso pon el link al post de referencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.