ERRO COM OBJETO RECORDSET

LUIS.HERRERA 11/08/2011 16:47:54
#381451
Boa tarde!
Estou com um problema que não consigo identificar, começou de uma hora para outra em alguns clientes e de forma intermitente. Porém não ocorre no meu micro (XP SP3).

O erro é: nº 91 - Descrição : Object variable or With block variable not set

Ocorre na linha:
Do While Not rs5.EOF

Tenho uma rotina que é chamada para povoar um MSFlexGrid, e o erro ocorre dentro dela na hora que vai checar o final do loop do recordset.
O estranho é que o erro parece dizer que o recordset não foi setado, mas antes de chamar a rotina de povoar o grid, eu testo se tem registros no recordset.

Rs (cursor no cliente)
RS.open.....

If Not RS.EOF then
Chama montagem grid
Endif
RS.Close

RS.open....
repito o processo para montar o segundo grid, e assim para os demais

O que pode ser isso, uso o MDAC 2.6 (pois tinha o Jet incluído nele), bem como o sistema funcionava em win98, 2000, NT, XP, Vista, Seven, etc... Agora só tem suporte para XP em diante.

Agradeço qualquer ajuda.
KERPLUNK 11/08/2011 17:10:02
#381462
Verifique se rs5 não está null
LUIS.HERRERA 11/08/2011 17:13:57
#381463
Então eu faço

if not rs5.EOF Then
aí chamo a função de povoar, ou seja, tem registros pois não chegou ao fim do RS. Se não é .EOF então foi criado, carregado e tem registros certo?
KERPLUNK 11/08/2011 17:26:04
#381464
Acontece que se rs5 for NULL, vc não pode ver EOF:
If not rs5 is null then
if not rs5.eof
....
LUIS.HERRERA 11/08/2011 17:27:47
#381466
Nossa isso eu não sabia. Então terei de mudar todas as rotinas do sistema para testar isso antes.Nunca tinha lido nada a respeito.
Vou testar. obrigado
KERPLUNK 11/08/2011 17:50:05
#381479
é acontece... hehehe
LUIS.HERRERA 12/08/2011 09:36:56
#381530

Kerplunk isso que você postou gera erro:

IF Not rs5 Is Null Then [ô]não é aceito pelo VB

Erro nº 424 - Descrição : O objeto é obrigatório



KERPLUNK 12/08/2011 09:47:58
#381533
Estou sem VB aqui, mas o que vc tem que fazer é verificar se está aberto e/ou se não é null...
LUIS.HERRERA 12/08/2011 10:15:14
#381537
Então mas quando se faz RS.Open .... isso obrigatoriamente não cria o RS, independente dele ter ou não registros?
Pois se não tiver registros, ele ficará com RS.BOF e RS.EOF (ambos iguais a TRUE).

Como um recordset pode ser Null depois de aberto?

Minha estrutura está:

Módulo:
Public rs5 As ADODB.Recordset

Form:

Private Sub PovoarGridsAuxiliares(nIdentificador As Long, Optional bCarregaDadosVigentes As Boolean)
If Conectar Then [ô]função realiza conexão retorno true (conectado)
Set rs5 = New ADODB.Recordset
rs5.CursorLocation = adUseClient
rs5.Open [Ô]SELECT ............;[Ô], cn, adOpenStatic, adLockReadOnly, adCmdTableDirect
If Not rs5.EOF Then
AtivaProgressBar (rs5.RecordCount) [ô]inicia exibição progresso
CarregarGridCopias
DesativaProgressBar
Else
GridCopias.Rows = 1
End If
rs5.Close
[ô] aqui refaço o processo para os outros grids.

else
[ô]não conectou
end If
End Sub

Private Sub CarregarGridCopias()
10 On Error GoTo Falha

20 With GridCopias
30 .Redraw = False
40 .AllowUserResizing = flexResizeBoth
50 .Cols = rs5.Fields.Count
60 .Rows = 1
70 Do While Not rs5.EOF [ô] aqui ocorre o erro em algumas situações não detectadas
80 .Rows = .Rows + 1
......
90 Loop
100 End With

....
End Sub

IMPORTANTE: Repare que antes da linha assinalada do erro em CarregarGridCopias, linha 50 já há uma referência ao total de colunas criado pelo grid usando exatamente o Recordset, então se ele estivesse nulo, o erro já ocorreria alí não? Porém ao meu ver, o erro teria de ocorrer já na Sub PovoarGridsAuxiliares anterior, pois é checado se o recordset é EOF então se ele fosse nulo, não seria também EOF e o erro ocorreria lá. Muito estranho isso.


KERPLUNK 12/08/2011 12:03:12
#381553
A mensagem [Ô]Object variable or With block variable not set[Ô] indica que tem um objeto que não foi instanciado, pode ser o recordset, a conexão, ou qualquer outro. Depure o código e veja qual deles é
LUIS.HERRERA 12/08/2011 14:25:30
#381576
Olha depurar o código é impossível, pois só ocorre em alguns clientes, não são todos. Onde desenvolvo também não acontece, então fica impossível eu depurar.

eu passei o código no último poste, é exatamente isso, agora se há registros no recordset quando eu chamo a sub que ocorre o erro, como o objeto pode não estar instanciado se está aberto e com registros? Isso não tem lógica.
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas