Jump to content
Fórum Script Brasil
  • 0

Numero por Extenso (hectares)


Abelhajr

Question

fala galera, seguinte possuo uma procedure para ler um numero e devolver o valor por extenso para um determinado numero no meu relatório do ireport, como não tenho muita experiencia com sql gostaria de pedir ajuda a vocês.

Bom se fosse para passar um numero para real meu problema estaria resolvido, mais preciso alterar essa procedure para hectares.

O formato que vem do banco dos hectares é assim 63,4836 (Sessenta e Três hectares Quatro mil Oitocentos e Trinta e Seis metros quadrados), deixe eu explicar melhor como funciona.

Um hectare equivale a 10.000 metros quadrados por isso depois da virgula vem os metros quadrados, ou seja apos a virgula o numero maximo é 9,999 pois acima disso seria equivalente a 1 hectare o que contaria antes da virgula.

Um outro problema é que o banco exclui os zeros em números cadastrados: exemplo 63,4(Sessenta e Três hectares e Quatro Mil metros Quadrados) ou seja a procedure teria que entender que o 4 apos a virgula equivale a Quatro Mil Metros Quadrados ao invés de Quatro Metros Quadrados, e para que equivale a Quatro Metros Quadrados seja 63,0004.

Tenho um problema também com virgulas o numero vem assim só com uma virgula que separa a quantidade de hectares dos metros quadrados. 63454,4(Sessenta e Três Mil Quatrocentos e Cinquenta e Quatro Hectares Quatro Mil Metros Quadrados) sendo assim a procedure terá que fazer a leitura sem se basear na virgula e sim na quantidade de números.

Essa é a procedure:

SET QUOTED_IDENTIFIER OFF 

GO

SET ANSI_NULLS OFF 

GO





CREATE PROCEDURE [Monetario_Nivel1_RetornoValorPorExtenso]



@valor_numerico as varchar(3),

@valor_porextenso as varchar(100) out



AS



declare @valor_len as int

declare @unidade as varchar(50)

declare @dezena as varchar(50)

declare @centena as varchar(50)



set @valor_len = len(@valor_numerico)



if( right(@valor_numerico,1) between 1 and 9 ) 

begin

   select @unidade = case right(@valor_numerico,1)

   when 1 then 'Um'

   when 2 then 'Dois'

   when 3 then 'Três'

   when 4 then 'Quatro'

   when 5 then 'Cinco'

   when 6 then 'Seis'

   when 7 then 'Sete'

   when 8 then 'Oito'

   when 9 then 'Nove'

   end

end



if( right(@valor_numerico,2) between 10 and 19 ) 

begin

   select @unidade = case right(@valor_numerico,2)

   when 10 then 'Dez'

   when 11 then 'Onze'

   when 12 then 'Doze'

   when 13 then 'Treze'

   when 14 then 'Quatorze'

   when 15 then 'Quinze'

   when 16 then 'Dezesseis'

   when 17 then 'Dezessete'

   when 18 then 'Dezoito'

   when 19 then 'Dezenove'

   end

end



if( len(@valor_numerico) >= 2 and cast(right(@valor_numerico,2) as char(1)) between 2 and 9 )

begin

   select @dezena = case cast(right(@valor_numerico,2) as char(1))

   when 2 then 'Vinte'

   when 3 then 'Trinta'

   when 4 then 'Quarenta'

   when 5 then 'Cinquenta'

   when 6 then 'Sessenta'

   when 7 then 'Setenta'

   when 8 then 'Oitenta'

   when 9 then 'Noventa'

   end

end



if( len(@valor_numerico) = 3 and cast(right(@valor_numerico,3) as char(1)) between 1 and 9 )

begin

   select @centena = case cast(right(@valor_numerico,3) as char(1))

   when 1 then 'Cento'

   when 2 then 'Duzentos'

   when 3 then 'Trezentos'

   when 4 then 'Quatrocentos'

   when 5 then 'Quinhentos'

   when 6 then 'Seiscentos'

   when 7 then 'Setecentos'

   when 8 then 'Oitocentos'

   when 9 then 'Novecentos'

   end

end



if @unidade is not null

   set @valor_porextenso = @unidade



if @dezena is not null and @unidade is null

   set @valor_porextenso = @dezena

else if @dezena is not null and @unidade is not null

   set @valor_porextenso = @dezena + ' e ' + @unidade



if @centena is not null

