19. januar 2017 - 12:56Der er
12 kommentarer og 1 løsning
Optimering af script brugt i Access
Hej alle
Jeg har fået hjælp til at lave et script som går ind og opretter rækker i en tabel i Access, hvis de ikke allerede eksisterer i forvejen. Scriptet udfører opgaven, men på så langsom vis at med det samme jeg skalerer datagrundlaget en smule op tager den over en uge at køre... Og derudover bliver scriptet ved med at køre selvom det egentlig er udført, hvilket kræver at jeg lukker databasen ned og åbner den igen...
Har I nogle eventuelle optimeringsmuligheder til scriptet vil jeg være utrolig taknemlig.
Function OpretDummyDage_AlleVarer() Dim d As Date Dim Db As Database Dim DummyRst As Recordset
Set Db = CurrentDb Set DummyRst = Db.OpenRecordset("tbl_VareforbrugStep1", dbOpenSnapshot) With DummyRst If Not .EOF Then Do OpretDummyDage (!Varenummer) .MoveNext Loop Until .EOF End If .Close End With Set DummyRst = Nothing Set Db = Nothing End Function
Private Sub OpretDummyDage(Varenummer As String) DoCmd.SetWarnings False For d = Date - 365 To Date If IsNull(DLookup("[Fysisk dato]", "tbl_VareforbrugStep1", "[Fysisk dato]=#" & Format(d, "yyyy/mm/dd") & "# AND Varenummer='" & Varenummer & "'")) Then DoCmd.RunSQL ("INSERT INTO tbl_VareforbrugStep1 (Varenummer, [Fysisk dato], Vareforbrug) SELECT '" & Varenummer & "',#" & Format(d, "yyyy/mm/dd") & "#, 0") End If Next d DoCmd.SetWarnings True End Sub
---
Kort forklaring til hvad scriptet gør. Jeg har en tabel med forskellige varenumre som hver har deres antal vareforbrugstransaktioner pr. dato. F.eks. Varenummer Dato Vareforbrug (antal) 12345 13-01-2016 10 12345 13-06-2016 30 54321 02-03-2016 5 54321 01-04-2016 50 Etc.
Scriptet går ind og laver en masse fiktive transaktionsdatoer (per varenummer) med 0 stk i vareforbrug på de datoer det seneste år hvor der IKKE er transaktioner. Det skal jeg bruge i forbindelse med aggregerede udregninger såsom gennemsnitlig forbrug det seneste år pr. varenummer, standardafvigelse pr. dag pr. varenummer det seneste år osv. Min udfordring er at jeg har 2.600 varenumre som dette skal gøres på, hvilket vil ende med at scriptet sammen med de eksisterende entries i tabellen skal skabe omkring 1 mio entries. Det mener jeg dog ikke bør tage fem dage at køre... Har I nogle optimeringsideer? Pft.!
To test performance you could make a copy of the table without data and then just loop to insert 1 million records without doing anything else. That should give you an idea of how long that takes,
In the first loop *OpretDummyDage_AlleVarer()) you open a recordset for all products
then in the next loop you use dlookup to check date, not sure exactly whats happening there. But couldn't you do this in OpretDummyDage_AlleVarer() so you only select those you know are OK date wise? That would eliminate the need to test using dlookup
Hej Terry Tak for fine inputs! Jeg er på ingen måde SQL haj! Så det du beder mig om er jeg meget usikker på hvordan jeg praktisk skal gøre? Kan du sende mig det fulde script med dine forslag til ændringer? Så prøver jeg at indsætte det og teste på et par varenumre?
Recordset which opened tbl_VareforbrugStep1 didn't contain distinct varenummer so a check is made to ensure we only process each varenummer once. This could be changed to an sql query which only selects DISTINCT varenummer.
A primary key comprising varenummer + date added to table so dlookup in OpretDummyDage isn't necessary, all varenummer+dates are inserted other than those which already exist
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.