Vi har sagt det før, men det er verdt å gjenta – koblede tabeller kan være veldig nyttige i databasene dine av en rekke årsaker. Men en stor ulempe med koblede tabeller er ytelsen – kjører spørringer mot dem, spesielt hvis de ikke er Microsoft Access-tabeller (dvs. hvis de er Excel, CSV eller DBF filer). De kan være smertefullt trege å jobbe med. Det er noen måter du kan omgå det på – vi jobber med én måte her, og det er å konvertere en koblet tabell til en lokal tabell. Jada – du kan gjøre dette manuelt ved å kopiere/lime inn tabeller, men hvis du har mye å håndtere, er det mye, mye enklere å gjøre det i kode, så la oss se hvordan...
Hvorfor det er viktig å skissere dine behov
Først av alt, la oss skissere hva vi faktisk vil at koden skal gjøre - å gjøre dette gjør det så mye enklere å faktisk lage koden i utgangspunktet, så jeg vil foreslå at du gjør dette hver gang du tenker på å lage litt VBA-kode , hjelper det med å klargjøre målet ditt:
"Gi navnet på en koblet tabell, importer den tabellen til databasen som en lokal tabell for å forbedre ytelsen - eventuelt slett koblingen fra databasen samtidig"
Normalt, når du konverterer en koblet tabell til en lokal tabell, vil du slette koblingen, men i kodeeksemplet nedenfor har vi gitt deg muligheten til å beholde den opprinnelige koblede filen også, men ved å gjøre dette, nylig importert tabell vil ikke erstatte den koblede tabellen i spørringene dine osv., så du vil ikke se ytelsesgevinsten som en lokal tabell ville gi deg. Når du er komfortabel med at koden fungerer som du trenger, anbefaler vi at du alltid sletter originalen – du sletter tross alt ikke selve tabellen, bare lenken til den.
Et ord av forsiktighet
Før vi kommer til koden – bare en rask advarsel, det er ikke mye du kan gjøre hvis du linker til en skadet Access-database – hvis Access ikke kan lese filen, er det svært usannsynlig at den vil kunne importere fra den.
Så – over til koden...
Sub MakeTableLocal(tableName As String, valgfri deleteOriginal As Boolean = True) Dim DbPath As Variant, TblName As Variant 'få banen til koblet tabell DbPath = DLookup("Database", "MSysObjects", "Name='" & tableName & "' And Type=6") 'Få det virkelige navnet på den koblede tabellen (i tilfelle den har fått et alias i lenken) TblName = DLookup("ForeignName", "MSysObjects", "Name='" & tableName & "' And Type=6") If IsNull(DbPath) Så 'Enten en lokal tabell, eller feil tabellnavn har blitt oppgitt, gå ut av sub Exit Sub End If 'delete linked table If deleteOriginal Then DoCmd.DeleteObject actTable, tableName Else 'If vi sletter ikke den eksisterende tabellen, vi må gi nytt navn til den importerte tabellen for å unngå å 'overskrive den osv. tabellnavn = tabellnavn & " - lokal" End If 'importer tabellen som en lokal, ukoblet tabell DoCmd.TransferDatabase acImport, "Microsoft Access", DbPath, actTable, TblName, tableName End Sub
Hva koden gjør
Most av koden vil være ganske åpenbar, men det er noen viktige punkter å merke seg. For det første får vi detaljene om hvilken fil som kobles til ved å se i (vanligvis skjult) Access-systemtabellen "MSysObjects". Siden det er fullt mulig (og sannsynlig) at du vil ha gitt den koblede tabellen et nytt lokalt alias, er det neste vi må gjøre å hente navnet på den opprinnelige tabellen – igjen, fra "MSysObjects"-tabellen.
Nå som vi har disse detaljene, så lenge de er gyldige (dvs. at du ikke har oppgitt et feilstavet tabellnavn til rutinen), så er vi i gang, så det er bare et spørsmål om å) slette lenken (hvis deleteOriginal er satt til True), og importerer tabellen.
Å gjøre dette vil ofte gi deg ganske dramatiske forbedringer i ytelsen, så hvis du bruker koblede tabeller, vil jeg på det sterkeste anbefale at du sjekker hvilke gevinster å flytte disse bordene til lokale versjoner – du kan bli overrasket!
Forfatterintroduksjon:
Mitchell Pond er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert reparasjon SQL Server fil og excel-programvareprodukter for gjenoppretting. For mer informasjon besøk www.datanumen. Med