[ Miro35 @ 05.07.2010. 08:08 ] @
Ovako imam funkciju koja mi trenutno radi link tabela iz jedne baze,znači kad hoću da se spojim na stare godine,iz combo boxa izaberem 2009_Robno_Baza i on se spoji.Sad mi treba da u aplikaciji linkujem nekoliko tabela iz drugih access baza.E sada ako neko ima ideju kako u ovoj funkciji to ugraditi.Ovu funkciju koristim:
Code:
Sub AktivnaBaza()
On Error GoTo greska
   ' Dim dbsCurrent As Database
   ' Dim tdfLinked As TableDef
    Dim strPom As String
    
   ' Set dbsCurrent = CurrentDb
   ' Set tdfLinked = dbsCurrent.TableDefs("NALOZI")
   ' strPom = Parsiraj(Mid$(tdfLinked.Connect, InStr(1, tdfLinked.Connect, "knjiga_steta_baza")))
    'Me.txtAktivnaBaza = strPom
    
strPom = CurrentDb.TableDefs("GRUPE").Connect
strPutBaz = DLookup("PUTBAZ", "PUTANJA")
If Right(strPutBaz, 1) = "\" Then
    strPutBaz = Left(strPutBaz, Len(strPutBaz) - 1) ' uklanja eventualno "\" iz naziva direktorija
End If
a = Len(strPutBaz)
b = Len(strPom)
'Me.txtAktivnaBaza = Mid$(strPom, a + 17, b - a - 15)
Me.txtAktivnaBaza = Right$(strPom, 19)

'Me.txtAktivnaBaza = strPom

Exit Sub
greska:
MsgBox "greška: " & Err.Number & "," & Err.Description

End Sub
Public Function osvjezi(txtBaza As String, txtZaporka As Variant) As Boolean
On Error GoTo osvjezi_error
    Dim dbsCurrent As Database
    Dim tdfLinked As TableDef
    Dim Ok As Variant
    Set dbsCurrent = CurrentDb
    Dim strPutBaz As String

    strPutBaz = DLookup("PUTBAZ", "PUTANJA")
    If Right(strPutBaz, 1) = "\" Then
    strPutBaz = Left(strPutBaz, Len(strPutBaz) - 1) ' uklanja eventualno "\" iz naziva direktorija
    End If

            DoCmd.Hourglass True
    For Each tdfLinked In dbsCurrent.TableDefs
        If tdfLinked.Attributes = dbAttachedTable Then
           Ok = SysCmd(acSysCmdSetStatus, "Povezujem tablicu: " & tdfLinked.Name)

            If IsNull(txtZaporka) Or txtZaporka = "" Then
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza
            Else
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza & ";PWD=" & txtZaporka
            End If
            tdfLinked.RefreshLink
        End If
    Next tdfLinked
    Ok = SysCmd(acSysCmdSetStatus, "                                          ")
    osvjezi = True
    DoCmd.Hourglass False
osvjezi_exit:

Exit Function

osvjezi_error:
    DoCmd.Hourglass False
    Ok = SysCmd(acSysCmdSetStatus, "                                             ")
    MsgBox "GREŠKA:" & Str(Err) & Chr$(13) & Err.Description, vbCritical, "OOPS!"
    osvjezi = False
 Resume osvjezi_exit
End Function
[ Zoran.Eremija @ 05.07.2010. 11:09 ] @
Ovako ja to radim da sada ne ulazim u bit Vaseg koda

Dim Baza As DAO.Database
Dim i As Integer
Dim BrojTabela As Integer
Dim NazivTabele As String
Dim Server As String
Dim Putanja As String
Dim cfgFajla As String
Dim NazivFajle As String
Dim Tabela As TableDef

Set Baza = CurrentDB

' Brisanje postojecih linkova

With Baza
BrojTabela = .TableDefs.Count - 1
For i = BrojTabela To 0 Step -1
NazivTabele = .TableDefs(i).Name
If .TableDefs(i).Connect <> "" Then
.TableDefs.Delete NazivTabele
End If
Next i
End With

' Povezivanje druge konfiguracione mdb baze

