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

Convertir cantidad a letras SQL SERVER 2005

Estas en el tema de Convertir cantidad a letras SQL SERVER 2005 en el foro de SQL Server en Foros del Web. He investigado y no se recomienda que esta lógica la tenga la Base de datos, sin embargo por tema de Crystal Report (VS 2005) me ...
  #1 (permalink)  
Antiguo 09/03/2012, 11:23
Avatar de dolorosaclaridad  
Fecha de Ingreso: noviembre-2011
Mensajes: 45
Antigüedad: 12 años, 5 meses
Puntos: 1
Convertir cantidad a letras SQL SERVER 2005

He investigado y no se recomienda que esta lógica la tenga la Base de datos, sin embargo por tema de Crystal Report (VS 2005) me veo en la obligacion de traermelo desde la BD.

Alguien sabe de alguna función para convertir una cantidad en palabras?, por ejemplo:

10125450 a "diez millones ciento veinticinco mil cuatrocientos cincuenta".

Agradecido de Antemano.
  #2 (permalink)  
Antiguo 09/03/2012, 12:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Convertir cantidad a letras SQL SERVER 2005

Checa esto:

Alguna vez publique esta rutina para SQL Server 2000, verifica si te sirve:


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
__________________
MCTS Isaias Islas

Última edición por iislas; 09/03/2012 a las 12:49
  #3 (permalink)  
Antiguo 09/03/2012, 13:29
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Convertir cantidad a letras SQL SERVER 2005

bien dicen el que busca encuentra :), hice una busqueda en google "convert number to word sql server" y aparecen varios resultados que funcionan por ejemplo este:



