Ir para conteúdo

Arquivado

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

gustanabe

[Resolvido] Erro 3251

Recommended Posts

Estou com um problema no meu Programa, esta dando o seguinte erro:

Run-time error '3251':
Method 'MoveLast' of object '_Recordset' failed


ai clico em debug e cai na seguinte linha:
Private Sub Cmdproximo_Click()
tbcad.MoveNext
If tbcad.EOF Then
    tbcad.MoveLast <<<<<<<------------
End If
Call mostrar_dados
Call desabilitar_tela
Call habilitar_botoes
End Sub

ou

Private Sub Cmdultimo_Click()
tbcad.MoveLast <<<<<-----------
Call mostrar_dados
Call desabilitar_tela
Call habilitar_botoes
End Sub
qual sera o problema???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gustanabe, primeiramente, seja bem vindo ao fórum.

Sempre que for utilizar códigos nas suas postagem, utilize as tags .

Para melhor se familiarizar com o fórum, leia nossas regras caso ainda não tenho feito.

 

 

Seu erro ocorre porque não há registros em sua tabela.

Repare no seu código:

If tbcad.EOF Then
    tbcad.MoveLast <<<<<<<------------
End If
Você compara se é fim de arquivo, e se sim, manda passar para o próximo.

Você deve verificar se não é fim de arquivo para passar para o próximo.

 

Dúvidas poste ai.

Abraço,

 

Cláudio Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Inseri 4 dados no meu banco de dados e ainda esta com o mesmo erro e na parte que você fala:

 

Seu erro ocorre porque não há registros em sua tabela.

Repare no seu código:

If tbcad.EOF Then
    tbcad.MoveLast <<<<<<<------------
End If

Você compara se é fim de arquivo, e se sim, manda passar para o próximo.

Você deve verificar se não é fim de arquivo para passar para o próximo.

Estou comparando se é fim de arquivo, e se sim, manda passar para o ultimo registro... e nao para o proximo.

 

 

Bom foi isso que entendi, mas ainda o programa persiste no mesmo erro.

 

Caso queira que eu te passe o programa para que voce vizualize melhor, é só falar.

 

 

No aguardo de uma resposta,

Gustavo(gustanabe)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perdão, você tem toda razão, me desculpe. Não vi que estava mandando para o último.

 

Poste a parte do código que está abrindo sua conexão e como está declarando suas variáveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

conexao bd access

Private Sub Form_Load()
con.Open "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\quadrinhos.mdb;"
tbcad.Open "Cadastro", con, adOpenDynamic, adLockOptimistic
End Sub

variaveis

Dim con As New ADODB.Connection
Dim tbcad As New ADODB.Recordset

Compartilhar este post


Link para o post
Compartilhar em outros sites

conexao bd access

Private Sub Form_Load()
con.Open "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\quadrinhos.mdb;"
tbcad.Open "Cadastro", con, adOpenDynamic, adLockOptimistic
End Sub

variaveis

Dim con As New ADODB.Connection
Dim tbcad As New ADODB.Recordset

.open "cadastro"???

Isso deveria ser uma query de consulta. Por exemplo "select * from cadastro".

E suas variáveis estão declaradas como dim. E se você está usando em mais de uma sub, precisa declarar como private.

Testa isso e diz o que deu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Gustavo.

Nesse seu caso, você não deve passar o método MoveLast para o seu recordset tbcad e sim o método MovePrevious. Ficaria assim:

 

 

If tbcad.EOF Then
    'tbcad.MoveLast (removido/comentado)
    tbCad.MovePrevious '(adicionado)
      end if

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Gustavo.

Nesse seu caso, você não deve passar o método MoveLast para o seu recordset tbcad e sim o método MovePrevious. Ficaria assim:

 

 

If tbcad.EOF Then
    'tbcad.MoveLast (removido/comentado)
    tbCad.MovePrevious '(adicionado)
      end if

