VB.net - Consulta e bloqueio de campo preenchido

.NET

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

Welington

Curtidas 0

Melhor post

Joel Rodrigues

Joel Rodrigues

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.
GOSTEI 1

Mais Respostas

Joel Rodrigues

Joel Rodrigues

09/10/2014

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.
GOSTEI 0
Welington

Welington

09/10/2014

Como faria essa verificação?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

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?
GOSTEI 0
Welington

Welington

09/10/2014

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?
GOSTEI 0
Jair Souza

Jair Souza

09/10/2014

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 é.
GOSTEI 0
Welington

Welington

09/10/2014

okay... pode ser que ajude
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

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.
GOSTEI 0
Jair Souza

Jair Souza

09/10/2014

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);
             }
        }
GOSTEI 0
Welington

Welington

09/10/2014

Desisto! Não dá certo.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

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?
GOSTEI 0
Welington

Welington

09/10/2014

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
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

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

Welington

09/10/2014

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
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

É porque faltam aspas simples no texto buscado:
 "Select Titulo From Tabela1 Where Titulo = '" + identifica+"'"
GOSTEI 0
Welington

Welington

09/10/2014

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
GOSTEI 0
Welington

Welington

09/10/2014

Onde estão os programadores de vb.net? Se ninguém aparece qual é a utilidade do fórum???
GOSTEI 0
Welington

Welington

09/10/2014

"Em se tratando de algo tão simples"??? Não é tão simples! Sua resposta nº1 fará o com que o foco seja setado para um textbox do Form2! O que perguntei foi quando eu sair do Form2 (clicando no botão "voltar") o txtTitulo que está no Form1 receba o foco. Se fosse no mesmo Form poderia usar : txtTitulo.focus() mas são Forms diferentes.

Quero "acionar" o método focus para o campo txtTitulo do Form1 ao clicar no botão Voltar, que está no Form2. (Como uma "ligação" entre forms que execute a ação, FOCUS, mas sendo feita do Form2 para ser executada no Form1)

Sei que ninguém tem obrigação de responder. Mas se ninguém responde....(e não é porque ninguém sabe, como vc mesmo disse "algo tão simples", para quem sabe vb.net acredito ser realmente fácil), parece que "escolhem" o que responder ... e essa certamente não é a ajuda que um fórum deveria ter. Veja vc foi o único a responder, e agradeço por isso (imagino o trabalho que vc tem para responder tantas perguntas/duvidas praticamente sozinho) até o Jair Souza tentou ajudar respondendo em C# (e ele não teria nem porque fazer isso, já que não estava respondendo em vb.net, que é o tópico aqui, mas mesmo assim tentou ajudar!)


[img:descricao=Form1]http://arquivo.devmedia.com.br/forum/imagem/390385-20141024-185414.jpg[/img]

[img:descricao=Form2]http://arquivo.devmedia.com.br/forum/imagem/390385-20141024-185434.jpg[/img]
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

Vamos lá. Quando eu falei em colocar o foco no TextBox, eu me referia ao Form1 mesmo e não ao 2. Veja como seria:
Form2.ShowDialog()
txtTitulo.Focus()

Por que isso deve funcionar?
Quando você invoca o método ShowDialog, o fluxo principal do código é redirecionado para o Form2, e quando este é fechado, o fluxo retorna para a próxima linha após o ShowDialog. Por isso, fazendo dessa forma o seu Form2 seria aberto, você o utilizaria e após fechá-lo, a linha txtTitulo.Focus() seria executada, sem precisar fazer mais nada.

Teste aí e veja se dá certo.
GOSTEI 0
Welington

Welington

09/10/2014

Valeu!!! Funcionou!

Só me restou um problema: Verifiquei que o BindingNavigator não mostra o primeiro cadastro (apresenta uma linha em branco, mostrando apenas o código) porque ao carregar o Form fiz com que todas as textbox fossem limpas (iniciando em branco) e isso causa essa "falha" no BindingNavigator.

Pergunto (e essa é difícil) como fazer com que o Form inicie sempre com as textbox em branco sem limpá-los como eu fiz?

Seria iniciar verificando qual foi o último registro gravado no BD + 1, ou seja, faz a verificação e exibe não o último registro mas o próximo que estaria obviamente em branco pronto para ser preenchido?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

A solução é mais ou menos essa. Mas bastaria você iniciar a inserção de um novo registro. Por exemplo:
bindingSource.AddNew();
GOSTEI 1
Welington

Welington

09/10/2014

Coloquei essa solução mas ao clicar em "move first" ou "move previous" dá esse erro:

An unhandled exception of type 'System.Data.NoNullAllowedException' occurred in System.Data.dll

Additional information: Column 'Titulo' não permite valores nulls.


Tentei alterar no Bd as regras do campo Titulo (permitir comprimento zero (sim), requerido (não) e indexado(não)) e no VB alterei a propriedade CausesValidation para False, mas o erro continua

RESOLVIDO!!!

Era a chave primária que eu havia colocado no textbox Titulo que impedia o funcionamento!
GOSTEI 0
Welington

Welington

09/10/2014

Eis que me aparece uma duvida/problema:

Como posso determinar quais as palavras que podem ser digitadas no preenchimento de uma textbox?

Explicando: tenho uma textbox Gêneros, como faço para que o usuário possa digitar apenas e exatamente gêneros de filmes (aventura, terror, drama, comédia, etc) e não qualquer palavra!? Caso seja digitada uma palavra qualquer (que não faça parte dos gêneros possíveis) não será permitido, exibindo uma mensagem de alerta.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

09/10/2014

Nesse caso o ideal é usar um ComboBox, onde você já define os valores.
GOSTEI 0
POSTAR