Fórum Preenchimento automatico campo item datagrid #2560

05/02/2009

0

Olá amigos, Estou criando um sistema financeiro. Porém, tenho dúvidas básicas de fundamentos. veja abaixo um exemplo do problema: Tipo de variável 1 - Estou utilizando numeric(18,2) para a variável que guarda o valor total no banco SQL server 2 - Na aplicação Vb.Net estou tratando os valores como inteiro. Problemas e dúvidas: 1 - Quando tenho valores com decimais, o banco de dados arredonda. 2 - Como é a forma correta de trabalhar com moedas num projeto que usa SQL server e Vb.Net ? Abraços e obrigado. Aguardarei retorno.
Cleber Filho

Cleber Filho

Responder

Posts

05/02/2009

Fabio Mans

Olá Cleber. No SQL Server você pode utilizar Money, SmallMoney, Decimal ou Numeric.   Veja o material que retirei do Books Online do SQL Server.   decimal and numeric decimal Fixed precision and scale numeric data from -10^38 +1 through 10^38 –1. numeric Functionally equivalent to decimal. money and smallmoney money Monetary data values from -2^63 (-922,337,203,685,477.5808) through 2^63 - 1 (+922,337,203,685,477.5807), with accuracy to a ten-thousandth of a monetary unit. smallmoney Monetary data values from -214,748.3648 through +214,748.3647, with accuracy to a ten-thousandth of a monetary unit.     No SQL Server o tipo que você está criando está correto, porém na aplicação você não pode utilizar inteiro.   Type Range Size .NET Framework type int -2,147,483,648 to 2,147,483,647 Signed 32-bit integer System.Int32   Como você pode ver acima, ele não possui precisão. Como você vai resolver o seu problema?   Basta você utilizar Double ou Float.     Type Approximate range Precision .NET Framework type double ±5.0 × 10−324 to ±1.7 × 10308 15-16 digits System.Double     Type Approximate range Precision .NET Framework type float ±1.5 × 10−45 to ±3.4 × 1038 7 digits System.Single     Segue abaixo uma tabela com todos os tipos do .NET   Tipos de variáveis: A seguir temos os tipos usado no C# com sua referência no .NET Framework: Tipo C# Tipo .NET Framework Significado             bool System.Boolean Representa valores true e false byte System.Byte inteiro de 8-bit sem sinal sbyte System.SByte   char System.Char Um caractere decimal System.Decimal Tipo numérico para cálculos financeiros double System.Double Ponto flutuante de precisão dupla float System.Single Ponto Flutuante de precisão simples int System.Int32 Inteiro uint System.UInt32 inteiro sem sinal long System.Int64 Inteiro Longo ulong System.UInt64 inteiro longo sem sinal object System.Object objeto short System.Int16 Inteiro Short ushort System.UInt16 Um inteiro short sem sinal string System.String Uma sequencia de caracteres A seguinte tabela mostra os tipos de variáveis e os valores possíveis de se armazenar em cada uma delas.   Tipo C# Valores possíveis de se armazenar bool Verdadeiro ou Falso byte 0 a 255 (8 bits) sbyte -128 a 127 (8 bits) char Um caractere (16 bits) decimal ±1.0 × 10-28 a ±7.9 × 1028 (128 bits) double ±5.0 × 10-324 a ±1.7 × 10308 (64 bits) float ±1.5 × 10-45 a ±3.4 × 1038 (32 bits) int -2,147,483,648 a 2,147,483,647 (32 bits) uint 0 a 4,294,967,295 (32 bits) long –9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 (64 bits) ulong 0 a 18,446,744,073,709,551,615 (64 bits) object Qualquer tipo. short -32,768 a 32,767 (16 bits) ushort 0 a 65,535 (16 bits) string Seqüência de caracteres (16 bits por caractere)   Veja abaixo um método de exemplo.   private void Calculo(int periodo, decimal dDesconto)
    {
        //Valor total
        decimal total = periodo*decimal.Parse(hfTotal.Value);
        //Desconto = Total * 0,10
        decimal desconto = total*dDesconto;
        lblDesconto.Text = string.Format("{0:c}", desconto);
        total = (total - desconto);
        labelTotal.Text = string.Format("{0:c}", total);
        hfPrecoFinal.Value = total.ToString();
    }   Perceba que trabalho com decimal para fazer um cálculo monetário.             Espero ter ajudado, qualquer dúvida retorno.   Fabio Galante Mans     ====================================================================== Olá amigos, Estou criando um sistema financeiro. Porém, tenho dúvidas básicas de fundamentos. veja abaixo um exemplo do problema: Tipo de variável 1 - Estou utilizando numeric(18,2) para a variável que guarda o valor total no banco SQL server 2 - Na aplicação Vb.Net estou tratando os valores como inteiro. Problemas e dúvidas: 1 - Quando tenho valores com decimais, o banco de dados arredonda. 2 - Como é a forma correta de trabalhar com moedas num projeto que usa SQL server e Vb.Net ? Abraços e obrigado. Aguardarei retorno.    
 
Responder

Gostei + 0

05/02/2009

Cleber Filho

Super Fábio, Obrigado pelas informações. Show de bola!!!.
Olha só, eu mudei no SQL sever para decimal(18,2) e na aplicacao coloquei a seguinte propiedade: ------------------------------ Private _fluxocaixa_total As Decimal Public Property fluxocaixa_total() As Decimal Get Return _fluxocaixa_total End Get Set(ByVal value As Decimal) _fluxocaixa_total = value End Set End Property ------------------------------ Tb na aplicação fiz assim: Dim Total As Double = 0 Total = txtTotal.Text // pega informação do form Total = Decimal.Parse(Total.ToString) // converte para decimal fluxocaixa_total = Decimal.Parse(Total.ToString) ------------------------------ Quando o fluxocaixa_total é igual a números inteiros, funciona. Quando o fluxocaixa_total é igual a número decimal não funciona. "There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement." Fico aguardando a sua orientação. abraços e novamente obrigado.
Responder

Gostei + 0

05/02/2009

Cleber Filho

Fábio, consegui trabalhar dentro do VB.NET o double, decimal e etc. Porém, mesmo no SQL com o tipo de dados decimal(18,2), dá erro, ou seja, os 2 lados já estao corretos, porém, quando vou gravar dá erro. Já tentei inclusive colocar aspas na passagem de paramtro da sqlstring e tb deu erro. Abrcs.
Responder

Gostei + 0

05/02/2009

Fabio Mans

Você pode postar o erro?    
Responder

Gostei + 0

05/02/2009

Cleber Filho

Sim, veja ai: "There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement."... PS.: esotu utlizando Decimal tanto na aplicacao quanto no mssql.
Responder

Gostei + 0

05/02/2009

Fabio Mans

O que você está tendo agora é outro problema, vou traduzir o erro.   Há menos colunas na declaração do que os valores previstos INSERIR os VALORES cláusula. O número de valores nos VALORES   Posta sua instrução SQL, confirme o seu insert.   Fabio  
Responder

Gostei + 0

05/02/2009

Cleber Filho

Salve Fabio, obrigado. Consegui resolver o problema. Fiz assim, como estava tentando gravar "0,00" valor com virgula, o sql achava que tinha valores a mais do que campos. Ai, declarei como decimal a variavel e o retorno dela tratei como string. Quando fui gravar no banco de dados, utilizei a string e fiz um replace de "," por "." e disse que era decimal. Pronto. deu certo!. No mais, goste de suas dicas. Guardeis as informacoes que vc me deu. Ajudou bastante a esclarecer. Abraços e até a proxima.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar