Avatar billede fruwille Nybegynder
20. december 2001 - 13:06 Der er 56 kommentarer og
2 løsninger

Indlæsning af tabel som globale variable

I mine formularer har jeg lavet en funktion  der henter alle overskrifterne til formularfelterne i en brugerstyrettabel. Dette gør formularerne meget fleksible.

Jeg henter hvert felt som =overskrift(\"O1\") osv..
Det betyder tabellen med overskrifterne læses ind mange mange, for at få udfyldt en hel formular med overskrifter. Dette kan godt tage et par sekunder.

Mit spørgsmål er: Kan man ved indlæsningen af databasen (eller andet valgt tidspunkt), indlæse alle disse variable overskrifter fra overskriftsstabellen (ca. 100 stk) som nogle globale variable, således tabellen ikke skal åbnes for hver eneste overskrift.
Avatar billede bennytordrup Nybegynder
20. december 2001 - 13:10 #1
Gør det i et modul, hvor du har erklæret disse globale variable.

Rutinen til at indlæse variablene kan du f.eks. kalde fra en makro, som hedder AutoExec.
20. december 2001 - 13:10 #2
Brug evt et array! I Et modul laver du følgende kode:

Public Overskrift(100) as String

Public Sub GemOverskrifter
Dim rs as DAO.Recordset
Set rs = Currentdb.Openrecordset(\"DinOverskrifttabel\")
Do Until rs.eof
  Overskrift(Val(rs![TællerfeltetIDinOverskriftTabel])) = rs!Overskrift
  rs.movenext
loop
rs.close
set rs = nothing
End Sub


Funktionen benytter DAO, så du skal huske en reference hertil.
Avatar billede terry Ekspert
20. december 2001 - 13:12 #3
I doubt if it would be much faster reading them into variables.
You could use the Dlookup function instead of your own (which we cant see here!)

=Dlookup(\"overskrift\", \"overskriftTabel\", \"ID=01\")
20. december 2001 - 13:12 #4
4 sekunder hurtigere denne gang, Benny! Men heller ikke et særligt uddybende svar ;o)
Avatar billede terry Ekspert
20. december 2001 - 13:13 #5
Make sure that the table is indexed too (primary key on ID)
20. december 2001 - 13:13 #6
Terry, du mener vel ikke for alvor, at det er lige så hurtigt at bruge DLookup 100 gange frem for at læse dem ind i et Array????
Avatar billede fruwille Nybegynder
20. december 2001 - 13:19 #7
thomasjepsen

Jeg er ikke lige helt med. Min tabel ser således ud:
Nøgle: Overskrift:
O1    Første overskrift
O2    Anden overskrift
S15    Her en ny overskrift
osv.

Nøglen kan indeholde både tal og bogstaver og kan ikke umiddelbart laves om. (Er refereret mange steder)
Avatar billede terry Ekspert
20. december 2001 - 13:20 #8
No, I mean the dlookup is more than likley faster than the current function  overskrift, yes I know I didnt think it would be much faster, but we are only talking about 100, so how longs that going to take? OK on a 486 with 8Mb memory, then OK it may make a difference!
But then the array is kind of smart!
Avatar billede terry Ekspert
20. december 2001 - 13:22 #9
Well that does change things! Now you rgoing to need a function to get hold of the right \"overskrift\"!
Avatar billede terry Ekspert
20. december 2001 - 13:23 #10
Try the dlookup and see how long it takes.
20. december 2001 - 13:28 #11
Okay, hvis din nøgle også indeholder bogstaver, så kan du ikke direkte bruge denne metode (uden at lave en ny tabel, som holder styr på nummereringen, og så er du lige vidt!)

hvornår indlæser du overskrifterne nu? Hver gang formularen åbnes? Eller når databasen åbnes første gang?
Avatar billede proaccess Nybegynder
20. december 2001 - 13:32 #12
Hvorfor ikke bruge et array i 2 dimensioner, 1 til nøglen og 1 til overskriften, så er numereringen uden betydning... Der skal \"bare\" løbes gennem arrayet\'s 1.dimension, for at finde den rigtige værdi, og derefter returneres 2.værdi...
Avatar billede fruwille Nybegynder
20. december 2001 - 13:32 #13
Hver gang formularen åbnes
20. december 2001 - 13:35 #14
Proaccess har ret i at 2 diminsioner er en god ide. Jeg mangler bare lidt info om hvad der styrer om det er 01 eller 02 der skal bruges?
Det er jo ikke det samme hver gang (eller ville der jo ikke være nogen ide i det)....
Avatar billede proaccess Nybegynder
20. december 2001 - 13:35 #15
Public Overskrift(1 To 100, 1 To 2) as String

Public Sub GemOverskrifter
Dim iLoop As Integer
Dim rs as DAO.Recordset
Set rs = Currentdb.Openrecordset(\"DinOverskrifttabel\")
Do
  iLoop=iLoop+1
  Overskrift(iLoop,1) = rs!ID
  Overskrift(iLoop,2) = rs!Overskrift
  rs.movenext
loop Until rs.EOF
rs.close
set rs = nothing
End Sub

Avatar billede fruwille Nybegynder
20. december 2001 - 13:35 #16
proaccess

Kan du lave et eksempel som thomasjepsen har gjort?
20. december 2001 - 13:39 #17
ProAccess, får du ikke stadig problem med at ID ikke altid er nummerisk??
Avatar billede proaccess Nybegynder
20. december 2001 - 13:39 #18
Public function getOverskrift(rID As String) As String
  dim iLoop As Integer
  For iLoop=1 to 100
    If Overskrift(iLoop,1)=rID Then
      getOverskrift=Overskrift(iLoop,2)
      exit For
    End If
  Next
End Function
Avatar billede terry Ekspert
20. december 2001 - 13:42 #19
try the dlookup function
Avatar billede proaccess Nybegynder
20. december 2001 - 13:42 #20
>Thomas: Nej, for jeg bruger ikke ID til andet end opslag i array\'et, som ved ovenstående funktion...

ULEMPE: Det tager længere tid at finde den rette værdi, men ingen tid i forhold til opslag i tabel...
Avatar billede fruwille Nybegynder
20. december 2001 - 13:45 #21
Tidligere indsatte jeg =overskrift(\"O1\") i formularen, er det stadig det samme med nedenstående?

Public Overskrift(1 To 100, 1 To 2) As String
Avatar billede proaccess Nybegynder
20. december 2001 - 13:47 #22
Nu skal du bruge:

=getOverskrift(\"O1\")
Avatar billede proaccess Nybegynder
20. december 2001 - 13:47 #23
Forudsat at du også har den førnævnte funktion indskrevet...
Avatar billede fruwille Nybegynder
20. december 2001 - 13:51 #24
proaccess, så er jeg ikke helt med længere. Du sendte to eksempler. Det jeg vil er jo een gang at indlæse overskrifterne i 100 variabler og dernæst blot af kunne referere til disse uden at skulle læse disse igen. Jeg er ikke så kvik som I andre...
Avatar billede proaccess Nybegynder
20. december 2001 - 13:52 #25
Du skal bruge BEGGE kode-stumper...

Den ene er til indlæsning af din tabel i array\'et, den anden til at få vist de rigtige overskrifter...
Avatar billede fruwille Nybegynder
20. december 2001 - 13:57 #26
proaccess. Dit eksempel virker, kan jeg jo konstatere, men kunne jeg undgå at skulle bruge funktionen getoverskrift() jeg ved ikke om det også forsinker opbygningen af formularen, idet getoverskrift jo skal kaldes for hver eneste overskrift???
Avatar billede proaccess Nybegynder
20. december 2001 - 14:00 #27
Jo, der kaldes en funktion, men det er væsentlig hurtigere end at slå op i et array end i selve tabellen hver gang...

Man kan IKKE bruge alfanumeriske index-værdier i Array\'s, så du kan ikke kalde Overskrift(\"O1\") direkte :-(
Avatar billede fruwille Nybegynder
20. december 2001 - 14:09 #28
Så tror jeg jeg har forstået det, så hvis jeg vælger at ændre opslagsværdien fra f.eks. O1 til 1 osv. så kan jeg bruges thomasjepsen´s forslag og derved spare funktionskald for hver oveskrift? Er dette korrekt?

Og er det iorden med pointfordelingen:
thomasjepsen 40

proaccess 60

terry jeg betvivler ikke at dlookup også er god, men det var ikke det jeg søgte i mit spørgsmål.
Avatar billede proaccess Nybegynder
20. december 2001 - 14:13 #29
Ja - Det er korrekt, så skal du bare selv vide hvilke overskrifter, der har hvilket ID...  (og i orden med pts.)
Avatar billede fruwille Nybegynder
20. december 2001 - 14:32 #30
Ok så lige sidste spørgsmål, hvis jeg så kun bruger ID og 1 felt med overskrifterne, får jeg mine variable data lagt i overskrift(1) osv. men hvordan henter jeg dem i min formular =overskrift(1) duer ikke?
Avatar billede proaccess Nybegynder
20. december 2001 - 14:41 #31
Du skal bruge Thomas\'s forslag (13:10:50)

Bemærk at dit array skal være erklæret PUBLIC, og ligge i et modul (som ikke må hedde overskrift)
Funktionen GemOverskrifter skal køres inden formularen åbnes første gang... evt ved autoexec-macro
Avatar billede fruwille Nybegynder
20. december 2001 - 14:48 #32
proaccess du skriver:
Bemærk at dit array skal være erklæret PUBLIC, og ligge i et modul (som ikke må hedde overskrift)

Er følgende korrekt??? (forhøjer dine point med 25)

Option Compare Database
Option Explicit

Public Overskrift(0 To 100) As String
Avatar billede jesperthomsen Nybegynder
20. december 2001 - 14:55 #33
terry har da fat i noget af det rigtige. En simpel løsning, der gør at teksterne kun skal læses ind hvis vinduet åbnes. At læse alle teksterne ind i et array er udmærket, men det er da tvivlsomt om en bruger skøjter 100 skærmbilleder igennem. Dermed spildes en masse tid på at læse tekster som ikke vil blive brugt.
Ganske vist er dlookup langsom, men hvis opslaget ligger på formens on_open event vil det stadig gå så hurtigt at ingen opdager det. Der er jo ingen grund til at hoppe over hvor gærdet er højest.
Avatar billede fruwille Nybegynder
20. december 2001 - 15:01 #34
jesperthomsen
der er ikke tale om 100 skærmbilleder, men om få, men med mange overskrifter, så jo alle felter vil blive brugt.
Avatar billede proaccess Nybegynder
20. december 2001 - 15:02 #35
Ja !!!

Og kør så Thomas\'s kode, når du åbner databasen... (ikke formularen)

Public Sub GemOverskrifter
Dim rs as DAO.Recordset
Set rs = Currentdb.Openrecordset(\"DinOverskrifttabel\")
Do Until rs.eof
  Overskrift(Val(rs![TællerfeltetIDinOverskriftTabel])) = rs!Overskrift
  rs.movenext
loop
rs.close
set rs = nothing
End Sub

Avatar billede jesperthomsen Nybegynder
20. december 2001 - 15:04 #36
Åååå - så er det bare mig der ikke er vågen. Så er dlookup nok for langsom.
Avatar billede fruwille Nybegynder
20. december 2001 - 15:07 #37
Min kommentar fra 14:32:43 gør, at det fortsat ikke virker, hvad skriver jeg?
Avatar billede fruwille Nybegynder
20. december 2001 - 15:14 #38
I feltet skrives der: #Navn?
Avatar billede proaccess Nybegynder
20. december 2001 - 15:16 #39
Jeg kan ikke sige andet end at det burde virke...???...???

Hvordan virker det ikke, kommer der en fejlmeddelse, eller står der bare ikke noget?

Hvad hedder det modul, hvor du har koden (og dit array) i?

Avatar billede fruwille Nybegynder
20. december 2001 - 15:19 #40
Alt hvad jeg har er dette:

Option Compare Database
Option Explicit

Public Overskrift(0 To 100) As String
------------------------------------------
Public Sub GemOverskrifter()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(\"Otabel\")
Do Until rs.EOF
  Overskrift(Val(rs![ID])) = rs![felt2]
  rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Avatar billede proaccess Nybegynder
20. december 2001 - 15:32 #41
Du har fuldstændigt ret...

Jeg kan kun \"komme til\" værdien i kode...

Private Sub Form_Open(Cancel as integer)
  Tekst0.Text = Overskrift(2)
  Tekst2.Tekst = Overskrift(5)
End Sub
20. december 2001 - 15:35 #42
Så er jeg tilbage....
Proaccess, du kan ikke assigne en værdi til en textbox ved Form_Open.
Det skal være Form_Load !
Avatar billede proaccess Nybegynder
20. december 2001 - 15:36 #43
Eller du kan bruge en FUNKTION til at angive værdi...

lav en funktion

public function hentOverskrift(rID as integer) as string
  hentOverskrift=Overskrift(rID)
end function

angiv derefter =hentOverskrift(3) som kontrol-kilde

20. december 2001 - 15:37 #44
Private Sub Form_Load()
  Me!Tekst1.Caption = Overskrift(2)
  Me!Tekst2.Caption = Overskrift(5)
End Sub
Avatar billede proaccess Nybegynder
20. december 2001 - 15:38 #45
>Thomas: Tager du over, jeg er nødt til at løbe...  Kæresten står foran H&M i City2, og er ved at være utålmodig... Vi skal handle julegaver...

20. december 2001 - 15:38 #46
Rettelse...

Private Sub Form_Load()
  Me!Tekst1 = Overskrift(2)
  Me!Tekst2 = Overskrift(5)
End Sub
20. december 2001 - 15:39 #47
OK, skynd dig :o)

God Jul :o))
20. december 2001 - 18:40 #48
fruwille, hvad er status?

For lige at forstå det rigtigt, så har du (indtil nu) haft en række teksbokse, hvor der f.eks. har stået:
=Overskrift(\"O1\")
I den næste kan der så stå f.eks.:
=Overskrift(\"S15\")

Ideen er, at du, ved at ændre i tabellen, kan ændre skærmbilledet. Er det forstået korrekt?

Hvis ja, så starter jeg lige forfra:
Jeg tror ikke at Array-løsningen er den helt optimale, når ID\'erne ikke er nummeriske.

I stedet forslår jeg følgende løsning:

Du erstatter simpelten din Overskrift-funktion med denne:

Public Function Overskrift(ID As String) As String
    Static rs As DAO.Recordset
    If rs Is Nothing Then
        Set rs = CurrentDb.OpenRecordset(\"Otabel\", dbOpenTable)
    End If
    rs.Index = \"ID\"
    rs.Seek \"=\", ID
    If rs.NoMatch Then
        Overskrift = \"\"
    Else
        Overskrift = rs!Overskrift
    End If
End Function



Denne funktion burde være væsentlig hurtigere end den du har i forvejen, da den kun initialisere recordsettet én gang. Herefter går søgningerne ret hurtigt. Især fordi der benyttes Seek.
Det kræver bare 2 ting: Tabellerne er ikke sammenkædet. Og ID er indekseret.

Såfremt tabellerne er sammenkædet, skal vi lige have lavet koden lidt om. Så må du lige sige til...

/Thomas
Avatar billede terry Ekspert
20. december 2001 - 20:21 #49
Hi Thomas>But according to the comment from fruwille 14:09:26:  \"terry jeg betvivler ikke at dlookup også er god, men det var ikke det jeg søgte i mit spørgsmål.\"

then your solution 18:40 isnt what he asked for either! Even though it is more than likley fastare than fruwille\'s own.
But I would STILL lik eto see the dLookup speed, just for fun :o)
Avatar billede fruwille Nybegynder
20. december 2001 - 20:23 #50
Thomas & proaccess
Jeg siger jer mange tak for hjælpen, jeg har prøvet begge dele i en lille database i Acc97, men mit projekt ligger i Acc2000 og bruger ADO i stedet for DAO, så jeg skal lige have omskrevet jeres tips og prøvet det af i den \"rigtige\" database. Jeg forhøjede pointene ekstra, fordi jeg syntes det var to (flere) meget gode løsninger, så det blev til 70 point til hver.

Så håber jeg der snart er noget jeg kan svare på, idet jeg så har 90 point tilbage.
Avatar billede terry Ekspert
20. december 2001 - 20:24 #51
Hope you make note of my comment 20:21!!
Avatar billede fruwille Nybegynder
20. december 2001 - 20:28 #52
terry
Den løsning jeg har prøvet, som virker bedst er proaccess fra 13:35 og 13:39, men lige så snart jeg får tid til at lægge det ind i \"den store\" database, hvor performanceproblemerne er, vil jeg også dlookup, hvis den er bedre - må du jo have mine sidste point.
Avatar billede fruwille Nybegynder
20. december 2001 - 20:29 #53
...jeg også dlookup...
...jeg også teste dlookup...
Undskyld.
Avatar billede terry Ekspert
20. december 2001 - 20:35 #54
Hej fruwille> I am not after your points, but you rejected my idea if the dlookup with the comment that it wasnt what you asked for. Thats fine, and although I cant see which solution you use, Thoams\'s answer isnt what you asked for either! So if its SPEED that your after then you should TEST all solutions before rejecting Dlookup.

The reason you rejected DLookup was, that it wasnt what you asked for!
Avatar billede fruwille Nybegynder
20. december 2001 - 20:41 #55
1000 * sorry. I have not been here in Eksperten for so long time, I\'ll learn it someday - i hope.
20. december 2001 - 21:02 #56
Terry-> When you use DLookup, Access opens a recordset and searches for the result. It is a forward-only-snapshot, but it still has to open and initialize the recordset everytime you call it.

For at illustrere tidsforskellen, har jeg (på min egen maskine) lavet 2 tests. Én hvor jeg kalder min funktion 20.000 gange og én hvor jeg kalder DLookup 20.000 (på samme tabel)
Testen slog den samme værdi op hver gang og skrev den til debug-vinduet.

Min funktion tog 11 sekunder og DLookup tog 1 minut og 30 sekunder!
Det er da noget af en forskel.

Jeg tror ikke at Fruwille undgår at lave opslag hver gang - enten i en tabel eller i nogle variabler/arrays. Det afgørende må jo være, hvad der er hurtigst!?

Fruwille, jeg benytter ganske rigtigt DAO. Det gør jeg altid, når jeg ikke ved om folk bruger Access 97 eller 2000/XP (husk derfor altid at opgive dette!)
Du kan sagtens bruge DAO samtidig med ADO (blot man husker at skrive DAO.recordset osv). Det kræver bare at du laver en reference til \"Microsoft DAO 3.6 object library\".

Men du kan selvfølgelig også ret let omskrive den til ADO.
Avatar billede fruwille Nybegynder
20. december 2001 - 21:19 #57
thomasjepsen
Jeg ved godt jeg også kan bruge DAO, men det er en applikation der skal bruges i 5 lande og alle steder Access 2000 og ADO er brugt alle andre steder, derfor valget.

Tak for testen.
Avatar billede terry Ekspert
21. december 2001 - 09:52 #58
I am also aware which method is the fastest Thomas, but that wasnt what I was pointing out!

God Jul :o)

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