ERRO COM OBJETO RECORDSET
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.
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.
Verifique se rs5 não está null
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?
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?
Acontece que se rs5 for NULL, vc não pode ver EOF:
If not rs5 is null then
if not rs5.eof
....
If not rs5 is null then
if not rs5.eof
....
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
Vou testar. obrigado
é acontece... hehehe
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
Estou sem VB aqui, mas o que vc tem que fazer é verificar se está aberto e/ou se não é null...
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.
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.
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 é
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.
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.
Tópico encerrado , respostas não são mais permitidas