30. juni 2004 - 15:56Der er
22 kommentarer og 1 løsning
Performance i access
Jeg har lavet en lille db, med 10 tabeller og ca 10 formularer. Der er nu indtastet ca 8000 records i den ene tabel. Den kører på et netværk. Jeg har komprimeret db-en. Indtastning i formularen er blevet langsom. Der fremkommer timeglas, som skal afventes inden næste indtastning. Indtastning af en record afsluttes med "Enter". Hvis man taster for hurtigt mistes data fra seneste record. Der er ikke relationer i db-en, men tabellen indeholder ca 10 felter. Har nogen gode ideer til mig så hører jeg gerne. Husk svar så jeg kan give point.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Prøv at lave en autoformular og se om den er hurtigere en dan anden form. Databasevindue > Tabeller > Marker din tabel og find ikonet for autoformular på menulinien.
der er for mig ingen tvivl om, at det er koden der sløver. Først åbner du formularen i den første record hvorefter du sender formularen til den sidste record. Ydermere kører du så en makro, og det gør den ikke hurtigere.
Hvad indeholder Makro6? Makroer bør absolut undgås i den færdige applikation.
Makro6: flytter focus til felt1. Den har jeg slettet og lavet en setfocus på open, men stadig er der dårlig performance. Koden "RS.Movelast" skulle vist nok gøre at access kunne bevare sidst indtastede i felter som man så ikke behøver at indtase igen i næste record. Har du et forslag til ændring af koden. Kan RS.movelast undværes ?
Jeg bruger samme kode til at indsætte værdien fra sidste post, og har ikke rigtig nogen bud, bortset fra at du kan prøve at undlade nogle kodelinier een af gangen for at se hvad der sker.
Dim rs As DAO.Recordset If Me.NewRecord Then Set rs = Me.RecordsetClone rs.MoveLast Me!felt1.DefaultValue = "'" & rs!felt1 & "'" rs.Close End If
Jeg kan huske at vi snakkede om den kode i et tidligere spm. Og da kom vi frem til, at disse to linier bedst skulle ligge på Form_Beforeupdate: Me!Tid = Now Me!Bruger = CurrentUser()
Jeg tror dog ikke, at det har den store betydning for performance.
Jeg tror dog, at du kunne drage stor nytte af at sørge for, at rs-koden kun udføres hvis du hopper til en ny post (det har jo ingen effekt på gamle poster):
Private Sub Form_Current() Dim rs As DAO.Recordset Dim stDocName As String
On Error Resume Next If Me.Newrecord then Set rs = Me.RecordsetClone rs.MoveLast Me!Udskibningsdato_Dato.DefaultValue = "'" & rs!Udskibningsdato_Dato & "'" Me!Bmrk.DefaultValue = "'" & rs!Bmrk & "'" rs.Close endif
Til thomasjepsen, du har ret i at vi for få dage siden talte om
Form_Beforeupdate: Me!Tid = Now Me!Bruger = CurrentUser()
Denne kode har jeg flyttet, men dårlig performance har jeg stadig.
Jeg vil prøve med Me.newrecord senere eller i morgen. Har du en ide til opdatering. Du ved at Docmd.refresh ikke virkede, i min ovst kode. Jeg tror iøvrigt Portugal vinder over Holland.
hvorfor er det, at du vil opdatere formularen? Jeg forstår ikke helt formålet? Docmd.Requery vil få formularen til at hoppe til første post, så det er nok ikke så godt. Jeg tror umiddelbart bare, at du skal fjerne linien.
Metoden er forøvrigt meget gammeldags, selvom access stadig (i version 2003) selv genererer denne kode når man bruger guiden. Metoden stammer tilbage fra version 7.0 (Access 95). Man kan med fordel blot bruge Me.refresh
thomasjepsen > Som jeg har forstået, er der tale om en ny post. Vil refresh så tilføje posten til tabellen? Men iøvrigt er det jo korrekt, at koden ikke er nødvendig, da den nye post vil blive tilføjet når denne forlades.
Så er den der: Private Sub Form_Current() Dim rs As DAO.Recordset Dim stDocName As String On Error Resume Next Set rs = Me.RecordsetClone rs.MoveLast Me!Udskibningsdato_Dato.DefaultValue = "'" & rs!Udskibningsdato_Dato & "'" Me!Bmrk.DefaultValue = "'" & rs!Bmrk & "'" rs.Close End Sub ------ og det virker det med at det som du lige har tastet bliver stående i felterne, så du kan nøjes med at taste eksp nr, hvis der er tale om samme udskibningsdato. ---- Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.Dirty Then Me!Tid = Now Me!Bruger = CurrentUser() End If
End Sub - er indsat på fefore update. ------------ Private Sub Form_Open(Cancel As Integer) Me!Eksp_nr.SetFocus End Sub -------- er indsat på open. Tak for hjælpen gutter eller gutterinder.
Jeg synes der er noget galt med pointgivningen her i eksperten. Det er i hverfald ikke logisk opbygget. Point til thomasjepsen. Jeg kom vist til at give mig selv point !!"!!
Hvis du ikke mener at have fået den nødvendige hjælp, er du naturligvis velkommen til selv at tage dine point igen. Men en begrundelse herfor mener jeg at være på sin plads, da en sådan handling ikke er særlig befordrende for fremtidig hjælp.
Tolveren->jeg undrede mig dog også lidt, da jeg så, at du selv tog pointene. Men du er langt fra den første, som har haft problemer med at give point. :o)
Men du kan bare oprette nyt spm med reference til dette spm.
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.