Jag har en tabell i Access som jag med ett SQL-anrop tar ut ett recordset till Excel-VBA, därefter loopar jag igenom setet, kollare lite saker och ökar en räknare (som jag återställer ibland) för att sedan uppdatera tabellen med räknarens värden för den posten, nån som fattar!??! :-) Se nedan! Tre förslag: Datan i tabellen ser ut enligt nedan: Är fältC unikt för varje grupp? Kan du inte skippa att köra den specifika UPDATE-queryn separat och istället modifiera recordsetet du redan har? Kör som Thomas G föreslår och ett enda genomlöp i posterna, Snabbare loop?
Set rsData = dbs.OpenRecordset(Select SQL-sträng)
Do While Not rsData.EOF
If strLastCode <> rsData.Fields("Code") Then
lngValue = 1
Else
lngValue = lngValue + 1
End If
dbs.Execute (Update SQL-sträng)
rsData.MoveNext
Loop
rsData.Close
Set rsData = Nothing
Min fråga är, om någon har något enkelt tips på hur detta går att snabba upp, då loopen idag tar närmare 5 timmar!!!
/MichaelSv: Snabbare loop?
1. If strLastCode <> rsData.Fields("Code") Then
Ersätt det med rsData(3) - om nu code-fältet är 3:e kolumnen
Du verkar göra en rekursiv loop. Berätta vad det är du hämtar ut för det kanske går att skriva om den så att din sql-sats går mycket snabbare och levererar mycket färre poster att bearbeta. Det du gör är troligtvis en full-tablescan, dvs tittar igenom varenda post flera gånger och gör därför kanske samma sak flera gånger.
tex:
strLastCode = 52
sql = "update tabell set värde = x where code <> " & strLastCode
En annan variant är att konvertera Access till MS-SQL Server Express vilket är en äkta databasmotor och gör jobbet mycket fortare. Inte minst kan du skapa lagrade procedurer och något som kallas cursors för att i en enda körning uppdatera datat eller som i detta fall en rekursiv loop.
Sv:Snabbare loop?
1, 0000006, A
1, 0000006, B
1, 0000006, C
1, 0000007, D
1, 0000010, A
1, 0000010, B
2, 0000006, A
2, 0000010, C
osv totalt ca.17000 poster
När första eller andra fältet skiljer sig mellan två poster skall räknaren börja om. I ovanstående
fall skall räknaren få värdena 1,2,3,1,1,2,1,1
Räknaren skriver jag sedan tillbaka med (för första posten)
"Update tabell set counter = räknare where fältA='A' and fältB='0000006' and fältC='A'"
Jag loopar igenom hela setet, men varje post endast en gång.Sv: Snabbare loop?
I såfall kan du kanske något sånt här blir snabbare:
UPDATE tabell as t1
SET counter = (
SELECT Count(*)
FROM tabell as t2
WHERE t1.fältA = t2.fältA AND t1.fältB = t2.fältB AND t2.fältC <= t1.fältC
)Sv:Snabbare loop?
rsdata.Edit
rsdata.Fields("DetForstaFaltet") = lngValue
rsdata.Update
rsdata.MoveNext
Sv: Snabbare loop?
(om värdet är samma, öka med ett, uppdatera. Annars nollställ räknaren).
Det ska räcka.
Detta borde vara avklarat på några sekunder.