Jump to content

Verificar se o registo já existe na base de dados access


Go to solution Solved by Tareko,

Recommended Posts

Posted (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 by Caça
GeSHi
Posted

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

Posted

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

Posted

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.

Posted

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

Posted

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

Posted

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

  • 2 weeks later...
  • Solution
Posted

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
Posted

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? 😛

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.