BOTOES DE NAVEGACAO ANTERIOR E PROXIMO VB6

ROGERCSANTOS 26/11/2013 10:22:04
#431467
Pessoal,

Estou fazendo uma aplicação em VB6 e estou tendo muitos problemas com os botões de navegação Anterior e Próximo. Quando clico no botão próximo ele passa apenas um registro e só fica nele, ou seja, não navega para os demais registros.

Para o botão próximo por exemplo eu fiz o seguinte:

Private Sub ProximoRegistroBanco()

Set rsSelecaoBanco = Nothing
Set CN = Nothing

CN.Provider = [Ô]SQLOLEDB[Ô] [ô] Provedor de acesso ao SQL Server
CN.Properties([Ô]Data Source[Ô]).Value = [Ô]ROGERIO-PC\SQLEXPRESS2008[Ô] [ô]Nome da Maquina\Instancia onde está instalado o BD
CN.Properties([Ô]Initial Catalog[Ô]).Value = [Ô]SYSCONTROL[Ô] [ô]Nome do BD
CN.Properties([Ô]User ID[Ô]).Value = [Ô]SYSCONTROL[Ô] [ô]Usuário para conexão no BD no SQL SERVER 2008
CN.Properties([Ô]Password[Ô]).Value = [Ô]tecsis[Ô] [ô]Senha para conexão no BD no SQL SERVER 2008
CN.Open [ô] Abrindo a conexão

Set rsSelecaoBanco = New ADODB.Recordset
Set rsSelecaoBanco.ActiveConnection = CN

rsSelecaoBanco.Open [Ô]SELECT * FROM SYSCONTROL.DBO.BANCO[Ô], CN, adOpenDynamic

rsSelecaoBanco.MoveNext
If rsSelecaoBanco.EOF Then
MsgBox [Ô]Fim do Arquivo, Registros indisponíveis[Ô], vbInformation
rsSelecaoBanco.MoveLast
End If
End Sub

Depois coloquei na opção click do botão próximo:

ProximoRegistroBanco
MostrarBanco


Onde:

Private Sub MostrarBanco()
txtcodbanco.Text = rsSelecaoBanco!CODIGO
txtabrbanco.Text = rsSelecaoBanco!ABREVIATURA
txtnomebanco.Text = rsSelecaoBanco!Nome
End Sub

Poderiam me auxiliar neste problema?
Já fiz várias pesquisas e não consegui achar a solução

Abraço

Rogério Couto

KIMH 26/11/2013 10:52:39
#431472
Bom dia Rogério.

Seu problema é o seguinte vc está abrindo a conexão na Sub ProximoRegistroBanco()

Quando o código: rsSelecaoBanco.Open [Ô]SELECT * FROM SYSCONTROL.DBO.BANCO[Ô], CN, adOpenDynamic; é executado

A variável rsSelecaoBanco é posicionada no primeiro registro

e logo abaixo vc da um MoveNext - posicionando no segundo registro.

Ou seja o cursor vai estar sempre no segundo registro



OMAR2011 26/11/2013 11:03:32
#431473
Resposta escolhida
Isto é a melhor forma de movimentar registro.
Para mim superou.

Título da Dica: Conexão ADO um pouco mais profissional e usando Command

Postada em 22/4/2003 por ®ogerVB

Neste exemplo de conexão estou usando o ADO 2.7, e 3 TextBox, com os nomes TxtCodigo, TxtNome e TxtObs,
e 4 CommandButton com os nome CmdPrimeiro, CmdAnterior, CmdProximo e CmdUltimo para a movimentação no banco!
Depois de adicionado esse objetos pode e a referencia pode copiar o seguinte código:

Public Conexao As ADODB.Connection
Private RsTabela As ADODB.Recordset
Private Cmd As ADODB.Command


Private Sub Atualizar()
TxtCodigo.Text = RsTabela([Ô]codigo[Ô])
TxtNome.Text = RsTabela([Ô]nome[Ô])
TxtObs.Text = RsTabela([Ô]obs[Ô])
End Sub


Private Sub CmdAnterior_Click()
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Conexao
Cmd.CommandType = adCmdText
Cmd.CommandText = [Ô]select * from tabela where codigo=(select max(codigo) from tabela where codigo < ?)[Ô]
Cmd.Parameters(0).Value = TxtCodigo.Text
Set RsTabela = Cmd.Execute

If Not RsTabela.EOF Then
Atualizar
End If
RsTabela.Close
Set RsTabela = Nothing
Set Cmd = Nothing
End Sub


Private Sub CmdPrimeiro_Click()
Set RsTabela = New ADODB.Recordset
RsTabela.Open [Ô]Select * From Tabela where codigo=(select min(codigo) from tabela)[Ô], Conexao, adOpenDynamic

If Not RsTabela.EOF Then
Atualizar
End If
RsTabela.Close
Set RsTabela = Nothing
End Sub


Private Sub CmdProximo_Click()
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Conexao
Cmd.CommandType = adCmdText
Cmd.CommandText = [Ô]select * from tabela where codigo=(select min(codigo) from tabela where codigo > ?)[Ô]
Cmd.Parameters(0).Value = TxtCodigo.Text
Set RsTabela = Cmd.Execute

If Not RsTabela.EOF Then
Atualizar
End If
RsTabela.Close
Set RsTabela = Nothing
Set Cmd = Nothing
End Sub


Private Sub CmdUltimo_Click()