Putanja = CurrentProject.Path
NazivFajle = Right(Putanja, 3)
cfgFajla = Putanja & "\" & NazivFajle & ".mdb"

DoCmd.TransferDatabase acLink, "Microsoft Access", cfgFajla, acTable, "System", "System"

' Povezivanje sa Front-end bazom

Server = Application.CurrentProject.Path + "\" & Trim(DLookup("[Server]", "System"))

Set Baza = OpenDatabase(Server)

For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = Tabela.Name
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next

Set Baza = Nothing
[ Miro35 @ 05.07.2010. 12:26 ] @
Ako mi možeš kratko objasnit da li ovo linkovanje može i u koji dio koda trebam unijeti svoje tabele koje su iz druge baze.Znači imam 10 tabela iz baze Robno a 3 tabele iz baze financijsko.Koliko mi se čini ova tvoja funkcija odnosno njen prvi dio linkuje tabele iz prve baze a ovaj dio služi da se upišu tabele koje nisu u osnovnoj bazi:
Code:
For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = Tabela.Name
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next
[ Zoran.Eremija @ 05.07.2010. 12:39 ] @
Ako cete da linkujete sve tabele iz Baza1.mdb i sve tabele iz Baza2.mdb onda moze ovako

Dim Baza As DAO.Database
Dim i As Integer
Dim BrojTabela As Integer
Dim NazivTabele As String
Dim Server As String
Dim Putanja As String
Dim NazivFajle As String
Dim Tabela As TableDef

' Povezivanje sa Baza1.mdb

Server = Application.CurrentProject.Path + "\Baza1.mdb"))

Set Baza = OpenDatabase(Server)

For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = Tabela.Name
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next

Set Baza = Nothing

' Povezivanje sa Baza2.mdb

Server = Application.CurrentProject.Path + "\Baza2.mdb"))

Set Baza = OpenDatabase(Server)

For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = Tabela.Name
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next

Set Baza = Nothing
[ Miro35 @ 05.07.2010. 14:51 ] @
Probaću pa javim ja mislim da je to to
[ Miro35 @ 06.07.2010. 07:53 ] @
Ovo je dobro samo što bi trebalo da kad izaberem bazu iz combo boxa neku drugu koja nije navedena u codu da se na nju ulinkuje a da ovu drugu bazu ostavi kakva je.
Code:
Private Sub Command0_Click()
Dim Baza As DAO.Database
Dim i As Integer
Dim BrojTabela As Integer
Dim NazivTabele As String
Dim Server As String
Dim Putanja As String
Dim NazivFajle As String
Dim Tabela As TableDef

' Povezivanje sa Baza1.mdb

Server = Application.CurrentProject.Path + "\Robno_Baza.mdb"

Set Baza = OpenDatabase(Server)

For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = KIF
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next

Set Baza = Nothing

' Povezivanje sa Baza2.mdb

Server = Application.CurrentProject.Path + "\BAZA_KASA.mdb"

Set Baza = OpenDatabase(Server)

For Each Tabela In Baza.TableDefs
If Tabela.Attributes = 0 Then
NazivTabele = GLSTAVKEMP
DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False
End If
Next

Set Baza = Nothing
End Sub
Ova prva baza se zove Robno_Baza.mdb i sad nju mjenjam,kad izaberem iz combo boxa recimo 2008_Robno_Baza.mdb onda da ovu tabelu ulinkuje na nju a da ove ostale ne dira.
[ Zidar @ 06.07.2010. 15:03 ] @
Miro, mozes da razbijes tvoj kod na dve funkcije. Prva povezuje na bazu 1, a druga na Bazu 2. Onda ih treca funkcija pozove. Funkcijama saljes path kao parametar, pa ne moras da imas nista hard-kodirano.

Stavis ovo

DoCmd.TransferDatabase acLink, "Microsoft Access", Server, acTable, NazivTabele, NazivTabele, False

u zasebnu funkciju koja prima paranmetre (Server, acTable, NazivTabele, NazivTabele, False). Onda tu funkciju pozivas iz koda.

U stvari, cele stvar se moze odraditi ovako:

Imas unbound formu sa dva combo boxa ili dva dugmeta za FielOpen dialog box.
Imas i dva text boxa gde ce se upisati path za BAza 1 i BAza 2
Korsitsi Combo ili FileOpen da dobijes path za bazu1 i bazu2, pa to upises u text boxKliknes dugme 'Povesi TAbele'
Treba ti i dugme 'Povezi tabele'
Dugem 'Povezi tabele' uradi ovo:

proveri da si nesto izabrao za Baza 1 i Baza 2
proveri da nisi izabrao isti fajl za Baza 1 i Baza 2
proveri sta jos mislis da treba da se proveri
ako je sve provereneo
pozovi funkciju LinkNABazu1
pozovi funkciju LinkNABazu2

NAravno da imas ERROR handling, za slucaj da nesto podje naopako.

Ovo sve kad napravis, imas neku vrstu wizarda koju mozes da selis iz aplikacije u aplikaciju.

Ovo sve radi pod pretpostavkom da BAza1 i baza2 sadrze tacno onoliko tabela koliko ti linkuje, (iz svake baze se linkuju SVE tabele)

Akui ti treba da linkujes samo neke tabele iz pojedinih baza, onda treba da imas lokalnu tabelu TabeleZaLinkovanje(OZnakaBAze, OriginalnoIme, ImeUMojojAplikaciji). Krozz set-up popunis imena tabela i oznaku baze. Onda sa FielOpen pokazes path za svaku oznaku baze i primenis tvoj kod -onu funkciju za linkovanje sa pocetka.

Nemam vremena da sastavim zgodan primer, ako me podsetite pocetkom sledece nedelje, okacicu primer.

[ Miro35 @ 07.07.2010. 07:46 ] @
To je dobra ideja ali ja trebam linkat tabele koje su već linkovane,znači već postojeće linkove treba osvježiti na drugu bazu.Ovo se dešava:Tabela tblArtikli je povezana na RobnoBaza.mdb a GLSTAVKE je povezana na BAZAKASA.mdb.E sada kad bi bile te dvije funkcije, jedna za jednu bazu druga za drugu,onda kad bi došlo do pokretanja prve funkcije da osvježi prvi link onda bi javio grešku zato što bi naišao na tabelu iz druge baze ili ne bi? Možda da napravim primjer?
[ Getsbi @ 07.07.2010. 11:52 ] @
Raspakuj ovo u folder PK na svom disku i isprobaj formu "Izbor klijenata". Nadam se da nisam prevideo neki .dll ili ocx. i da će ti ovo pomoći.
[ Miro35 @ 07.07.2010. 13:39 ] @
Hvala ti na trudu,ja baš imam skoro isti kao tvoj kod i to mi radi.Sad ti vraćam ovo tvoje što si mi poslo skupa sa svojom bazom gdje su tabele koja se zove BAZA_KASA.mdb . Ja sam iz te baze ulinkovo jednu tabelu u tvoju aplikaciju,a putanja je u direktoriju C:\PK. I sada ako možeš na ovaj postojeći kod koji imaš u svojoj aplikaciji za linkanje tabela ugradiš da može ulinkovati tabelu iz ove baze koju sam ja postavio,naravno skupa sa tvojim tabelama ,jer sad javlja grešku kad sam ja ovu svoju jednu tabelu ulinkovo,a bez nje sve radi u tvom programu.Nadam se da me razumješ.
Hvala
[ Getsbi @ 07.07.2010. 14:08 ] @
Miro, svaku tabelu koja ima različito ime od postojećih tabela u Pogonsko knjigovodstvo.mdb, moraš da ulinkuješ prvi put ručno. Nakon toga u tabeli AS_KLIJENTI dodaj zapis broj 6 i u koloni putanja upiši \PK\BAZA_KASA.mdb.

Naravno da ovaj program nije podešen da radi sa tvojim tabelama pa neće biti nikakvog efekta u aplikaciji ali će redovno da uradi automatski RefreshLink.

Da bi radio uspešan automatski RefreshLink i linkao se sa baze na bazu, potrebno je da one imaju identične tabele. Access "trči" kroz sve tabele u tekućoj .mdb (front end) i linkuje takve iste sa zadate putanje na kojoj se nalazi back end.

