none
Sql arredondando valor automaticamente RRS feed

  • Pergunta

  • Boa noite, estou com um problema para gravar um valor monetário no BD, já busquei em fóruns e etc mas nehumas das soluções me ajudou espero que aqui alguém possa.

    Estou criando um programa em vb.net 2010 e há um cadastro de produtos não ocorre erros ao gravar mas ao verificar o que foi gravado o valor não aparece com os centavos olhem como eu fiz.

    codigo do VB.

     Dim DA As New DSvendasTableAdapters.TABPRODUTOSTableAdapter

       DA.Insertpro(txtNompro.Text, txtPrepro.Text, txtQtdAtual.Text, txtQtdmin.Text, txtQtdmax.Text)


    o txtprepro.text é o valor do produto(ex. 1,99) e formatei para aceitar apenas números e virgula(também usei ponto), ao clicar no gravar não ocorre erro mas o consultar o produto o valor aparece como 2,00. Todo numero que eu coloque com centavos ele arredonda para cima ou para baixo os centavos sempre ficam como 00.

    No sql estou usando como numeric(10,2) para o valor do produto segue o insert do produto:

    INSERT INTO [dbo].[TABPRODUTOS] ( [Nompro], [Prepro], [Atupro], [Minpro], [Maxpro]) 
    VALUES ( @Nompro, @Prepro, @Atupro, @Minpro, @Maxpro);
    SELECT Nompro, Prepro, Atupro, Minpro, Maxpro 
    FROM TABPRODUTOS 

    Será que alguém tem uma luz?

    sábado, 9 de fevereiro de 2013 23:16

Respostas

  • Bom dia Kyuza,

    Apenas para constatar que o problema não é com o datatype usado, fiz esse simples exemplo:

    declare @table table (valor numeric(10,2))
    
    insert into @table values(1.99)
    select * from @table

    Quando vc estiver gravando em um campo decimal/numeric, voce terá que enviar esses valores com "." ponto. Quanto ao arredondamento, seria interessante você vc dar um "print" nesse valor pela sua aplicação, para ter certeza do valor que ele está submentendo no "insert".

    At.
    Rafael

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:50
    segunda-feira, 11 de fevereiro de 2013 12:38
  • Olá,

    É provavel que seu problema não esteja no MS SQL e sim na codificação que você fez para inserir os valores , qual o tipo de variavel que você está armazenando esse dado? Se for integer já vai arrendondado automáticamente para 2 no caso tem que ser utilizado o tipo double que aceita ponto flutuante do VB.net.

    Para idêntificar o problema entre no VS e faça um break na linha que está sendo passado os valores e verifique qual a informação passando o mouse sobre a variável e verifique qual o valor se é 1,99 ou 2 .


    Américo Arvani
    MCP Frw web 2.0 / MCPD (Enterprise Application Developer) Frw web/win/wcf 3.5
    MBA – Post Graduate in Strategic Management of Information Technology
    Se funcionou compartilhe a solução.
    http://americoarvani.blogspot.com
    View Americo Arvani's profile on LinkedIn

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:50
    sexta-feira, 15 de fevereiro de 2013 17:22

Todas as Respostas

  • Bom dia Kyuza,

    Apenas para constatar que o problema não é com o datatype usado, fiz esse simples exemplo:

    declare @table table (valor numeric(10,2))
    
    insert into @table values(1.99)
    select * from @table

    Quando vc estiver gravando em um campo decimal/numeric, voce terá que enviar esses valores com "." ponto. Quanto ao arredondamento, seria interessante você vc dar um "print" nesse valor pela sua aplicação, para ter certeza do valor que ele está submentendo no "insert".

    At.
    Rafael

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:50
    segunda-feira, 11 de fevereiro de 2013 12:38
  • Kyuza,

    Como esta definida as configurações regionais do seu Windows?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 13 de fevereiro de 2013 17:28
  • Então Rafael, já tentei com o "." também e da o mesmo resultado arredondando para cima ou para baixo, sobre o que vc disse "Quanto ao arredondamento, seria interessante você vc dar um "print" nesse valor pela sua aplicação, para ter certeza do valor que ele está submentendo no "insert". "  Eu não entendi estou no level easy sobre o sql rsrsrs
    quinta-feira, 14 de fevereiro de 2013 22:13
  • Junior o default é o português mas já alterei para o inglês também mas nada mudou continuou do mesmo jeito =/
    • Editado kyuza quinta-feira, 14 de fevereiro de 2013 22:14
    quinta-feira, 14 de fevereiro de 2013 22:14
  • Kyuza,

    O "Print", eu quero dizer na propria aplicação.... para vc ver o conteudo das variaveis. Disse "print" pq cada linguagem usa um comando/termo diferente, tipo  "Alert", "ShowMessage"....etc. O debug também seria interessante.

    At.
    Rafael

    sexta-feira, 15 de fevereiro de 2013 10:47
  • Olá,

    É provavel que seu problema não esteja no MS SQL e sim na codificação que você fez para inserir os valores , qual o tipo de variavel que você está armazenando esse dado? Se for integer já vai arrendondado automáticamente para 2 no caso tem que ser utilizado o tipo double que aceita ponto flutuante do VB.net.

    Para idêntificar o problema entre no VS e faça um break na linha que está sendo passado os valores e verifique qual a informação passando o mouse sobre a variável e verifique qual o valor se é 1,99 ou 2 .


    Américo Arvani
    MCP Frw web 2.0 / MCPD (Enterprise Application Developer) Frw web/win/wcf 3.5
    MBA – Post Graduate in Strategic Management of Information Technology
    Se funcionou compartilhe a solução.
    http://americoarvani.blogspot.com
    View Americo Arvani's profile on LinkedIn

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:50
    sexta-feira, 15 de fevereiro de 2013 17:22
  • Kyuza,

    Você definiu alguma máscara para formatação de valores na sua aplicação para estes campos?

    Qual é o digito formatar de casas decimais e valores de milhares que você definiu?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 16 de fevereiro de 2013 12:21
  • Boa tarde pessoal foi mal a demora estava com problemas na minha net, mas então resolvi o problema conforme abaixo mas não sei se é uma gambiarra ou se ta de acordo rsrsrs mas pelo menos funfou tks a todos.

     Dim DA As New DSvendasTableAdapters.TABPRODUTOSTableAdapter

     

    No btn gravar:

    Dim valorpro As Double
    valorpro = txtPrepro.Text

    DA.Insertpro(txtNompro.Text, valorpro, txtQtdAtual.Text, txtQtdmin.Text, txtQtdmax.Text)


    No sql estou usando como numeric(10,2) para o valor do produto segue o insert do produto:

    INSERT INTO [dbo].[TABPRODUTOS] ( [Nompro], [Prepro], [Atupro], [Minpro], [Maxpro]) 
    VALUES ( @Nompro, @valorpro, @Atupro, @Minpro, @Maxpro);
    SELECT Nompro, Prepro, Atupro, Minpro, Maxpro 
    FROM TABPRODUTOS 

    domingo, 24 de fevereiro de 2013 19:32