• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

passado

Vb.NET com SQL e campo Money

26 mensagens neste tópico

boas pessoal, num projecto que estou a desenvolver tenho alguns campos money, acontece que tou com algumas dificuldades em tratar os dados, sempre que numa textbox escrevo por exemplo "10" ele vai escrever na BD "1000" pensei entao e usar masktextbox tenho entao esta mascara "00,000,000.00 €" ele guarda-me a mesma os valores acrescentando dois "0" e se a masktextbox nao tiver todos os "0" ele da erro ou seja para adicionar correctamente tenho de ter assim por exemplo "00,000,010.00 €" um mal menor mas que me chateia, depois fui ver a uma grid como os valores eram resgatados e eram resgatados assim "100000" pensei em colocar uma formatação na grid e coloquei "00,000,000.00" e pronto na grid ficou tudo a funcionar lindamente, mas eu queria mesmo era resgatar os valores para uma textbox ou assim e entao pensei mais uma vez no masktextbox mas ai os valores sao resgatados assim "10,000,0_ _._ _ €" ou seija em vez de 10.00€ é mostrado um valor diferente, que posso eu fazer para o seguinte efeito:

-> guardar um preço na base de dados

-> resgatar o mesmo preço para uma textbox ou uma masktextbox

-> guardar os valores de modo que depois possam ser somados e posteriormente comparados com outros valores de campos Money

Alguem me consegue ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nos comandos SQL os valores numéricos/decimal.. os valor referente as décimas é separado por . (ponto) e não por virgula.. dos restantes números..

Penso que é esse teu problema.. 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continou com o mesmo problema :S

Mostra o que estás a utilizar ... muita explicação e pouco código :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu nao coloquei o que tenho porque o que tenho e o normal

mas ca vai, botao que insere uma nova maquina que tem um preço

Private Sub bt_addmaq_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_addmaq.Click
        If testar() Then
            Try
                Dim lm As String = "INSERT INTO Maquinas ([marca], [modelo], [descricao], [nserie], [dtaentrada], [custo], [abatida], [alugada], [idcategoria]) VALUES (@marca, @modelo, @descricao, @nserie, @dtaentrada, @custo, @abatida, @alugada, @idcategoria)"

                ' Inicia uma ligação à base de dados
                Using connection As New SqlConnection(Gestão_de_Alugueres.My.Settings.aluguerConnectionString)

                    ' Define o comando e os parâmetros
                    Dim cmd As New SqlCommand(lm, connection)
                    cmd.Parameters.Add("@marca", SqlDbType.NVarChar).Value = MarcaTextBox.Text()
                    cmd.Parameters.Add("@modelo", SqlDbType.NVarChar).Value = ModeloTextBox.Text()
                    cmd.Parameters.Add("@descricao", SqlDbType.NVarChar).Value = DescriçãoTextBox.Text()
                    cmd.Parameters.Add("@nserie", SqlDbType.NVarChar).Value = NserieTextBox.Text()
                    cmd.Parameters.Add("@dtaentrada", SqlDbType.DateTime).Value = DtaentradaDateTimePicker.Value()
                    cmd.Parameters.Add("@custo", SqlDbType.Money).Value = CustoMaskedTextBox.Text()
                    cmd.Parameters.Add("@abatida", SqlDbType.Bit).Value = False
                    cmd.Parameters.Add("@alugada", SqlDbType.Bit).Value = False
                    cmd.Parameters.Add("@idcategoria", SqlDbType.Int).Value = CategoriaComboBox.SelectedValue

                    ' Abre a ligação e insere o registo
                    connection.Open()
                    Dim x As Integer = cmd.ExecuteNonQuery()
                    Dim a As MsgBoxResult
                    a = MsgBox("Registo inserido com sucesso." & Chr(13) & Chr(13) & "Deseja inserir outro registo?", MsgBoxStyle.YesNo)
                    If a = MsgBoxResult.Yes Then
                        limpar()
                    ElseIf a = MsgBoxResult.No Then
                        Me.Close()
                    End If
                    If x <> 1 Then
                        Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
                    End If
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
        MsgBox("Preencha os campos obriatorios")
        End If
    End Sub

