Usuário com melhor resposta
Pesquisa no formulário de registro do Access

Pergunta
-
Tenho a seguinte instrução abaixo que deve efetuar a seguinte ação:
Se o usuário do Access digitar uma chave-primaria(não automática) existente na tabela no campo Nº_Peça do formulário, o Access devera ir para o registro da chave primaria no próprio formulário, caso a chave não existe ele deverá prosseguir com o cadastro do novo.
Private Sub Nº_Peça_AfterUpdate() Dim RegEncontrado As Recordset Dim strSQL As String If Not IsNull(Me.Nº_Peça) Then strSQL = "SELECT Nº_Peça FROM tabMovimentação WHERE Nº_Peça=" & Me.Nº_Peça & "" Set RegEncontrado = CurrentDb.OpenRecordset(strSQL) If RegEncontrado.RecordCount <> 0 Then DoCmd.OpenForm "frmMovimentação", acNormal, , "Nº_Peça=" & RegEncontrado("Nº_Peça") End If End If End Sub
Porém encontro o erro 3061 com mensagem "Parâmetros insuficientes. Eram esperados 1."
Ao depurar a linha "Set RegEncontrado..." é marcada.
Alguém poderia me ajudar?
Obs.: Access 2007 e se trata de um front-end.
Respostas
-
Amigo
Não sei se já resolveu o seu problemas, mas para resolver é simples.
Seu código está corretíssimo, porém tenho uma alteração a fazer.
A x da questão é que você quer cancelar o registro e aplicar um filtro no formulário para que ele vá para o registro que já existe. Porém, cancelando o registro, não tem mas como o access saber qual era o registro. Então a solução é, antes de cancelar, criar uma variável para armazenar o registro digitado.
Então a solução é.
Private Sub Nº_Peça_AfterUpdate()
Dim RegEncontrado As Recordset
Dim strSQL As String
If Not IsNull(Me.Nº_Peça) Then
strSQL = "SELECT Nº_Peça FROM tabMovimentação WHERE Nº_Peça=" & Me.Nº_Peça & ""
Set RegEncontrado = CurrentDb.OpenRecordset(strSQL)
If RegEncontrado.RecordCount <> 0 Then
DoCmd.OpenForm"frmMovimentação",acNormal,,"Nº_Peça="&RegEncontrado("Nº_Peça")End If
End If
End Sub
O riscado acima substitua por:
TempVars.Add "variavel_codigo", Me.[Nº_Peça].Value
Cancel = True
Me.Undo
Me.Filter = "[Nº_Peça]=" & [TempVars]![variavel_codigo]
Me.FilterOn = TrueRESOLVIDA A PARADA
caso tenha mais dúvidas favor entrar em contato
www.shoppmania.com.br/ss
lblima2008@gmail.com
****NUNCA VI O JUSTO DESAMPARADO NEM SUA DESCENDÊNCIA MENDIGAR O PÃO****
****NUNCA VI PROBLEMA NO ACCESS QUE EU NÃO ENCONTRE SOLUÇÃO****
- Editado MESTRE DO ACCESS segunda-feira, 16 de fevereiro de 2015 02:43
- Sugerido como Resposta MESTRE DO ACCESS segunda-feira, 16 de fevereiro de 2015 02:44
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 11 de março de 2015 00:25
-
Não recomendo utilizar o caractere º como nome de um campo numa tabela. Renomeie seu campo para No_Peça ou N_Peça. Adiantou algo?
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Romy Moura terça-feira, 28 de janeiro de 2014 12:44
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 11 de março de 2015 00:25
Todas as Respostas
-
Não recomendo utilizar o caractere º como nome de um campo numa tabela. Renomeie seu campo para No_Peça ou N_Peça. Adiantou algo?
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Sugerido como Resposta Romy Moura terça-feira, 28 de janeiro de 2014 12:44
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 11 de março de 2015 00:25
-
Olá Felipe, bom dia!
Antes de mais nada obrigado pelo conselho, parece que surtiu efeito sim, porém agora aparece a seguinte mensagem de erro:
"Erro em tempo de execução '2501':
A ação Openform foi cancelada."
Agora o código ficou assim:
Private Sub NPeca_AfterUpdate() Dim RegEncontrado As Recordset Dim strSQL As String If Not IsNull(Me.NPeca) Then strSQL = "SELECT NPeca FROM tabMovimentação WHERE NPeca=" & Me.NPeca & "" Set RegEncontrado = CurrentDb.OpenRecordset(strSQL) If RegEncontrado.RecordCount <> 0 Then DoCmd.OpenForm "frmMovimentação", acNormal, , "NPeca=" & RegEncontrado("NPeca") End If End If End Sub
Att,
Cristiano Tomadon
-
Você alterou o nome do campo em sua tabela para NPeca, ao que parece.
---
Esse campo armazena de texto ou somente números? Lembre-se que se armazenar texto, você precisa colocar a expressão entre aspas simpesl.
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
-
Olá Felipe!
Fiz exatamente essa alteração e o campo é uma chave primaria de apenas números não automática.
Vou tentar deixar mais claro o que desejo com este código:
O Usuário que utiliza um leitor de código de barras, cadastra movimentação de entrada da peças no formulário "frmMovimentacao". Desejo que se o usuário scanear um número de peça já cadastrado o formulário "salte" para o respectivo registro.
Att,
Cristiano Tomadon
-
-
-
Tomadon,
Este erro é antigo e ocorre quando não há dados para exibição no report e/ou form ou não existe impressora configurada na máquina.
Faça um tratamento de erros
On Error GoTo Error_SemDados:
DoCmd.OpenForm "frmMovimentacao", acNormal, , "NPeca=" & RegEncontrado("NPeca")
Sair_Metodo: End DoCmd.CancelEvent Error_SemDados: If Err.Number <> 2501 Then MsgBox Err.Number & ": " & Err.Description End If Resume Sair_Metodo
Veja o link de um KB que fala sobre o assunto:
http://support.microsoft.com/kb/913031/pt-br
E um post no Fórum americano, semelhante ao seu problema:
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
Olá Durval,
Realmente o erro não aparece mais, porém agora ele não continua registrando um novo caso a chave não exista e se existir ele não traz o registro no formulário.
E caso a chave não existe ele traz o erro 3021 : Nenhum Registro atual.
O código ficou assim:
Private Sub NPeca_AfterUpdate() Dim RegEncontrado As Recordset Dim strSQL As String If Not IsNull(Me.NPeca) Then strSQL = "SELECT NPeca FROM tabMovimentação WHERE NPeca=" & Me.NPeca & "" Set RegEncontrado = CurrentDb.OpenRecordset(strSQL) If Not RegEncontrado Is Nothing Then On Error GoTo Error_SemDados DoCmd.OpenForm "frmMovimentacao", acNormal, , "NPeca=" & RegEncontrado("NPeca") Sair_Metodo: End DoCmd.CancelEvent Error_SemDados: If Err.Number <> 2501 Then MsgBox Err.Number & ": " & Err.Description End If Resume Sair_Metodo End If End If End Sub
-
Olá Durval,
Realmente o erro não aparece mais, porém agora ele não continua registrando um novo caso a chave não exista e se existir ele não traz o registro no formulário.
E caso a chave não existe ele traz o erro 3021 : Nenhum Registro atual.
O código ficou assim:
Private Sub NPeca_AfterUpdate() Dim RegEncontrado As Recordset Dim strSQL As String If Not IsNull(Me.NPeca) Then strSQL = "SELECT NPeca FROM tabMovimentação WHERE NPeca=" & Me.NPeca & "" Set RegEncontrado = CurrentDb.OpenRecordset(strSQL) If Not RegEncontrado Is Nothing Then On Error GoTo Error_SemDados DoCmd.OpenForm "frmMovimentacao", acNormal, , "NPeca=" & RegEncontrado("NPeca") Sair_Metodo: End DoCmd.CancelEvent Error_SemDados: If Err.Number <> 2501 Then MsgBox Err.Number & ": " & Err.Description End If Resume Sair_Metodo End If End If End Sub
Tomadon,
Este erro ocorre porque apesar do objeto retornar um RecordSet, ele está vazio.
Para tratar este erro você deve incluir no seu fonte o seguinte código:
On Error GoTo Error_SemDados
If Not RegEncontrado Is Nothing Then
If RegEncontrado.EOF Then MsgBox "VAZIO"
Exit Sub else
DoCmd.OpenForm "frmMovimentacao", acNormal, , "NPeca=" & RegEncontrado("NPeca")
End If
End If
Segue abaixo um link com a documentação sobre este objeto:
http://msdn.microsoft.com/en-us/library/office/ff820966.aspx
Não esqueça de marcar todos os posts que ajudaram na solução como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
Durval,
Propositalmente estou inserindo um valor de chave de um registro existente e não vazio.
Mesmo alterando o código conforme solicitado o formulário não traz o registro existente.
Att,
Cristiano Tomadon
- Editado Tomadon terça-feira, 28 de janeiro de 2014 14:32 Revisão do Texto
-
Durval,
Propositalmente estou inserindo um valor de chave de um registro existente e não vazio.
Mesmo alterando o código conforme solicitado o formulário não traz o registro existente.
Att,
Cristiano Tomadon
Tomadon,
Insira um breakpoint logo após carregar o "OpenRecordset". É preciso saber o que ele está efetivamente retornando.
Só depois, verificar se o vínculo do campo "NPeca" está correto.
Não esqueça de marcar todos os posts que ajudaram na solução como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
Durval,
Propositalmente estou inserindo um valor de chave de um registro existente e não vazio.
Mesmo alterando o código conforme solicitado o formulário não traz o registro existente.
Att,
Cristiano Tomadon
Tomadon,
Insira um breakpoint logo após carregar o "OpenRecordset". É preciso saber o que ele está efetivamente retornando.
Só depois, verificar se o vínculo do campo "NPeca" está correto.
Não esqueça de marcar todos os posts que ajudaram na solução como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"Olá Durval,
Fiz conforme sugerido e a variável fica vazia.
Entendo que isto não deveria acontecer devido ao fato de que insiro o mesmo número.
Fico imaginando se isto não ocorre pq a "tabMovimatacao" é uma tabela vinculada do back-end...
Abraço,
Cristiano Tomadon
- Editado Tomadon quarta-feira, 29 de janeiro de 2014 16:19
-
-
Amigo
Não sei se já resolveu o seu problemas, mas para resolver é simples.
Seu código está corretíssimo, porém tenho uma alteração a fazer.
A x da questão é que você quer cancelar o registro e aplicar um filtro no formulário para que ele vá para o registro que já existe. Porém, cancelando o registro, não tem mas como o access saber qual era o registro. Então a solução é, antes de cancelar, criar uma variável para armazenar o registro digitado.
Então a solução é.
Private Sub Nº_Peça_AfterUpdate()
Dim RegEncontrado As Recordset
Dim strSQL As String
If Not IsNull(Me.Nº_Peça) Then
strSQL = "SELECT Nº_Peça FROM tabMovimentação WHERE Nº_Peça=" & Me.Nº_Peça & ""
Set RegEncontrado = CurrentDb.OpenRecordset(strSQL)
If RegEncontrado.RecordCount <> 0 Then
DoCmd.OpenForm"frmMovimentação",acNormal,,"Nº_Peça="&RegEncontrado("Nº_Peça")End If
End If
End Sub
O riscado acima substitua por:
TempVars.Add "variavel_codigo", Me.[Nº_Peça].Value
Cancel = True
Me.Undo
Me.Filter = "[Nº_Peça]=" & [TempVars]![variavel_codigo]
Me.FilterOn = TrueRESOLVIDA A PARADA
caso tenha mais dúvidas favor entrar em contato
www.shoppmania.com.br/ss
lblima2008@gmail.com
****NUNCA VI O JUSTO DESAMPARADO NEM SUA DESCENDÊNCIA MENDIGAR O PÃO****
****NUNCA VI PROBLEMA NO ACCESS QUE EU NÃO ENCONTRE SOLUÇÃO****
- Editado MESTRE DO ACCESS segunda-feira, 16 de fevereiro de 2015 02:43
- Sugerido como Resposta MESTRE DO ACCESS segunda-feira, 16 de fevereiro de 2015 02:44
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 11 de março de 2015 00:25
-