Jump to content

Vb.NET com SQL e campo Money


passado

Recommended Posts

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?

Link to comment
Share on other 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
Link to comment
Share on other 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

Link to comment
Share on other 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
Link to comment
Share on other 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

ser.gifsartim.gif

Link to comment
Share on other 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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.