begin

   set @valor_porextenso = @centena

   if @dezena is not null and @unidade is null

      set @valor_porextenso = @centena + ' e ' + @dezena

   else if @dezena is not null and @unidade is not null

      set @valor_porextenso = @centena + ' e ' + @dezena + ' e ' + @unidade

   else if @dezena is null and @unidade is not null

      set @valor_porextenso = @centena + ' e ' + @unidade

   if( @valor_porextenso = 'Cento' )

      set @valor_porextenso = 'Cem'

end



GO

SET QUOTED_IDENTIFIER OFF 

GO

SET ANSI_NULLS ON 

GO



SET QUOTED_IDENTIFIER OFF 

GO

SET ANSI_NULLS OFF 

GO





CREATE PROCEDURE [Monetario_RetornoValorPorExtenso]



@valor_numerico as varchar(100),   --FORMATO: 1.123,00

@valor_porextenso_completo as varchar(500) out



AS



if @valor_numerico is null

   return 1

if @valor_numerico = ''

   return 2



declare @valor_numerico_tmp as varchar(100)

declare @valor_numerico_spt as varchar(100)

declare @valor_num_inter as varchar(100)

declare @valor_num_cent as varchar(100)

declare @valor_porextenso as varchar(500)

declare @index as int

declare @final as int

declare @x as int



-- separa valor inteiro e centavo.

set @valor_num_inter = replace( left(@valor_numerico,len(@valor_numerico)-2), ',' , '.' )

set @valor_num_cent = right( @valor_numerico, 2 )

set @valor_numerico_tmp = @valor_num_inter

set @x = 0

set @index = 0



/* 

looping para gerar o valor por extenso de cada parte do valor inteiro; 

exemplo: 123.456.

executa primeiro para 123 em seguida para 456.

*/

while( 0 = 0 )

begin

   set @valor_numerico_tmp = right( @valor_numerico_tmp, len( @valor_numerico_tmp ) - @index )

   set @index = charindex( '.', @valor_numerico_tmp )

   if( @index < 1 ) break

   set @final = charindex( '.', @valor_numerico_tmp ) - 1

   set @valor_numerico_spt = substring( @valor_numerico_tmp, 1, @final )



   exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_spt, @valor_porextenso out



   set @x = @x + 1

   if( len(@valor_num_inter) < 5 )

   begin

      if( @x = 1 )

         set @valor_porextenso_completo = @valor_porextenso

   end



   if( len(@valor_num_inter) between 5 and 9 )

   begin

      if( @x = 1 )

         set @valor_porextenso_completo = @valor_porextenso + ' Mil'

      if( @x = 2 )

         set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso 

   end



   if( len(@valor_num_inter) > 9 )

   begin

      if( @x = 1 )

      begin      

         if( cast(@valor_numerico_spt as int) > 1 )

           set @valor_porextenso_completo = @valor_porextenso + ' Milhões '

         else

           set @valor_porextenso_completo = @valor_porextenso + ' Milhão '

      end

      if( @x = 2 )

         set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil' 

      if( @x = 3 )

         set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso 

   end

end



set @valor_porextenso_completo = @valor_porextenso_completo + ' Hectares'



if( @valor_num_cent > 0 )

begin

   exec Monetario_Nivel1_RetornoValorPorExtenso @valor_num_cent, @valor_porextenso out

   if( @valor_num_cent > 1 )

      set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Metros Quadrados'

   else

      set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Metro Quadrado'

end

GO

SET QUOTED_IDENTIFIER OFF 

GO

SET ANSI_NULLS ON 

GO



declare @valor_numerico as varchar(100)





declare @valor_porextenso as varchar(500)







set @valor_numerico = '6.054,540,40'







exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out







print @valor_porextenso

espero poder contar com a ajuda de vocês

abraços

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Bom dia Abelha,

Dei uma olhada rápida em sua procedure, mas não identifiquei nenhuma variável criada como DECIMAL.

Quando precisar de manipular informações depois da vírgula, o melhor tipo para se utilizar seria este.

Se utilizar int, terá um problema com as casas decimais. Da mesma forma se utilizar varchar, onde os cálculos ficarão difíceis de fazer... tente fazer a implementação utlizando o DECIMAL.

Ex.:

DECLARE @teste DECIMAL (5,4)

SET @teste = 5

SELECT @teste

Link to comment
Share on other sites

  • 0
Bom dia Abelha,

Dei uma olhada rápida em sua procedure, mas não identifiquei nenhuma variável criada como DECIMAL.

Quando precisar de manipular informações depois da vírgula, o melhor tipo para se utilizar seria este.

Se utilizar int, terá um problema com as casas decimais. Da mesma forma se utilizar varchar, onde os cálculos ficarão difíceis de fazer... tente fazer a implementação utlizando o DECIMAL.

Ex.:

DECLARE @teste DECIMAL (5,4)

SET @teste = 5

SELECT @teste

então cara o pior é que eu so meio noob em sql sei bem o basicão mesmo achei essa procedure no forum e precisava adaptala pro que escrevi la encima e to tendo um problemao com isso, to tentando e não to conseguindo nada e precisava disso ai porque tão meio que cobrando aqui no trampo.

obrigado pela ajuda

Link to comment
Share on other sites

  • 0

é.... acho q vou começar a cobrar!!! hehehehehe... brincadeira.

Seguinte: a 1ª procedure [Monetario_Nivel1_RetornoValorPorExtenso] continuará da mesma forma.

A 2ª procedure teve uma alteração. O problema foi a formatação do número. O cara colocou a formatação de 2 casas decimais após a virgula (que era especificado na própria procedure). Sendo assim, ele fazia um teste simples apenas. Como agora terá 4 casas, é necessário o loop para identificar os MIL e o resto do número.

Alterei a estrutura. Ela está agora para 4 casas decimais fixas. Se rolar mais 1 casa decimal? Terá que alterar a estrutura novamente, ok?

Fiz aqui rápido. Faça bastante testes para ver se está ok.

Segue o script. Se tiver tudo ok, depois passo a conta pra depósito!!! rs...

create PROCEDURE [Monetario_RetornoValorPorExtenso]

@valor_numerico as varchar(100),

@valor_porextenso_completo as varchar(500) out

AS

if @valor_numerico is null

   return 1

if @valor_numerico = ''

   return 2

declare @valor_numerico_tmp as varchar(100)

declare @valor_numerico_spt as varchar(100)

declare @valor_num_inter as varchar(100)

declare @valor_num_cent as varchar(100)

declare @valor_porextenso as varchar(500)

declare @index as int

declare @final as int

declare @x as int

-- separa valor inteiro e centavo.

set @valor_num_inter = replace( left(@valor_numerico,len(@valor_numerico)), ',' , '.' )

set @valor_num_cent = right( @valor_numerico, 4 )

set @valor_numerico_tmp = @valor_num_inter

set @x = 0

set @index = 0

while( 0 = 0 )

begin

   set @valor_numerico_tmp = right( @valor_numerico_tmp, len( @valor_numerico_tmp ) - @index )

   set @index = charindex( '.', @valor_numerico_tmp )

   if( @index < 1 ) break

   set @final = charindex( '.', @valor_numerico_tmp ) - 1

   set @valor_numerico_spt = substring( @valor_numerico_tmp, 1, @final )

   exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_spt, @valor_porextenso out


   set @x = @x + 1

   if( len(@valor_num_inter) < 5 )

   begin

      if( @x = 1 )

         set @valor_porextenso_completo = @valor_porextenso

   end



   if( len(@valor_num_inter) between 5 and 9 )

   begin

      if( @x = 1 )

         set @valor_porextenso_completo = @valor_porextenso + ' Mil'

      if( @x = 2 )

         set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso

   end

   if( len(@valor_num_inter) > 9 )

   begin

      if( @x = 1 )

      begin      

         if( cast(@valor_numerico_spt as int) > 1 )

           set @valor_porextenso_completo = @valor_porextenso + ' Milhões '

         else

           set @valor_porextenso_completo = @valor_porextenso + ' Milhão '

      end

      if( @x = 2 )

         set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil'

      if( @x = 3 )

         set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso

   end

end


set @valor_porextenso_completo = @valor_porextenso_completo + ' Hectares'


if( @valor_num_cent > 0 )

begin

while( 0 = 0 )

begin

   set @valor_numerico_tmp = substring(@valor_num_cent, 1, 1)

   IF cast(@valor_numerico_tmp AS INT) = 0 BREAK
   
   exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_tmp, @valor_porextenso out

   set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Mil'

   set @valor_numerico_tmp = (substring(@valor_num_cent, 2, 3))    
   
   IF cast(@valor_numerico_tmp AS INT) = 0 BREAK
      
   exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_tmp, @valor_porextenso OUT
   
   set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso
   
   IF cast(@valor_numerico_tmp AS INT) < 999 BREAK
    
