PROBLEMAS COM FILTRO EM RECORDSET
Pessoal estou com a seguinte rotina:
With rst2
With .Fields
.Append "datref", adVariant
.Append "codfil", adVariant
.Append "tipven", adVariant
.Append "vlvend", adVariant
.Append "vlcust", adVariant
.Append "vlimpo", adVariant
.Append "vlcagr", adVariant
.Append "vlragr", adVariant
.Append "vllucb", adVariant
.Append "perlub", adVariant
.Append "qtdvei", adVariant
End With
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open , , adOpenDynamic, adLockOptimistic
End With
filtod = False
anager = True
While Not rst.EOF
If Not rst2.EOF Then
rst2.Filter = adFilterNone
rst2.Filter = "tipven = 'GER'"
End If
If rst2.EOF Then
rst2.AddNew
rst2!datref = rst!datref
rst2!codfil = IIf(filtod, 999, rst!codfil)
rst2!tipven = IIf(anager, "GER", rst!tipven)
rst2!vlvend = rst!vlvend
rst2!vlcust = rst!vlcust
rst2!vlimpo = rst!vlimpo
rst2!vlcagr = rst!vlcagr
rst2!vlragr = rst!vlragr
rst2!vllucb = rst!vllucb
rst2!perlub = rst!perlub
rst2!qtdvei = rst!qtdvei
rst2.Update
Else
'Totaliza regs
End If
rst.MoveNext
Wend
A questão é que qdo vou efetuar o filtro no recordset dinà ¢mico dá o erro:
Run-time error '-2147217825' - O filtro não pode ser aberto... alguém sabe o q pode estar errado??? Por favor!!!
With rst2
With .Fields
.Append "datref", adVariant
.Append "codfil", adVariant
.Append "tipven", adVariant
.Append "vlvend", adVariant
.Append "vlcust", adVariant
.Append "vlimpo", adVariant
.Append "vlcagr", adVariant
.Append "vlragr", adVariant
.Append "vllucb", adVariant
.Append "perlub", adVariant
.Append "qtdvei", adVariant
End With
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open , , adOpenDynamic, adLockOptimistic
End With
filtod = False
anager = True
While Not rst.EOF
If Not rst2.EOF Then
rst2.Filter = adFilterNone
rst2.Filter = "tipven = 'GER'"
End If
If rst2.EOF Then
rst2.AddNew
rst2!datref = rst!datref
rst2!codfil = IIf(filtod, 999, rst!codfil)
rst2!tipven = IIf(anager, "GER", rst!tipven)
rst2!vlvend = rst!vlvend
rst2!vlcust = rst!vlcust
rst2!vlimpo = rst!vlimpo
rst2!vlcagr = rst!vlcagr
rst2!vlragr = rst!vlragr
rst2!vllucb = rst!vllucb
rst2!perlub = rst!perlub
rst2!qtdvei = rst!qtdvei
rst2.Update
Else
'Totaliza regs
End If
rst.MoveNext
Wend
A questão é que qdo vou efetuar o filtro no recordset dinà ¢mico dá o erro:
Run-time error '-2147217825' - O filtro não pode ser aberto... alguém sabe o q pode estar errado??? Por favor!!!
O que você quer fazer com essa propriedade FILTER?
Localizar o registro com tipven = "GER" em rst2 para somar os valores apurados em rst.
Então troca pra:
While Not rst.EOF
If rst2.RecordCount > 0 Then
rst2.MoveFirst
rst2.Find "tipven = 'GER'"
Endif
If not rst2.EOF Then
rst2.AddNew
rst2!datref = rst!datref
rst2!codfil = IIf(filtod, 999, rst!codfil)
rst2!tipven = IIf(anager, "GER", rst!tipven)
rst2!vlvend = rst!vlvend
rst2!vlcust = rst!vlcust
rst2!vlimpo = rst!vlimpo
rst2!vlcagr = rst!vlcagr
rst2!vlragr = rst!vlragr
rst2!vllucb = rst!vllucb
rst2!perlub = rst!perlub
rst2!qtdvei = rst!qtdvei
rst2.Update
Else
'Totaliza regs
End If
rst.MoveNext
Wend
putz... só q tem situações q vou usar mais de um critério no FIND... e se não me engano o find não permite... ou estou errado??
Exemplo:
rst2.Find "tipven = 'GER' AND codfil = 1"
dá certo???
Exemplo:
rst2.Find "tipven = 'GER' AND codfil = 1"
dá certo???
Sem problemas! Na verdade, eu não recomendo fazer querys usando o FIND, pois decresce MUITO a performance da aplicação, sempre faço a busca usando o WHERE do SQL que é bem mais rápido, e retorna o registro da mesma forma, contribuindo para a melhora de velocidade da aplicação.
Pra resolver o problema do FIND, faz o seguinte: (Vou até postar na parte de dicas do Site)
1- Declare um recordset público com o nome de CLONE_RS assim:
2- Cole este código num módulo:
4- Chame o MULTI_FIND assim:
Multi_Find rs, "state = 'RJ' AND city = 'Rio'"
If rs.EOF then
Msgbox "Não encontrado!"
Else
Msgbox "Encontrado!"
Endif
Entendeu?
Pra resolver o problema do FIND, faz o seguinte: (Vou até postar na parte de dicas do Site)
1- Declare um recordset público com o nome de CLONE_RS assim:
Public clone_rs As ADODB.Recordset 2- Cole este código num módulo:
Public Sub Multi_Find( _
ByRef oRs As ADODB.Recordset, _
sCriteria As String)
Dim clone_rs As ADODB.Recordset
Set clone_rs = oRs.Clone
clone_rs.Filter = sCriteria
If clone_rs.EOF Or clone_rs.BOF Then
oRs.MoveLast
oRs.MoveNext
Else
oRs.Bookmark = clone_rs.Bookmark
End If
clone_rs.Close
Set clone_rs = Nothing
End Sub4- Chame o MULTI_FIND assim:
Multi_Find rs, "state = 'RJ' AND city = 'Rio'"
If rs.EOF then
Msgbox "Não encontrado!"
Else
Msgbox "Encontrado!"
Endif
Entendeu?
Tópico encerrado , respostas não são mais permitidas