VB.net - Consulta e bloqueio de campo preenchido

09/10/2014

Boa noite

Tenho "trocentos" cadastros a serem feitos, com 10 campos para serem preenchidos, e apenas o primeiro campo não pode ter dados repetidos...

Minha pergunta é: Tem como emitir uma mensagem de que já existe tal dado digitado logo após o campo ser preenchido sem precisar preencher todos os outros 9 campos e clicar em salvar?

Exemplo mais detalhado:

O primeiro campo é Titulo, logo que se digita algum titulo e pressiona-se TAB para ir ao próximo campo , o programa exibe uma mensagem alertando de que esse titulo já existe (limpando o campo e retornando o focus para que seja digitado outro titulo)

Welington

Melhor resposta

24/10/2014

Amigo, não sei se você sabe, mas ninguém aqui tem obrigação de responder nada. Este é um ambiente de colaboração voluntária e que sem dúvida ajuda muita gente diariamente. Eu mesmo me esforço para diariamente tentar ajudar no que posso, em praticamente todas as salas. Agora você questionar a utilidade do fórum por que o seu tópico especificamente não foi respondido rapidamente, aí já é um tanto egoísta. Ainda mais se tratando de algo tão simples.

Mas respondendo sua dúvida:
1) Após chamar o evento ShowDialog do form 2, você deve setar o foco para o textbox desejado utilizando o método Focus();
2) No Form2, basta usar o comando Close, não precisa chamar o Show do Form1, pois ele já estava visível antes do 2 ser aberto.

Um abraço e bons códigos.

Joel Rodrigues

Responder Citar

Outras Respostas

10/10/2014

Joel Rodrigues

No evento Leave do TextBox referente ao título você pode efetuar uma consulta ao banco de dados, verificando se o título já existe. Se existir, você exibe a mensagem.
Responder Citar

10/10/2014

Welington

Como faria essa verificação?
Responder Citar

10/10/2014

Joel Rodrigues

Efetuando, como eu disse, uma consulta ao banco de dados. Usando ADO.NET, por exemplo.
Se você trabalha com dados em sua aplicação, deve saber como fazer um select simples, certo?
Responder Citar

10/10/2014

Welington

Sorry! Fiz um curso de VB6 há +/-4 anos e não continuei desenvolvendo programas, portanto o pouco que aprendi, pouco me recordo! Além disso utilizo no momento vb.net 2012 com ligação ao bd Access. Desenvolvo esse projeto com ajuda de videos e dicas vistas na internet. Mas há situações em que não encontro o que preciso ou não sei como usar/adaptar os códigos para executar o que quero! Nessa hora preciso recorrer a pessoas que saibam e possam me esclarecer.

O projeto está, digamos 90% pronto, os únicos problemas são:

1- Impedir, antes que seja preciso preencher todos os campos do formulário, que o campo Titulo tenha outro igual no banco de dados (caso contrário teria que preencher todos os campos do formulário e clicar em salvar para só então receber uma mensagem de que o titulo já existe! Seria uma perda de tempo e trabalho desnecessário! É justamente isso que quero evitar)

Pensei em usar o LostFocus para que ao pressionar TAB fosse feita a busca no bd para verificar se não existe um titulo igual antes de passar o foco para o próximo campo, mas qual seria o código para executar essa pesquisa através do pressionamento da tecla TAB?
Responder Citar

13/10/2014

Jair Souza

Eu tenho o código para este evento e para banco Access, porém é em C# e não em vb, se quiser posso postar aqui, pelo menos pra ti ter idéia de como é.
Responder Citar

13/10/2014

Welington

okay... pode ser que ajude
Responder Citar

14/10/2014

Joel Rodrigues