resgate de uma maquina

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        If (ListBox1.SelectedValue.ToString() <> "System.Data.DataRowView") Then
            Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
            Dim strSQL As String = "SELECT id, marca, modelo, descricao, nserie, dtaentrada, custo, abatida, motivo, alugada, idcategoria FROM Maquinas WHERE id = " & ListBox1.SelectedValue
            Dim dr As SqlDataReader

            'define objeto connection e command
            Dim con As New SqlConnection(strConn)
            Dim cmd As New SqlCommand(strSQL, con)
            Try
                con.Open()
                dr = cmd.ExecuteReader
                If (dr.HasRows) Then
                    dr.Read()
                    IdTextBox.Text = dr("id").ToString
                    MarcaTextBox.Text = dr("marca").ToString
                    ModeloTextBox.Text = dr("modelo").ToString
                    DescricaoTextBox.Text = dr("descricao").ToString
                    NserieTextBox.Text = dr("nserie").ToString
                    DtaentradaDateTimePicker.Value = dr("dtaentrada").ToString
                    CustoMaskedTextBox.Text = dr("custo")
                    AbatidaCheckBox.Checked = dr("abatida")
                    MotivoRichTextBox.Text = dr("motivo").ToString
                    AlugadaCheckBox.Checked = dr("alugada")
                    IdcategoriaComboBox.SelectedValue = dr("idcategoria").ToString
                End If
            Catch ex As Exception
                MsgBox("Erro ao obter dados. Erro : " & ex.Message)
            Finally
                con.Close()
            End Try
        End If
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E onde dá erro ?

Qual é o resultado de CustoMaskedTextBox.Text ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu nao tenho erro em lado nenhum o problema e que nao faz o que quero, por exemplo assim como tenho ele guardame os valores se os resgatar para uma datagridview com as celulas formatadas fica tudo bem mas depois se os resgatar para uma masktextbox nao fica bem....

E o meu maior problema é se ao adicionar dois "0" se isso vai ter algum problema depois nos calculos, basicamente o que quero e saber a melhor maneira de inserir valores monetarios na bd e resgatalos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que queres dizer com os dois zeros ? É só formatação e não deve dar problema

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a actualizar como assim? a fazer o update a base de dados? estou a fazer da mesma forma do insert

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a actualizar como assim? a fazer o update a base de dados? estou a fazer da mesma forma do insert

Mostra lá

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Private Sub bt_edit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_edit.Click
        Try
            Dim lm As String = "UPDATE Maquinas SET [marca]=@marca,[modelo]=@modelo,[descricao]=@descricao,[nserie]=@nserie,[dtaentrada]=@dtaentrada,[custo]=@custo, [abatida]=@abatida, [motivo]=@motivo, [alugada]=@alugada, [idcategoria]=@idcategoria WHERE id=@id"
            ' Inicia uma ligação à base de dados
            Using connection As New SqlConnection(Gestão_de_Alugueres.My.Settings.aluguerConnectionString)

                ' Define o comando e os parâmetros
                Dim command As New SqlCommand(lm, connection)
                command.Parameters.Add("@marca", SqlDbType.NVarChar).Value = MarcaTextBox.Text
                command.Parameters.Add("@modelo", SqlDbType.NVarChar).Value = ModeloTextBox.Text
                command.Parameters.Add("@descricao", SqlDbType.NVarChar).Value = DescricaoTextBox.Text
                command.Parameters.Add("@nserie", SqlDbType.NVarChar).Value = NserieTextBox.Text
                command.Parameters.Add("@dtaentrada", SqlDbType.DateTime).Value = DtaentradaDateTimePicker.Value
                command.Parameters.Add("@custo", SqlDbType.Money).Value = CustoMaskedTextBox.Text
                command.Parameters.Add("@abatida", SqlDbType.Bit).Value = AbatidaCheckBox.CheckState
                command.Parameters.Add("@motivo", SqlDbType.NVarChar).Value = MotivoRichTextBox.Text
                command.Parameters.Add("@alugada", SqlDbType.Bit).Value = AlugadaCheckBox.CheckState
                command.Parameters.Add("@idcategoria", SqlDbType.Bit).Value = IdcategoriaComboBox.SelectedValue
                command.Parameters.Add("@id", SqlDbType.Int).Value = IdTextBox.Text()

                ' Abre a ligação e insere o registo
                connection.Open()
                Dim x As Integer = command.ExecuteNonQuery()

                If x <> 1 Then
                    Throw New ArgumentException("Não foi possível actualizar o registo na base de dados!")
                Else
                    MsgBox("Actualização realizada com sucesso")
                    LimparForms(GroupBox1)
                    AlugadaCheckBox.Checked = False
                    AbatidaCheckBox.Checked = False
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o resultado quando faço o resgate é, se eu inserir 10.00 quando adiciono a maquina, quando a edito a masktextbox mostrame 10,000,0_ _ , _ _ €

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Trabalhar com números de tamanho variável em caixas CustoMaskedTextBox não provavelmente a melhor das soluções, uma vez que os "." e "," nem sempre ficam nos sítios certos.

