Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Form pesquisa dentro do form original

Recommended Posts

Ola pessoal.

Peguei o tutorial que esta em http://www.macoratti.net/08/06/vbn_psv2.htm, e resolvi colocar o form de pesquisa que la esta no formulario de cadastro de clientes.

 

Meu código abaixo, faz a filtragem normal e exibe no gridview normal mas na hora que eu vou selecionar o registro no grid e entregar ao formulario, simplesmente não funciona.

 

O que será que esta faltando?

 

Meu código:

 

Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where Nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		Dim linha As Integer = DGWClientes.CurrentRow.Index
		'Obtem o elemento da coluna ClienteID
		Dim P_Codigo As String = DGWClientes.Item("ClienteID", linha).Value.ToString
		'Definimos como OK o resultado da janela de diálogo
		Me.DialogResult = System.Windows.Forms.DialogResult.OK
	End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse eu ja matei mas agora deu um problema.

 

No código quie puz para resolver este problema, tem um linha que me retorna o valor do clienteID que esta na tabela do banco de dados. O problema é que não esta me retornando o valor do clienteID mas sim quantos resultados foram aferidos na consulta exposta no grid.

Por exemplo:

No grid sairam os id's: 01, 02, 03 e 05

Caso eu selecione no grid o id 05, o código abaixo esta me retornando 04 pois é o 04 registro a ser listado no grid.

Como resolvo isso?

Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		Dim linha As Integer = DGWClientes.CurrentRow.Index
		'Obtem o elemento da coluna ClienteID
		registro = DGWClientes.Item("clienteID", linha).Value - 1
		exibirDados(registro)
	End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja que ninhguem ainda respondeu, vou tentar ser mais específico.

 

Normalmente, a gente faz um formulario para cadastro de clientes e nele, um botão localizar que abre outro formulario para pesquiza de clientes certo?

Nesse formulario de pesquisa, quando selecionamos no gridview o cliente que queremos e clikamos no botão selecionar, a rotina pega o id desse cliente, fecha o form de pesquisa e exibe os dados do cliente selecionado no form de cadastro de clientes. Certo?

 

Pois bem. Eu resolvi, em vez de criar um form separado para pesquisa, criar um panel no proprio form de cadastro de clientes.

 

Tudo ocorre normalmente, exceto um coisa:

 

Após a pesquisa entrgar os dados do cliente escolhido para o form de cadastro, caso eu clique no botão alterar do form para alterar o registro vindo da parte da pesquisa, caso o registro anterior tenha sido excluido, a rotina diz que o registro anterior não existe.

Porem, isso só acontece com no caso da ediçao com registros que vem do form de pesquisa.

 

Caso eu navegue pelos botões, proximo anterior... até esse mesmo registro, aí não da erro.

 

Exemplo:

 

registro na tabela:

clientes exibidos:

01, 02, 03 e 05 (o 04 foi deletado)

 

Se eu escolher os clientes de 01 a 03 no form de pesquisa, a edição funciona normal. Mas, se escolher o 05, ai ele diz que não existe registro na posição 04. Mas, isso só acontece quan do o registro é alterado vin do do form de pesquisa.

 

O que pode estar errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, matei mais essa ficou assim:>

Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		Dim linha As Integer = DGWClientes.CurrentRow.Index
		'Obtem o elemento da coluna ClienteID
		registro = DGWClientes.Item("ClienteID", linha).Value.ToString - 1
		Dim i As Integer = dt.Rows.Count - 1
		If registro > i Then registro = i
		exibirDados(registro)
	End Sub

Agora. Poque coloco nas propriedades do form para ele abrir maximizado e ele n ão abre?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Pessoal.

Sou iniciante em .Net e to precisando de uma luz tua ai fazendo um favor:

Peguei teu tuto http://www.macoratti.net/08/05/vbn8_psv.htm.

 

Normalmente, a gente faz um formulário para cadastro de clientes e nele, um botão localizar que abre outro formulário para pesquisa(como você fez no tuto) de clientes certo?