Dê uma olhada neste link: [url:descricao=http://msdn.microsoft.com/en-us/library/dw70f090(v=vs.110).aspx]http://msdn.microsoft.com/en-us/library/dw70f090(v=vs.110).aspx[/url].
O exemplo da seção OleDb vai lhe ajudar.
Responder Citar

15/10/2014

Jair Souza

Aí está o código, vai no evento Leave do textbox :

private void nometextBox_Leave(object sender, EventArgs e)
{
            try
            {
                OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb;Jet OLEDB:Database Password = 123");

                OleDbCommand comando = new OleDbCommand("SELECT Nome FROM Funcionario WHERE Nome = @nome", conexao);

                comando.Parameters.AddWithValue("@nome", nomeTextBox.Text);
                
                conexao.Open();

                OleDbDataReader reader = null;

                reader = comando.ExecuteReader(CommandBehavior.CloseConnection);

                if ((reader.HasRows) && (reader.Read()) && (BtnAdicionar.Checked == true))
                {
                    if (nomeTextBox.Text == reader["nome"].ToString())
                    {
                        MessageBox.Show("Nome já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        nomeTextBox.Focus();
                        nomeTextBox.ForeColor = Color.Red;
                        }
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi Possível Verificar !" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
        }
Responder Citar

17/10/2014

Welington

Desisto! Não dá certo.
Responder Citar

18/10/2014

Joel Rodrigues

Desisto! Não dá certo.
Se você desistir assim tão fácil, tenho péssimas notícias para seu futuro na programação.
O que você tentou? Vamos tentar corrigir os erros?
Responder Citar

20/10/2014

Welington

Estou usando BindingSource/Dataset , e o que tentei me exibe a mensagem:

An unhandled exception of type 'System.NullReferenceException' occurred in Filmographic.exe

Additional information: Referência de objeto não definida para uma instância de um objeto.

Não sei como resolver essa referência não definida, aparentemente ocorre erro com a "ligação/leitura" com o bindingsource!

Criei um módulo fazendo a conexão (que funciona, pois exibe a mensagem de sucesso que coloquei no try)

O erro ocorre no trecho que deveria fazer a consulta: (que também está dentro do módulo da conexão)

Public Sub consulta(ByRef identifica As String)

cmd.Connection = conn
cmd.CommandType = CommandType.Text
cmd.CommandText = "Select Titulo From Tabela1 Where Titulo = " + identifica


Try
dr = cmd.ExecuteReader()

Catch ex As Exception
MsgBox(ex.ToString)

End Try

End Sub


Dentro do leave do textbox Titulo:

Private Sub txtTitulo_Leave(sender As Object, e As EventArgs) Handles txtTitulo.Leave

If txtTitulo.Text <> "" Then

consulta(Me.txtTitulo.Text)

If dr.Read Then
txtTitulo.Text = dr(1).ToString
MsgBox("Titulo já cadastrado!")

End If
End If

dr.Close()

End Sub
Responder Citar

20/10/2014

Joel Rodrigues

Alguma variável não foi instanciada (usando o operador New). Talvez esse cmd. Identifique em qual linha ocorre o erro.
Responder Citar

20/10/2014

Welington

Public conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Documents\BancoFilmes.accdb")
Public cmd As New OleDb.OleDbCommand (Aqui não havia New)
Public dr As OleDb.OleDbDataReader

Ao rodar agora com o New surge essa mensagem de erro:

System.Data.OleDb.OleDbException (0x80040E14): Erro de sintaxe (operador faltando) na expressão de consulta 'Titulo=Coração Valente'


E dentro do leave, aponta essa linha:


If dr.Read then
Responder Citar

21/10/2014

Joel Rodrigues

É porque faltam aspas simples no texto buscado:
 "Select Titulo From Tabela1 Where Titulo = '" + identifica+"'"
Responder Citar

21/10/2014

Welington

Halleluya! Funcionou! Obrigado! Aproveitando o moment queria consertar duas falhas que estão ocorrendo:

1º Tenho dois forms, quando passo para o form2 e retorno ao form1 o foco não aparece na textbox que deveria! No load do form1 já está configurado para iniciar com o foco nessa textbox, e funciona, mas não funciona quando retorno do form2 para o from1!


'código que chama o form2
Private Sub btnPesquisar_Click(sender As Object, e As EventArgs) Handles btnPesquisar.Click
Form2.ShowDialog()
End Sub


'código que retorna ao form1
Private Sub btnVoltar_Click(sender As Object, e As EventArgs) Handles btnVoltar.Click
Form1.Show()
Me.Close()
End Sub


2º No form1, tenho além dos campos que criei um bindingnavigator, acontece que ao percorrer os itens pelos botões do bindingnavigator (eles são mostrados nas textbox que criei) mas não aparece o primeiro item cadastrado! No primeiro item cadastrado os campos aparecem em branco, apenas o código aparece! Isso acontece com o primeiro registro cadastrado. No form2 que é para pesquisa há um datagrid onde se mostram os resultados da pesquisa e lá aparece o primeiro registro cadastrado normal?!

Não é exibida nenhuma mensagem de erro! O que pode estar gerando essas duas falhas?

Valeu pela ajuda
Responder Citar