Ir para conteúdo
Fórum Script Brasil

Abelhajr

Membros
  • Total de itens

    5
  • Registro em

  • Última visita

Tudo que Abelhajr postou

  1. 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)
  2. 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
  3. 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.
  4. 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
  5. 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
×
×
  • Criar Novo...