viernes, 20 de octubre de 2017

Convertir Numero a Letra SQL SERVER Numero a letra

La siguiente función sql server convierte un numero a letra soporta hasta 12 dígitos es decir hasta 999,999,999,999.99

Con este tutorial puedes convertir cualquier numero en letra de forma fácil y rápida con la ayuda de este SP.








CREATE FUNCTION [dbo].[CantidadConLetra]
(
    @Numero             Decimal(18,2)
)
RETURNS Varchar(180)
AS
BEGIN
    DECLARE @ImpLetra Varchar(180)
        DECLARE @lnEntero bigint,
                        @lcRetorno VARCHAR(512),
                        @lnTerna bigint,
                        @lcMiles VARCHAR(512),
                        @lcCadena VARCHAR(512),
                        @lnUnidades bigint,
                        @lnDecenas bigint,
                        @lnCentenas bigint,
                        @lnFraccion bigint
        SELECT  @lnEntero = CAST(@Numero AS bigint),
                        @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 bigint)
            SELECT @lnDecenas = @lnEntero % 10
            SELECT @lnEntero = CAST(@lnEntero/10 AS bigint)
            SELECT @lnCentenas = @lnEntero % 10
            SELECT @lnEntero = CAST(@lnEntero/10 AS bigint)
            -- 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 'DIECISEIS '
                  WHEN 7 THEN 'DIECISIETE '
                  WHEN 8 THEN 'DIECIOCHO '
                  WHEN 9 THEN 'DIECINUEVE '
                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 M.N.'
   RETURN @ImpLetra
END;


14 comentarios:

  1. gran aporte, muy facil de portear a sqlscript

    ResponderEliminar
  2. ya arreglaste para que diga un millon en vez de millones?

    ResponderEliminar
  3. Hola! no calcula la parte de millares? Gracias

    ResponderEliminar
  4. WHEN @lnTerna = 2 THEN @lcCadena + 'MIL '
    WHEN @lnTerna = 3 THEN @lcCadena + IIF(@lnUnidades = 1,'MILLON ','MILLONES ')
    WHEN @lnTerna = 4 THEN @lcCadena + 'MIL '

    ResponderEliminar
  5. No funciona cuando el valor es 4000000

    ResponderEliminar
    Respuestas
    1. para los 4 millones 4000000
      WHEN @lnTerna = 2 THEN @lcCadena + IIF(@lnUnidades = 0,'', 'MIL ')

      1 millon o 2 millones
      WHEN @lnTerna = 3 THEN @lcCadena + IIF(@lnUnidades = 1,'MILLON ','MILLONES ')

      Eliminar
  6. no funcioana,, truena como matraca

    select dbo.CantidadConLetra(100000)

    regresa:
    CIENTO PESOS 00/100 M.N.

    convertire mejor la formula que hice en crystal reports

    ResponderEliminar
  7. Muchas Gracias por la función, anda de lujo.

    ResponderEliminar
  8. CONSULTA EN SQL SEVER PARA CONVERTIR UN NUMERO A TEXTO

    ResponderEliminar
  9. me parece interesante y pues te dejo este link que puede ser de mucha utilidad https://thedevelopmentstages.com/category/convertir-numero-a-letras/

    ResponderEliminar

Comenta cualquier duda o recomendatorio.