Código SQL:
Ver original
  1. DECLARE @NUMBER INT
  2.  SET @NUMBER=10125450
  3.    
  4.  DECLARE @RESULT VARCHAR(100), @word VARCHAR(100), @GROUP VARCHAR(100)  
  5.  DECLARE @i INT, @j INT, @m INT, @digit VARCHAR(2), @cn VARCHAR(20)  
  6.  
  7.  IF @NUMBER = 0 print 'Zero'  
  8.  
  9.  SELECT @RESULT = '', @word = '', @GROUP = ''  
  10.    
  11.  SET @cn = @NUMBER  
  12.  SET @cn = REPLACE(@cn,',','')  
  13.  SET @m = LEN(@cn) % 3  
  14.  IF @m > 0 SET @cn = REPLICATE('0',3-@m) + @cn    -- Left pad with zeroes to a multiple of 3  
  15.  
  16.  SET @i = 1  
  17.  SET @j = LEN(@cn)-@i+1  
  18.  SET @m = @i % 3  
  19.  WHILE @i <= LEN(@cn)  
  20.  BEGIN  
  21.   -- @i is 1 origin index into numeric string while @m = @i modulo 3  
  22.   -- If the middle digit of each group of 3 is a '1' then this is a 'Ten' or a '...teen'  
  23.   IF @m = 2 AND SUBSTRING(@cn,@i,1) = '1'  
  24.   BEGIN  
  25.    SET @digit = SUBSTRING(@cn,@i,2)  
  26.    -- Skip rightmost digit of 3 if processing teens  
  27.    SET @i = @i + 1  
  28.   END  
  29.   ELSE  
  30.    SET @digit = SUBSTRING(@cn,@i,1)  
  31.  
  32.   SET @word =  
  33.   CASE  
  34.    WHEN @m = 0 THEN         -- Rightmost digit of group of 3  
  35.     CASE @digit  
  36.      WHEN '0' THEN ''  
  37.      WHEN '1' THEN 'One'  
  38.      WHEN '2' THEN 'Two'  
  39.      WHEN '3' THEN 'Three'  
  40.      WHEN '4' THEN 'Four'  
  41.      WHEN '5' THEN 'Five'  
  42.      WHEN '6' THEN 'Six'  
  43.      WHEN '7' THEN 'Seven'  
  44.      WHEN '8' THEN 'Eight'  
  45.      WHEN '9' THEN 'Nine'  
  46.     END +  
  47.     CASE  
  48.      WHEN (@GROUP <> '' OR @digit <> '0') AND (@j+2) / 3 = 2 THEN ' Thousand'  
  49.      WHEN (@GROUP <> '' OR @digit <> '0') AND (@j+2) / 3 = 3 THEN ' Million'  
  50.      WHEN (@GROUP <> '' OR @digit <> '0') AND (@j+2) / 3 = 4 THEN ' Billion'  
  51.      ELSE ''  
  52.     END  
  53.    WHEN LEN(@digit) = 2 THEN       -- Special case when middle digit is a '1'  
  54.     CASE @digit  
  55.      WHEN '10' THEN 'Ten'  
  56.      WHEN '11' THEN 'Eleven'  
  57.      WHEN '12' THEN 'Twelve'  
  58.      WHEN '13' THEN 'Thirteen'  
  59.      WHEN '14' THEN 'Fourteen'  
  60.      WHEN '15' THEN 'Fifteen'  
  61.      WHEN '16' THEN 'Sixteen'  
  62.      WHEN '17' THEN 'Seventeen'  
  63.      WHEN '18' THEN 'Eighteen'  
  64.      WHEN '19' THEN 'Nineteen'  
  65.     END +  
  66.     CASE  
  67.      WHEN (@GROUP <> '' OR @digit <> '00') AND (@j+2) / 3 = 2 THEN ' Thousand'  
  68.      WHEN (@GROUP <> '' OR @digit <> '00') AND (@j+2) / 3 = 3 THEN ' Million'  
  69.      WHEN (@GROUP <> '' OR @digit <> '00') AND (@j+2) / 3 = 4 THEN ' Billion'  
  70.      ELSE ''  
  71.     END  
  72.    WHEN @m = 2 THEN         -- Middle digit of group of 3  
  73.     CASE @digit  
  74.      WHEN '2' THEN 'Twenty'  
  75.      WHEN '3' THEN 'Thirty'  
  76.      WHEN '4' THEN 'Forty'  
  77.      WHEN '5' THEN 'Fifty'  
  78.      WHEN '6' THEN 'Sixty'  
  79.      WHEN '7' THEN 'Seventy'  
  80.      WHEN '8' THEN 'Eighty'  
  81.      WHEN '9' THEN 'Ninety'  
  82.      ELSE ''  
  83.     END  
  84.    WHEN @m = 1 THEN         -- Leftmost digit of group of 3  
  85.     CASE @digit  
  86.      WHEN '0' THEN ''  
  87.      WHEN '1' THEN 'One'  
  88.      WHEN '2' THEN 'Two'  
  89.      WHEN '3' THEN 'Three'  
  90.      WHEN '4' THEN 'Four'  
  91.      WHEN '5' THEN 'Five'  
  92.      WHEN '6' THEN 'Six'  
  93.      WHEN '7' THEN 'Seven'  
  94.      WHEN '8' THEN 'Eight'  
  95.      WHEN '9' THEN 'Nine'  
  96.     END +  
  97.     CASE WHEN @digit <> '0' THEN ' Hundred' ELSE '' END  
  98.   END  
  99.  
  100.   SET @GROUP = @GROUP + RTRIM(@word)      -- Group value  
  101.  
  102.   IF @word <> ''  
  103.   BEGIN  
  104.    DECLARE @prefix VARCHAR(20)  
  105.    IF CHARINDEX(' ',@word) > 0 SET @prefix = LEFT(@word,CHARINDEX(' ',@word)) ELSE SET @prefix = @word  
  106.    IF RIGHT(@RESULT,2) = 'ty' AND @prefix IN ('One','Two','Three','Four','Five','Six','Seven','Eight','Nine')  
  107.     SET @RESULT = @RESULT + '-' + LTRIM(@word)  
  108.    ELSE  
  109.     SET @RESULT = @RESULT + ' ' + LTRIM(@word)  
  110.   END  
  111.   -- The following needs to be outside of a UDF to work:  
  112.   --IF @debug = 1 SELECT @cn as 'Number', @i as '@i', @j as '@j', @m as '@m', @digit as '@digit', CAST(replace(@group,' ','`') AS CHAR(30)) as '@group', @word as '@word', @result as '@result'  
  113.   SET @i = @i + 1  
  114.   SET @j = LEN(@cn)-@i+1  
  115.   SET @m = @i % 3  
  116.   IF @m = 1 SET @GROUP = ''        -- Clear group value when starting a new one  
  117.  
  118.  END  
  119.  
  120.  IF @RESULT = '' SET @RESULT = '0'  
  121.  print @RESULT

Aqui el link de donde saque ese codigo

http://www.sqlservercentral.com/Foru...134-149-1.aspx

Nada mas cambia las palabras de ingles al español y listo tienes tu funcion :)

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 12/03/2012, 08:10
Avatar de dolorosaclaridad  
Fecha de Ingreso: noviembre-2011
Mensajes: 45
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Convertir cantidad a letras SQL SERVER 2005

muchas gracias por las respuestas, todo lo deje en un SP, y el luego cuando lo necesito ejecuto el SP. saludos

Etiquetas: letras, numeros, sql
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 13:59.