END

   set @valor_porextenso_completo = @valor_porextenso_completo + ' Metros Quadrados'

end


declare @valor_numerico as varchar(100)
declare @valor_porextenso as varchar(500)
set @valor_numerico = '6.054.540,4935'
exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out

print @valor_porextenso

Link to comment
Share on other sites

  • 0

valeu pela ajuda cara,

então testei aqui e ele esta lendo tipo assim

se jogo um numero 54,1234 o certo seria Cinquenta e Quatro Hectares Um Mil Duzentos e Trinta e Quatro Metros Quadrados

o jeito de ler hectares e diferente do de ler um numero normal

com o que você altero esta saindo assim: Cinquenta e Quatro Mil Hectares e Trinta e Quatro Metros Quadrados

ele ainda elimina os dois primeiros numeros após a virgula.

Link to comment
Share on other sites

  • 0

O formato do número é: 6.054.540,4935

A procedure lê esta forma de número. Quer dizer: as centenas separadas por PONTO e as casas decimais separadas por VIRGULA.

O número passado tem q estar neste formato. Teste com o número 6.054.540,4935 que veio de exemplo na procedure que funcionará.

A tarde vou testar o número que passou: 54,1234

Link to comment
Share on other sites

  • 0

foi mal e que dexei o numero na procedure mais a forma que vem mesmo da area total do terreno e sempre essa 54,1234 podendo ser de 0 a quatro casas a pos a virgula e antes da virgula geralmente sem limites. sendo que ser vir 54,4 a procedure tera que entender como 54,4000 e se for para ser 54, 4 metros ai o numero vai vir assim do banco 54,0004

Link to comment
Share on other sites

  • 0

cara consegui uma function melhor e já dei uma ajeitada nela o que acontece e o seguinte ela até le os caracteres apos a virgula so que ela aproxima dos dois primeiros apos a virgula, ou seja se o o valor passado for 54,3499 ele vai informar por extenso como 54,35 entendeu, falta so ele ler os 4 caracters apos a virgula, desconsiderar os caractes apos os quatro primeiros depois da virgula caso aja mais ou seja se tiver um numer 54,34999999 ele vai ler so ate o quarto depois da virgula: 54,3499 entendeu e aquela questao de acrescentar zero(0) caso não complete 4 numeros apos a virgula ou seja 54,34 vai ficar 54,3400.

segue a function

CREATE FUNCTION dbo.GrupoExtenso(@VALOR DECIMAL(18, 4))
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE
@STR_EXT VARCHAR(255),
@AUX INT,
@VALOR_T INT

SET @STR_EXT = ''
SET @AUX = 0

SET @VALOR_T = ROUND(@VALOR, 0)
SET @AUX = @VALOR_T - (@VALOR_T % 100)


IF (@VALOR_T = 100) SET @STR_EXT = ' Cem'
ELSE IF (@AUX = 100) SET @STR_EXT = ' Cento'
ELSE IF (@AUX = 200) SET @STR_EXT = ' Duzentos'
ELSE IF (@AUX = 300) SET @STR_EXT = ' Trezentos'
ELSE IF (@AUX = 400) SET @STR_EXT = ' Quatrocentos'
ELSE IF (@AUX = 500) SET @STR_EXT = ' Quinhentos'
ELSE IF (@AUX = 600) SET @STR_EXT = ' Seiscentos'
ELSE IF (@AUX = 700) SET @STR_EXT = ' Setecentos'
ELSE IF (@AUX = 800) SET @STR_EXT = ' Oitocentos'
ELSE IF (@AUX = 900) SET @STR_EXT = ' Novecentos'

IF (((@VALOR_T - @AUX) <> 0) AND (@AUX <> 0)) 
SET @STR_EXT = @STR_EXT+' e'

SET @AUX = (@VALOR_T % 100) - (@VALOR_T % 10)


IF ((@AUX = 0) and (@VALOR_T < 10))
BEGIN
SET @AUX = (@VALOR_T % 10)

IF (@AUX = 1) SET @STR_EXT = @STR_EXT+' Um'
ELSE IF (@AUX = 2) SET @STR_EXT = @STR_EXT+' Dois'
ELSE IF (@AUX = 3) SET @STR_EXT = @STR_EXT+' Tres'
ELSE IF (@AUX = 4) SET @STR_EXT = @STR_EXT+' Quatro'
ELSE IF (@AUX = 5) SET @STR_EXT = @STR_EXT+' Cinco'
ELSE IF (@AUX = 6) SET @STR_EXT = @STR_EXT+' Seis'
ELSE IF (@AUX = 7) SET @STR_EXT = @STR_EXT+' Sete'
ELSE IF (@AUX = 8) SET @STR_EXT = @STR_EXT+' Oito'
ELSE IF (@AUX = 9) SET @STR_EXT = @STR_EXT+' Nove'
END


SET @AUX = (@VALOR_T % 100) - (@VALOR_T % 10)

IF (@AUX = 10)
BEGIN
SET @AUX = (@VALOR_T % 10)

IF (@AUX = 0) SET @STR_EXT = @STR_EXT+' Dez'
ELSE IF (@AUX = 1) SET @STR_EXT = @STR_EXT+' Onze'
ELSE IF (@AUX = 2) SET @STR_EXT = @STR_EXT+' Doze'
ELSE IF (@AUX = 3) SET @STR_EXT = @STR_EXT+' Treze'
ELSE IF (@AUX = 4) SET @STR_EXT = @STR_EXT+' Quatorze'
ELSE IF (@AUX = 5) SET @STR_EXT = @STR_EXT+' Quinze'
ELSE IF (@AUX = 6) SET @STR_EXT = @STR_EXT+' Dezesseis'
ELSE IF (@AUX = 7) SET @STR_EXT = @STR_EXT+' Dezessete'
ELSE IF (@AUX = 8) SET @STR_EXT = @STR_EXT+' Dezoito'
ELSE IF (@AUX = 9) SET @STR_EXT = @STR_EXT+' Dezenove'
END
ELSE
BEGIN
IF (@AUX = 20) SET @STR_EXT = @STR_EXT+' Vinte'
ELSE IF (@AUX = 30) SET @STR_EXT = @STR_EXT+' Trinta'
ELSE IF (@AUX = 40) SET @STR_EXT = @STR_EXT+' Quarenta'
ELSE IF (@AUX = 50) SET @STR_EXT = @STR_EXT+' Cinquenta'
ELSE IF (@AUX = 60) SET @STR_EXT = @STR_EXT+' Sessenta'
ELSE IF (@AUX = 70) SET @STR_EXT = @STR_EXT+' Setenta'
ELSE IF (@AUX = 80) SET @STR_EXT = @STR_EXT+' Oitenta'
ELSE IF (@AUX = 90) SET @STR_EXT = @STR_EXT+' Noventa'

IF ((@AUX <> 0) and ((@VALOR_T % 10) <> 0))
BEGIN
SET @STR_EXT = @STR_EXT+' e'

SET @AUX = (@VALOR_T % 10)

IF (@AUX = 1) SET @STR_EXT = @STR_EXT+' Um'
ELSE IF (@AUX = 2) SET @STR_EXT = @STR_EXT+' Dois'
ELSE IF (@AUX = 3) SET @STR_EXT = @STR_EXT+' Tres'
ELSE IF (@AUX = 4) SET @STR_EXT = @STR_EXT+' Quatro'
ELSE IF (@AUX = 5) SET @STR_EXT = @STR_EXT+' Cinco'
ELSE IF (@AUX = 6) SET @STR_EXT = @STR_EXT+' Seis'
ELSE IF (@AUX = 7) SET @STR_EXT = @STR_EXT+' Sete'
ELSE IF (@AUX = 8) SET @STR_EXT = @STR_EXT+' Oito'
ELSE IF (@AUX = 9) SET @STR_EXT = @STR_EXT+' Nove'
END
END

RETURN(@STR_EXT);
END

GO



CREATE FUNCTION dbo.TrataGrupoExtenso(
@GRUPO DECIMAL(18, 5), @SINGULAR VARCHAR(50), 
@PLURAL VARCHAR(50), @FLAG_E INT, @STR_EXT VARCHAR(255))
RETURNS @RESULTADO TABLE (FLAG_E INT, STR_EXT varchar(250))
AS
BEGIN
DECLARE
@RETORNO VARCHAR(255),
@FLAG INT

SET @RETORNO = @STR_EXT
SET @FLAG = @FLAG_E