Nesse formulário de pesquisa, quando selecionamos no gridview o cliente que queremos e clikamos no botão selecionar, a rotina pega o id desse cliente, fecha o form de pesquisa e exibe os dados do cliente selecionado no form de cadastro de clientes. Certo?

 

Pois bem. Eu resolvi, em vez de criar um form separado para pesquisa, criar um panel no próprio form de cadastro de clientes.

 

Tudo ocorre normalmente, exceto um coisa:

 

Após a pesquisa entregar os dados do cliente escolhido para o form de cadastro, caso eu clique no botão alterar do form para alterar o registro vindo da parte da pesquisa, caso o registro anterior tenha sido excluído, a rotina diz que o registro anterior não existe. Daí tentei pegar pelo posição do registro mas não deu também pois essa posição não é a do cadastro e sim da pesquisa. No mnomento em que eu faço o filtro no textbox ai o registro toma outra posição.

Porem, isso só acontece com no caso da edição com registros que vem do form de pesquisa.

 

Caso eu navegue pelos botões, próximo anterior... até esse mesmo registro, aí não da erro.

 

Exemplo:

 

registro na tabela:

clientes exibidos:

01, 02, 03 e 05 (o 04 foi deletado)

 

Se eu escolher os clientes de 01 a 03 no form de pesquisa, a edição funciona normal. Mas, se escolher o 05, ai ele diz que não existe registro na posição 04. Mas, isso só acontece quando o registro é alterado vindo do form de pesquisa.

 

O que pode estar errado?

O foco é na ultima parte La embaixo onde ta assim:

Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		registro = DGWClientes.CurrentRow.Index
		exibirDados(registro)
	End Sub
Bom, segue meu código completo:

Imports MySql.Data.MySqlClient
Public Class Clientes
	Dim accDb As New DBConnection
	Dim registro As Integer
	Dim dr As DataRow
	Dim dt As DataTable
	Dim ds As DataSet = Nothing
	Dim tabela As String = "Clientes"

	Public Sub habilita()
		For Each c As Control In Me.grpClientes.Controls
			If TypeOf c Is TextBox Then
				c.Enabled = True
			End If
		Next
	End Sub
	Public Sub desabilita()
		For Each c As Control In Me.grpClientes.Controls
			If TypeOf c Is TextBox Then
				c.Enabled = False
			End If
		Next
	End Sub
	Private Sub atribuirDados(ByVal dr As DataRow)
		dr("clienteID") = Codigo.Text
		dr("nome") = Nome.Text
		dr("endereco") = Endereco.Text
		dr("email") = Email.Text
	End Sub

	Private Sub exibirDados(ByVal m As Integer)
		Dim i As Integer = dt.Rows.Count - 1
		If m < 0 OrElse i < 0 Then Exit Sub
		Dim dr As DataRow = dt.Rows(m)

		Codigo.Text = dr("clienteID")
		Nome.Text = dr("nome")
		Endereco.Text = dr("endereco")
		Email.Text = dr("email")
	End Sub

	Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S'"
			ds = accDb.ExecuteDS(sql, tabela)
			dt = ds.Tables(tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
			registro = dt.Rows.Count - 1
			exibirDados(registro)
			desabilita()
			If dt.Rows.Count = 0 Then
				Primeiro.Enabled = False
				Anterior.Enabled = False
				Proximo.Enabled = False
				Ultimo.Enabled = False
				Atualizar.Enabled = False
				Eliminar.Enabled = False
				Pesquisar.Enabled = False
			End If
			If dt.Rows.Count > 0 Then
				registro = 0
				Primeiro_Click(Nothing, Nothing)
			Else
				registro = -1
			End If
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Primeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Primeiro.Click
		registro = 0
		exibirDados(registro)
	End Sub

	Private Sub Anterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Anterior.Click
		registro = registro - 1
		If registro < 0 Then registro = 0
		exibirDados(registro)
	End Sub

	Private Sub Proximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Proximo.Click
		Dim i As Integer = dt.Rows.Count - 1
		registro = registro + 1
		If registro > i Then registro = i
		exibirDados(registro)
	End Sub

	Private Sub Ultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ultimo.Click
		registro = dt.Rows.Count - 1
		exibirDados(registro)
	End Sub

	Private Sub Novo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Novo.Click
		If Novo.Text = "Novo" Then
			For Each c As Control In Me.grpClientes.Controls
				If TypeOf c Is TextBox Then
					c.Text = ""
				End If
			Next
			Atualizar.Enabled = False
			Eliminar.Enabled = False
			Encerrar.Text = "Cancela"
			Novo.Text = "Incluir"
			habilita()
			Nome.Focus()
			Codigo.Enabled = False
		ElseIf Novo.Text = "Incluir" Then
			dr = dt.NewRow
			incluirRegistro(dr)
			Novo.Text = "Novo"
			Encerrar.Text = "Encerrar"
			Atualizar.Enabled = True
			Eliminar.Enabled = True
			desabilita()
		End If
	End Sub
	Private Sub incluirRegistro(ByVal dr As DataRow)
		Dim sql As String = "INSERT INTO " & tabela & " (nome,endereco,email,ativo)VALUES ('" & Nome.Text & "','" & Endereco.Text & "','" & Email.Text & "','S')"
		ds = accDb.ExecuteDS(sql, tabela)
		Try
			MessageBox.Show("registro de Usuário incluido com sucesso.")
			exibirDados(registro)
		Catch ex As Exception
			MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
		End Try
	End Sub

	Private Sub Clientes_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
		'permitir que a mudança de um campo para outro do formulário seja possível com o pressionamento da tecla ENTER 
		If e.KeyChar = Convert.ToChar(13) Then
			e.Handled = True
			SendKeys.Send("{TAB}")
		End If
	End Sub

	Private Sub Atualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Atualizar.Click
		If Atualizar.Text = "Atualizar" Then
			registro = registro
			Novo.Enabled = False
			Eliminar.Enabled = False
			Encerrar.Text = "Cancela"
			Atualizar.Text = "Salvar Alteração"
			Nome.Focus()
			habilita()
			Codigo.Enabled = False
		ElseIf Atualizar.Text = "Salvar Alteração" Then
			Dim kk As String = registro
			Codigo.Enabled = False
			If registro < 0 OrElse registro > dt.Rows.Count - 1 Then Exit Sub
			dr = dt.Rows(registro)
			atualizarRegistro(dr)
			Atualizar.Text = "Atualizar"
			Encerrar.Text = "Encerrar"
			Novo.Enabled = True
			Eliminar.Enabled = True
			desabilita()
		End If
	End Sub
	Private Sub atualizarRegistro(ByVal dr As DataRow)
		atribuirDados(dr)
		Dim kk As String = registro
		Dim sql As String = "UPDATE " & tabela & " SET nome = '" & Nome.Text & "',endereco= '" & Endereco.Text & "',email = '" & Email.Text & "' where clienteID='" & dr("clienteID") & "'"
		ds = accDb.ExecuteDS(sql, tabela)
		exibirDados(registro)
		Try
			MessageBox.Show("registro de Usuário alterado com sucesso.")
		Catch ex As Exception
			MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
		End Try
	End Sub

	Private Sub Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Eliminar.Click
		If registro < 0 OrElse registro > dt.Rows.Count - 1 Then
			Exit Sub
		Else
			If MessageBox.Show("Deseja Excluir esse registro", "Excluir", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
				Dim codigo As Integer
				Dim dr As DataRow = dt.Rows(registro)
				codigo = dr("clienteID")
				codigo = CType(codigo.ToString, Integer)
				eliminarRegistro(codigo)
			End If
		End If
	End Sub
	Private Sub eliminarRegistro(ByVal codigo As Integer)
		Dim sql As String = "UPDATE " & tabela & " SET ativo = 'N' where clienteID = " & codigo
		ds = accDb.ExecuteDS(sql, tabela)
		Proximo_Click(Nothing, Nothing)
		Try
			MessageBox.Show("registro de Usuário excluido com sucesso.")
		Catch ex As Exception
			MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
		End Try
	End Sub

	Private Sub Encerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Encerrar.Click
		If Encerrar.Text = "Encerrar" Then
			If MessageBox.Show("Deseja encerrar a aplicação", "Encerrar", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
				If ds.HasChanges Then
					ds.AcceptChanges()
				End If
				Me.Close()
			End If
		ElseIf Encerrar.Text = "Cancela" Then
			desabilita()
			Encerrar.Text = "Encerrar"
			Atualizar.Enabled = True
			Eliminar.Enabled = True
			Novo.Text = "Novo"
			Novo.Enabled = True
			Atualizar.Text = "Atualizar"
			Anterior_Click(Nothing, Nothing)
		End If
	End Sub

	Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		registro = DGWClientes.CurrentRow.Index
		exibirDados(registro)
	End Sub
End Class

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei.

O problema todo é que na pesquiza eu faço a seguinte query:

Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
Que a cada letra digitada, retorna(com filtro) um novo resultado na gridview.

Porem, quando a chave chega la na função mostrar dados (registo), la, o ponteiro da query da pesquiza não confere com o ponteiro da query do load do formulario e ai da que não ha registro na posição tal.

Colocando como chave primaria, quando chega a chave primaria la na função de mostrar dados, a função fica procurando ponteiro da query do load com o valorr da chave primaria e não pela chave.

 

segue o link dos arquivos em .zip.

por favor. baixe e de uma olhadinha fazendo favor

 

http://www.carcleo.com/vendas.zip

Função mostradados()

Private Sub exibirDados(ByVal m As Integer)
		Dim i As Integer = dt.Rows.Count - 1
		If m < 0 OrElse i < 0 Then Exit Sub
		Dim dr As DataRow = dt.Rows(m)

		Codigo.Text = dr("clienteID")
		Nome.Text = dr("nome")
		Endereco.Text = dr("endereco")
		Email.Text = dr("email")
	End Sub

codigo da chamada:

 

Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged
		Try
			Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"
			ds = accDb.ExecuteDS(sql, tabela)
			DGWClientes.DataSource = ds.Tables(0).DefaultView
		Catch ex As Exception
			MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End Try
	End Sub

	Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click
		'Dim linha As Integer = DGWClientes.CurrentRow.Index
		'registro = DGWClientes.Item("clienteID", linha).Value.ToString

		registro = DGWClientes.CurrentRow.Index
		exibirDados(registro)
	End Sub

mas quando chega na operação de editar ai da o erro:

Private Sub Atualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Atualizar.Click
		If Atualizar.Text = "Atualizar" Then
			Novo.Enabled = False
			Eliminar.Enabled = False
			Encerrar.Text = "Cancela"
			Atualizar.Text = "Salvar Alteração"
			Nome.Focus()
			habilita()
			Codigo.Enabled = False
		ElseIf Atualizar.Text = "Salvar Alteração" Then
			Dim kk As String = registro
			Codigo.Enabled = False
			If registro < 0 OrElse registro > dt.Rows.Count - 1 Then Exit Sub
			dr = dt.Rows(registro)
			atualizarRegistro(dr)
			Atualizar.Text = "Atualizar"
			Encerrar.Text = "Encerrar"
			Novo.Enabled = True
			Eliminar.Enabled = True
			desabilita()
		End If
	End Sub
	Private Sub atualizarRegistro(ByVal dr As DataRow)
		atribuirDados(dr)
		Dim kk As String = registro
		Dim sql As String = "UPDATE " & tabela & " SET nome = '" & Nome.Text & "',endereco= '" & Endereco.Text & "',email = '" & Email.Text & "' where clienteID='" & dr("clienteID") & "'"
		ds = accDb.ExecuteDS(sql, tabela)
		exibirDados(registro)
		Try
			MessageBox.Show("registro de Usuário alterado com sucesso.")
		Catch ex As Exception
			MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
		End Try
	End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.