Parece-me que o problema aqui se poderá prender com o facto de sql não reconhecer o , como separador decimal, mas como separador dos milhares. Além de não teres provavelmente nalguns casos o valor da caixa totalmente preenchido devolvendo provavelmente 10,000,0_ _ , _ _, algo que cria problemas ao nivel da formatação.

Sugiro que tentes usar uma text box normal. Poderás perder algum tempo a tentares criar um controlo melhorado que format o numero no textchange de forma controlada e permitires apenas a introdução de números e virgulas.

Com os melhores cumprimentos,

Sérgio Matias

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Trabalhar com números de tamanho variável em caixas CustoMaskedTextBox não provavelmente a melhor das soluções, uma vez que os "." e "," nem sempre ficam nos sítios certos.

Parece-me que o problema aqui se poderá prender com o facto de sql não reconhecer o , como separador decimal, mas como separador dos milhares. Além de não teres provavelmente nalguns casos o valor da caixa totalmente preenchido devolvendo provavelmente 10,000,0_ _ , _ _, algo que cria problemas ao nivel da formatação.

Sugiro que tentes usar uma text box normal. Poderás perder algum tempo a tentares criar um controlo melhorado que format o numero no textchange de forma controlada e permitires apenas a introdução de números e virgulas.

Com os melhores cumprimentos,

Sérgio Matias

obrigado pela dica, vou então implementar as textbox normais e ver como corre

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem ao substituir apenas de maskedtextbox para textbox, inseri na textbox onde adiciono a maquina um custo de "1000060" (tal e qual como aqui esta), ao resgatar deveria ter 1000060,00 mas nao o que me devolveu foi "1000060,0000", porque 4 casas decimais? estes campos money estao a dar-me cabo da cabeça....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O arredondamento por defeito do campo money é de 4 casas decimais, mas tens duas alternativas, ou alteras o formato na base de dados para ter apenas duas casas decimais. Outra é usares o formatnumber para formatares o número com apenas duas casas decimais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O arredondamento por defeito do campo money é de 4 casas decimais, mas tens duas alternativas, ou alteras o formato na base de dados para ter apenas duas casas decimais. Outra é usares o formatnumber para formatares o número com apenas duas casas decimais.

uhm estou a perceber depois para mosrar como deve ser o melhor é usar o textchange é isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uhm estou a perceber depois para mosrar como deve ser o melhor é usar o textchange é isso?

por acaso também tive um problema semelhante ao teu, e o que fiz foi a usar a "lei do menos esforço" ou seja, em vez de usar uma maskedbox usei uma textbox e no evento change fiz +/- isto:

http://www.forumweb.com.br/foruns/index.php?/topic/366-formatar-campo-moeda-e-data/

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

por acaso também tive um problema semelhante ao teu, e o que fiz foi a usar a "lei do menos esforço" ou seja, em vez de usar uma maskedbox usei uma textbox e no evento change fiz +/- isto:

http://www.forumweb.com.br/foruns/index.php?/topic/366-formatar-campo-moeda-e-data/

cumps.

Obrigado vasco, vou ver se me resolve o problema

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora