Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa linkovanim tabelama, Access 2000

[es] :: Access :: Problem sa linkovanim tabelama, Access 2000

[ Pregleda: 2056 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mmikan

Član broj: 25409
Poruke: 7
*.dyn.optonline.net



Profil

icon Problem sa linkovanim tabelama, Access 200026.04.2004. u 02:25 - pre 243 meseci
Pozdrav svim ucesnicima ovog foruma, sa molbom za pomoc. Na pocetku da naglasim da posedujem samo elementarno iskustvo u radu sa Access-om, koje se odnosi na kreiranje jednostavnih baza, bez mnogo VBA programiranja.

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:

Code:
 
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.









 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 07:48 - pre 243 meseci
Ovo Set dbsld = OpenDatabase(Application.CurrentDb.Name)
promeni svuda u Set dbsld = CurrentDB()

Otvori code editor i uradi search & replace za ceo projekat.
All beer is good. Some beer is better.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 13:39 - pre 243 meseci
Simke ti je dao dobar savet. Medjutim, ocekujem jos problema. Ako tvoj kod koristi rs.index, najverovatnije je da se negde posle toga javlja rs.seek. Metod .seek u principu ne radi sa linkovanim tabelama i potreban je work-around. Ne secam se napamet, moram to da potrazim, ali se secam da se svodi na otvaranje trazene tabele na neki drugi nacin. Nije tesko, ali zahteva brljanje po kodu.

Javi sta se desava posle primene Simketovog saveta, pa cemo da vidimo dalje.
 
Odgovor na temu

mmikan

Član broj: 25409
Poruke: 7
*.cps.k12.ri.us



Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 14:10 - pre 243 meseci
Simke i Zidar, hvala vam na savetima, probacu veceras cim dodjem kuci sa posla, i javisu rezultat. Hvala vam jos jednom.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 14:21 - pre 243 meseci
Funkcija koja radi lepo sa lokalnim tabelama, ali nece sa linkovanim:

Function SeekLinked_NeRadi()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT * FROM TNLines1"

Set db = CurrentDb

Set rs = db.OpenRecordset(strSQL)

With rs
.Seek "=", 1
If .NoMatch Then
MsgBox "SEEK NIJE nasao trazenu vrednost"
Else
MsgBox "SEEK JESTE nasao trazenu vrednost"
End If
End With

End Function


Funkcija koja radi sa linkovanim tabelama:

Function SeekLinked_GOOD()
Dim rs As DAO.Recordset

Set rs = OpenForSeek("TNLines")
'OpenForSeek je korisnicka funkcija, nije ugradjena u Access, vidi dole

With rs
.Index = "PrimaryKey"
.Seek "=", 3
If .NoMatch Then
MsgBox "SEEK NIJE nasao trazenu vrednost!"
Else
MsgBox "SEEK je nasao record za zadati ID=" & !ID
End If
End With

rs.Close

End Function

Public Function OpenForSeek(TableName As String) As Recordset
' Assume MS-ACCESS table
Set OpenForSeek = DBEngine.Workspaces(0).OpenDatabase _
(Mid(CurrentDb().TableDefs(TableName).Connect, _
11), False, False, "").OpenRecordset(TableName, _
dbOpenTable)
End Function

 
Odgovor na temu

mmikan

Član broj: 25409
Poruke: 7
*.cps.k12.ri.us



Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 15:58 - pre 243 meseci
Simke:
Probao sam tvoj savet i zamenio svaki OpenDatabase() sa CurrentDB(). Nazalost moram da prijavim da se ista greska i dalje pojavljuje na istom mestu {rstIzlaz.Index = "RB"}. Sadrzaj i struktura promenljivih 'dbsld' i 'rstIzlaz' su ISTOVETNI posle primene CurrentDB() kao i posle OpenDatabase(). Napravio sam screenshots watch-eva obe promenljive i mogao bih da ih post-ujem ako je potrebno, cim provalim kako to da uradim :). Primetio sam da u oba slucaja promenljiva 'dbsld' ima sledece vrednosti za properties:
dbsld.Name="path do front-end.mdb" (mislim da je to OK)
dbsld.RecordSet.Count=1 (mislim da je tu problem)
dbsld.TableDefs.Count=74 (i svaki od ta 74 Item-a ima Connect atribut setovan na korektan path do BACK-END.MDB)
Takodje me buni sto je rstIzlaz.Index korektnog tipa String, ali mu je value setovan na "Operation is not supported for this type of object". Nije mi uopste jasno koji deo koda dovodi do te poruke, posto dodeljvanje stringa "RB" varijabli tipa String ne bi smelo da prijavi tu gresku, bar ja mislim :((


Zidar:
Hvala na trudu da pronadjes primer funkcije za seek. Bio si u pravu, code je prepun While .... Seek .....DLookup() .... Wend struktura, medjutim nemogu da probam da primenim tvoj savet dok prvo ne resim ovaj problem sa Runtime Error 3251.

Da li bi pomoglo ako bih attach-ovo screenshots watch-eva za dbsld i rstIzlaz, ili listing cele funkcije sa kojom imam problema (nije jedina ali se svi problemi svode na isto).
Hvala unapred na daljim savetima.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 17:44 - pre 243 meseci
Error 3251 jeste upravo to - pokusaj da se odradi .Seek na attachovanoj tabeli. Tvoj kod puca vec na rs.index, sto je isto, rs.seek i rs.index idu u paru i ni jedno ni drugo ne radi za linkovane (attachovane) tabele. Nema ti druge nego da uradis kako sam ti kazao, i obrati paznju na link o CurrentDB, mada je to u ovom trenutku od sekundarnog znacaja. Neka prvo proradi, pa makar i sporo. Samo, ako nisi iskusan sa VBA kodom bis jako tesko da ispravis ovu vrstu problema.

Pravi problem je sto je sistem napravljen onako kako je napravljen. Imali smo na ovom forumu, cini mi se, diskusiju o tome kako se postavlja Access system. Back end i front end odvojeni od samog pocetka, front end instaliran na lokalnim masinama, back end na serveru i svi attachovani na back end. Izbegavati procesiranje u petljama (loops) jer sve ionako moze da se uradi action kverijima, a pogotovu izbegavati pretrage recordseta tipa .Seek i .Find. Sva ta pravila su prekrsena u ovom slucaju. Medjutim, sta je tu je, nisi ti pisao aplikaciju i nisi tu nista kriv. Pomoci cemo ti koliko mozemo, ali bice tesko. Ako si u Srbiji, mozes da potrazis na ovom forumu neke majsstore da ti stvarno pomognu, oko cene se dogovorite, jer ovo nece biti lako. Kad kazem majstori u Srbiji, odmah mi nekako zvone imena Broker i VbRaca :-)

Srecno!
 
Odgovor na temu

mmikan

Član broj: 25409
Poruke: 7
*.cps.k12.ri.us



Profil

icon Re: Problem sa linkovanim tabelama, Access 200026.04.2004. u 19:48 - pre 243 meseci
Zidar:
Hvala ti na konkretnom objasnjenju problema. Moram priznati da sam se toga i ja plasio od samog pocetka. Iako nemam iskustva sa Access-ovim VBA programiranjem, bavim se kompjuterima vec 18 godina, i solidno znam C i C++, kao i teoriju baza podataka. Bio sam svestan da se upustam u "mracne dubine" koda koji od samog pocetka nije pisan sa postavkom razdvojenih back-end i front-end-a, nego sa jedinstvenim fajlom na umu. Mada sam se nadao da ce to proci malo lakse, sada vidim da moze itekako biti povuci-potegni.

Da pokusam da sumarizujem nalaze, ispravi me ako gresim molim te:
1. Problem nije u metodima OpenDatabase() niti CurrentDB(), i Access je "svestan" da su sve tabele linkovane a ne lokalne.
2. Problem je u metodima rs.seek i rs.index koje se koriste za seek po privremenim recordset-ovima, i dodeljivanju vrednosti i manipulaciji sadrzajem polja, cime se ostvaruje zeljena logika rada rutine.
3. Umesto code-a tipa:
Code:

Set rstIzlaz = dbsld.OpenRecordset("Izlaz robe")
rstIzlaz.Index = "RB"

trebalo bi da koristim nesto kao:
Code:

Set rsIzlaz = OpenForSeek("Izlaz robe")
rstIzlaz.Index = "RB"

pri cemu je OpenForSeek() korisnicka funkcija iz tvog primera. Takodje, koliko razumem iz tvog primera, ne bih morao da menjam komplikovane strukture tipa:
Code:

If Not rstIzlaz.NoMatch Then
  While rstIzlaz("Redni broj") = nRB
    rstKartica.Seek "=", nVrsta, DLookup("Sifra", "Proizvodi")
    rstKartica("MP cena") = rstIzlaz("MP cena")     
    rstKartica.Update
    nBroj = nBroj + 1
    rstIzlaz.MoveNext
    If rstIzlaz.EOF Then
      GoTo Kraj:
    End If
  Wend
End If

iako taj pristup nije dobar sa stanovista performansi, ali makar da mi sve funkcije prorade, a posle cu da probam da optimizujem code.

Da li sam ovo dobro razumeo, ako nisam ispravi me molim te.
Hvala ti puno.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Problem sa linkovanim tabelama, Access 200027.04.2004. u 14:05 - pre 243 meseci
Sve je potpuno tacno kako si razumeo. Samo promeni nacin otvaranja recordseta, bas onako kako si naveo pod tackom 3. Takodje, na moras i NE SMES da menjas strukture tipa

If Not rstIzlaz.NoMatch Then
...
...
Endi If

Kad otvoris recordsete sa Set rsIzlaz = OpenForSeek(...) sve ce dalje da radi OK.

Preporucujem da ne diras kod dalje od navedenih izmena. Program je do sada ocigledno radio i nije bio ni spor ni nista, samo si hteo da organizujes forme i odvojis front i back end. Ako je aplikacija radila dobro, radice dobro i nadalje. Sto nije napisana po mom ukusu i sto teorijski to moze drugacije, nema veze. Kod je verovatno ako ne optimalan on bar dovoljno dobar za taj nacin programiranja.

:-)

P.S. Slutio sam da imamo posla s nekim ko zna sta radi. Za nekoga ko nema bas nikakvo iskustvo sa Accessom i VBA jos od pocetka se videlo da veoma dobro razumes sustinu - tacno lokalizovan problem i pretpostavaka o resenju. To pocetnik ne moze da u radi ni pod razno. Sad razumem kako. 18 godina iskustva, pa C/C++ objasnjava mnogo toga.

Svaka cast mastore.
:-)
 
Odgovor na temu

mmikan

Član broj: 25409
Poruke: 7
*.cps.k12.ri.us



Profil

icon Re: Problem sa linkovanim tabelama, Access 200027.04.2004. u 14:41 - pre 243 meseci
Zidar:
Jos jednom ti najlepse zahvaljujem na savetima i recima pohvale.
Da, tacno je, iskustvo u radu sa racunarima i programiranjem (iako se vec duzi niz godina bavim sistemskim planiranjem, implementacijom i administracijom mreza), pomaze mi da tezim jasnoj lokalizaciji problema i pretpostavki mogucih resenja. To nikako ne znaci da se "guram gde mi nije mesto", i zato iskreno priznajem mi Access nije dovoljno poznat. Uradicu kako si preporucio, jes' da nece bas biti brzo, nervira me Access-ov ograniceni development environment, nepoznavanje keyboard shortcut-a za brze kretanje po kodu, itd... Ali uspecu vec nekako, verujem u to.
Potpuno si bio u pravu kada si rekao da je aplikacija itekako funkcionalana, radi bez problema 16-20 sati na dan, vec godinu ipo, i ja sam samo zeleo da je malo "ulepsam" i razdvojim podatke od logike aplikacija, sa daljim ciljem da nekako probam da "povezem" bazu sa buducim web sajtom za prodavnicu, i mogucom on-line prodajom ogranicenog tipa. No, otom potom, moram prvo ovo da fix-ujem.
Javicu sta sam uradio i kako je proslo.

