[ MrNash @ 05.09.2013. 10:06 ] @
Pozdrav!

U okviru Access aplikacije imam tabelu link-ovanu sa odgovarajucom tabelom u Oracle bazi podataka.
Potrebno je da realizujem VBA kod koji ce u zavisnosti od odabrane opcije tabelu linkovati sa produkcionim ili
testnim Oracle serverom (oba servera imaju potrebnu tabelu).

Koristio sam kod:

Dim Db As Database
Set Db = CurrentDb()

Db.TableDefs("ACCESS_TABLE_NAME").Connect = "ODBC;DSN=DSN_CONN;SERVER=MAINSERVER;UID=USERNAME;PWD=PASSWORD;TABLE=ORACLE_TABLE_NAME"
Db.TableDefs("ACCESS_TABLE_NAME").RefreshLink
Db.Close

za linkovanje na produkcioni server. Kod za link-ovanje sa testnim serverom je identican samo u konekcionom stringu stoji SERVER=TESTSERVER.
Medjutim svaki put kada izvrsim kod vidim da linkovanje nije izvrseno (na osnovu podataka u Acces tabeli i njenih kolona). Tek nakon sto resartujem Access aplikaciju
i izvrsim Resfresh pomocu "Linked Table Manager-a" tabela se zaista linkuje.

Imate li prijedloge?
[ Zoran.Eremija @ 05.09.2013. 17:03 ] @
Ako sam Vas dobro razumeo Vama treba nesto sto sam radio za linkovnje na SQL Server. Imate primer "LinkSQLServer.zip" na lokaciji http://zoraneremija.wix.com/eremijacv#!downloads/c1qda

Posto nemam Oracle instalisan ne mogu da probam. Pogledajte KonektString u kodu, treba da ga promenite sa parametrima za Oracle.
[ MrNash @ 06.09.2013. 08:20 ] @
Preuzeo sam dokument.

Da provjerim, komandom

DoCmd.TransferDatabase acLink, "ODBC Database", KonektString, acTable, "sysobjects", "LinkTables", , True

Vi link-ujete Access-ovu "LinkTables" tabelu sa "sysobjects" tabelom na MS SQL Serveru. Je li tako?
[ Zoran.Eremija @ 06.09.2013. 09:53 ] @
Odgovor je NE.
Parametar "sysobjects" je SQLServer sistemska tabela u kojoj se nalazi popis svih tabela i pogleda baze koju posmatramo. Pretpostavljam, jer odavno nisam radio s Oracle jos od verzije 6, da Oracle takodje ima neku sistemsku tabelu u kojoj ima popis svih tabela i pogleda i na mesto tog parametra "sysobjects" treba upisati ime Oracle sistemske tabele.

Parametar "LinkTables" je preimenovan naziv sistemske tabele "sysobjects", sto znaci da ce se u Access-u linkovana tabela zvati ne izvorno kako se zove u Oracle vec ce joj ime biti LinkTables.

Kada se linkuje ta tabela onda treba da korigujete upit QLinkTables prema pravim nazivima kolona koji su u toj linkovanoj tabeli...
[ MrNash @ 06.09.2013. 10:02 ] @
OK, ali nakon izvrsenja komande u Access-u cemo imati tabelu "LinkTables" sa istom strukturom i podacima kao
"sysobjects" SQL server sistemska tabela?
[ Zoran.Eremija @ 06.09.2013. 10:14 ] @
Tako je s time sto struktura i naziv tabele u Oracle nije ista najverovatnije. SQLServer-ova tabela "sysobjects" u sebi ima popis vise razlicitih objekata koji se dikriminiraju putem atributa "xtype". Koliko sam video na internetu Oracle ima posebnu tabelu za listu tabela i posebnu tabelu za listu View.
[ MrNash @ 06.09.2013. 10:19 ] @
Probao sam s Vasom komandom, s tim sto sam izmjenio konekcioni string i nazive tabela.
Medjutim nakon izvrsenja komande koja treba da poveze Access tabelu sa testnim serverom vidim
da je i dalje povezana sa tom tabelom na produkcionom serveru (na osnovu podataka i strukture).
[ Zoran.Eremija @ 06.09.2013. 10:22 ] @
Verovatno niste promenili naziv baze u KonektString
[ MrNash @ 06.09.2013. 10:31 ] @
Unio sam isti konekcioni string koji koristim za povezivanje iz Accessa na Oracle bazu i izvrsavanje upita
(taj dio funkcionise).

KonektString = "ODBC;DSN=DSN;SERVER=TESTSERVER;UID=USERNAME;PWD=PASSWORD;"
DoCmd.TransferDatabase acLink, "ODBC Database", KonektString, acTable, "Oracle_Table_Name", "Access_Table_Name", , True

Na Oracle serveru koliko vidim ne postoje odvojene baze podataka (kao kod MS SQL Servera) nego samo spisak objekata.
[ Zoran.Eremija @ 06.09.2013. 10:44 ] @
Ipak nisam u mogucnosti da vam 100% pomognem ali pogledajte na ovom linku primer pa ga prilagodite prema Vasem slucaju http://www.dbforums.com/micros...rdatabase-odbc-dsn-string.html
[ MrNash @ 06.09.2013. 11:34 ] @
Nije frka, jos cu malo da proguglam.