Ukoliko imaš baze sa različitim nazivima tabela onda ćeš morati da primeniš VBA kod koji ti je dao Zoran u svom prvom postu jer će ti trebati brisanje postojećih tabela pre linkovanja.

RefreshLink samo osvežava linkove sa putanje koja mu je data.

[Ovu poruku je menjao Getsbi dana 07.07.2010. u 16:12 GMT+1]
[ Zidar @ 07.07.2010. 17:53 ] @
Evo da zakacim i ja za sada dva moguca resenja, mozda nekome bude koristilo

Prvo resenje linkuje tabele iz jedne baze. Linkuju se (osvezavaju) samo one tabele koje su vec zakcene za aplikaciju. Ako fajl sa podaciam ima 10 tabela, a u aplikaciju su linkovane tri tabele, onda ce se uvek osveziti samo te tri, ostale program ni ne vidi dok se ne povezu rucno. Znaci, table koje aplikacija vec vidi mogu se pozvati iz nekog drugok fajla.

Drugo resenje pretpostavlja da je aplikacija povezana za vise od jednog back end fajla. Iz svakog back end fajla linkovana je poneka tabela, i back endovi imaju i drugih tabela, za koje nasa aplikacija niti zna niti je briga. Zakacio sam fajl sa jednom formom, dva modula, jednim kverijem i jednom lokalnom tabelaom. To resenje dozvoljava da se kacis za razlicite back endove.

Ako ista od ovoga sto sam zakacio koristi, samo uvezite sve objekte (osim linkovanih tabela, tabele cete linkovati odakle vam trebaju i koje vam trebaju) i sve bi trebalo da radi. Oba resenja pretpostavljaju da cete za prvi put rukom povezati tabele. Onda samo birate gde vam se nalazi fajl sa podacima (ili vise fajlova)


Ima i treca opcija, da ce cuva konfiguracija linkovanja u lokalnoj tabeli ali to zahteva dosta rada, ne na linkovanju, nego na alatima za odrzavanje konfiguracione tabele i formi za set-up. Mi smo profesionalci pa nam to nije tesko ;-)

[ Getsbi @ 07.07.2010. 19:50 ] @
Proverio sam i ovo drugo rešenje radi verovatno upravo ono što Miroslavu treba.
Nakon ručnog linkovanja fajl treba obavezno zatvoriti, pa pri sledećem otvaranju uraditi relink sa bilo koje već programu poznate lokacije.
[ Miro35 @ 09.07.2010. 10:14 ] @
U pravu si evo sad sam vidio još će mi trebat vremena da kod sebe primjenim,pa ako nije problem da ako mi ne bude jasno da vas još malo gnjavim.
[ Miro35 @ 10.07.2010. 09:35 ] @
Imam pitanje:Sve mi radi imam dvije baze back End i one su linkovane i ova funkcija radi,e sad kad hoću da se povežem na staru godinu recimo 2009_Robno_Baza.mdb onda mi javi ovu grešku iz funkcije:
Code:
RelinkTables_Error:
  Select Case Err.Number
Case 3021
    MsgBox "Access ne prepoznaje ime MDB fajla koji zelite da povezete." _
    & vbCrLf & "Ovaj program zahteva da ime fajla bude onako kako je pokazano u list boxu.", vbExclamation
  Case Else
    flgError = True
    MsgBox "Error " & Err & " " & Error$ & " in RefreshMDBLinks!"
  End Select
  
  Resume RelinkTables_Exit