Set RsTabela = New ADODB.Recordset
RsTabela.ActiveConnection = Conexao
RsTabela.CursorLocation = adUseClient
RsTabela.CursorType = adOpenDynamic
RsTabela.Open [Ô]Select * From Tabela where codigo=(select max(codigo) from tabela)[Ô]

If Not RsTabela.EOF Then
Atualizar
End If
RsTabela.Close
Set RsTabela = Nothing
End Sub


Private Sub Form_Load()
[ô]abre banco
Set Conexao = New ADODB.Connection
Conexao.Open [Ô]Provider=Microsoft.Jet.OLEDB.4.0; Data Source= [Ô] & App.Path & [Ô]\banco.mdb[Ô]
Frame1.Enabled = False
CmdPrimeiro_Click
End Sub

NILSONTRES 26/11/2013 11:52:08
#431477
Amigo, não perde tempo com isso, esse tipo de busca vc não vai utilizar em sistemas, pelo menos profissionais, a não ser que com certeza tera muitos pocous registros. Porque ? Cadastre dezenas, centenas, milhares de registros, depois navegue hum a hum para encontrar algo.
ROGERCSANTOS 26/11/2013 12:51:28
#431481
Boa tarde KIMH,

Mais se eu não abrir a conexão o sistema retorna uma mensagem de erro dizendo que o banco está fechado.
Como posso resolver essa questão?

De ante mão, te agradeço a atenção
ROGERCSANTOS 26/11/2013 13:19:03
#431484
Boa tarde Tri Campeão OMAR2011,

Eu tentei seguir o exemplo que me passou programando o botão anterior, porém ao realizar o teste a seguinte informação foi apresentada:

Run-time error [ô]3709[ô]

A operação solicitada requer um objeto OLE DB Session, para qual não há suporte do provedor atual.

Acho que é pq estou usando o Microsoft DAO 3.51 Object Library
MARCELO.TREZE 26/11/2013 13:45:33
#431490
Roger posso te dar uma sugestão?

Bom quando iniciei com DAO eu usava os botões de navegação (movenext, moveprevious, movefirst, movelast), porém com o crescimento de banco de dados, percebi que não era muito funcional eu ficar clicando para chegar a um determinado registro, vamos supor que você possua uma lista com 5000 nomes, ja pensou se quiser localizar um registro na posicção 2500, você terá que dar 2500 cliques no botão, meio inviável não acha?

Bom minha dica preencha uma grid pode ser listbox, listview, msflexgrid(o que eu uso), dbgrid, ou seja o que se encaixar melhor pra você.

como funciona você coloca, ou todos os registros nesta grid e seleciona um para exibir os dados, ou coloca um campo txt onde vc digita uma letra e esta grid preenche todos registros que possuem esta letra.

esta é a maneira mais viável de se navegar nos registros

KIMH 26/11/2013 14:35:46
#431492
Tenta fazer assim

Private Sub Form_Load()
Set rsSelecaoBanco = Nothing
Set CN = Nothing

CN.Provider = [Ô]SQLOLEDB[Ô] [ô] Provedor de acesso ao SQL Server
CN.Properties([Ô]Data Source[Ô]).Value = [Ô]ROGERIO-PC\SQLEXPRESS2008[Ô] [ô]Nome da Maquina\Instancia onde está instalado o BD
CN.Properties([Ô]Initial Catalog[Ô]).Value = [Ô]SYSCONTROL[Ô] [ô]Nome do BD
CN.Properties([Ô]User ID[Ô]).Value = [Ô]SYSCONTROL[Ô] [ô]Usuário para conexão no BD no SQL SERVER 2008
CN.Properties([Ô]Password[Ô]).Value = [Ô]tecsis[Ô] [ô]Senha para conexão no BD no SQL SERVER 2008
CN.Open [ô] Abrindo a conexão

Set rsSelecaoBanco = New ADODB.Recordset
Set rsSelecaoBanco.ActiveConnection = CN

rsSelecaoBanco.Open [Ô]SELECT * FROM SYSCONTROL.DBO.BANCO[Ô], CN, adOpenDynamic
End Sub

Private Sub ProximoRegistroBanco()
rsSelecaoBanco.MoveNext
If rsSelecaoBanco.EOF Then
MsgBox [Ô]Fim do Arquivo, Registros indisponíveis[Ô], vbInformation
rsSelecaoBanco.MoveLast
End If
End Sub


ProximoRegistroBanco
MostrarBanco

Private Sub MostrarBanco()
txtcodbanco.Text = rsSelecaoBanco!CODIGO
txtabrbanco.Text = rsSelecaoBanco!ABREVIATURA
txtnomebanco.Text = rsSelecaoBanco!Nome
End Sub


Obs.: Declare as variáveis de conexão com banco como publicas no form (deixando claro como nossos amigos acima conexão DAO já está ultrapassada).
OMAR2011 26/11/2013 14:59:53
#431494
[txt-color=#e80000]Acho que é pq estou usando o Microsoft DAO 3.51 Object Library [/txt-color]
Isto é do Access.
Tem que ser do SqlServer 2008.
Mude a conexão para Sqlserver,isto é apenas de como fazer.
ROGERCSANTOS 26/11/2013 16:17:24
#431498
Caros amigos,

Obrigado pelas dicas de vocês.
Deu certo por aqui...botões anterior e próximo funcionando perfeitamente.

Concordo que os botões estão obsoletos de acordo com o grande fluxo de informações, porém, eu queria eles funcionando apenas para tê-los no sistema mesmo.

Muito obrigado a todos
Tópico encerrado , respostas não são mais permitidas