Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas no MovePrevious e MoveNext


Gabriel Cabral

Pergunta

Olá pessoas.....eu aqui denovo....

agora com essa dúvida de moveprevious e movenext

é o seguinte....para ambos os botões, o código é esse, apenas com alteração em rs.MovePrevious/rs.MoveNext

Dim Conex As New ADODB.Connection
Conex.CursorLocation = adUseClient
Conex.Open StringDeConexao
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = " Select * From FinanWin_Cli "
Set rs = .Execute
End With

rs.MovePrevious/rs.MoveNext 'aqui dependendo do botão clicado
txtCli_Cod.Text = rs("Cli_Cod")
txtCli_NomeFantasia.Text = rs("Cli_NomeFantasia")

__________________________________________________

Ao clicar no botão MovePrevious, dá o seguinte erro:

Run-time error '3021': Either BOF or EOF is True, or the current record has been deleted.

Requested operation requires a current record.

e marca a linha txtCli_Cod.Text = rs("Cli_Cod")

__________________________________________________

Ao clicar no botão MoveNext, é como se ele funcionasse apenas uma vez; pois se está no registro 1, eu clico e então vai pro registro 2, mas se clico denovo, fica no registro 2.

Bom....se alguém tiver paciencia pra ler tudo isso aqui e puder me ajudar, muito obrigado =P

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

da uma olhada aqui:

.CommandText = " Select * From FinanWin_Cli "

toda vez q passa aqui ele executa esse select. e assim q ele acaba de executar ele vai sempre pro primeiro registro. ou seja, o MoveNext SEMPRE vai mostrar o segundo registro e o MovePrevious SEMPRE vai dar erro porque não existe registro antes do primeiro.

fora q você criou o RecordSet interno pro evento click do botao. então, assim q o evento acabar de ser executado, o RecordSet é perdido. ele tem no textbox os dados q vieram do banco, mas o visual basic não tem como entender q aquilo veio de um recordset, muito menos q veio de um banco de dados muito menos saber pra qual registro esses dados apontam se ele não tem mais o RecordSet.

você teria q declarar o RecordSet la em cima no declarations (o mesmo pra Connection) e fazer o Select apenas UMA vez (ou tb refazer cada vez q alguma coisa for gravada na tabela), pra poder chamar o MovePrevious e o MoveNext.

Link para o comentário
Compartilhar em outros sites

  • 0

Ae kuroi,

Pelo que voce disse, eu entendi o que está acontecendo..

