jueves, 15 de marzo de 2012

Función SQL Server que convierte de número a letras o literal

Muchas veces necesitamos convertir un numero a texto o literal, aquí les muestro una función para SQL Server que lo hace y con varios ejemplos de uso:


--1) Crear la siguiente función de Base de datos  y no olvide darle permiso de ejecución


CREATE FUNCTION [dbo].[CantidadConLetra]
(
    @Numero             Decimal(18,2)
)
RETURNS Varchar(180)
AS
BEGIN
    DECLARE @ImpLetra Varchar(180)
        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 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 '
                  WHEN 6 THEN 'DIEZ Y SEIS '
                  WHEN 7 THEN 'DIEZ Y SIETE '
                  WHEN 8 THEN 'DIEZ Y OCHO '
                  WHEN 9 THEN 'DIEZ Y NUEVE '
                END
              WHEN @lnDecenas = 2 THEN
              CASE @lnUnidades
                WHEN 0 THEN 'VEINTE '
                ELSE 'VEINTI' + @lcCadena
              END
              WHEN @lnDecenas = 3 THEN
              CASE @lnUnidades
                WHEN 0 THEN 'TREINTA '
                ELSE 'TREINTA Y ' + @lcCadena
              END
              WHEN @lnDecenas = 4 THEN
                CASE @lnUnidades
                    WHEN 0 THEN 'CUARENTA'
                    ELSE 'CUARENTA Y ' + @lcCadena
                END
              WHEN @lnDecenas = 5 THEN
                CASE @lnUnidades
                    WHEN 0 THEN 'CINCUENTA '
                    ELSE 'CINCUENTA Y ' + @lcCadena
                END
              WHEN @lnDecenas = 6 THEN
                CASE @lnUnidades
                    WHEN 0 THEN 'SESENTA '
                    ELSE 'SESENTA Y ' + @lcCadena
                END
              WHEN @lnDecenas = 7 THEN
                 CASE @lnUnidades
                    WHEN 0 THEN 'SETENTA '
                    ELSE 'SETENTA Y ' + @lcCadena
                 END
              WHEN @lnDecenas = 8 THEN
                CASE @lnUnidades
                    WHEN 0 THEN 'OCHENTA '
                    ELSE  'OCHENTA Y ' + @lcCadena
                END
              WHEN @lnDecenas = 9 THEN
                CASE @lnUnidades
                    WHEN 0 THEN 'NOVENTA '
                    ELSE 'NOVENTA Y ' + @lcCadena
                END
              ELSE @lcCadena
            END /* DECENAS */
            -- Analizo las centenas
            SELECT @lcCadena =
            CASE /* CENTENAS */
              WHEN @lnCentenas = 1 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 THEN @lcCadena + 'MIL '
              WHEN @lnTerna = 3 THEN @lcCadena + 'MILLONES '
              WHEN @lnTerna = 4 THEN @lcCadena + 'MIL '
              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'
   DECLARE @sFraccion VARCHAR(15)
   SET @sFraccion = '00' + LTRIM(CAST(@lnFraccion AS varchar))
   SELECT @ImpLetra = RTRIM(@lcRetorno) + ' PESOS ' + SUBSTRING(@sFraccion,LEN(@sFraccion)-1,2) + '/100 PESOS'

   RETURN @ImpLetra
END
GO

¿Cómo se usa?  

Ejemplo # 1 de uso pasando como parámetro el campo sueldo de la tabla empleado para el empleado código 5 y suponiendo que este gane 28700.50

    Select dbo.CantidadConLetra(dbo.EMPLEADO.SUELDO)
    From Empleado
    Where  empleado.cod_empleado = 5

RESULTADOS: 
     VEINTIOCHO MIL SETECIENTOS PESOS 50/100 PESOS

Ejemplo # 2 de uso pasando como parámetro monto 5000: 
    Select dbo.CantidadConLetra(5000)

RESULTADOS:
         CINCO MIL PESOS 00/100 PESOS