Desculpe Desaweb, mas isso está incorreto. Tanto faz ele passar moveprevious ou movelast. Depende do que ele quer, mandar para o primeiro ou para o último, mas não é isso que está gerando erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Retirado do MSDN (Microsoft Development Network), site de experiências(conhecimentos, fóruns) da Microsoft.

 

The MoveLast Method

 

This method is used to move to the last record in a Recordset object. It also make the last record the current record.

Tradução:

O Método MoveLast

Este método é usado para mover para o último registro em um objeto Recordset. Também faz do último registro o registro atual.

Bom, na linha onde faz o teste :

1 If tbcad.EOF Then
                                 2 tbcad.MoveLast 
                                 3  end if
Temos: Na linha 1, está testando se é o fim do arquivo, que , caso verdadeiro ele move para o último registro. Se é o fim do Arquivo por que mover para o último registro? Ou vai para o primeiro(MoveFirst) ou vai para o anterior(MovePrevious) ou ainda manda um aviso dizendo que chegou no Ultimo. Usando MoveLast vai permanecer onde está e moveNext nao pode pois nao há outro registro após, correto? Também nao mencionei que era isso que estava gerando o erro(falha minha pois devemos apresentar soluçoes), só disse que estava errado.

Mas voltando, você matou a charada no início, quando mencionou "Você compara se é fim de arquivo, e se sim, manda passar para o próximo.

Você deve verificar se não é fim de arquivo para passar para o próximo.". Pronto está ai a solução para o botão que move para último. Acho que ficaria melhor também se o Gustavo mostrasse os propósitos dos códigos que ele está fazendo, se caso for para criar botões para navegar pelo Recorset ou o que pois, conforme for deve-se verificar o tipo de cursor usado, se há atualizações(Update) no momento etc. Bom estamos a disposição. Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não não Desaweb.

 

Fim de arquivo não quer dizer que está no último registro, se fosse assim não geraria erro nenhum chegar nele. Fim de arquivo indica que tentou ultrapassar o último registro.

 

É como se tivessémos uma tabela com três linhas, e vamos dando movenext.

Ele vai apontar fim de arquivo quando der movenext pelo terceira vez, ou seja, tentar pegar o quarto registro, que não existe.

Sendo assim, damos movelast para permanecer no terceiro.

Agora, se quiser criar um loop e levar para o primeiro para o cliente entender que é um "circuito fechado", aí sim damos movefirst.

 

Repare que ele declarou as variáveis dele como dim, e não foram declaradas dentro dessa sub, mas em outra, ou seja, estão perdendo a referência.

 

Quando ele tenta dar o comando movelast na variável, a mesma não sabe o que é isso.

 

Mas de qualquer forma, temos que esperar ele postar para ver se tentou e se deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Correto! Mas em que momente eu disse que FIM DO ARQUIVO É O ultimo registro? Acredito que nao mencionei,acho eu... o que quero dizer é que: como você mencionou no segundo post: Por que testar se É FIM DE ARQUIVO, e logo após executar o método .MoveLast? Pois se for FIM DO ARQUIVO, já passou pelo último! Deve-se testar se NÃO É FIM DO ARQUIVO e aí sim aplicar MoveLast. Caso contrário está semanticamente errado. Por isso reforço que deve vir sempre o propósito do código, pois muitas vezes (o que não é esse o caso) roda normalmente, mas tempo depois aparece algum problema em virtude de estar semanticamente errado e nao sintaticamente (sintaxe). E também está correto que se foi utilizado dim dentro da procedure (Sub ou funcition) em outra ele não irá reconhecer nem a váriavel normal nem a uma variável de objeto, a não ser se utilizar a instrução Private ao invés de Dim.

Dim --> a variavel,seus valores, propriedades e métodos são válidos somente dentro do procedimento (sub ou function)

Private --> a variavel, seus valores, propriedades e métodos são validos somente dentro do módulo (Form, modulo, etc)

É isso...

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado a todos que tentaram me ajudar nesse post, porem, ja consegui resolver o problema reinstalando o VB6.

 

Acho que nao tinha algumas coisas necessarias instaladas, por isso deu esse erro.

 

Obrigado novamente a todos que me ajudaram!!

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.