header image

Kako dopovedati Accessu, da smo prestavili datoteko s podatki?

Objavil: P.J. | 24.10.2010 | Brez komentarjev |

Ena najpogostejših težav, s katero se srečujejo uporabniki različne programske opreme je, da ko pride do selitve zbirke podatkov, program preprosto preneha delovati. Slednje zna biti precej zoprna reč. Pri manjših podjetnikih se rado zgodi, da program, ki ga je spočetka uporabljal en sam uporabnik sčasoma želi uporabljati več ljudi. Tudi v večjih podjetjih se zgodi, da se ob zamenjavi strežnika novi ne imenuje več enako in se nahaja na drugem IP naslovu, kakor stari. Tokrat si bomo ogledali, kako lahko tozadevne težave odpravimo že pri snovanju.

MS Access si za vsako tabelo posebej zapomni, kako naj dostopa do podatkov v njej. Z MS Accessom lahko torej dostopamo do podatkov na različnih mestih in jih z vidika naše rešitve obravnavamo kot enotno podatkovno zbirko in med objekti v njej tudi postavljamo relacije. Na ta način lahko z MS Accessom povežemo med seboj več ločenih sistemov, npr. CRM1, ERP2, MES/MRP3, itd. v homogeno celoto in se izognemo večkratnemu vnašanju istih podatkov.

Hkrati pa je na ta način lahko rešitev v MS Accessu odlična odskočna deska za t.i. avtomatizacijo pisarniškega poslovanja, saj lahko MS Accessove datoteke služijo kot povezovalni člen za dostop do omejenega nabora podatkov iz osrednjega sistema za hrambo podatkov, kar nam pride prav v t.i. podpornih službah. Skratka, zgledov uporabe je malo morje. Mi pa se bomo tokrat osredotočili na enostaven elementaren primer, ki se ga da  brez težav razširiti na kompleksne razvejane strukture.

Predpostavili bomo, da smo naredili rešitev v MS Accessu in pravilno ločili datoteko, v kateri bomo hranili podatke in datoteko z uporabniškimi vmesniki, s pomočjo katerih te podatke vnašamo in pregledujemo. Recimo, da je ena datoteka poimenovana vmesniki.mdb, druga pa podatki.mdb4 in da se v času, ko izdelujete vašo rešitev,  nahajata v mapi Moji dokumenti. Ko zadevo zaključite, vmesnik.mdb prevedete in dobite vmesnik.mde, nakar vse skupaj postavite nekam na omrežje… recimo na \\Strežnik\NekaVsemDostopnaMapa. Toda glej ga zlomka, zadeva ne deluje.

Rešitev je dokaj preprosta. V datoteki vmesnik.mdb (preden jo prevedemo torej) bomo zadeve nastavili tako, da naj ob zagonu preveri in po potrebi spremeni poti do posameznih tabel, s čimer bomo omogočili prosto prestavljanje obeh datotek po naših željah. Za to moramo najprej narediti preprost makro v naši zbirki podatkov in ga poimenovati AutoExec (in nič drugače). Ta makro se bo izvedel ob vsakem zagonu naše datoteke z uporabniškimi vmesniki.

AutoExec Makro v MS Accessu 2007

AutoExec Makro v MS Accessu 2007

Vsebina tega makroja je dokaj trivialna zadeva. Preprosto iz spustnega seznama Action nastavimo na RunCode in kot argument navedemo funkcijo Main. Sam sem se navadil kot zadnji korak v makroju vedno eksplicitno navesti, naj zaustavi izvajanje, kar pa ni nujno. Sedaj smo pripravili vse potrebno, da s pomočjo VBA sprogramiramo tisto, kar smo si zastavili. Funkcija Main zgleda v našem primeru nekako tako:

Public Function Main() As Boolean
On Error GoTo ErrorHandler

  If LinkTables Then
    DoCmd.OpenForm "MiniIS"
    ...
  Else
    ' ustavimo izvajanje aplikacije
  End If
FinalHandler:
  Exit Function

ErrorHandler:
  MsgBox Err.Description, vbOKOnly + vbExclamation, _
    "[General.Main] Sporočilo: " & Err.Number
  Resume FinalHandler

End Function

Preden prikažemo privzeti obrazec z izbirniki uporabniku, pokličemo funkcijo LinkTables(), s katero osvežimo podatke o tem, kje se dejansko nahajajo tabele s podatki. Nato odpremo obrazec po izbiri. Če bi med izvajanjem slučajno prišlo do nepredvidene situacije, prikažemo tudi sporočilo, da je nekaj šlo narobe. Sedaj pa si oglejmo še našo funkcijo LinkTables(), ki tudi ni ničkaj posebej zahtevna.

