Avatar billede hekla Nybegynder
06. juni 2003 - 15:49 Der er 15 kommentarer og
2 løsninger

Knap så langsom

Min database er opdelt i front end og back end. Front end ligger på arbejdsstationerne.

Den har en rimelig performance, men en bestemt knap på en formular, som åbner en rapport baseret på en forespørgsel kører utroligt langsom (svartider på > 10 sek, når der er flere brugere koblet på back end). I forespørgslen filtereres tabellens datofelt efter talfeltet "dage" på samme formular.

Et nøjagtig tilsvarende sæt (formular, rapport, forespørgsel, talfelt) har svartider på ca et sek. Eneste forskel er at dette sæt også filtreres på CPR-nummer. Der er kun ét CPR-nummer i min tabel aktuelt og ganske få poster.

Jeg har kopieret alle elementer i både front end og back end over i nye, tomme databaser,
Jeg har lavet formular og forespørgsel forfra fra bunden og givet dem nye navne,
Jeg prøvet at lade knappen åbne forespørgslen i stedet for rapporten,
Jeg har kopieret Dage-feltet fra den velfungerende til den dårligt fungerende formular
og lige lidt hjalp det.

Det eneste, der hjalp, var at ændre "Dage"-kriteriet til den velfungerende formular, men det kan jeg ikke rigtig bruge i praksis.

Er der nogen der har flere forslag?
Forespørgslerne og koden kommer nedenfor.


Det dårligt fungerende sæt:
Forespørgsel, f_alle:
SELECT t_barn.CPR, t_barn.Fornavn, t_barn.Efternavn, t_notater.Notattype, t_notater.notat, t_notater.Dato, t_notater.Klokkeslet, t_notater.init, t_afdeling.Institutionsnavn, t_afdeling.Afdelingsnavn
FROM t_afdeling, t_barn INNER JOIN t_notater ON t_barn.CPR = t_notater.CPR
WHERE (((t_notater.Dato)>=Date()-[forms]![f_laes]![dage]));


Kode på knappen:
Private Sub cmd_alle_Click()

Dim stDocName As String
stDocName = "r_allebarn_sidste_dogn"

'Tests if the query is empty
If DCount("*", "Q_alle") = 0 Then
    MsgBox "Der er ingen notater skrevet de(t) sidste " & Forms!f_laes!dage & " døgn", vbInformation, "Ingen notater, vælg en længere periode"
  Exit Sub
End If

'Logging rutine
CPRnummer = Me!dage
Formul = "3"
Call Loguser

'Opens report
DoCmd.OpenReport stDocName, acPreview
DoCmd.Maximize

Exit Sub
End Sub


Det velfungerende sæt:
Forespørgslen, Q_etbarn_sidstedogn:
SELECT t_barn.CPR, t_barn.Fornavn, t_barn.Efternavn, t_notater.Dato, t_notater.Klokkeslet, t_notater.Notattype, t_notater.notat, t_notater.init, t_afdeling.Institutionsnavn, t_afdeling.Afdelingsnavn
FROM t_afdeling, t_barn INNER JOIN t_notater ON t_barn.CPR = t_notater.CPR
WHERE (((t_barn.CPR)=[forms]![f_laes_periode]![cpr]) AND ((t_notater.Dato)>=(Date()-[forms]![f_laes_periode]![dage])));



Private Sub cmd_vis_etbarn_Click()

Dim stDocName As String
stDocName = "r_etbarn_sidstedogn"

'Tests if the query is empty
If DCount("*", "Q_etbarn_sidstedogn") = 0 Then
    MsgBox "Der findes ingen notater fra denne periode", vbInformation, "Ingen notater, vælg en længere periode"
  Exit Sub
End If
   
'Logging rutine
CPRnummer = Me!CPR
Formul = "8"
Call Loguser

'Opens report
DoCmd.OpenReport stDocName, acPreview
DoCmd.Maximize

Exit Sub
End Sub
Avatar billede hekla Nybegynder
06. juni 2003 - 15:56 #1
Herudover har jeg komprimeret og repareret og haft front ends og back end liggende på forskellige maskiner.

Det foregår i AccessXP
Avatar billede mugs Novice
06. juni 2003 - 15:57 #2
Jeg har absolut ingen forstand på det her, men nedennævnte linie falder mig i øjnene:

WHERE (((t_notater.Dato)>=Date()-[forms]![f_laes]![dage]));

