Preenchimento automatico campo item datagrid
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
Curtidas 0
Respostas
Fabio Mans
05/02/2009
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.
{
//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.
GOSTEI 0
Cleber Filho
05/02/2009
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.
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.
GOSTEI 0
Cleber Filho
05/02/2009
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.
GOSTEI 0
Fabio Mans
05/02/2009
Você pode postar o erro?
GOSTEI 0
Cleber Filho
05/02/2009
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.
GOSTEI 0
Fabio Mans
05/02/2009
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
GOSTEI 0
Cleber Filho
05/02/2009
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.
GOSTEI 0