Public Function LinkTables() As Boolean
On Error GoTo ErrorHandler

    Dim oDB As DAO.Database
    Dim oTD As DAO.TableDef
    Dim aPath As String

    aPath = ";DATABASE=" & DBPath

    Set oDB = CurrentDb
    For Each oTD In oDB.TableDefs
        If (oTD.Connect <> "") Then
          If (oTD.Connect <> aPath) Then
            oTD.Connect = aPath
            oTD.RefreshLink
          End If
        End If
    Next oTD

    LinkTables = True

FinalHandler:
  Set oTD = Nothing
  Set oDB = Nothing
  Exit Function

ErrorHandler:
  LinkTables = False
  MsgBox Err.Description, vbOKOnly + vbExclamation, _
    "[General.LinkTables] Sporočilo: " & Err.Number
  Resume FinalHandler

End Function

V zanki se sprehodimo čez vse tabele v naši datoteki in najprej preverimo, ali ne gre morda za interne tabele. Če gre za tabele zunaj, na katere se naša rešitev povezuje preverimo, ali se shranjena pot v Accessovi datoteki razlikuje od prave poti in če slučajno se, potem jo ustrezno popravimo. Tudi tukaj poskrbimo za obravnavo nepredvidenih okoliščin in to je to.

Pozabavajmo se malo še z določitvijo prave poti, ki jo zgoraj označuje klic funkcije DBPath(). Sam se za take primere poslužujem kar XML datotek, v katere shranjujem takšne in drugačne nastavitve. Praviloma takšno datoteko postavim v natanko isto mapo, kakor datoteko z uporabniškim vmesnikom.

Public Function DBPath() As String
On Error GoTo ErrorHandler

  Dim oXmlDoc As DOMDocument
  Dim oXmlNode As IXMLDOMNode
  Dim aXPathQry As String
  Dim aPath As String

  aXPathQry = "//database/connection[@name='link']"

  Set oXmlDoc = New DOMDocument
  oXmlDoc.Load CurrentProject.Path & "\config.xml"

  Set oXmlNode = oXmlDoc.SelectSingleNode(aXPathQry)
  If Not (oXmlNode Is Nothing) Then
    aPath = oXmlNode.Attributes.getNamedItem("value").Text
    aPath = Replace(aPath, "\.", CurrentProject.Path)
  End If

  DBPath = aPath

FinalHandler:
 Set oXmlNode = Nothing
 Set oXmlDoc = Nothing
 Exit Function

ErrorHandler:
 MsgBox Err.Description, vbOKOnly + vbExclamation, _
  "[Global.DBPath] Napaka: " & Err.Number
 Resume FinalHandler

End Function

Funkcija DBPath() torej v XML datoteki config.xml, ki se nahaja v isti mapi, kakor datoteka z uporabniškimi vmesniki, poišče oznako connection z atributom name nastavljenim na vrednost link. Če najde takšno oznako, potem prebere vrednost atributa value in ga vrne kot rezultat funkcije. Ker pa sem lenoba po horoskopu, sem si izmislil tudi skovanko “\.”, s katero označim, da se datoteka s podatki nahaja v isti mapi, kakor datoteka z uporabniškimi vmesniki. Za to pa poskrbi vrstica, ki sem jo poudaril z okrepljeno pisavo.

Upoštevaje zgoraj omenjeno prakso se lahko ognete nadležnih glavobolov, ki se lahko pojavijo pri prenašanju rešitev narejenih v MS Accessu po omrežju. Z nekaj domišljije pa jo lahko tudi prilagodite vašim potrebam. V vsakem primeru upam, da pride komu prav.

  1. CRM – customer relationship management ; sistem za spremljanje odnosov s strankami []
  2. ERP – enterprise resource planing ; sistem za spremljanje in planiranje virov v podjetju, pri nas praviloma uporabljan zgolj za knjigovodstvo []
  3. MES-MRP – manufacturing enterprise system / Manufacturing resource planning; sistem za spremljanje proizvodnje []
  4. mdb – pomeni oznako za Microsoft Database. MS Access 2007 pa je vpeljal novo končnico accdb, ki pomeni Access Database []
  • Share/Bookmark
Zapisano pod: Programiranje, Zbirke podatkov
Tags: ,

Pustite komentar

Tvoj odziv :

Komentiranje iz tujine je omogočeno zgolj prijavljenim uporabnikom !

Kategorije