Tareko Posted September 25, 2012 at 08:23 PM Report #476512 Posted September 25, 2012 at 08:23 PM (edited) Boas Estou a tentar fazer um programa em que tenho que registar clientes. Gostaria de saber como é que consigo procurar na base de dados access se o nome do cliente já existe de modo a impedir registos duplicados. Tenho apenas o código para guardar o registo, alguem me pode ajudar? (peço desculpa por não colocar o codigo da maneira correcta mas mesmo pesquizando os post não consegui saber como se faz) Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "" Then MsgBox("O nome do cliente é obrigatório") Else clientes.ClientesTableAdapter.Insert(Me.TextBox1.Text, Me.TextBox2.Text, Me.TextBox3.Text, Me.TextBox4.Text, Me.TextBox5.Text) clientes.ClientesTableAdapter.Fill(clientes.BDComdomoniumDataSet.Clientes) MsgBox("Registo Adicionado") Me.Close() End If End Sub cumprimentos Tiago Edited September 26, 2012 at 08:07 AM by Caça GeSHi
cmd Posted September 25, 2012 at 09:18 PM Report #476544 Posted September 25, 2012 at 09:18 PM Olá, Antes de fazeres o Insert deves fazer um Select à tua base de dados, "buscando" pelo nome de utilizador (porque é este campo que queres que seja único) e verificar se o Select retorna algum registo, se retornar significa que existem utilizadores, senão não existe lá ninguém 🙂 Cumps.cmd
Tareko Posted September 26, 2012 at 06:37 PM Author Report #476680 Posted September 26, 2012 at 06:37 PM Boas Obrigado pela explicação. A lógica já percebi, mas como os meus conhecimentos de programação sao fraquinhos só consegui pensar nisto :s Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim teste As String = "SELECT count(*) FROM Clientes where Nome_do_cliente = '" & Me.TextBox2.Text & "'" If teste > 0 Then MsgBox("Já existe um registo") Else clientes.ClientesTableAdapter.Insert(Me.TextBox1.Text, Me.TextBox2.Text, Me.TextBox3.Text, Me.TextBox4.Text, Me.TextBox5.Text) clientes.ClientesTableAdapter.Fill(clientes.BDComdomoniumDataSet.Clientes) MsgBox("Registo Adicionado") Me.Close() End If Onde existe o erro "A conversão da cadeia "SELECT count(*) FROM Clientes wh" para o tipo 'Double' não é válida." na linha If teste > 0 Then Tenho o raciocinio errado? obg
acao Posted September 26, 2012 at 07:38 PM Report #476685 Posted September 26, 2012 at 07:38 PM boas talvez ajude vê aqui é para sql server mas é identico só muda a a ligação á base dados. http://www.jorgepaulino.com/2008/04/vbnet-gesto-de-dados-em-sql-server_16.html e isto https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/ https://wiki.portugal-a-programar.pt/dev_net/vb.net/dadosaccessoraclesqlserv/ https://wiki.portugal-a-programar.pt/dev_net/vb.net/gestao_bases_dados_access/ cumps acao
samesdavis Posted September 26, 2012 at 09:56 PM Report #476698 Posted September 26, 2012 at 09:56 PM Em minha humilde opinião, fazer uma busca pelo nome do cliente não é uma boa opção porque podem existir nomes iguais. Ex.: João da Silva. O que eu acho mais correto é fazer um cadastro de clientes por uma chave que pode até ser um CPF ou RG.
Tareko Posted October 1, 2012 at 04:48 PM Author Report #477332 Posted October 1, 2012 at 04:48 PM Boas obrigado pelas ajudas Em minha humilde opinião, fazer uma busca pelo nome do cliente não é uma boa opção porque podem existir nomes iguais. Ex.: João da Silva. O que eu acho mais correto é fazer um cadastro de clientes por uma chave que pode até ser um CPF ou RG. Têm razão, mas se eu conseguisse fazer pelo nome tambêm o conseguia alterar, o que não está facil... :S
Tareko Posted October 1, 2012 at 07:59 PM Author Report #477347 Posted October 1, 2012 at 07:59 PM Boas. Ddado as pesquisas que fiz este é o código que tenho até agora Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BDComdomonium.accdb") Dim com As OleDbCommand = Nothing Dim queryResult As Integer con.Open() com = New OleDbCommand("SELECT COUNT(*) FROM Clientes WHERE Nome_do_Cliente ='" & Me.TextBox1.Text & "'", con) queryResult = com.ExecuteScalar() con.Close() If queryResult = 0 Then con.Open() com = New OleDbCommand("INSERT INTO Clientes (Nome_do_Cliente) VALUES (@Nome_do_Cliente)", con) com.ExecuteNonQuery() con.Close() Else MsgBox("Este registo já existe") End If Creio que vou no caminho certo mas aind an funciona... 1- Dá o segundo erro no comando ExecuteScalar() "Não foi fornecido nenhum valor para um ou mais parâmetros necessários." 2 - Na realidade na minha tabela o "Nome_do_Cliente" está como "Nome do Cliente". Como me refiro entao à coluna? Ou tenho que mudar na tabela? Grato por qualquer ajuda
ricasss Posted October 2, 2012 at 08:35 AM Report #477401 Posted October 2, 2012 at 08:35 AM Boas. Ddado as pesquisas que fiz este é o código que tenho até agora Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BDComdomonium.accdb") Dim com As OleDbCommand = Nothing Dim queryResult As Integer con.Open() com = New OleDbCommand("SELECT COUNT(*) FROM Clientes WHERE Nome_do_Cliente ='" & Me.TextBox1.Text & "'", con) queryResult = com.ExecuteScalar() con.Close() If queryResult = 0 Then con.Open() com = New OleDbCommand("INSERT INTO Clientes (Nome_do_Cliente) VALUES (@Nome_do_Cliente)", con) com.ExecuteNonQuery() con.Close() Else MsgBox("Este registo já existe") End If Creio que vou no caminho certo mas aind an funciona... 1- Dá o segundo erro no comando ExecuteScalar() "Não foi fornecido nenhum valor para um ou mais parâmetros necessários." 2 - Na realidade na minha tabela o "Nome_do_Cliente" está como "Nome do Cliente". Como me refiro entao à coluna? Ou tenho que mudar na tabela? Grato por qualquer ajuda [Nome do Cliente] embora não devias ter dado o nome a uma tabela com espaços
rumbafum Posted October 2, 2012 at 08:40 AM Report #477403 Posted October 2, 2012 at 08:40 AM o teu problema não é esse. O problema é dares um parâmetro de entrada na query de insert mas não teres definido esse mesmo parâmetro...@Nome_do_Cliente
Solution Tareko Posted October 16, 2012 at 08:02 PM Author Solution Report #479395 Posted October 16, 2012 at 08:02 PM Resolvido Não sei se será a maneira mais correcta de fazer, mas parece que na minha situação funciona bem. Aqui fica meu codigo Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BDComdomonium 2.0.accdb") Dim com As OleDbCommand = Nothing Dim queryResult As Integer con.Open() com = New OleDbCommand("SELECT COUNT(*) FROM Clientes WHERE Nome_do_Cliente ='" & Me.TextBox1.Text & "'", con) queryResult = com.ExecuteScalar() con.Close() If queryResult = 0 Then con.Open() com = New OleDbCommand("INSERT INTO Clientes ([Nome_do_Cliente], [Data_de_Criação],[Telefone],[E-mail],[Morada],[NIF]) VALUES ([@Nome_do_Cliente], [@Data_de_Criação],[@Telefone],[@E-mail],[@Morada],[@NIF])", con) com.Parameters.AddWithValue("@Nome_do_Cliente", OleDbType.VarChar).Value = Me.TextBox1.Text com.Parameters.AddWithValue("@Data_de_Criação", OleDbType.VarChar).Value = Today.ToShortDateString com.Parameters.AddWithValue("@Telefone", OleDbType.VarChar).Value = Me.TextBox2.Text com.Parameters.AddWithValue("@E-mail", OleDbType.VarChar).Value = Me.TextBox3.Text com.Parameters.AddWithValue("@Morada", OleDbType.VarChar).Value = Me.TextBox4.Text com.Parameters.AddWithValue("@NIF", OleDbType.VarChar).Value = Me.TextBox5.Text If Me.TextBox1.Text = "" Then MsgBox("O Campo 'Nome do Cliente' deverá ser preenchido") Else com.ExecuteNonQuery() con.Close() MsgBox("Registo adicionado") Clientes.Close() Clientes.Show() Me.Close() End If Else MsgBox("Já existe um registo com este nome") Me.TextBox1.Text = "" Me.TextBox2.Text = "" Me.TextBox3.Text = "" Me.TextBox4.Text = "" Me.TextBox5.Text = "" End If End Sub End Class
Tareko Posted October 17, 2012 at 07:57 PM Author Report #479551 Posted October 17, 2012 at 07:57 PM Boas Agora dei com um problema. Apesar deste codigo funcionar bem com todas as tabelas que o apliquei até agora, ao fazer a mesma pesquisa para a tabela "Despesa_de_Condomínio" dá-me o erro "O motor de base de dados do Microsoft Office Access não conseguiu localizar a tabela de entrada ou a consulta 'Despesa_de_Condomínio'. Verifique se a tabela ou a consulta existe e se o nome foi introduzido correctamente." A unica diferença que esta tabela tem das outras é o facto de ter o underscore no nome. Ja esperimentei com () e com [] mas continua a dar sempre o mesmo erro. Alguma sugestão? 😛
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now