Det tror jeg vil kunne gøre den langsom. Er det muligt (om ikke andet så som et forsøg), at flytte dage til forespørgslen?
Avatar billede hekla Nybegynder
06. juni 2003 - 16:02 #3
Det fungerer jo problemfrit i det velfungerende sæt, og meningen er, at brugerne, skal kunne vælge, hvor langt tilbage output skal gå.
Avatar billede hekla Nybegynder
06. juni 2003 - 18:42 #4
Forhøjer til 100p
Avatar billede kabbak Professor
06. juni 2003 - 20:21 #5
Prøv at omdøbe 'Forespørgsel, f_alle'

Kopier derefter 'Forespørgslen, Q_etbarn_sidstedogn', ved at højreklikke på navnet og vælg kopier.

indsæt den som 'f_alle'

gå ind i designvisning og ret kretieriet til '>=Date()-[forms]![f_laes]![dage]'

du soger jo at Forespørgslen, Q_etbarn_sidstedogn, kører fint, så derfor kopieringen.
Avatar billede kabbak Professor
06. juni 2003 - 20:21 #6
soger = siger
Avatar billede terry Ekspert
06. juni 2003 - 20:28 #7
sounds to me as though you need to have an index on yor date field. I wouldnt be surprised if your CPR number is already indexed!
Avatar billede terry Ekspert
06. juni 2003 - 20:31 #8
Even if this deosnthelp here its import that fields often used for searching are indexed. Quite often in Access programs people think that its enough to have a primary key which in most cases is an autonumber and thats about it!
Avatar billede terry Ekspert
07. juni 2003 - 09:21 #9
Have you tried to find out EXACTLY where th eproblem is? Is it the VBA code which opens the report, or maybe the query behind the report. Or is it the actual report? You can do this be entering all the data in the appropriate fields and then just open the query directly. Then you can do the same with the report. If you have MANY calculated fields on the report then it IS going to take longer although 10 seconds does seem too long.

Something else: You could save this line
If DCount("*", "Q_etbarn_sidstedogn") = 0 Then

and do it in the actual report although it may not save any time.


You can use the reports NoData event for this

Private Sub Report_NoData(Cancel As Integer)
MsgBox "Der findes ingen notater fra denne periode", vbInformation, "Ingen notater, vælg en længere periode"

Cancel = True

End Sub
Avatar billede hekla Nybegynder
07. juni 2003 - 22:21 #10
kabbak>> Jeg har prøvet dit forslag før, og jeg har testet det igen nu, men det virker desværre ikke.

Terry>> Både dato og CPR er indexerede. i øvrigt bliver datofeltet jo brugt på nøjagtig samme måde i den velfungerende og den dårligt fungerende forespørgsel.
Jeg har fundet ud af, nøjagtigt hvor problemet er, men jeg glemte at skrive, at jeg havde prøvet at lade knappen åbne forespørgslen i stedet for rapporten, hvilket ikke ændrede noget. Det eneste der hjalp, var at ændre kriteriet fra talfeltet på den syge til talfeltet på den raske formular, så det er vel talfeltet i den syge formular det er galt med.
'If DCount("*", "Q_etbarn_sidstedogn") = 0 Then' fungerer fint i den raske formular.
Avatar billede terry Ekspert
09. juni 2003 - 20:41 #11
I will take a look if you like, mayb eit seasier for me to see what is happening. eksperten@santhell.dk
Avatar billede hekla Nybegynder
09. juni 2003 - 23:06 #12
terry>> Jeg slettede 30-40 formularer, som tilsyneladende ikke havde noget med det aktuelle problem at gøre for at reducere størrelsen på databasen, da jeg ville sende den til dig. Det sjove er, at det fil fejlen til at forsvinde!!?
Så nu må jeg prøve mig frem til, hvilke formularer det er, der medfører fejlen. Jeg har derfor ikke sendt dig databasen.
Avatar billede mugs Novice
09. juni 2003 - 23:12 #13
Lyder sjovt!
Avatar billede hekla Nybegynder
09. juni 2003 - 23:20 #14
Ja, der er arbejde til de lange sommeraftener :o(
Avatar billede tma_oksboel Nybegynder
12. juni 2003 - 10:55 #15
Har du kunnet kompilere koden problemfrit? Det er vel næsten den eneste årsag en formular der ikke anvendes kan slæbe med sig.
Avatar billede hekla Nybegynder
12. juni 2003 - 12:30 #16
Der har ikke været problemer med compileringen.
/hekla
Avatar billede hekla Nybegynder
23. juni 2003 - 15:07 #17
Lukker spøgsmålet
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester