Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Go Back

Campo Money

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

¬¬

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

É 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

=\

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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
FROM 
	TblComContratos
WHERE
	CodContrato = @Cod_Contrato

-- 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
-- Fim da Transação.
END
GO

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.