46 comentarios:

  1. Muchísimas gracias. Me sirvió mucho. Saludos.

    ResponderEliminar
  2. Hola,

    Hay ciertos ajustes que se deben hacer para que quede perfecto, aquí algunos ejemplos porque no me dejó poner todo el script por el tamaño, gracias por la ayuda!!

    CASE /* CENTENAS */
    WHEN @lnCentenas = 1 AND @lnTerna = 3 THEN 'CIEN ' + @lcCadena
    WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena
    WHEN @lnCentenas = 1 AND @lnTerna <> 3 THEN 'CIENTO ' + @lcCadena

    ResponderEliminar
  3. Gracias amigo ...Me sirvió mucho..gracias

    ResponderEliminar
  4. Muchas Gracias, función funcionando perfectamento :3

    ResponderEliminar
  5. Muy bueno!, me sirvió y gracias por compartir...!!!
    PD: le hice una pequeña modificación para que pueda trabajar hasta 999,999,999,999.99 no se si deba de ponerla por aquí.

    ResponderEliminar
  6. Le hice otro arreglo para que funciones cifras de millones... 2000000 mostraba como DOS MILLONES MIL PESOS 00/100 PESOS

    ResponderEliminar
    Respuestas
    1. Saludos,
      es un buen trabajo.
      tengo mel mismo problema de MILLONES MIL
      me pudieras enseñar el arreglo que lem hizo porfa

      Eliminar
    2. 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 */

      Eliminar
    3. Muchas gracias buen aporte ya funciona a la perfección.

      Eliminar
  7. Muchas Gracias Hermano, me sirvió bastante

    ResponderEliminar
  8. genere mi pequeño aporte de Ajuste

    ---CAMBIO 1

    CASE /* UNIDADES */
    WHEN @lnUnidades = 1 THEN 'UNO ' + @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 */

    --- CAMBIO 2


    CASE /* TERNA */
    WHEN @lnTerna = 1 THEN @lcCadena
    WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) and @lcCadena = 'UNO' THEN 'MIL '
    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 and @lcCadena = 'UNO' THEN 'UN MILLON '
    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 */

    ResponderEliminar
    Respuestas
    1. CASE /* TERNA */
      WHEN @lnTerna = 1 THEN @lcCadena
      -- MIL
      WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) and @lcCadena = 'UNO' THEN 'MIL '
      WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + 'MIL '
      -- UN MILLON
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 and @lcCadena = 'UNO' THEN 'UN MILLON '
      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 and @lcCadena = 'UNO' ) THEN 'MIL MILLONES '
      WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + 'MIL MILLONES '
      ELSE ''
      END /* TERNA */


      EJEMPLO
      select dbo.CantidadConLetra(1000)
      select dbo.CantidadConLetra(1000000)
      select dbo.CantidadConLetra(1000000000)
      select dbo.CantidadConLetra(2000000000)


      despues de millones que usamos .... ??? creo que un rango suficiente

      sujiero cambiar conceptos de SQL por FnCantidadConLetra Fn es para funciones .... es mas facil usar referencia en letras

      Eliminar
    2. Fernando,
      Si pruebas con el numero 999.999.999.999 te da el siguiente resultado
      NOVECIENTOS NOVENTA Y NUEVE MIL MILLONES NOVECIENTOS NOVENTA Y NUEVE MILLONES NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE
      Pero debiese ser
      NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE

      Eliminar
    3. Con el siguiente cambio queda solucionado declaro una bandera primero @tieneMillones

      -- Analizo la terna
      IF (@lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0))
      SET @tieneMillones = 1

      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) AND @tieneMillones = 1 THEN @lcCadena + 'MIL '
      WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + 'MIL MILLONES '
      ELSE ''
      END /* TERNA */

      Select dbo.CantidadConLetra(999000010000)
      salida:
      NOVECIENTOS NOVENTA Y NUEVE MIL MILLONES DIEZ MIL

      Select dbo.CantidadConLetra(999999010000)
      salida:
      NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES DIEZ MIL


      Eliminar
  9. hola tendrás una manera pero para convertir los meses en letra

    ResponderEliminar
    Respuestas
    1. select dbo.FnFechaMeses(getdate())


      -- =============================================
      -- Author: Fernando yevenes
      -- Create date: 07/10/2014
      -- Description: funcion indica Meses del año
      -- =============================================
      CREATE FUNCTION [dbo].[FnFechaMeses](@FECHA datetime)
      RETURNS nvarchar(100)
      AS
      BEGIN

      DECLARE @valor nvarchar(100);

      set @valor = ( SELECT CASE WHEN MONTH(@fecha) = 1 THEN 'Enero'
      WHEN MONTH(@fecha) = 2 THEN 'Febrero'
      WHEN MONTH(@fecha) = 3 THEN 'Marzo'
      WHEN MONTH(@fecha) = 4 THEN 'Abril'
      WHEN MONTH(@fecha) = 5 THEN 'Mayo'
      WHEN MONTH(@fecha) = 6 THEN 'Junio'
      WHEN MONTH(@fecha) = 7 THEN 'Julio'
      WHEN MONTH(@fecha) = 8 THEN 'Agosto'
      WHEN MONTH(@fecha) = 9 THEN 'Septiembre'
      WHEN MONTH(@fecha) = 10 THEN 'Octubre'
      WHEN MONTH(@fecha) = 11 THEN 'Noviembre'
      WHEN MONTH(@fecha) = 12 THEN 'Diciembre'
      END 'Mes' )

      RETURN(ltrim(rtrim(@valor)));
      END;

      Eliminar
    2. Hola Lorena acosta villalobos esto te puede servir, select DATENAME(month,GETDATE()), si necesitas cambiarlo a español puedes utilizar set language spanish

      Eliminar
  10. Hola aqui tengo una pequeña modificacion.
    especialmente para los valores
    1
    21


    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

    ResponderEliminar
  11. Tome su like, buen hombre!!... Todavía en el 2016 tu aporte es de gran utilidad... ¡GRACIAS!

    ResponderEliminar
  12. Hola,
    Tengo un total en dolares que es 0.01 y necesito que en letras salga 01/100, con la función que tengo me sale CERO.

    ResponderEliminar
  13. Está con madre tu código, yo sólo le agregaría este ajuste al final, antes del return

    IF (LEFT(@ImpLetra,2) = 'UN' AND @ImpLetra LIKE '%MILLONES%')
    BEGIN
    SELECT @ImpLetra = REPLACE(@ImpLetra,'MILLONES','MILLON')
    END

    ResponderEliminar
    Respuestas
    1. voy ha acerlo .. ademas falta agregar a un google driver y lo comparto

      Eliminar
  14. Buenas,

    Tengo problemas ps necesito los centavos tambien

    ResponderEliminar
  15. Necesito agregarle unidades a los centavos alguien me podría ayudar

    ResponderEliminar
  16. Hola Gracias por el aporte necesito que me muestre BILLONES como seria para ese caso.

    ResponderEliminar
  17. Hola buenas tardes, alguna funcion pero para SSRS?

    ResponderEliminar
  18. Gracias Amigo, me sirve muchisimo este codigo, pero una duda. Si los miles van separados por coma que modificacion puedo hacer a este codigo, de antemano gracias

    ResponderEliminar
  19. La función tiene errores, cuando se le pasa 1000001 retorna UN MILLONES MIL UN PESOS 00/100 PESOS

    ResponderEliminar
  20. Mediante estas dos funciones tienes una implementación que soporta hasta el valor máximo de un bigint 9223372036854775807


    select [dbo].[GetNumbertText] (9001372036854775807).




    CREATE FUNCTION [dbo].[GetNumbertText]( @Number bigInt ) RETURNS varchar(255)
    AS
    BEGIN
    DECLARE @ResultVar varchar(255)=''
    Declare @aux1 Varchar(21)
    Declare @g0 Integer, @g1 Integer, @g2 Integer,@g3 Integer, @g4 Integer, @g5 Integer, @g6 Integer
    set @Aux1 = Format(@Number, '000000000000000000000')
    Set @g0= Convert(int, Substring(@aux1,19,3))
    Set @g1= Convert(int, Substring(@aux1,16,3))
    Set @g2= Convert(int, Substring(@aux1,13,3))
    Set @g3= Convert(int, Substring(@aux1,10,3))
    Set @g4= Convert(int, Substring(@aux1,7,3))
    Set @g5= Convert(int, Substring(@aux1,4,3))
    Set @g6= Convert(int, Substring(@aux1,1,3))

    Set @ResultVar= Case when @G6=1 then 'UN TRILLÓN' when @G6>0 then ' ' + [dbo].[GetNumber3DigitText](@G6) + ' TRILLONES' ELSE '' END +
    Case when @G5=1 then ' MIL' when @G5>0 then ' ' + [dbo].[GetNumber3DigitText](@G5) + ' MIL' ELSE '' END +
    Case when @G4=1 then 'UN BILLÓN' When @G5 + @g4 >0 then ' ' + [dbo].[GetNumber3DigitText](@G4) + ' BILLONES' ELSE '' END +
    Case when @G3=1 then ' MIL' when @G3>0 then ' ' + [dbo].[GetNumber3DigitText](@G3) + ' MIL' ELSE '' END +
    Case when @G2=1 then 'UN MILLÖN' When @G3+@g2 >0 then ' ' + [dbo].[GetNumber3DigitText](@G2) + ' MILLONES' ELSE '' END+
    Case when @G1=1 then ' MIL' When @G1>0 then ' ' + [dbo].[GetNumber3DigitText](@G1) + ' MIL' ELSE '' END +
    ' ' + [dbo].[GetNumber3DigitText](@G0)
    RETURN ltrim(@ResultVar)
    END

    ResponderEliminar
    Respuestas
    1. Función dos:


      CREATE FUNCTION [dbo].[GetNumber3DigitText](@Number int ) RETURNS varchar(255)
      AS
      BEGIN

      DECLARE @Cent int, @Dec int, @Und int
      SET @und= @Number % 10
      SET @dec= ((@Number - @Und) / 10) % 10
      SET @Cent = ((@Number - 10* @dec - @Und) / 100)

      DECLARE @ResultVar varchar(255)
      SET @ResultVar =
      Case @Cent
      when 0 then ''
      When 1 Then Case when @Dec*10 + @Und=0 then 'CIEN' else 'CIENTO' end
      When 2 Then 'DOSCIENTOS'
      When 3 Then 'TRESCIENTOS'
      When 4 Then 'CUATROCIENTOS'
      When 5 Then 'QUINIENTOS'
      When 6 Then 'SEISCIENTOS'
      When 7 Then 'SETECIENTOS'
      When 8 Then 'OCHOCIENTOS'
      When 9 Then 'NOVECIENTOS'
      End

      SET @ResultVar = @ResultVar + case Len(@ResultVar) when 0 then '' else ' ' end

      SET @ResultVar = @ResultVar +
      CASE WHEN @Dec<3 THEN '' ELSE
      Case @Dec
      when 0 then ''
      When 1 Then 'DIEZ'
      When 2 Then 'VEINTE'
      When 3 Then 'TREINTA'
      When 4 Then 'CUARENTA'
      When 5 Then 'CINCUENTA'
      When 6 Then 'SESENTA'
      When 7 Then 'SETENTA'
      When 8 Then 'OCHENTA'
      When 9 Then 'NOVENTA'
      End
      END

      SET @ResultVar = Rtrim(@ResultVar) + case Len(@ResultVar) when 0 then '' else ' ' end
      SET @ResultVar = @ResultVar + CASE WHEN @Dec>=3 AND @Und>0 THEN 'Y ' ELSE '' END

      SET @ResultVar = @ResultVar +
      CASE WHEN @Dec<3 OR @Und=0 THEN '' ELSE
      Case @UND
      when 0 then ''
      When 1 Then 'UN'
      When 2 Then 'DOS'
      When 3 Then 'TRES'
      When 4 Then 'CUATRO'
      When 5 Then 'CINCO'
      When 6 Then 'SEIS'
      When 7 Then 'SIETE'
      When 8 Then 'OCHO'
      When 9 Then 'NUEVE'
      End
      END

      SET @ResultVar = Rtrim(@ResultVar) + case when Len(@ResultVar) = 0 or @Dec>=3 then '' else ' ' end

      SET @ResultVar = @ResultVar +
      CASE WHEN @Dec>=3 then '' else
      Case @Dec*10+ @UND
      when 0 then ''
      When 1 Then 'UN'
      When 2 Then 'DOS'
      When 3 Then 'TRES'
      When 4 Then 'CUATRO'
      When 5 Then 'CINCO'
      When 6 Then 'SEIS'
      When 7 Then 'SIETE'
      When 8 Then 'OCHO'
      When 9 Then 'NUEVE'
      When 10 Then 'DIEZ'
      When 11 Then 'ONCE'
      When 12 Then 'DOCE'
      When 13 Then 'TRECE'
      When 14 Then 'CATORCE'
      When 15 Then 'QUINCE'
      When 16 Then 'DIECISÉIS'
      When 17 Then 'DIECISIETE'
      When 18 Then 'DIECIOCHO'
      When 19 Then 'DIECINUEVE'
      When 20 Then 'VEINTE'
      When 21 Then 'VEINTIÚN'
      When 22 Then 'VEINTIDDOS'
      When 23 Then 'VEINTITRÉS'
      When 24 Then 'VEINTICUATRO'
      When 25 Then 'VEINTICINCO'
      When 26 Then 'VEINTISÉIS'
      When 27 Then 'VEINTISIETE'
      When 28 Then 'VEINTIOCHO'
      When 29 Then 'VEINTINUEVE'
      End
      End
      RETURN @ResultVar
      END

      Eliminar
  21. Solo es una función no puedo adaptar para PROCEDDURE, busqueda de datos de un comprobante (tipo, serie , numero) y el total de comprobante convertir a letras, el total es de tipo numerico(10, 2)

    ResponderEliminar
  22. Muchas gracias, estuve buscando algo de esto, excelente aporte.
    Hice algunas modificaciones (En caso de 100 salia CIENTO debe ser CIEN, en caso de 1001 salía UN MIL UN, ahora sale MIL UNO, etc), espero les sirva.

    NOTA: Adaptado para PERÚ.


    CREATE FUNCTION [dbo].[Fn_NumerosALetras]
    (
    @Numero Decimal(18,2)
    )
    RETURNS Varchar(180)
    AS
    BEGIN
    DECLARE @ImpLetra Varchar(180)
    DECLARE @lnEntero bigint,@LenNum int,@lnEntero2 VARCHAR(20),
    @lcRetorno VARCHAR(512),
    @lnTerna bigint,
    @lcMiles VARCHAR(512),
    @lcCadena VARCHAR(512),
    @lnUnidades bigint,
    @lnDecenas bigint,
    @lnCentenas bigint,
    @lnFraccion bigint,
    @tieneMillones bigint
    SELECT @lnEntero = CAST(@Numero AS bigint),
    @lnFraccion = (@Numero - @lnEntero) * 100,
    @lcRetorno = '',
    @lnTerna = 1,
    @lnEntero2= CAST(@lnEntero AS VARCHAR(20)),
    @LenNum=len(@lnEntero2)

    --AQUI VA EL WHILE

    IF @lnTerna = 1
    SELECT @lcRetorno = 'CERO'
    DECLARE @sFraccion VARCHAR(15)
    SET @sFraccion = '00' + LTRIM(CAST(@lnFraccion AS varchar))
    IF @LenNum>2
    BEGIN
    SET @lnUnidades = SUBSTRING(@lnEntero2,@LenNum,1)
    SET @lnDecenas = SUBSTRING(@lnEntero2,@LenNum-1,1)
    SET @lnCentenas = SUBSTRING(@lnEntero2,@LenNum-2,1)
    if @lnDecenas = 0 and @lnUnidades = 1 SET @lcRetorno=SUBSTRING(@lcRetorno,1,len(@lcRetorno)-2) + 'UNO'
    END
    IF @LenNum=4
    BEGIN
    SET @lnUnidades = SUBSTRING(@lnEntero2,1,1)
    if @lnUnidades = 1 SET @lcRetorno=REPLACE(@lcRetorno,'UN ',' ')
    END
    SET @lcRetorno=REPLACE(@lcRetorno,'CIENTO MIL','CIEN MIL')


    SELECT @ImpLetra = RTRIM(@lcRetorno) + ' CON ' + SUBSTRING(@sFraccion,LEN(@sFraccion)-1,2) + '/100 SOLES'
    SET @ImpLetra=REPLACE(@ImpLetra,'CIENTO CON','CIEN CON')
    SET @ImpLetra=REPLACE(@ImpLetra,'VEINTIUN CON','VEINTIUNO CON')
    SET @ImpLetra=REPLACE(@ImpLetra,' Y UN CON', ' Y UNO CON')
    RETURN @ImpLetra

    END;

    ResponderEliminar
  23. se los paso con dolares!!!
    ALTER FUNCTION [dbo].[CantidadConLetra]
    (
    @Numero Decimal(18,2),
    @Moneda int
    )
    RETURNS Varchar(180)
    AS
    BEGIN
    ---ultima parte
    SELECT @ImpLetra = RTRIM(@lcRetorno) + ' PESOS ' + SUBSTRING(@sFraccion,LEN(@sFraccion)-1,2) + '/100 MXN'
    end else
    if @Moneda = 1
    begin
    SELECT @ImpLetra = RTRIM(@lcRetorno) + ' DÓLARES ' + SUBSTRING(@sFraccion,LEN(@sFraccion)-1,2) + '/100 USD'
    end
    RETURN @ImpLetra
    END

    ResponderEliminar
  24. Como utilizar en reporte rdlc te agradezo mucho

    ResponderEliminar
  25. Como seria la funcion con un precio, para euros con sus decimales?

    ResponderEliminar
  26. EXCELENTE APORTE MUCHISIMAS GRACIAS

    ResponderEliminar