Pessoal, boa tarde!!!
Qual a melhor maneiro de fazer um filtro no banco de dados access, correr os registros selecionados em um loop e dentro desse loop fazer update na tabela na medida que for percorrerndo o loop? Atualmente, faço da seguinte maneira:
Dessa forma que faço hoje, acho muito lento, dependendo do número de registros e outra que quando trabalhamos com RecordSet, o banco de dados vai aumentando.
Queria uma solução, dica, ou qualquer coisa do tipo que otimizasse esse código acima para ficar mais rápido e também, talvez, não usar RecordSet para não ficar aumentando o banco.
Certo de atenção, agradeço-lhes e aguardo retorno.
Atenciosamente,
Qual a melhor maneiro de fazer um filtro no banco de dados access, correr os registros selecionados em um loop e dentro desse loop fazer update na tabela na medida que for percorrerndo o loop? Atualmente, faço da seguinte maneira:
- Código:
Private Function SetGrupo(ByVal strCiclo As String, ByVal strTipo As String, ByVal strRecDes As String) As Boolean
On Error GoTo Erro_SetGrupo
'Declaração das variáveis
Dim db As Database, qdSel1 As QueryDef, rsSel1 As Recordset, qdSel2 As QueryDef, rsSel2 As Recordset
Dim SQL As String, SQLFinal As String
Dim bRetVal As Boolean
Dim vVal As String
' Inicialização das variáveis
bRetVal = True
Set db = CurrentDb
' Seta os campos RELACIONADA e GRUPO
Set qdSel1 = db.CreateQueryDef("Sel1")
qdSel1.SQL = "SELECT [EOT REL] FROM TB_Provisao WHERE Movimento = '" & strRecDes & "' AND Ciclo = '" & strCiclo & "' AND [TIPO] = '" & strTipo & "' GROUP BY [EOT REL];"
Set rsSel1 = qdSel1.OpenRecordset(dbOpenSnapshot)
If rsSel1.RecordCount > 0 Then
Set qdSel2 = db.CreateQueryDef("Sel2")
rsSel1.MoveFirst
Do Until rsSel1.EOF 'Fazer enquanto não chegar ao final da
SQL = "PARAMETERS [cod] INTEGER; " & _
"SELECT TB_Anexo5.Holding FROM TB_Anexo5 WHERE TB_Anexo5.[CODIGO] = [cod];"
qdSel2.SQL = SQL
qdSel2.Parameters("cod") = rsSel1![EOT REL]
Set rsSel2 = qdSel2.OpenRecordset(dbOpenSnapshot)
SQL = "UPDATE TB_Provisao SET GRUPO = '" & Trim(rsSel2![HOLDING]) & "'" & " WHERE Movimento = '" & strRecDes & "' AND [EOT REL] = '" & rsSel1![EOT REL] & "' AND Ciclo = '" & strCiclo & "' AND [TIPO] = '" & strTipo & "';"
DoCmd.SetWarnings False
DoCmd.RunSQL SQL, False
DoCmd.SetWarnings True
rsSel1.MoveNext 'Mover para o próximo registro
Loop
End If
Sair_SetGrupo:
db.QueryDefs.Delete "Sel1"
db.QueryDefs.Delete "Sel2"
rsSel1.Close
rsSel2.Close
db.Close
' Libera os objetos da memória
Set db = Nothing
Set rsSel1 = Nothing
Set rsSel2 = Nothing
SetGrupo = bRetVal
Exit Function
Erro_SetGrupo:
MsgBox "Erro: " & Err.Number & " - " & Err.Description & " - ClassProvisao.SetGrupo()"
bRetVal = False
Resume Sair_SetGrupo
End Function
Dessa forma que faço hoje, acho muito lento, dependendo do número de registros e outra que quando trabalhamos com RecordSet, o banco de dados vai aumentando.
Queria uma solução, dica, ou qualquer coisa do tipo que otimizasse esse código acima para ficar mais rápido e também, talvez, não usar RecordSet para não ficar aumentando o banco.
Certo de atenção, agradeço-lhes e aguardo retorno.
Atenciosamente,