Kuidas teisendada lingitud tabel teie juurdepääsus kohalikuks tabeliks

Oleme seda varem rääkinud, kuid tasub korrata – lingitud tabelid võivad teie andmebaasides olla väga kasulikud mitmel põhjusel. Kuid lingitud tabelite üks suur puudus on jõudlus – päringute käivitamine nende vastu, eriti kui need ei ole Microsoft Accessi tabelid (st kui need on Exceli, CSV- või DBF failid). Nendega töötamine võib olla valusalt aeglane. Sellest saate mööda minna mitmel viisil – me töötame siin ühe võimalusega, milleks on lingitud tabeli teisendamine kohalikuks tabeliks. Muidugi – saate seda teha käsitsi, kopeerides/kleepides tabeleid, kuid kui teil on palju käsitseda, on seda koodis palju-palju lihtsam teha, nii et vaatame, kuidas…

Miks on oma vajaduste väljatoomine oluline

Juurdepääs lingitud tabelileKõigepealt kirjeldame, mida me tegelikult tahame, et kood teeks – see muudab koodi loomise palju lihtsamaks, nii et soovitan teil seda teha iga kord, kui mõtlete mõne VBA koodi loomisele. , aitab see teie eesmärki selgitada:

"Arvestades lingitud tabeli nime, importige see tabel jõudluse parandamiseks andmebaasi kohaliku tabelina – soovi korral kustutage link andmebaasist samal ajal."

Tavaliselt, kui teisendate lingitud tabeli kohalikuks tabeliks, soovite lingi kustutada, kuid allolevas koodinäidis oleme andnud teile võimaluse säilitada ka algne lingitud fail, kuid seda tehes äsja imporditud tabel ei asenda teie lingitud tabelit teie päringutes jne, nii et te ei näe toimivuse kasvu, mida kohalik tabel teile annaks. Kui olete veendunud, et kood töötab nii, nagu vajate, soovitame alati originaali kustutada – lõppude lõpuks ei kustuta te tegelikku tabelit, vaid selle linki.

Hoiatuseks

Enne koodi juurde jõudmist – vaid kiire hoiatus. Kui lingite kahjustatud Accessi andmebaas – kui Access ei saa faili lugeda, on ebatõenäoline, et ta suudab sellest importida.

Niisiis – koodi juurde…

Sub MakeTableLocal(tableName As String, optional deleteOriginal As Boolean = True)
    Dim DbPath As Variant, TblName As Variant

    'get path of linked table
    DbPath = DLookup("Database", "MSysObjects", "Name='" & tableName & "' And Type=6")
    'Get the real name of the linked table (in case it has been given an alias in the link)
    TblName = DLookup("ForeignName", "MSysObjects", "Name='" & tableName & "' And Type=6")
    If IsNull(DbPath) Then
        'Either a local table, or the wrong table name has been supplied, exit the sub
        Exit Sub
    End If

    'delete linked table
    If deleteOriginal Then
        DoCmd.DeleteObject acTable, tableName
    Else
        'If we're not deleting the existing table we'll have to rename the imported table to avoid
        'overwriting it etc
        tableName = tableName & " - local"
    End If
    
    'import the table as a local, unlinked table
    DoCmd.TransferDatabase acImport, "Microsoft Access", DbPath, acTable, TblName, tableName
End Sub

Mida kood teeb

VBA koodMost Kood on üsna ilmne, kuid siin on mõned põhipunktid, mida tasub tähele panna. Esiteks saame üksikasjaliku teabe selle kohta, millise failiga lingitakse, vaadates (tavaliselt peidetud) Accessi süsteemi tabelit "MSysObjects". Kuna on täiesti võimalik (ja tõenäoline), et olete andnud lingitud tabelile uue kohaliku pseudonüümi, peame järgmiseks hankima algse tabeli nime – jällegi tabelist “MSysObjects”.

Nüüd, kui meil on need üksikasjad, nii kaua kui need kehtivad (st te pole rutiinile valesti kirjutatud tabelinime andnud), oleme valmis minema, nii et see on lihtsalt a) lingi kustutamise küsimus (kui deleteOriginal on seatud väärtusele Tõene) ja tabeli importimisel.

See parandab sageli jõudlust, nii et kui kasutate lingitud tabeleid, soovitan teil kindlasti kontrollida, millist kasu annab nende tabelite viimine kohalikesse versioonidesse – võite olla üllatunud!

Autori sissejuhatus:

Mitchell Pond on andmete taastamise ekspert DataNumen, Inc., mis on maailmas juhtiv andmete taastamise tehnoloogiate, sealhulgas remont SQL Server fail ja Exceli taastamise tarkvaratooted. Lisateabe saamiseks külastage www.datanumenCom

Kommentaarid on suletud.