IF (@GRUPO <> 0)
BEGIN
IF (@FLAG_E = 1) SET @RETORNO = @RETORNO + ' e'
SET @FLAG_E = 1
SET @RETORNO = @RETORNO + (SELECT dbo.GrupoExtenso(@grupo))
IF (@GRUPO = 1) SET @RETORNO = @RETORNO + @SINGULAR
ELSE SET @RETORNO = @RETORNO + @PLURAL
END
INSERT @RESULTADO
(FLAG_E, STR_EXT) VALUES (@FLAG, @RETORNO)
RETURN
END

GO




CREATE FUNCTION dbo.Extenso(@VALOR DECIMAL(18, 5))
RETURNS VARCHAR(255)
AS
BEGIN

DECLARE
@STR_EXT VARCHAR(255),
@FLAG_E INT,
@GRUPO DECIMAL(10, 2),
@MOEDA VARCHAR(10),
@MOEDA_PLURAL VARCHAR(10),
@FLAG_CENTAVOS DECIMAL(18, 5)

-- Aqui você podera configurar a descricao da Moeda
SET @MOEDA = 'Hectar' 
SET @MOEDA_PLURAL = 'Hectares'
SET @FLAG_CENTAVOS = 1 -- Exibir os centavos [ 0) não 1) Sim ]

SET @STR_EXT = ''
SET @FLAG_E = 0
SET @GRUPO = 0

IF ((CONVERT(INT, @VALOR) - (CONVERT(INT, @VALOR) % 1)) = 0)
BEGIN
SET @STR_EXT = ' Zero'
END
ELSE
BEGIN
DECLARE @TEMPINT BIGINT
-- SET @TEMPINT = (.000000001*((CONVERT(BIGINT, @VALOR) % 1000000000000) 
-- - (CONVERT(BIGINT, @VALOR) % 1000000000)))
-- SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT FROM dbo.TrataGrupoExtenso(
-- @TEMPINT, ' Bilhão', ' Bilhões', @FLAG_E, @STR_EXT)

SET @TEMPINT = .000001*((CONVERT(INT, @VALOR) % 1000000000) 
- (CONVERT(INT, @VALOR) % 1000000))

SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT 
FROM dbo.TrataGrupoExtenso(
@TEMPINT, ' Milhão' , ' Milhões', @FLAG_E, @STR_EXT)

SET @TEMPINT = .001*((CONVERT(INT, @VALOR) % 1000000) - 
(CONVERT(INT, @VALOR) % 1000))

SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT 
FROM dbo.TrataGrupoExtenso(
@TEMPINT, ' Mil' , ' Mil', @FLAG_E, @STR_EXT)

SET @TEMPINT = (CONVERT(INT, @VALOR) % 1000)

SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT 
FROM dbo.TrataGrupoExtenso(
@TEMPINT, '' , '', @FLAG_E, @STR_EXT)
END

IF (ROUND(@VALOR, 0) = 1) 
BEGIN
SET @STR_EXT = @STR_EXT + ' '+RTRIM(@MOEDA)
END
ELSE
BEGIN
IF (ROUND(@VALOR, -6) <> 0) and 
(ROUND(@VALOR, 0) - ROUND(@VALOR, -6) = 0)
SET @STR_EXT = @STR_EXT + ' de ' + RTRIM(@moeda_plural)
ELSE
SET @STR_EXT = @STR_EXT + ' ' + RTRIM(@moeda_plural)
END

IF (@FLAG_CENTAVOS = 1)
BEGIN
SET @FLAG_E = 1;

DECLARE @TEMPINT2 BIGINT
-- SET @TEMPINT2 = 100*(@VALOR - ROUND(@VALOR, 0))

set @TEMPINT2 = cast(right(cast(cast(@VALOR as numeric(10,2)) as varchar(15)),2) as BIGINT)

-- Aqui você podera mudar a descricao dos centavos
SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT 
FROM dbo.TrataGrupoExtenso(
@TEMPINT2, ' Metro Quadrado' , ' Metros Quadrados', @FLAG_E, @STR_EXT)
END

RETURN @STR_EXT 
END

GO

SELECT dbo.Extenso(54.3499)

Link to comment
Share on other sites

  • 0

Gostei da implementação, mas a segunda procedure q passou estava um pouco grande e com muitas variáveis e loops.

