Radi se o bazi u Access 2000 .mdb formatu, sa preko 70 tabela, 100 formi, 40 izvestaja, 65 query-ija i 20 macro-a, koja je narasla do skoro 100 MB. Baza se inace koristi za svakodnevno poslovanje maloprodajnog diskonta na Novom Beogradu, uz koriscenje PC kase i bar kod skenera, i programirao ju je profesionalni programer. Moj otac, koji vodi firmu, zamolio me je pokusam da poboljsam korisnicki interfejs i pojednostavim i grupisem sve te mnogobrojne forme i izvestaje u logicki organizovane module. Moj izbor je pao na Switchboard i to sam veoma jednostavno uradio kroz ugradjeni "Switchboard Manager".
Sledeca stvar koju sam uradio je bilo da razdvojim podatke od izvrsne logike "aplikacije", koristeci "Linked Table Manager". Tako sam kreirao back-end, sa svim tabelama i podacima (koji cini 90% velicine baze), i front-end sa svim ostalim formama, izvestajima, itd. Ideja je bila da se olaksa razvoj i finalno "stelovanje" korisnickog interfejsa, uz neometano funcionisanje PC kase koja koristi bazu 16 sati na dan.
Sve je to na prvi pogled lepo funkcionisalo, dok prilikom testiranja front-end-a nije doslo do raznih poruka o greskama u izvesnim formama, koje se ranije nisu pojavljivale dok se koristila jedinstvena baza. Greske su se kretale od nefunkcionisanja izvesnih delova formi, nekih komandi na tastaturi, pa do direktnih Access-ovih error-a tipa: Runtime Error 3251 "Operation is not supported for this type of object". Koristeci debugger dosao sam do otkrica da su se problemi javljali svaki put prilikom izvrsavanja DAO metoda 'OpenDatabase' i 'OpenRecordset', tacnije prilikom pokusaja dodeljivanja vrednosti nekom od polja u privremenim varijablama tipa 'Recordset'. Da ja ne bih "pametovao" mnogo i mozda izazvao podsmeh svojim pogresnim tumacenjem VBA pojmova, evo navodim konretan primer:
Public Function Kartica_Izlaz(nRB, nVrsta, dDatum, nSOP)
Dim dbsld As Database
Dim rstIzlaz As Recordset
Dim rstKartica As Recordset
Dim rstProizvodi As Recordset
Dim nBroj As Integer
nBroj = 0
Set dbsld = OpenDatabase(Application.CurrentDb.Name)
Set rstIzlaz = dbsld.OpenRecordset("Izlaz robe")
rstIzlaz.Index = "RB"
..... itd ......
Runtime Error 3251 "Operation is not supported for this type of object", se javi prilikom izvrsavanja zadnje linije {rstIzlaz.Index = "RB"}. Analiziranjem sadrzaja promenljivih dbsld i rstIzlaz u tom trenutku, "upalo mi je u oko" da Application.CurrentDb.Name referise na front-end fajl, u kome se nalazi samo link na tabelu "Izlaz robe", koja se fizicki nalazi u sasvim drugom back-end fajlu. Kada sam testa radi, obrisao taj link i fizicki prebacio tu tabelu iz back-end-a u front-end, funkcija se izvrsila bez problema i error-a.
Time dolazimo do mog pitanja: Da li je moguce da "Linked Table Manager" i ovaj, inace pametan princip razdvajanja tabela od izvrsne logike aplikacije, ne funkcionise korektno u slucaju koriscenja DAO metoda? Ili bi trebalo nekako korigovati argumente tih metoda i dati im do znanja da se radi o linkovanim tabelama a ne lokalnim. Ili bi trebalo koristiti neki drugi programerski jezik, kao ADO ili JetSQL, da bi se omogucilo korektno koriscenje linkovanih tabela. Ja sam proveo sate pretrazujuci po ugradjenim Help fajlovima, MS Knowledge Base-u i MSDN Knowledge Base-u, ali sam samo postao jos zbunjeniji no sto sam bio na pocetku.
Unapred sam zahvalan na svakom ponudjenom savetu.