Mas agora não to conseguindo resolver isso :(

Assim...

no Declarations tem isso

Public Conex As ADODB.Connection
Public rs As ADODB.Recordset
Public StringDeConexao As String
e eu não sei o que fazer nos botoes de movimentação.. Essas seguintes partes aqui, por exemplo, eu não sei o que devo fazer... Não sei se está faltando ou sobrando algo aí.. Ou se está em lugar errado..
'ESSA PARTE PERNTENCE AO EVENTO CLICK DOS BOTOES DE MOVIMENTAÇÃO

Dim Conex As New ADODB.Connection
Conex.CursorLocation = adUseClient
Conex.Open StringDeConexao
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " Select * From FinanWin_Cli "
    Set rs = .Execute
End With

Se você puder me ajudar, indicando o que devo fazer...

O QUE devo declarar e ONDE devo declarar

Muito obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

ué, se você entendeu o que está acontecendo com o select, então esqueceu de mudar seu código, pois o select continua dentro do código do botão de movimentação. tira o select. aqui vai um exemplo de um programa meu:

Dim Dados As New ADODB.Recordset

Private Sub Form_Load()
    Dim Conexao As String
    Dim Comando As String
    
    Conexao = "Base de Dados"
    Comando = "SELECT * FROM TABELA ORDER BY CAMPO" 'recebe a select na inicialização do form
    
    Dados.CursorLocation = adUseClient
    Dados.Open Comando, Conexao, adOpenStatic 'abre o RecordSet na inicialização do form
    Dados.MoveFirst
    Text1.Text = Dados("CAMPO1")
    Text2.Text = Dados("CAMPO2")
End Sub

Private Sub Command1_Click() 'botão que move o registro para trás
    Dados.MovePrevious
    If Dados.BOF Then 'caso seja o primeiro registro da tabela
        Dados.MoveNext
        MsgBox "Este é o primeiro registro"
    Else
        Text1.Text = Dados("CAMPO1")
        Text2.Text = Dados("CAMPO2")
    End If
End Sub

Private Sub Command2_Click() 'botão que move o registro para frente
    Dados.MoveNext
    If Dados.EOF Then 'caso seja o último registro da tabela
        Dados.MovePrevious
        MsgBox "Este é o último registro"
    Else
        Text1.Text = Dados("CAMPO1")
        Text2.Text = Dados("CAMPO2")
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dados.Close 'fecha o RecordSet
End Sub

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0

o esquema é o seguinte gabriel:

você deve carregar o recordset e deixa-lo aberto e então no botão de movimentação por o codigo movenext ou moveprevious que ele irá movimentar o recordset que está carregado, ou seja, você chama o select para carregar o recordset no evento Form_load e não põe rs = nothing nem rs.close para não fecha-lo assim o recordset fica carregado com os dados da tabela para você trabalhar com ele em outros eventos assim:

Private sub Form_load()

With cmd
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = " Select * From FinanWin_Cli "
Set rs = .Execute
End With

End Sub

Private Sub Cmd_PROXIMO_Click()

With rs
    .MoveNext

    If .EOF Then .MoveLast
    
    txtCli_Cod.Text = rs("Cli_Cod")
    txtCli_NomeFantasia.Text = rs("Cli_NomeFantasia")

End With

End Sub

Beleza ? Lembrando que o Recordset deve ser declarado no General Declarations do Form

Link para o comentário
Compartilhar em outros sites

  • 0

Gente...

segui o que vocês me indicaram....mas ainda tem algo errado no que estou fazendo

olha só...

No General Declarations eu declarei o recordset

Public rsmove As ADODB.Recordset
O Load do form está assim:
Private Sub Form_Load()

StringDeConexao = "Provider=microsoft.jet.oledb.4.0;" & "Data Source=" & App.Path & "\FinanWin.mdb;"

Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " Select Max(Cli_Cod) From FinanWin_Cli "
    Set rs = .Execute
End With

If Not IsNull(rs(Val("Cli_Cod"))) Then
txtCli_Cod.Text = rs(Val("Cli_Cod")) + 1
Else
txtCli_Cod.Text = 1
End If

Dim rsmove As New ADODB.Recordset

With cmd
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = " Select * From FinanWin_Cli "
Set rsmove = .Execute
End With

End Sub
e o Click do botão está assim:
Private Sub cmdMoveNext_Click()

With rsmove
    .MoveNext

    If .EOF = True Then
    cmdMoveNext.Enabled = False
    cmdMoveLast.Enabled = False
    End If
End With
        
    txtCli_Cod.Text = rsmove("Cli_Cod")
    txtCli_NomeFantasia.Text = rsmove("Cli_NomeFantasia")
    txtCli_RazaoSocial.Text = rsmove("Cli_RazaoSocial")
    txtCli_Endereco.Text = rsmove("Cli_Endereco")
    txtCli_Numero.Text = rsmove("Cli_Numero")
    txtCli_Bairro.Text = rsmove("Cli_Bairro")
    txtCli_Cidade.Text = rsmove("Cli_Cidade")
    txtCli_Estado.Text = rsmove("Cli_Estado")
    txtCli_CEP.Text = rsmove("Cli_CEP")
    txtCli_Email.Text = rsmove("Cli_Email")
    txtCli_DDD.Text = rsmove("Cli_DDD")
    txtCli_Telefone.Text = rsmove("Cli_Telefone")
    txtCli_Celular.Text = rsmove("Cli_Celular")
    txtCli_RG.Text = rsmove("Cli_RG")
    txtCli_CPF.Text = rsmove("Cli_CPF")
    txtCli_CNPJ.Text = rsmove("Cli_CNPJ")
    txtCli_IE.Text = rsmove("Cli_IE")

cmdMoveFirst.Enabled = True
cmdMovePrevious.Enabled = True

End Sub

Mas quando eu clico no MoveNext, dá o seguinte erro

Run-time error '91':

Object variable or With block variable not set

e marca a linha .MoveNext

Ainda tem algo errado que não sei o que é :(

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

Coloque assim:

No General declarations:

Dim rs New As ADODB.Recordset
Dim Conex As New ADODB.Connection
Dim cmd As New ADODB.Command
Private Sub Form_Load()

StringDeConexao = "Provider=microsoft.jet.oledb.4.0;" & "Data Source=" & App.Path & "\FinanWin.mdb;"


Conex.CursorLocation = adUseClient
Conex.Open StringDeConexao

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " Select Max(Cli_Cod) From FinanWin_Cli "
    Set rs = .Execute
End With

If Not IsNull(rs(Val("Cli_Cod"))) Then
txtCli_Cod.Text = rs(Val("Cli_Cod")) + 1
Else
txtCli_Cod.Text = 1
End If

With cmd
.ActiveConnection = Conex
.CommandType = adCmdText
.CommandText = " Select * From FinanWin_Cli "
Set rs = .Execute
End With

End Sub
Botão :
Private Sub cmdMoveNext_Click()

With rsmove
    .MoveNext

    If .EOF = True Then .MoveLast
           
    txtCli_Cod.Text = rsmove("Cli_Cod")
    txtCli_NomeFantasia.Text = rsmove("Cli_NomeFantasia")
    txtCli_RazaoSocial.Text = rsmove("Cli_RazaoSocial")
    txtCli_Endereco.Text = rsmove("Cli_Endereco")
    txtCli_Numero.Text = rsmove("Cli_Numero")
    txtCli_Bairro.Text = rsmove("Cli_Bairro")
    txtCli_Cidade.Text = rsmove("Cli_Cidade")
    txtCli_Estado.Text = rsmove("Cli_Estado")
    txtCli_CEP.Text = rsmove("Cli_CEP")
    txtCli_Email.Text = rsmove("Cli_Email")
    txtCli_DDD.Text = rsmove("Cli_DDD")
    txtCli_Telefone.Text = rsmove("Cli_Telefone")
    txtCli_Celular.Text = rsmove("Cli_Celular")
    txtCli_RG.Text = rsmove("Cli_RG")
    txtCli_CPF.Text = rsmove("Cli_CPF")
    txtCli_CNPJ.Text = rsmove("Cli_CNPJ")
    txtCli_IE.Text = rsmove("Cli_IE")

End With

End Sub

Gabriel:

1 - veja no codigo que você estava declarando dois Recordset's, pode ser também, mas como você só estava usando no primeiro caso para retornar o maior registro e depois esse numero só seria chamado novamente no proximo Form_Load então podemos usar o mesmo recordset para retornar este numero e depois com outra instrução para o command usa-lo para retornar os dados da tabela.

2 - Declare sempre o Command no General Declarations assim você não precisa declarar em todos os eventos, por exemplo, declarando o cmd no general declarations você pode usa-lo no botão de gravar com a instrução Insert Into, pode usa-lo no botão excluir com a instrução delete, pode usa-lo em algum outro evento para fazer algum select, tudo isso sem precisar declará-lo em todos os eventos, beleza ?

3 - Os recordset's se você declara-los também no general, você alem de só declarar uma vez, ou só declarar mais de um quando for realmente necessário, fica mais facil de você ver quantos e quais recordset's você declarou para poder fechalos de uma só vez no evento Form_Unload assim não corre o risco de você ter declarado algum recordset em algum evento e não fecha-lo ao sair da aplicação, isto pode ocorrer justamente quando você tiver com uma aplicação grande e passar mais de uma hora olhando todo o codigo para ver onde declarou ou não algum recordset

Beleza ?

Link para o comentário
Compartilhar em outros sites

  • 0

Aeeeeeeee Macêdo,

Agora sim

tudo funcionando perfeitamente !!!!!

Agora to entendendo bem melhor essa de declarar uma vez só e tudo mais

Muito obrigado kuroi, Duduh e Macêdo

Voces me deram um presente de Natal, Ano Novo e Aniversário

Abraço a todos

E um Feliz Ano Novo

Link para o comentário
Compartilhar em outros sites

  • 0

Ah....está dando um errinho aqui....não sei nem se posso aproveitar esse tópico ou tenho que abrir outro

é o seguinte...

O erro é no botao de inclusao e de alteração

Quando incluo um registro, não dá erro nenhum, mas se vou incluir outro, dá o erro

Run-time error '3265':

Item não pode ser encontrado nesta coleção...

O mesmo erro ocorre para quando estou alterando...

Se altero um registro, não dá nenhum erro....mas se vou alterá-lo novamente ou alterar outro, dá esse erro

Esse erro ocorre quando se faz o filtro para inclusao

rs.Filter = "Cli_Cod Like '" & txtCli_Cod & "'"
e para alteração
rs.Filter = "Cli_Cod = " & txtCli_Cod & " AND Cli_NomeFantasia = '" & txtCli_NomeFantasia & "' AND Cli_RazaoSocial = '" & txtCli_RazaoSocial & "' And Cli_Endereco = '" & txtCli_Endereco & "' And Cli_Numero = '" & txtCli_Numero & "' And Cli_Bairro = '" & txtCli_Bairro & "' And Cli_Cidade = '" & txtCli_Cidade & "' And Cli_Estado = '" & txtCli_Estado & "' And Cli_CEP = '" & txtCli_CEP & "' And Cli_Email = '" & txtCli_Email & "' And Cli_DDD = '" & txtCli_DDD & "' And Cli_Telefone = '" & txtCli_Telefone & "' And Cli_Celular = '" & txtCli_Celular & "' And Cli_RG = '" & txtCli_RG & "' And Cli_CPF = '" & txtCli_CPF & "' And Cli_CNPJ = '" & txtCli_CNPJ & "' And Cli_IE = '" & txtCli_IE & "'"

O erro NÃO ocorre se eu incluir/alterar, aí fechar o form e depois abri-lo novamente e incluir/alterar mais um

o que pode estar havendo??

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

todos os campos do filter tem q estar no select do recordset q deve estar ativo e aberto. é possivel q o nome de algum dos campos esteja errado, confira ai. se você tiver dificuldade de encontrar, tenta ir tirando campo por campo do filter e va tentando ver se funciona a cada campo tirado assim você pode encontrar qual o errado.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...