No código abaixo, você notará que a velocidade de processamento do Openrecordset pode ser de 40 a 200 vezes mais rápida do que usando o Insert Into no Access Vba.
Para o texte, eu criei uma tabela chamada Table1 e coloquei as colunas de A até J em texto curto. A coluna A será preenchida com a letra 'A', a B com a letra 'B' e assim sucessivamente.
Com o DoCmd.RunSQL foram gastos 14,1 segundo, com o Openrecordset foram gastos 0,07 segundos. Ou seja 200 vezes mais rápido.
Private Sub carga()
Dim rst As Recordset
Dim vStrSQL As String
Dim vLgTimer As Long
Dim vLgI As Long
'vLgTimer = Timer
vStrSQL = "SELECT * FROM Table1;"
Set rst = CurrentDb.OpenRecordset(vStrSQL)
vStrSQL = "INSERT INTO Table1 (A, B, C, D, E, F, G, H, I, J) " & _
"VALUES ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');"
If InputBox("Insira: " & vbCr & "1 - para processar DoCmd.RunSQL;" & vbCr & "2 - para processar OpenRecordset;", "Tempo de Processamento...", 1) = 1 Then
vLgTimer = Timer
For vLgI = 0 To 1000
DoCmd.RunSQL vStrSQL
Next
MsgBox "Processado em " & Left(Abs((Timer - vLgTimer)), 4) & " segundos usando o DoCmd.RunSQL"
Else
vLgTimer = Timer
For vLgI = 0 To 1000
'Não coloque o - Set rst = CurrentDb.OpenRecordset(vStrSQL) - dentro de estruturas de repetição, pois atrasa o processamento.
rst.AddNew
rst!A = "A": rst!B = "B": rst!C = "C": rst!D = "D": rst!E = "E": rst!F = "F": rst!G = "G": rst!H = "H": rst!I = "I": rst!J = "J"
rst.Update
Next
MsgBox "Processado em " & Left(Abs((Timer - vLgTimer)), 4) & " segundos usando o OpenRecordset"
End If
End Sub
Outro fator importante é não colocar o Openrecordset dentro da Sub ou função que será chamada para fazer a carga. Isso porque o Set...Openrecordset para ser aberto exige um tempo bem significativo de processamento. No caso de uso de um Loop, For, While, o Set...Openrecordset não deve ficar dentro destas estruturas de repetição. Para tal, declare a variável recordset como pública ou global, e o set...openrecordset fora da estrutura de repetição. Assim o processamento fica top, num piscar de olhos.
Para o texte, eu criei uma tabela chamada Table1 e coloquei as colunas de A até J em texto curto. A coluna A será preenchida com a letra 'A', a B com a letra 'B' e assim sucessivamente.
Com o DoCmd.RunSQL foram gastos 14,1 segundo, com o Openrecordset foram gastos 0,07 segundos. Ou seja 200 vezes mais rápido.
Private Sub carga()
Dim rst As Recordset
Dim vStrSQL As String
Dim vLgTimer As Long
Dim vLgI As Long
'vLgTimer = Timer
vStrSQL = "SELECT * FROM Table1;"
Set rst = CurrentDb.OpenRecordset(vStrSQL)
vStrSQL = "INSERT INTO Table1 (A, B, C, D, E, F, G, H, I, J) " & _
"VALUES ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');"
If InputBox("Insira: " & vbCr & "1 - para processar DoCmd.RunSQL;" & vbCr & "2 - para processar OpenRecordset;", "Tempo de Processamento...", 1) = 1 Then
vLgTimer = Timer
For vLgI = 0 To 1000
DoCmd.RunSQL vStrSQL
Next
MsgBox "Processado em " & Left(Abs((Timer - vLgTimer)), 4) & " segundos usando o DoCmd.RunSQL"
Else
vLgTimer = Timer
For vLgI = 0 To 1000
'Não coloque o - Set rst = CurrentDb.OpenRecordset(vStrSQL) - dentro de estruturas de repetição, pois atrasa o processamento.
rst.AddNew
rst!A = "A": rst!B = "B": rst!C = "C": rst!D = "D": rst!E = "E": rst!F = "F": rst!G = "G": rst!H = "H": rst!I = "I": rst!J = "J"
rst.Update
Next
MsgBox "Processado em " & Left(Abs((Timer - vLgTimer)), 4) & " segundos usando o OpenRecordset"
End If
End Sub
Outro fator importante é não colocar o Openrecordset dentro da Sub ou função que será chamada para fazer a carga. Isso porque o Set...Openrecordset para ser aberto exige um tempo bem significativo de processamento. No caso de uso de um Loop, For, While, o Set...Openrecordset não deve ficar dentro destas estruturas de repetição. Para tal, declare a variável recordset como pública ou global, e o set...openrecordset fora da estrutura de repetição. Assim o processamento fica top, num piscar de olhos.
Última edição por Lauro Ribeiro em 14/7/2023, 12:49, editado 1 vez(es)