Hvala.
[ Trtko @ 09.09.2013. 07:47 ] @
davno je to bilo, al evo kako sam se spajao na Oracle i pretrazivao po systemskoj tabeli Tabele, Viewe ......

trt = "Driver={Microsoft ODBC for Oracle}; Server=" + serv + "; Uid=" + loz + "; Pwd=" + pas

Dim wstemp As Workspace
Dim dbtemp As Database
Dim rstemp As Recordset

Set wstemp = DBEngine.Workspaces(0)

Set dbtemp = wstemp.OpenDatabase("", True, True, trt)

Set rstemp = dbtemp.OpenRecordset("select * from all_objects", dbOpenDynaset, dbSQLPassThrough)


If pcek = -1 And tcek = -1 And scek = -1 Then
rstemp.MoveFirst

Do While Not rstemp.EOF()

imeow = rstemp.Fields(0)
If imeow = loz Then

imetabele = rstemp.Fields(1)

If rstemp.Fields(3) = "TABLE" Then
brtab = brtab + 1
End If

If rstemp.Fields(3) = "VIEW" Then
brview = brview + 1
End If
If rstemp.Fields(3) = "SYNONYM" Then
brsyn = brsyn + 1
End If
If rstemp.Fields(3) = "TABLE" Or rstemp.Fields(3) = "VIEW" Or rstemp.Fields(3) = "SYNONYM" Then
aa = aa + rstemp.Fields(3) + ":" + imetabele + ";"
End If
End If
rstemp.MoveNext

Loop
End If


i drugi primjer linkovanja

serv = curserver
loz = curowner
pas = curowner
imelink = loz + "." + tabele

oddb = "ODBC;DSN=" + serv + "; Uid=" + loz + "; Pwd=" + pas + ";DATABASE=" + serv
DoCmd.TransferDatabase acLink, "ODBC Database", oddb, acTable, imelink, "orakle"
imptrt = "select * from orakle"



možda ti pomogne, pozdrav
[ MrNash @ 09.09.2013. 09:59 ] @
Hvala ali nazalost situacija je ista. Koju god VBA komandu da izvrsim tabela je i dalje Link-ovana sa prethodnim database serverom.
[ Zidar @ 09.09.2013. 14:38 ] @
Ako tabela tvrdoglavo odbija da promeni link, zasto ne obrises tabledef pa je onda zakacis ponovo, iz izvora koji ti treba?
[ MrNash @ 09.09.2013. 15:10 ] @
Mislite da se prvo obrise postojeci link te tabele pa onda kreira novi?

[ Zoran.Eremija @ 09.09.2013. 17:51 ] @
Zipujte i okacite Vas primer da vidimo sta je.
[ Zidar @ 09.09.2013. 23:50 ] @
"Mislite da se prvo obrise postojeci link te tabele pa onda kreira novi?" - tacno tako.
[ MrNash @ 10.09.2013. 08:01 ] @
Situacija mi je nejasna, imam Access tabelu link-ovanu sa glavnim serverom (MAINSERVER). Kada izvrsim kod ispod
situacija ostane nepromjenjena (iako prva linija koda ukloni Access tabelu, provjerio sam).


DoCmd.DeleteObject acTable, "ACCESS_TABLE_NAME"

Dim KonektString As String
KonektString = "ODBC;DSN=DSN_NAME;Server=TESTSERVER;UID=USERNAME;PWD=PASSWORD"

DoCmd.TransferDatabase acLink, "ODBC Database", KonektString, acTable, "ORACLE_TABLE_NAME", "ACCESS_TABLE_NAME", False, True
[ Zidar @ 10.09.2013. 16:29 ] @
Zakacio sam MDB sa skupom funkcija koje rade ovo sto se trazi. Pogledati funkciju RefreshAttachedTAble, pa gledati dalje ako je potrebno.

Kod je baziran na knjizi "Essential Access 95" autori Allen Browne i Alison Balter. Dalje od ovoga ne znam.

Kod namerno nema error handling da bi se videlo sta se desava.

[Ovu poruku je menjao Zidar dana 10.09.2013. u 17:49 GMT+1]

[Ovu poruku je menjao Zidar dana 10.09.2013. u 17:50 GMT+1]
[ MrNash @ 11.09.2013. 08:21 ] @
Implementirao sam kod koji ste mi poslali (koristeci moje nazive tabela). Kod se izvrsi bez
greske ali nova tabela je i dalje linkovana sa starim serverom.

Ispod je format konekcionog stringa koji sam koristio (za Oracle bazu).

"ODBC;DSN=DSN_NAME;SERVER=TESTSERVER;UID=USERNAME;PWD=PASSWORD"
[ Zidar @ 11.09.2013. 14:07 ] @
"ODBC;DSN=DSN_NAME;SERVER=TESTSERVER;UID=USERNAME;PWD=PASSWORD"

