none
Pesquisa no formulário de registro do Access RRS feed

  • 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.

    quarta-feira, 22 de janeiro de 2014 10:22

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 = True

    RESOLVIDA 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****



    segunda-feira, 16 de fevereiro de 2015 02:40
  • 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

    quarta-feira, 22 de janeiro de 2014 20:32
    Moderador

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

    quarta-feira, 22 de janeiro de 2014 20:32
    Moderador
  • 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

    quinta-feira, 23 de janeiro de 2014 10:36
  • 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

    quinta-feira, 23 de janeiro de 2014 22:27
    Moderador
  • 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

    sexta-feira, 24 de janeiro de 2014 10:22
  • Set RegEncontrado = CurrentDb.OpenRecordset(strSQL)
    If Not RegEncontrado Is Nothing Then
      DoCmd.OpenForm "frmMovimentação", acNormal, , "NPeca=" & RegEncontrado("NPeca")
    End If


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    sábado, 25 de janeiro de 2014 13:42
    Moderador
  • Olá Felipe, bom dia!

    Infelizmente o erro persistiu, ele ocorre exatamente na linha:

    DoCmd.OpenForm "frmMovimentacao", acNormal, , "NPeca=" & RegEncontrado("NPeca")

    Att,

    Cristiano.

    segunda-feira, 27 de janeiro de 2014 10:37
  • 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:

    http://social.msdn.microsoft.com/Forums/office/en-US/c391306c-15d6-4970-bb9f-4fa1d74f7dec/error-handling-if-docmdsendobject-is-cancelled?forum=accessdev

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 27 de janeiro de 2014 16:56
  • 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

    terça-feira, 28 de janeiro de 2014 12:30
  • 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 Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 28 de janeiro de 2014 13:08
  • 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
    terça-feira, 28 de janeiro de 2014 14:31
  • 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 Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 28 de janeiro de 2014 16:31
  • 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 Ramos
    Microsoft 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
    quarta-feira, 29 de janeiro de 2014 15:47
  • Galera estou ficando com um parafuso a menos já para resolver este problema.

    Precisa de Ajuda!

    Abraço


    Cristiano Tomadon

    quinta-feira, 30 de janeiro de 2014 11:41
  • 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 = True

    RESOLVIDA 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****



    segunda-feira, 16 de fevereiro de 2015 02:40
  • Muito Obrigado!

    Cristiano Tomadon

    segunda-feira, 10 de agosto de 2015 21:39