Como as casas são fixas (por se tratarem de números), seria mais interessante fazer uma implementação mais estática, ao invés de dinâmica como os Whiles....

Tentei pegar a mesma estrutura e implementar novamente. Retirei os loops e algumas variáveis... acho q agora tá ok. Com os números no formato 54, 4 ou 54,4 . Coloque os números sem ponto. Apenas o delimitador vírgula para os casas decimais.

Dê uma olhada:

create PROCEDURE [Monetario_RetornoValorPorExtenso]

@valor_numerico as varchar(100), @valor_porextenso_completo as varchar(500) out
AS
DECLARE @valor_porextenso as varchar(500)
DECLARE @Centena VARCHAR(3)
DECLARE @Mil VARCHAR(3)
DECLARE @Milhao VARCHAR(3)
DECLARE @CentenaDecimal VARCHAR(3)
DECLARE @MilDecimal VARCHAR(3)
DECLARE @numero as varchar(100)
DECLARE @CasasDecimais as varchar(100)

--declare @valor_numerico as varchar(100)

--SET @valor_numerico = '32354, 32'

IF CHARINDEX(' ', @valor_numerico)=0
BEGIN
    SET @CasasDecimais = len(SUBSTRING (@valor_numerico, CHARINDEX(',', @valor_numerico)+1, LEN(@valor_numerico)))
    IF @CasasDecimais = 1 
        SET @valor_numerico = @valor_numerico + '000'
    IF @CasasDecimais = 2
        SET @valor_numerico = @valor_numerico + '00'
    IF @CasasDecimais = 3
        SET @valor_numerico = @valor_numerico + '0'
END
ELSE
BEGIN
    SET @CasasDecimais = len(SUBSTRING (@valor_numerico, CHARINDEX(',', @valor_numerico)+1, LEN(@valor_numerico)))-1
    IF @CasasDecimais = 1 
        set @valor_numerico = REPLACE(@valor_numerico, ' ' , '000') 
    IF @CasasDecimais = 2
        set @valor_numerico = REPLACE(@valor_numerico, ' ' , '00') 
    IF @CasasDecimais = 3
        set @valor_numerico = REPLACE(@valor_numerico, ' ' , '0') 
END

--PRINT @valor_numerico

set @numero = (LEFT(@valor_numerico, CHARINDEX(',', @valor_numerico)-1))
set @valor_porextenso_completo = ''

-- Identifica os milhões
SET @Milhao = (SUBSTRING(@numero, len(@numero)-8, 3))
IF isnumeric(@Milhao)=1
BEGIN
    exec Monetario_Nivel1_RetornoValorPorExtenso @Milhao, @valor_porextenso OUT
    IF CAST (@Milhao AS INT) = 1
        set @valor_porextenso_completo = @valor_porextenso + ' Milhão, '
    ELSE
        set @valor_porextenso_completo = @valor_porextenso + ' Milhões, '
END

-- Identifica os mils
SET @Mil = (SUBSTRING(@numero, len(@numero)-5, 3))
IF isnumeric(@Mil)=1
BEGIN
    exec Monetario_Nivel1_RetornoValorPorExtenso @Mil, @valor_porextenso OUT
    set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil, '
END

-- Identifica as centenas
SET @Centena = (SUBSTRING(@numero, len(@numero)-2, 3))
IF isnumeric(@Centena)=1
BEGIN
    exec Monetario_Nivel1_RetornoValorPorExtenso @Centena, @valor_porextenso OUT
    set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' hectares, '
END

set @numero = CAST((right(@valor_numerico, CHARINDEX(',', @valor_numerico)-2)) AS INT)

-- Identifica os mils decimais
IF len(@numero)> 3
BEGIN
    SET @MilDecimal = (left(@numero, 1))
    IF isnumeric(@MilDecimal)=1
    BEGIN
        exec Monetario_Nivel1_RetornoValorPorExtenso @MilDecimal, @valor_porextenso OUT
        set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil '
    END
END

-- Identifica as centenas decimais
SET @CentenaDecimal = (right(@numero, 3))
IF isnumeric(@CentenaDecimal)=1
BEGIN
    exec Monetario_Nivel1_RetornoValorPorExtenso @CentenaDecimal, @valor_porextenso OUT
    set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' metros quadrados.'
END





declare @valor_numerico as varchar(100)
declare @valor_porextenso as varchar(500)
set @valor_numerico = '32354,332'
exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out

print @valor_porextenso

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...