Hvala ti, i "da si ziv i zdrav jos godina sto... {cumbe, cumbe...}" :))

 
Odgovor na temu

mmikan

Član broj: 25409
Poruke: 7
*.cps.k12.ri.us



Profil

icon Re: Problem sa linkovanim tabelama, Access 200027.04.2004. u 17:27 - pre 243 meseci
Zidar:

SVAKA CAST MAJSTORE!!! CAR SI, NEMA STA!!! SAVET TI PARA VREDI!!!

Iako sam na poslu trenutno, nisam izdrzao da posle tvoje potvrde da sam razumeo resenje, to i probam. Logovao sam se na kucni racunar kroz VPN i XP-ov RemoteDesktop Sharing, i odmah primenio resenje na istoj onoj funkciji koju sam koristio za primer problema.
Probacu da sumarizujem resenje ponovo, ne bi li mozda nekome pomoglo sa slicnim problemom:

1. Definisao sam novu korisnicku funkciju OpenForSeek:
Code:

Public Function OpenForSeek(TableName As String) As Recordset
'// Prema savetu "Zidar"-a sa [es-Access] foruma
  Set OpenForSeek = DBEngine.Workspaces(0).OpenDatabase _
  (Mid(CurrentDb().TableDefs(TableName).Connect, _
  11), False, False, "").OpenRecordset(TableName, _
  dbOpenTable)
End Function

2. Svako pojavljivanje
Code:

Dim dbsld As Database
Set dbsld = OpenDatabase(Application.CurrentDb.Name) 

zamenio sam sa:
Code:

Set dbsld = CurrentDb()


3. I sto je najvaznije za resenje problema:
Svako pojavljivanje:
Code:

Dim rstIzlaz As Recordset
Set rstIzlaz = dbsld.OpenRecordset("ime_tabele")

zamenio sam sa:
Code:

Set rstIzlaz = OpenForSeek("ime_tabele")


I SVE JE PRORADILO KAO TREBA :-)

Nema vise Runtime Error 3251 "Operation is not supported for this type of object", stampe rade ispravno, samo nisam stigao da proverim da li se sve knjizi na kartice i lager robe, ali za to treba prvo da promenim OpenForSeek funkciju na jos jedno pedesetak mesta u code-u. No uveren sam da ce sve korektno da radi, bas kao sto si rekao, bez diranja ostatka code-a, sto i nemam nameru, neka sve samo proradi korektno sa linkovanim tabelama, vise mi ni ne treba.

Covek, ako mogu da ti se nekao oduzim za ovu veliku pomoc, samo reci, molim te.

Pozdrav i hvala jos jednom.
 
Odgovor na temu

[es] :: Access :: Problem sa linkovanim tabelama, Access 2000

[ Pregleda: 2056 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.