V řadě aplikací je vhodné využít možnosti oddělení dat od jejich obsluhy. Především je to situace, kdy se s programem již pracuje a přitom pokračuje jeho vývoj. Je vhodné, aby nová verze obsluhy nemohla zasáhnout do již zapsaných dat.
Postup je velmi jednoduchý. Tabulky s daty umístíme do samostatného souboru. Do druhého souboru tyto tabulky připojíme (Attach), viz obr. 32 a doplníme jejich zpracováním.
Obr. 32. Tabulky umístěné v databázi a tabulky připojené vazbou
Připojení tabulek do hlavního souboru provedeme příkazem File-Attach Table... z hlavní nabídky. Zvolíme typ souboru Microsoft Access a najdeme požadovaný soubor s daty. Systém nabídne seznam tabulek, viz obr. 33, které postupně připojíme.
Obr. 33. Připojení tabulek z databáze s daty
Celý systém bude pracovat vcelku bez problémů. Ty nastanou v okamžiku, kdy bude soubor s daty přemístěn do jiného adresáře. Např. při instalaci systému bude zadána jiná cesta pro jeho uložení. Protože při připojení tabulek je uložena celá cesta ke zdrojové databázi, nebude připojení tabulek pracovat a systém zhavaruje. Existuje sice možnost opravit připojení tabulek pomocí doplňkového modulu (Add-ins) Attachment Manager, viz obr. 34, požadovat tento úkon po uživateli je však dosti odvážné. Zejména, pokud se data nacházejí v několika samostatných datových souborech. To je vhodné zejména, pokud se mezi tabulkami nachází data plněná uživatelem a data dodávaná od autora databáze (typicky různé číselníky, nabídky a katalogy).
Obr. 34. Oprava připojení tabulek z datového souboru pomocí přídavného modulu
Naštěstí existuje možnost provedení opravy připojení tabulek programově. Následující výpis modulu MODPripojeniTabulek obsahuje proceduru PripojeniTabulek(), která zkontroluje připojení tabulek a pokud není správné, pokusí se o jejich opravu. Pro co největší obecnost byl algoritmus rozdělen do několika částí:
Obr. 35. Umístění jednotlivých souborů v síťové aplikaci
Na obr. 35 je uveden příklad rozdělení jednotlivých souborů v síťové aplikaci. Na centrálním serveru jsou umístěny všechny datové soubory, ke kterým se připojují obslužné soubory umístěné na lokálních discích jednotlivých uživatelů. Rozdělení dat do více souborů umožňuje samostatnou distribuci částí dat s rozdílnou periodou aktualizace.
Pokud je to potřeba, je možno na lokálních počítačích umístit soubor s daty, která patří pouze jednotlivým uživatelům a nemají být přístupna ostatním uživatelům. Buď přímo do obslužného souboru nebo také do samostatného datového souboru.
Option Compare Database 'Usedatabase order for string comparisons Option Explicit 'Declare all variables before the first usage '******************************************************************* ' Systém pro automatickou opravu připojení tabulek z externích zdrojů ' Copyright (C) 1996 Ing. Radim Farana, CSc. ' ******************************************************************* ' K provedení opravy připojení tabulek z externích zdrojů je potřeba ' připojit funkci PripojeniTabulek() do makropříkazu AutoExec. ' Pokud funkce vrátí hodnotu False, připojení nebylo úspěšné a nemá ' smysl pokračovat v práci se systémem. ' Funkce vyžaduje přítomnost funkce JmenoSOuboruAttach(Soubor), ' která se standardně nachází v modulu MODCestaKSouboru. ' Omezení systému ' ----------------- ' Maximální počet externích tabulek = 100 ' Maximální počet externích databází = 100 ' Seznam procedur ' ----------------- 'Private Function JmenoDB (Jmeno As String) As String ' ******************************************************** ' Funkce vyzvedne z připojovacího řetězce název databáze ' ******************************************************** 'Private Function OpravaConnect (Jmeno As String) As String ' ******************************************************** ' Funkce vyzvedne z připojovacího řetězce název databáze ' ******************************************************** 'Function PripojeniTabulek () As Variant ' ********************************************************* ' Kontrola připojení tabulek z externích zdrojů ' Vrací logickou hodnotu informující, zda připojení proběhlo ' správně (True) nebo ne (False) ' Copyright (C) 1996 Ing. Radim Farana, CSc. ' ********************************************************* ' Definice procedur ' ----------------- Private Function JmenoDB (Jmeno As String) As String ' ******************************************************** ' Funkce vyzvedne z připojovacího řetězce název databáze ' ******************************************************** Dim S As String Dim I As Integer I = Len(Jmeno) Do While I > 0 S = Right(Left(Jmeno, I), 1) If S = "\" Or S = ":" Then JmenoDB = Right(Jmeno, Len(Jmeno) - I) Exit Function End If I = I - 1 Loop ' Nepodařilo se najít začátek, nelze vrátit název databáze JmenoDB = Jmeno End Function Private Function OpravaConnect (Jmeno As String) As String ' ******************************************************** ' Funkce vyzvedne z připojovacího řetězce název databáze ' ******************************************************** Dim S As String Dim I As Integer I = Len(Jmeno) Do While I > 0 If Right(Left(Jmeno, I), 1) = "=" Then OpravaConnect = Right(Jmeno, Len(Jmeno) - I) Exit Function End If I = I - 1 Loop ' Nepodařilo se najít rovnítko, nelze vrátit název databáze OpravaConnect = Jmeno End Function Function PripojeniTabulek () As Variant ' ********************************************************* ' Kontrola připojení tabulek z externích zdrojů ' Vrací logickou hodnotu informující, zda připojení proběhlo ' správně (True) nebo ne (False) ' Copyright (C) 1996 Ing. Radim Farana, CSc. ' ********************************************************* Dim D As Database ' Aktuální databáze Dim TD As TableDef ' Aktuální definice tabulky Dim I As Integer ' Počítadlo Dim P As Integer ' Pomocné počítadlo Dim PCesta As String ' Pomocná hledaná cesta Dim S As String ' Pomocný řetězec Dim V As Variant ' Pomocná proměnná Dim OK As Variant ' Hlášení o výsledku operace Dim Jmeno As String ' Jméno hledaného souboru Static TDFalse(1 To 100) As String ' Názvy špatně připojených tabulek Dim TDPoc As Integer ' Počítadlo názvů špatně připojených tabulek Static DPuv(1 To 100) As String ' Původní názvy zdrojových databází Static DNov(1 To 100) As String ' Nové názvy zdrojových databází Dim DPoc As Integer ' Počítadlo převodu názvů databází Const MaxPol = 100 ' Maximální počet uložených názvů On Error GoTo ERR_P1 ' Vynulování proměnných For I = 1 To MaxPol TDFalse(I) = "" DPuv(I) = "" DNov(I) = "" Next I DPoc = 0 TDPoc = 0 PripojeniTabulek = False ' Kontrola připojení tabulek a nalezení chybných připojení Set D = DBENGINE(0)(0) For I = 0 To D.TableDefs.Count - 1 Set TD = D.TableDefs(I) If TD.Connect <> "" Then ' Tabulka je připojena z externího zdroje S = TD.Connect S = OpravaConnect(S) V = Dir(S) If V = "" Then ' Původní zdroj nebyl nalezen If TDPoc < MaxPol Then TDPoc = TDPoc + 1 TDFalse(TDPoc) = TD.Name V = 0 OK = False Do While V < DPoc V = V + 1 S = TD.Connect If DPuv(V) = OpravaConnect(S) Then OK = True End If Loop If Not OK Then If DPoc < MaxPol Then DPoc = DPoc + 1 S = TD.Connect DPuv(DPoc) = OpravaConnect(S) Else MsgBox Byla překročena velikost paměti pro nové připojení externích tabulek. Systém nelze provozovat.", 16, "Připojení tabulek" Exit Function End If End If Else MsgBox Byla překročena velikost paměti pro nové připojení externích tabulek. Systém nelze provozovat.", 16, "Připojení tabulek" Exit Function End If End If End If Next I ' Byly zkontrolovány připojené tabulky a nalezena chybná připojení ' Pokus o nalezení stejných databází na jiných cestách If DPoc > 0 Then For I = 1 To DPoc If Len(DPuv(I)) < 4 Then ' soubor je moc krátký Else P = 1 Do While P > 0 Select Case P Case 1 ' Kontrola původní cesty k připojení PCesta = DPuv(I) Case 2 ' Vyzkoušení aktuální cesty k databázi PCesta = Pracovni_Adresar() & "\" & JmenoDB(DPuv(I)) Case 3 ' Vyzkoušení jiných zařízení pro původní cestu PCesta = "C" & Right(DPuv(I), Len(DPuv(I)) - 1) Case 4 PCesta = "D" & Right(DPuv(I), Len(DPuv(I)) - 1) Case 5 PCesta = "E" & Right(DPuv(I), Len(DPuv(I)) - 1) Case 6 PCesta = "F" & Right(DPuv(I), Len(DPuv(I)) - 1) Case 7 PCesta = "G" & Right(DPuv(I), Len(DPuv(I)) - 1) End Select V = Dir(PCesta) If V = "" Then ' Pokus nebyl úspěšný P = P + 1 If P > 7 Then P = 0 PCesta = "" End If Else ' Pokus byl úspěšný P = 0 DNov(I) = PCesta End If Loop If PCesta = "" Then ' Soubor nebyl nalezen Else ' Soubor byl nalezen pod jiným názvem jednotky End If End If Next I End If ' Hledání automaticky nepřipojených tabulek ručně I = 0 Do While I < DPoc I = I + 1 If DNov(I) = "" Then ' Databázi je potřeba hledat If 6 = MsgBox("Systém potřebuje data z databáze '" & DPuv(I) & "', ale nenašel ji, chcete ji najít ručně? (Pokud bude nabízený soubor prázdný, stiskněte tlačítko OK a pak najděte požadovaný soubor.)", 4 + 32, "Připojení tabulek") Then S = JmenoSouboruAttach(JmenoDB(DPuv(I))) If S = "" Then ' Databáze nebyla zadána MsgBox "Hledaná databáze nebyla zadána. Systém nemůže dále pracovat.", 16, "Připojení tabulek" Exit Function Else V = Dir(S) If V = "" Then ' Hledaná databáze neexistuje MsgBox "Zadaná databáze " & S & "nebyla nalezena. Systémnemůže dále pracovat.", 16, "Připojení tabulek" Exit Function Else ' Hledaná databáze je v pořádku DNov(I) = S End If End If Else MsgBox "Za těchto okolností není možno spustit systém.Práce končí.", 64, "Připojení tabulek" Exit Function End If End If Loop ' Nové připojení tabulek On Error Resume Next For I = 1 To TDPoc Set TD = D.TableDefs(TDFalse(I)) S = TD.Connect S = OpravaConnect(S) P = 0 V = "" Do Until P = DPoc P = P + 1 If S = DPuv(P) Then V = DNov(P) End If Loop TD.Connect = ";DATABASE=" & V Err = 0 TD.RefreshLink If Err <> 0 Then ' Spojení se nepodařilo realizovat Select Case Err Case 3011 MsgBox "Byla nalezena požadovaná databáze '" & V & "', ale chybí v ní tabulka '" & TD.SourceTableName & "'. Systém nebude pracovat.", 16, "Připojení zdrojových tabulek" Case 3024 MsgBox "Je požadována databáze '" & V & "', ale nebyla nalezena . Systém nebude pracovat.", 16, "Připojení zdrojových tabulek" Case 3051 MsgBox "Byla nalezena požadovaná databáze '" & V & "', ale je nastavena jen pro čtení. Systém nebude pracovat.", 16, "Připojení zdrojových tabulek" Case 3027 MsgBox "V systému je potřeba připojit zdrojové databáze, ale hlavní databáze je jen pro čtení. Systém nebude pracovat.", 16, "Připojení zdrojových tabulek" Case Else MsgBox "V systému je potřeba připojit zdrojovou databázi '" & V & "', s tabulkou '" & TD.SourceTableName &"', ale nepodařilo se to. Systém nebude pracovat.", 16, "Připojení zdrojových tabulek" End Select Exit Function End If Next I PřipojeniTabulek = True Exit Function '******************************* ' Obsluha chyby '******************************* ERR_P1: V = "" Resume Next End Function