SERVER=TESTSERVER ne znaci nista u connection stringu. Jedino sto se racuna je DSN=...., UID-.., PWD=... Da li se tvoj ODBC connection zaista zove DSN_NAME ili se zove nekako drugacije? Obrati paznju na Example kod u mojim funkcijama. U jednom slucaju moj DSN se zove G10_2012 a u drugom G10_2012_DEV. Konekcija G10_2012 gleda u bazu G10_2012 na production serveru, a G10_2012_DEV gleda u bazu sa istim imenom na development serveru.

Pogledaj na sta gleda tvoj ODBC connection (DSN=...) koji treba da gleda na test server. Da nisi slucajno, greskom, napravio dve ODBC konekcije sa razlicitim imenima koje gledaju na istu bazu na isti server, a ti mislis da gledaju na dva razlicita servera? Sve sto su ti kolege rekle u prethodnim postovima je tacno i radi, isto kao sto i kod koji sam ja ostavio radi. Ako nesto ne stimuje, mora biti van Accessa, a prvo mesto da se gleda je ODBC connections.

Dalje od ovoga ti ne mozemo pomoci. Dalja pomoc zahteva da neko sedne za tvoj racunar i pokusa da sve napravi i da pocne istragu odatle.
[ MrNash @ 11.09.2013. 14:49 ] @
Moja ODBC konekcija gleda na server TESTSERVER (onaj server na koji hocu da linkujem tabelu) :-(

Jesi li siguran da SERVER=TESTSERVER ne znaci nista u connection stringu?
Kada "rucno" napravim dvije link-ovane tabele u Access-u (jedna povezana sa tabelom na produkcionom
serveru a druga sa istom tom na testnom serveru) u tooltip tekstu za obe mi stoji ista vrijednost za "DSN=" ali razlicite vrijednosti za "Server=" (i podaci i struktura Access tabela su razliciti).

Takodje, Access funkcija koja se povezuje na Oracle bazu i izvrsava upit vraca razlicite podatke kada promjenim "Server=" vrijednost u konekcionom stringu.

[ Zidar @ 11.09.2013. 15:09 ] @
Citat:
Kada "rucno" napravim dvije link-ovane tabele u Access-u (jedna povezana sa tabelom na produkcionom
serveru a druga sa istom tom na testnom serveru) u tooltip tekstu za obe mi stoji ista vrijednost za "DSN=" ali razlicite vrijednosti za "Server=" (i podaci i struktura Access tabela su razliciti).

SIgurno je da se ne uzima u obzir. Sva informacija koja treba Accesu o serveru se nalazi u definiciji ODBC konekcije. Medjutim, ne smeta da kopiras ceo string, iako Microsoft natrpa svesta u taj string. Pomenuo sam to da ne bi gubio vreme proveravajuci sve parametre u connection stringu.

Probaj da unistis ODBC koji ne radi, pa ga napravi ponovo, pod drugim imenom, pa probaj tu novu konekciju. Dalje zaista ne zanm sa se moze kazati iz daljine.
[ MrNash @ 11.09.2013. 15:29 ] @
Hvala.
[ MrNash @ 12.09.2013. 11:32 ] @
Napravio sam ponovo ODBC konekije na produkcioni server (DSN_MAIN) i testni server (DSN_TEST).
Opet sam izvrsio kod ispod s tim sto sam u konekcionom stringu ostavio samo DSN, username i pasword.

Sada kada otvorim Access tabelu vidim da su podaci sa tesnog servera!!! Kada ponovo izvrsim isti kod sa DSN_MAIN
u konekcionom stringu vidim da tabela opet cita podatke sa produkcije.

Dim Db As Database
Set Db = CurrentDb()

Db.TableDefs("ACCESS_TABLE_NAME").Connect = "ODBC;DSN=DSN_TEST;UID=USERNAME;PWD=PASSWORD;"
Db.TableDefs("ACCESS_TABLE_NAME).RefreshLink
Db.TableDefs.Refresh
Db.Close
[ Zidar @ 12.09.2013. 22:01 ] @
Da li ovo znaci da sada radi ili jos uvek ne radi?
[ MrNash @ 13.09.2013. 08:17 ] @
(Za) sada radi...
[ Trtko @ 20.09.2013. 19:57 ] @

KonektString = "ODBC;DSN=DSN_NAME;Server=TESTSERVER;UID=USERNAME;PWD=PASSWORD"

Meni se čini da ti nije dobar Konektstring

Uid ti je uvijek USERNAM
pwd je password


oddb = "ODBC;DSN=" + serv + "; Uid=" + loz + "; Pwd=" + pas + ";DATABASE=" + serv


znači string "konektstring" koji šalješ ti nije dobar ,pa ispiši ga prije konekcije da vidiš što je u njemu, MSGBOX KonektString


ako koristis ovaj moj string Oddb

staviš da je

serv="testserver"
Uid="Scott" ' to su lozinke za ulaz na oracle testnu bazu , koliko se sječam
pas="tiger"

ti staviš svoj uid i svoj pasword