A inače trenutna godina mi je Robno_Baza.mdb znači bez one godine ispred.Kad bi se moglo tu nešto popravit onda bi imao cjelokupno rješenje problema.Ja sad imam to rješenje sa jednom bazom,znači povezujem se na Robno i na stare godine robno,ali nemam rješenje da se povezujem na robno i financijsko i na stare godine robno i financijsko istovremeno.
[ Getsbi @ 10.07.2010. 09:54 ] @
Ako si povezao prvi put ručno tabele iz 2009_Robno_Baza.mdb, izašao iz programa i ponovo pokrenuo "LinkFromMultipleFiles.mdb" moći ćeš da automatski linkuješ. Kod mene to funkcioniše. Pitanje je samo šta si i kako si to ugradio u svoj program. Proveri da li si pokupio sve elemente (funkcije i procedure) iz date aplikacije. Svaka nova baza mora da se prvi put ulinkuje ručno.
[ Miro35 @ 10.07.2010. 10:55 ] @
To i kod mene radi kad ručno povežem robno2009, ali ako je moguće da ne moram ručno povezivati.Znači kad izaberem samo robno da poveže i isto tako robno2009.
[ Getsbi @ 10.07.2010. 11:53 ] @
Ukoliko baza1 i baza2 imaju različite skupove tabela (broj i naziv) i pri tom su još na različitim lokacijama, normalno je da mora prvi put da se ulinkuju ručno. Neznam koliko ti je jasan koncept Relink-a.
[ Miro35 @ 12.07.2010. 07:42 ] @
Izgleda da se nisno razumjeli.Ovo je moja funkcija koja se zove "osvjezi":
Code:
Public Function osvjezi(txtBaza As String, txtZaporka As Variant) As Boolean
On Error GoTo osvjezi_error
    Dim dbsCurrent As Database
    Dim tdfLinked As TableDef
    Dim Ok As Variant
    Set dbsCurrent = CurrentDb
    Dim strPutBaz As String
    

    strPutBaz = DLookup("PUTBAZ", "PUTANJA")
    If Right(strPutBaz, 1) = "\" Then
    strPutBaz = Left(strPutBaz, Len(strPutBaz) - 1) ' uklanja eventualno "\" iz naziva direktorija
    End If

            DoCmd.Hourglass True
    For Each tdfLinked In dbsCurrent.TableDefs
        If tdfLinked.Attributes = dbAttachedTable Then
           Ok = SysCmd(acSysCmdSetStatus, "Povezujem tablicu: " & tdfLinked.Name)

            If IsNull(txtZaporka) Or txtZaporka = "" Then
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza
            Else
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza & ";PWD=" & txtZaporka
            End If
            tdfLinked.RefreshLink
           
        End If
    Next tdfLinked
    Ok = SysCmd(acSysCmdSetStatus, "                                          ")
    osvjezi = True
    DoCmd.Hourglass False
osvjezi_exit:

Exit Functionosvjezi_error:
    DoCmd.Hourglass False
    Ok = SysCmd(acSysCmdSetStatus, "                                             ")
    MsgBox "GREŠKA:" & Str(Err) & Chr$(13) & Err.Description, vbCritical, "OOPS!"
    osvjezi = False
 Resume osvjezi_exit
End Function

Ovaj dio koda je važan:
Code:
DoCmd.Hourglass True
    For Each tdfLinked In dbsCurrent.TableDefs
        If tdfLinked.Attributes = dbAttachedTable Then
           Ok = SysCmd(acSysCmdSetStatus, "Povezujem tablicu: " & tdfLinked.Name)

            If IsNull(txtZaporka) Or txtZaporka = "" Then
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza
            Else
                tdfLinked.Connect = ";DATABASE=" & strPutBaz & "\" & txtBaza & ";PWD=" & txtZaporka
            End If
            tdfLinked.RefreshLink
           
        End If
    Next tdfLinked
    Ok = SysCmd(acSysCmdSetStatus, "                                          ")
    osvjezi = True
    DoCmd.Hourglass False

Ovde bi trebao neku petlju stavit ili tako nešto,znači ako funkcija naiđe na tabelu koja je ulinkovana iz neke druge baze
odnosno ne postoji u ovoj bazi koju sam izabro iz kombo boxa i koju linkujem,treba da je preskoči a ne da mi javi ovu grešku koja se nalazi u funkciji.To je ovaj dio koda:
Code:
osvjezi_error:
    DoCmd.Hourglass False
    Ok = SysCmd(acSysCmdSetStatus, "                                             ")
    MsgBox "GREŠKA:" & Str(Err) & Chr$(13) & Err.Description, vbCritical, "[red]OOPS[/red]!"
    osvjezi = False
 Resume osvjezi_exit
End Function