Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Tarde a Toldos.
DECLARE @Valor_Mensal AS VARCHAR(40)
DECLARE @Valor_Parcela AS VARCHAR(30)
SET @Valor_Mensal = '20.750,73'
SET @Valor_Mensal = REPLACE(@Valor_Mensal, ',', '')
SET @Valor_Mensal = REPLACE(@Valor_Mensal, '.', '')
-- Determina o valor cada Parcela
SET @Valor_Parcela = @Valor_Mensal / 2
PRINT(@Valor_Parcela)
Retorno -> 1037536
Não é pra voltar desse jeito!
O certo seria assim:
Retorno -> 10.375, 36
Eu estou utilizando o CONVERT(MONEY, CAMPO, 2), mas ele acrescenta ,00 no final. =\
Thks a tocdos.
O problema dessa função é que o cara usa um tratamento para cada número de casa.
Está certo isso ? Não tem outro jeito ?
Eu estou no meio de uma Stored Procedure.
O meu problema é que eu estou usando numeros inteiros.
Sem virgula e sem ponto.
Tipo: 1234567
Dae quando uso essas funções todas ele coloca um ,00 no final.
¬¬
Refiz o texto:
Dando uma pensada no seu caso e na estrutura do SQL, diretamente não sera possível, independenda da versão dao SQL utilizada.
O SQL grava somente os dados, não os formata. Para isso temos os tipos de dados a serem gravados e a função CONVERT nos ajuda até certo ponto. Não é impossível fazer, mas tem que ver se o tempo gasto com isso é válido, sendo que se fizer na aplicação é mais simples de ser feito!
Na função que esta postada no link que te passei, ela lhe ajudaria qdo os campos tem o separador de decimal já no valor sem separador teria que fazer outro tratamento.
Realmente é necessário sair com dados formatados do SQL?
Abçs
Vlw cara.
Não consegui até agora.
Tentei várias coisas.
Eu preciso só pelo menos de colocar um ponto antes das duas casas.
1234567
Assim: 12345.67
Dá pra fazer multiplicação com decimal ?
Pq eu tento fazer ele acusa: que não pode fazer isso com INT, tipo 1235.67 / 2.
Não posso multiplicar um FLOAT ou DECIMAL por um INT.
:S
Go Back, eu refiz minha colocacao no post anterior e nem reparei que estava lendo o post. Me desculpe.
Qual a finalidade final desta formatacao? Pq nao faz o calculo antes e depois formata a saida? É para algum relatório em RP (Reporting Serv.) ou B.I (saída em excel por exemplo)?
Abçs
É que assim, em uma tabela eu tenho um campo Valor_Total.
Eu preciso multiplicar esse Valor por um determinado número de Parcelas que eu gero na Procedure.
Estou fazendo um sistema de faturamento.
Daí eu recebo o valor: 10.000,00. Detalhe, este é um campo Varchar.
Esse campo é tratado em outras páginas que eu desenvolvi. E tratei direto na linguagem, que é o ASP.
Daí beleza, eu recebo o 10,000.00.
Eu não consigo fazer a multiplicação por um número devido a vírgula e o ponto.
Então eu fiz um REPLACE na Stored Procedure para retirar tanto a vírgula como o ponto.
Daí ficou 1000000.
Daí sim eu consigo dividir por um número inteiro.
Por exemplo, no meu caso aqui está sendo o 12.
Daí eu divido, 1000000 / 12 = 83333333.
Aí que está o problema.
Eu preciso pelo menos colocar um ponto nas duas ultimas casas pra eu determinar que são os centavos.
Assim: 833.33
Mas eu não consigo fazer isso.
Eu faço o CONVERT(MONEY), CONVERT(DECIMAL), CONVERT(FLOAT) e ele não formata o campo como eu quero.
Não dá pra fazer isso na linguagem pois estou em uma Stored Procedure como já falado.
E eu preciso fazer esse tratamento porquê eu estou salvando esses valores gerados para outra tabela, que é a de Faturamento.
Que depois eu vou usar num relatório Crystal Report. E preciso pelo menos do ponto, porquê daí ele entende que são os centavos e me mostra o valor correto no relatório.
Passei por uma situação parecida com a sua, deixa eu ver se tenho acesso a solução e já posto.. guentai ai....
mas no meu caso a saída era em Excel.
Valew s2
Go Back,
Nos relatórios que achei, usei a função que esta no fórum, e a formatação foi feita diretamente na aplicação.
Resolvi....
Agora só falta arredondar corretamente.
Nem pra mais nem pra menos, mas exatamente.
Tem como ?
Eu uso o Floor, Round... Ele arredonda, mas na hora da soma, dá diferença do valor inicial.
=\
Quando se fala de "arredondamento" nao tem como, ou eh pra mais ou pra menos. Matematica pura. você pode trazer todos os registros e na aplicacao mostrar somente dois digitos, mas acho que vai arredondar do mesmo jeito
Como que resolveu?
Está comentado na linha de como eu resolvi.
ALTER PROCEDURE SP_Faturamento
@Cod_Contrato AS INT
AS
BEGIN
DECLARE @cString AS VARCHAR(MAX) -- Variável para Query.
DECLARE @Valor_Mensal AS VARCHAR(20) -- Valor Mensal do Contrato
DECLARE @Dt_Inicio AS VARCHAR(15) -- Data de Ínicio do Contrato
DECLARE @Dt_Fim AS VARCHAR(15) -- Data de Fim do Contrato
DECLARE @Tipo AS VARCHAR(15) -- Tipo do Faturamento (Ex. Mensal, Bimestral)
DECLARE @Dt_Next AS VARCHAR(15) -- Próxima Data da Parcela
DECLARE @Transaction AS VARCHAR(20) -- Nome da Transação
DECLARE @Dt_Fat AS VARCHAR(15) -- Data do Faturamento
DECLARE @Valor_Parcela AS VARCHAR(50) -- Valor de cada Parcela
DECLARE @Qtd_Meses AS INT -- Quantidade de Meses de Acordo com o Tipo de Faturamento
DECLARE @Diff AS INT -- Diferença entre @Dt_Inicio e @Dt_Fim
DECLARE @Parcelas AS INT -- Resultado da @Diff dividido por @Tipo
DECLARE @X AS INT -- Contador
DECLARE @Parcelas_Ft AS DECIMAL(3,1) -- Formata valor da parcela com ponto.
SET @Transaction = 'Faturamento'
-- Consulta para trazer as informações acima de determinado Contrato.
SELECT
@Dt_Inicio = CONVERT(VARCHAR, DtInicio, 103),
@Dt_Fim = CONVERT(VARCHAR, DtFim, 103),
@Dt_Fat = CONVERT(VARCHAR, DtFaturamento, 103),
@Valor_Mensal = VlMensal,
@Tipo = QtdMeses-- Cálculo para trazer a diferença entre a Data de Ínicio e Data de Fim do Contrato.
SELECT @Diff = DATEDIFF(mm, CONVERT(DATETIME,@Dt_Inicio,103), CONVERT(DATETIME,@Dt_Fim,103))
-- Cálculo para trazer a Quantidade de Parcelas do Faturamento.
IF @Tipo = 'Mensal'
SET @Qtd_Meses = 1
ElSE IF @Tipo = 'Bimestral'
SET @Qtd_Meses = 2
ELSE IF @Tipo = 'Trimestral'
SET @Qtd_Meses = 3
ELSE IF @Tipo = 'Quadrimestral'
SET @Qtd_Meses = 4
ELSE IF @Tipo = 'Semestral'
SET @Qtd_Meses = 6
-- Parcelas
SET @Parcelas = @Diff / @Qtd_Meses
-- RESOLVI AQUI, EU CONVERTI UM INT EM FLOAT, POR EXEMPLO 12, PARA 12.0
SET @Parcelas_Ft = CONVERT(DECIMAL(3,1), @Parcelas)
-- DEPOIS EU RETIREI A VIRGULA, DEPOIS EU SUBSTITUÍ A VIRGULA DO FINAL POR UM PONTO, PARA DETERMINAR QUE SÃO OS CENTAVOS.
-- Retira pontos e vírgulas do Valor.
SET @Valor_Mensal = REPLACE(@Valor_Mensal, '.', '')
SET @Valor_Mensal = REPLACE(@Valor_Mensal, ',', '.')
-- DEPOIS MULTIPLIQUEI DOIS FLOAT CONVERTIDOS ACIMA. E EMBAIXO EU CONVERTI PARA NUMERIC
-- Determina o valor cada Parcela
SET @Valor_Parcela = CONVERT(NUMERIC(15,2), @Valor_Mensal) / @Parcelas_Ft
SET @X = 1
-- Transação
BEGIN TRANSACTION @Transaction
-- Percorre o total de parcelas e insere tabela de Faturamento.
WHILE @X <= @Parcelas
BEGIN
-- Insere as parcelas na tabela Faturamento.
INSERT INTO TblFin_Faturamento (ID_CodContrato, VlVenda, DtPrevFaturamento, Status)
VALUES (@Cod_Contrato, CONVERT(DECIMAL(15,2),@Valor_Parcela), CONVERT(DATETIME, @Dt_Fat, 103), 'Não')
SET @X = @X + 1
-- Adiciona meses a Data Inicial do Faturamento
SET @Dt_Fat = CONVERT(VARCHAR, DATEADD(MONTH, @Qtd_Meses, @Dt_Fat), 103)
END
-- Verifica se houve falhas na transação. Se sim volta ao seu status anterior.
IF @@ERROR <> 0
ROLLBACK TRANSACTION @Transaction
ELSE
COMMIT TRANSACTION @Transaction
Isso pode lhe ajudar:
http://forum.imasters.com.br/topic/223479-formatar-valores-numericos-no-sql/