Budując aplikacje w Accessie używam różnych w modułach VBA funkcji nie
tylko z Access'a. Na przykład: OpenDatabase, które jest w DAO.
Problem w tym, że np. na moim komputerze jest DAO 3.51. Inni mogą mieć
wersję 3.50, inni: 3.60. Wystarczy, że wersja nie będzie się dokładnie
zgadzała z moją, a baza przestanie działać na innym komputerze (w
Narzędzia -Odwołania będzie pisało: "BRAKUJE: Microsoft DAO 3.51 Object
Library"). I to wszystko dzieje się pomimo tego, że DLL tak samo się nazywa,
jest w tym samym katalogu, co oryginalny, i są w nim identyczne funkcje
exportowane.
Co robić ? Wygląda na to, że aby uruchomić mój projekt muszę razem z plikiem
MDB przenieść na inny komputer także odpowiednie pliki DLL i je
zarejestrować !!!
O ile jeszcze w przypadku DAO jest mniejszy problem (bo można z
powodzeniem stosować DAO 2.5/3.5 Compatibility Library), to problem staje
się poważny z innymi bibliotekami. Przykład: ADO 2.1/2.0 (zdarzyło mi się
dzisiaj).
Cóż z tego, że moja baza gdzieś działa. Wystarczy, że M$oft wymyśli nowy
Service Pack do NT/Office/MDAC (niepotrzebne skreślić). Użytkownik w dobrej
wierze zainstaluje 'poprawki' i baza przestanie mu działać. Co prawda przy
uaktualnianiu _prawdopodobie_ zachowują się stare wpisy w rejestrach (a to
od nich zależy rozpoznanie wersji), ale świeżo zainstalowany komputer z
najnowszymi poprawkami nie będzie miał starszych wpisów.
Nie mogę przecież żądać od użytkowników: Macie mieć wersję Office 'XXX'
SP 'YYY' na NT Worstation z Service Pack 'ZZZ' z ODBC 'AAA.BBB.CCC' i nie
wolno wam uaktualniać systemu !!!
Czy ktoś ma może pomysły jak rozwiązać ten problem...
Piotr.
Rysiek <a@lajkonik.wis.pk.edu.plnapisa=B3...
Napisalem baze danych w Accessie 7, ktora posiada=20
uzytkownikow i przydzielone im hasla i prawa. Chcialbym
napisac aplikacje w VB4 ktora obslugiwalaby ta baze danych,
z dostepem do uzytkownikow i hasel.=20
Za u=BFytkownik=F3w odpowiada obiekt Workspace:
Set variable =3D CreateWorkspace(name, user, password)
U=BFytkownicy utrzymywani s=B1 w bazie systemowej (SYSTEM.MDB zazwyczaj) =
wi=EAc przeniesienie tej bazy to pocz=B1tkowy stan u=BFytkownik=F3w. =
Jest jaki=B6 parametr kt=F3ry pozwala odpali=E6 Accessa z konkretn=B1 =
baz=B1 systemow=B1 (nie trzeba manewrowa=E6 WorkGroup Administratorem). =
Ale szczeg=F3=B3y jak to zrobi=E6 w VB - nie wiem, ale na pewno si=EA =
da...
Dodawanie / usuwanie u=BFytkownik=F3w i grup to metody obiektu =
Workspace.
O szczeg=F3=B3y naj=B3atwiej w dokumentacji (np. tematy zawieraj=B1ce =
"DAO" - Data Access Object). =AFeby zacz=B1=E6, w VB4.0 Tools | =
References warto w=B3=B1czy=E6 "Microsoft DAO 3.0 Object Library"... =
Wypr=F3buj (tyle na poczekaniu, u mnie dzia=B3a - to akcja Load pustego =
formularza VB4):
Private Sub Form_Load()
Dim db As Database, F As Object, T As Object
Set db =3D OpenDatabase("D:msofficeaccesssamples
orthwind.mdb")
MsgBox "Nazwa bazy: " & db.Name & ", kontener=F3w: " & =
db.Containers.Count
Set F =3D db.Containers("Forms")(0)
MsgBox "Nazwa pierwszego formularza: " & F.Name
Set T =3D db.TableDefs ' ...podobnie QueryDefs, Indexes...
MsgBox "Liczba tabel: " & T.Count
Set T =3D T(0)
MsgBox "Nazwa pierwszej: " & T.Name
s =3D ""
For i =3D 0 To T.Fields.Count - 1
s =3D s & T.Fields(i).Name & ", " ' ... podobnie Parameters dla =
pyta=F1
Next
MsgBox "Lista p=F3l: " & Left(s, Len(s) - 2)
db.Close
End Sub
Pozdrowienia
Zbyszek
--=20
.....a tak w og=F3le uwa=BFam =BFe ka=BFdy powinien podpisywa=E6 si=EA =
(w=B3asnym) imieniem i nazwiskiem...
Zbigniew Gasiorek [z@euro.net.pl] Cracow Poland
On Sat, 20 Jan 2001, Wiesław Wronowicz wrote:
Wyrazilem po prostu fakt, ze jestes dosc
aktywny na tej grupie od paru lat - i to w pozytywnym tego slowa
znaczeniu.
Dziekuję:))) Takie słowa to nagroda za choćby czas tracony na
odpowiedzi.:)))
Ja pojmuje w VB referencje jako zmienna mogaca zawierac adres jakiegos
obiektu. Dla przykladu:
Dim x as Collection
dim y as object
Tutaj x jest wlasnie referencja. Natomiast obiektem jest to cos co siedzi
pod adresem zawartym w x
Ja pojmuję to dokładnie odwrotnie (pomijając odwołanie do Collection,
które stanowi chyba coś innego).
Dla mnie:
Dim x As MojaKlasa
Dim y As Object
Set x=New MojaKlasa
Set y=x
mam jedną referencję MojaKlasa i dwa obiekty x i y typu MojaKlasa,
dla których kod jest pod adresem zawartym w odwołaniu (referencji)
MojaKlasa.
Inaczej jeżeli klikam na Project, References i zaznaczam tam jakąś
biblioteke kodu np Microsoft DAO 4.0 tzn. ze dodałem do projektu
referencje czyli bibliotekę kodu. Na bazie tej biblioteki mogę
utworzyć ileś tam obiektów, które mają wspólny kod i oddzielne
obszary zmiennych. Czyli:
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
jest zadeklarowaniem trzech obiektów rs1, rs2, rs3 o wspólnej
referencji (klasie) Recordset.
Ta definicja jest jednoznaczna, natomiast mam wątpliwości jezeli
jest to odwolanie do Collection, ponieważ Kolekcja może zawierać
zarówno obiekty (odwołania do obiektów) , jak i inne dowolne
zmienne np. stringi, czy liczby.
Mam również wątpliwości czy Kolekcja wogóle jest referencją.
czyli piszac np.
set x = new collection
set y = x
mamy jeden obiekt typu Collection, i 2 referecje, ktore na niego wskazuja.
Pzdr, Mundek
Pozdrawiam
Wiesiek
On Mon, 22 Jan 2001, Wiesław Wronowicz wrote:
| Ja pojmuje w VB referencje jako zmienna mogaca zawierac adres jakiegos
| obiektu. Dla przykladu:
| Dim x as Collection
| dim y as object
| Tutaj x jest wlasnie referencja. Natomiast obiektem jest to cos co siedzi
| pod adresem zawartym w x
Ja pojmuję to dokładnie odwrotnie (pomijając odwołanie do Collection,
które stanowi chyba coś innego).
Dla mnie:
Dim x As MojaKlasa
Dim y As Object
Set x=New MojaKlasa
Set y=x
mam jedną referencję MojaKlasa i dwa obiekty x i y typu MojaKlasa,
dla których kod jest pod adresem zawartym w odwołaniu (referencji)
MojaKlasa.
Inaczej jeżeli klikam na Project, References i zaznaczam tam jakąś
biblioteke kodu np Microsoft DAO 4.0 tzn. ze dodałem do projektu
referencje czyli bibliotekę kodu. Na bazie tej biblioteki mogę
utworzyć ileś tam obiektów, które mają wspólny kod i oddzielne
obszary zmiennych. Czyli:
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
jest zadeklarowaniem trzech obiektów rs1, rs2, rs3 o wspólnej
referencji (klasie) Recordset.
Ta definicja jest jednoznaczna, natomiast mam wątpliwości jezeli
jest to odwolanie do Collection, ponieważ Kolekcja może zawierać
zarówno obiekty (odwołania do obiektów) , jak i inne dowolne
zmienne np. stringi, czy liczby.
Mam również wątpliwości czy Kolekcja wogóle jest referencją.
No wlasnie, masz watpliwosci..., a nie mialbys ich gdybys pojmowal to tak
jak ja. Problem w tym, ze w VB slowo referencja moze byc uzyte w 2
kontekstach:
1.Referencja Twojego komponentu do innych ActiveX-ow ustawiana dla
projektu wlasnie w Project/references, dzieki ktorej do VB laduje sie
biblioteka typow pozwalajaca ci na "typowane" tworzenie i bliskie wiazanie
obiektow klas, ktore sa upublicznione w tej wlasnie bibliotece.
2.Rejerencje do obiektow - czyli instancji klas.
Wydaje mi sie to tak oczywiste, ze nie wspominam nigdy dokladnie jaka
referencje mam na mysli,bo to zawsze wynika z kontekstu, ale moze sie
myle.
Zeby sie nie rozpisywac - wyszukalem w MSDN-e odpowiedni artykul - tam
jest to dosc jasno opisane co jest co. Wystarczy poszukac pod haslem:
"Object references, vs. object variables"
Pzdr, Mundek
Reference=*G{00000205-0000-0010-8000-00AA006D2EA4}#2.5#0#......WINDOWSS
YSTEMmsado25.tlb#Microsoft ActiveX Data Objects 2.5 Library
Reference=*G{00025E01-0000-0000-C000-000000000046}#5.0#0#......WINDOWSS
YSTEMDAO360.DLL#Microsoft DAO 3.6 Object Library
Reference=*G{6B263850-900B-11D0-9484-00A0C91110ED}#1.0#0#......WINDOWSS
YSTEMMSSTDFMT.DLL#Microsoft Data Formatting Object Library 6.0 (SP4)
Object={EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0; SHDOCVW.DLL
Reference=*G{56BF9020-7A2F-11D0-9482-00A0C91110ED}#1.0#0#......WINDOWSS
YSTEMMSBIND.DLL#Microsoft Data Binding Collection VB 6.0 (SP4)
Reference=*G{B45E0189-CF19-11D6-8C2D-0050FC2F0D73}#2.0#0#......PROGRAM
FILESPIEKARNIAREGISTERLICENCJA.DLL#Licencja
Reference=*G{84B7C305-D151-11D6-8C2D-0050FC2F0D73}#1.0#0#......PROGRAM
FILESPIEKARNIAREGISTERCOD.DLL#Cod
Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.3#0; COMCTL32.OCX
Object={65E121D4-0C60-11D2-A9FC-0000F8754DA1}#2.0#0; MSCHRT20.OCX
Object={67397AA1-7FB1-11D0-B148-00A0C922E820}#6.0#0; MSADODC.OCX
Object={C932BA88-4374-101B-A56C-00AA003668DC}#1.1#0; MSMASK32.OCX
Object={CDE57A40-8B86-11D0-B3C6-00A0C90AEA82}#1.0#0; MSDATGRD.OCX
Object={0ECD9B60-23AA-11D0-B351-00A0C9055D8E}#6.0#0; MSHFLXGD.OCX
Object={3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0; RICHTX32.OCX
Object={BDC217C8-ED16-11CD-956C-0000C04E4C0A}#1.1#0; TABCTL32.OCX
Object={86CF1D34-0C5F-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCT2.OCX
Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; COMDLG32.OCX
Reference=*G{0D452EE1-E08F-101A-852E-02608C4D0BB4}#2.0#0#......WINDOWSS
YSTEMFM20.DLL#Microsoft Forms 2.0 Object Library
Object={FAEEE763-117E-101B-8933-08002B2F4F5A}#1.1#0; DBLIST32.OCX
Object={F0D2F211-CCB0-11D0-A316-00AA00688B10}#1.0#0; MSDATLST.OCX
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0; MSCOMM32.OCX
Object={48E59290-9880-11CF-9754-00AA00C00908}#1.0#0; MSINET.OCX
Object={00028C01-0000-0000-0000-000000000046}#1.0#0; DBGRID32.OCX
Object={248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0; MSWINSCK.OCX
Object={5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0; MSFLXGRD.OCX
Object={38911DA0-E448-11D0-84A3-00DD01104159}#1.1#0; COMCT332.OCX
Object={ED2BF553-CF2C-11D6-8C2D-0050FC2F0D73}#1.0#0; BROWSEMDB.OCX
Object={4A26529F-AE17-4F66-B265-70227BBF77DA}#1.1#0; RYSUNEK.OCX
Object={E043FC54-CFFB-11D6-8C2D-0050FC2F0D73}#1.0#0; INFORM.OCX
Najlepiej w tym celu przeslij na grupe naglowek pliku vbp,
gdzie sa wymienione uzyte obiekty.
pzdr aci
Użytkownik "Siudek Sławomir" <siud@atrix.com.pl.nospamnapisał w
wiadomości
PS: Prosiłbym o komentarz W. Wronowicza czy się zgadza z moim opisem -
zakładam że od zawsze ma u siebie BDE i dlatego nie wychodziły mi takie
cuda
jak u mnie - przez tydzień dociekałem, dlaczego DAO 3.51 może modyfikować
dane dBase, zaś DAO 3.6 już nie (nie miałem wtedy BDE).
W latach 1997-1998 pracowałem w firmie w której wykorzystywany był polski
program finansowy w formacie dBASE III. Ja korzystałem w tym czasie z VB4.0
i przeszłem na VB 5.0.
Napisalem kilka małych programików uzupełniających ten główny. Pliki dbf
otwierałem przez Kontrolkę DATA, podając w właściwości Connect dBASE III.
i ustawiając RekordSource. Dodatkowo w katalogach na serwerze tam gdzie były
dbf instalowałem pliki inf (tak jak pisałem wczesniej). Korzystałem z DBGrid
i DBCombo związanymi z DATA. W tym czasie nie było VB6 ani JET 4.0.
Efekty: miałem pełną kontrolę: dodawanie, edycja, kasowanie rekordów pod
moim programem w VB 5.0. Chodziły również indeksy, wszystko wprowadzało
się prawidłowo. Kontrola za pomocą specjalnego narzedzia używanego przez
autorów programu, wykazywała że wszystkie zmiany w plikach bazy danych
i indeksów były prawidłowe. Jedynie czego nie udało mi się uzyskać, to ich
narzędziem można było zobaczyć rekordy deletowane, u mnie nie.
Te moje programiki nie były zbyt profesjonalne, ale skuteczne i proste.
Natomiast nie pamietam czy indeksy były NDX czy NTX.
Pamiętam że początkowo nie korzystałem z indeksów, tylko wprowadzałem
zmiany w samych plikach dbf, w trybie exlusive (ustawiałem w DATA). Po
zmianie zwalniałem plik i uruchamiałem przeindeksowanie (było takie
narzedzie w programie głównym, trwało to sekunde).
Podsumuwując: Moje doświadczenia są inne niż Twoje Sławku. Nie mam i
nie miałem BDE. Korzystałem tylko z Microsoft DAO 2.5 Object Library i
Microsoft DAO 2.5/3.51 Compatibility Library.
Od tamtej pory nie miałem do czynienia z dBASE III.
Pozdrawiam
Wiesiek
Pawel <les@box43.gnet.plwrote in message Niestety występuje błąd podczas kompilacji.
Gdybyś napisał dokładnie JAKI bład występuje spróbowałbym Ci pomóc.
Przede wszystkim: aby móc używać obiektów typu 'Database' lub 'Recordset'
musisz dodać do swojego projektu referencję do biblioteki DAO.
W moim przypadku nazywa się ona 'Microsoft DAO 3.51 Object Library' a jest
w pliku "C:Program FilesCommon FilesMicrosoft SharedDAODAO350.DLL"
Biblioteka ta jest niezbędna aby użyć tych obiektów a poza tym musisz mieć
zainstalowane drivery do obcych typów baz danych (innych niż MS Jet).
Nieistnienie tych driverów objawiałoby się jednak błędem typu run-time czyli
błedem w czasie pracy programu a nie w czasie jego kompilacji. Proponuję
więc dodać tą referencję do projektu i ponownie skompilować. U mnie ta
funkcja działa i "VB6 Pro" nie zgłasza żadnych błędów kompilacji. Jeśli
jednak mimo dodania DAO do referencji dalej były błędy kompilacji to napisz
tu o nich - postaram Ci się pomóc.
Może jest jakiś prostszy sposób żeby otrzymać liczbę wierszy w otwartym
skoroszycie.
Otwartym? Uważaj na dostęp do *otwartego* poliku. Możesz dostać błedy typu
protekcji dostępu. System nie pozwala dwu aplikacjom otworzyć tego samego
pliku do zapisu! A co do samej prostoty tego rozwiązania to chyba nie
znajdziesz niczego znacznie prostrzego od otwarcia tego arkusza wyczesania
z niego liczby rekordów i zamknięcia pliku... w sumie to 4-5 linijek kodu,
nie przesadzaj - to bardzo prosty sposób co nie znaczy że nie istnieje
prostrzy! Jak to mówią Amerykanie: "There are so many ways to skin the cat..."
Ja jednak znam tylko jeden sposób oskórowania Twojego kota... ;-) Powodzenia!
p.s. pisz swój tekst POD cytatem... zgodnie z usenetową tradycją ;-)
-----Wiadomość oryginalna-----
Od: Pszemol <Psze@PolBox.com
Grupy dyskusyjne: pl.comp.lang.vbasic
Data: 5 sierpnia 1999 16:03
Temat: Re: VB i Excel
Pawel <les@box43.gnet.plwrote in message
| Niestety występuje błąd podczas kompilacji.
Gdybyś napisał dokładnie JAKI bład występuje spróbowałbym Ci pomóc.
Przede wszystkim: aby móc używać obiektów typu 'Database' lub 'Recordset'
musisz dodać do swojego projektu referencję do biblioteki DAO.
W moim przypadku nazywa się ona 'Microsoft DAO 3.51 Object Library' a jest
w pliku "C:Program FilesCommon FilesMicrosoft SharedDAODAO350.DLL"
Biblioteka ta jest niezbędna aby użyć tych obiektów a poza tym musisz mieć
zainstalowane drivery do obcych typów baz danych (innych niż MS Jet).
Nieistnienie tych driverów objawiałoby się jednak błędem typu run-time
czyli
błedem w czasie pracy programu a nie w czasie jego kompilacji. Proponuję
więc dodać tą referencję do projektu i ponownie skompilować. U mnie ta
funkcja działa i "VB6 Pro" nie zgłasza żadnych błędów kompilacji. Jeśli
jednak mimo dodania DAO do referencji dalej były błędy kompilacji to napisz
tu o nich - postaram Ci się pomóc.
A do czego służy DAO?
Otwartym? Uważaj na dostęp do *otwartego* poliku. Możesz dostać błedy typu
protekcji dostępu. System nie pozwala dwu aplikacjom otworzyć tego samego
pliku do zapisu! A co do samej prostoty tego rozwiązania to chyba nie
znajdziesz niczego znacznie prostrzego od otwarcia tego arkusza wyczesania
z niego liczby rekordów i zamknięcia pliku... w sumie to 4-5 linijek kodu,
nie przesadzaj - to bardzo prosty sposób co nie znaczy że nie istnieje
prostrzy! Jak to mówią Amerykanie: "There are so many ways to skin the
cat..."
Ja jednak znam tylko jeden sposób oskórowania Twojego kota... ;-)
Powodzenia!
Zapomniałem zaznaczyć, że pisze makro w VBA w Excelu. Pisze "prosty sposób"
bo chyba można z otwartego w Excelu skoroszytu odczytać ilość wierszy.
p.s. pisz swój tekst POD cytatem... zgodnie z usenetową tradycją ;-)
Dzięki! Teraz jest dobrze?
Pilnie poszukuje czegos takiego
co zwie sie Microsoft DAO w wersji 3.5
(DAO to Data Access Objects).
[...]
DAO wykorzystuje Access 97. Zainstaluj i sprawdz czy cos Ci pomoze.
Grzegorz M
W artykule news:drlth1$niv$1@inews.gazeta.pl,
niejaki(a): Piotrus z adresu <piot@niema.mailanapisał(a):
(...)
mam takich 80 plikow mdb (i niestety tabele roznia sie nazwami, czasem
iloscia, 2 mniej lub wiecej)..
dlatego pojedynczo importowane dane nie maja sensu, musialbym wykonac
1600 importow!
dlatego pytam o jakies narzedzie co obsluzy przynajmniej 1 caly plik
mdb eksportujac go do excela...
(...)
Do tego celu mozna równiez wykorzystać DAO lub ADO. Ponizej masz przykład
procedury z uzyciem DAO, która do aktywnego skoroszytu importuje wszystkie
tabele z przykładowej bazy Access'a.
Sub ListTbls()
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim rst As DAO.Recordset
Dim i As Integer
Set db = DAO.OpenDatabase("C:DaneExample.mdb")
For Each tbl In db.TableDefs
If Left(tbl.Name, 4) <"MSys" Then
Worksheets.Add
Set rst = db.OpenRecordset(tbl.Name)
i = 1
With ActiveSheet
.Name = tbl.Name
For Each pole In rst.Fields
With .Cells(1, i)
.Value = pole.Name
.Font.Bold = True
End With
i = i + 1
Next
OpenRecordsetOutput rst
.UsedRange.EntireColumn.AutoFit
End With
End If
Next tbl
End Sub
Sub OpenRecordsetOutput(rstOutput As DAO.Recordset)
Dim pole
Dim i As Integer
Dim wiersz As Long
wiersz = 2
With rstOutput
Do While Not .EOF
i = 1
For Each pole In .Fields
Cells(wiersz, i) = pole.Value
i = i + 1
Next
.MoveNext
wiersz = wiersz + 1
Loop
End With
End Sub
Do prawidłowego działania konieczne jest "zaptaszkowanie" biblioteki "Microsoft
DAO Object Library" w menu ToolsReferences edytora VBA.
Oczywiście przykład jest bardzo "surowy" i brak mu bajerów typu formatowanie
danych czy kontrola poprawności.
Ten przykład można bez problemów rozbudować, tak aby jednocześnie pobrać dane
ze wszystkich baz umieszczonych w okreslonym folderze.
Tajan
|| PS.
|| Na końcówkach na których będzie baza musisz mieć dao
|| zarejestrowane inaczej będzie ci wywalało błędy
|| (hehehe bo się moduł nie będzie chciał skompilować ;-)
DAO jest integralną częścią access'a, więc jeśli gdziekolwiek access jest
zainstalowany (czy to w wersji pełnej czy RT) to biblioteka ta równiez
jest instalowana !
| W nowszych wersjach MS Access w projekcie VBA defaultową referencją jest
| Microsoft ActiveX Data Objects 2.X Library (poprzednio było DAO) i
| dlatego jesli chcemy korzystać w obiektów DAO , no Recordset DAO możemy
| zrobić, a właściwie musimy, jedną z 3-ch następujących rzeczy
Nie do końca ! Access 2003 obecnie ma domyslnie zaznaczone obydwie
referencje, z DAO w pierwszej kolejności !
| 1. Dodać referencję w projekcie do Microsoft DAO 3.X Object Library, a
| linija kodu deklaracji powinna wówczas wygladać następująco:
(...)
| 2. Dodać referencję w projekcie do Microsoft DAO 3.X Object Library oraz
(...)
| 3. Zadbać o to aby refrecje w projekcie w okienku referencji były w
(...)
| czyli w każdym przypadku bezpieczniej jest użyć jednak deklaracji
| zprefiksem DAO
Jest jeszcze 4-ty sposób, wydaje się że bardzo uzyteczny dla tych
wszystkich, którzy większy akcent kładą na ADO niz DAO.
W ich przypadku DAO przydaje się w bardzo nielicznych sytuacjach, których
ADO (ADODB + ADOX) nie potrafi obsłużyć (przykłady można znaleźć na
stronie Michaela Kaplana)
Pamiętajmy, że DAO ładowane jest ZAWSZE, niezależnie od obecności na
liście referencji (oczywiście nie mówię o projektach ADP).
Bezpośrednie odwołania do jego obiektów dostarczają nam takie
funkcje/metody jak:
- DBEngine
- CurrentDb
- Me.RecordsetClone
Dlatego ZAWSZE możemy otworzyć jakiś DAO.Recordset poprzez deklarację
ogólną:
Dim db as Object ' As DAO.Database
Dim rs as Object ' As DAO.Recordset
Set db = Currentdb
Set rs = db.OpenRecordset(...)
oczywiście to nie metoda dla ludzi w ogóle nieznających DAO, bo szlag
trafia wszelkie podpowiedzi składni w IDE, niemniej ...
Bardzo popularny kawałek kodu, wyszukujący dane na formularzu:
Dim rs as DAO.Recordset
Set rs = Me.RecordsetClone
With rs
.FindFirst "MojePole=" & JakisKlucz
if .NoMatch Then
...
else
Me.Bookmark = .Bookmark
end if
End With
możemy nadal śmiało używać pomimo braku DAO na liście referencji:
Dim rs as Object ' !!!!
(...)
itd.
lub po prostu:
With Me.RecordsetClone
.FindFirst "MojePole=" & JakisKlucz
(...)
itd.
Tworząc nową bazę masz domyślnie ustawione odwołania do:
1. OLE Automation
2. MS ADO 2.1.
a brakuje
- MS DAO 3,6 Object Library
bez którego nie możesz definiować takich obiektów jak Database, QueryDef i
inne
a Recordset odwołuje się do ADO.Recordset, który ma inne metody i
właściwości niż DAO.Recordset
Oto lista referencji, które mam zaznaczone:
Visual Basic For Applications
Microsoft Access 9.0 Object Library
Microsoft DAO 3.6 Object Library
OLE Automation
Microsoft ActiveX Data Objects 2.1 Library
Microsoft Calendar 9.0
MISSING: Tutor ActiveX Control Module
Disk-Management Snap-In Object Library
ctv OLE Control Module
Microsoft Windows Common Controls 6.0
Microsoft Outlook 9.0 Object Library
Microsoft Excel 9.0 Object Library
Microsoft Office 9.0 Object Library
Microsoft SQL Parser Object Library 1.0
Microsoft Visual Basic For Applications Extensibility 5.3
acwzmain
Microsoft ActiveX Data Objects Recordset 2.5 Library
Kopiując, stosując rozwiązania przeznaczone dla DAO powinieneś:
1. Ustawić w referencjach odwołanie do DAO
(moduły / tools /references)
2. Definiować obiekty w sposób jawny:
Dim rec As DAO.Recordset
i dodatkowo (dla tych co wiedzą co robią)
- w ogóle odhaczyć tamte dwa pierwsze odwołania, albo "przesunąć" je pod
DAO
(odhaczyć i po ponownym otwarciu ponownie zahaczyć)
KN
Moja procedura wygląda tak. Nie działa gdy aktywne są wiersze 1, 2 i 3. Po
zakomentowaniu tych wierszy wszystko działa prawidłowo. O co chodzi ???
Private Sub btnFiltruj_Click()
Dim baza As DAO.Database
Dim recset As DAO.Recordset, rs As DAO.Recordset
Dim miastoid As Integer, formrozlid As Integer, cyklrozlid As Integer
Dim liczyoczy As Integer, ilerec As Integer, licznik As Integer
Dim strsql As String
Set baza = CurrentDb
Set rs = baza.OpenRecordset("szkoly")
rs.MoveLast
MsgBox "Wykonano otwarcie recordsetu"
lstFiltered.Visible = True
ilerec = rs.RecordCount ' wiersz 1
MsgBox "Liczba rekordów: " & Str(ilerec) ' wiersz 2
rs.Close ' wiersz
3
MsgBox "Koniec Procedury!"
End Sub
Pozdrawiam
Wojciech G
||| -OLE automation
|| a korzystasz ?
|
| Sam nie wiem które z referencji są wykorzystane. Zostają one
| automatyczne dodane. Nie wiem jak zweryfikować i eliminować nie
| potrzebne.
referencje dzielą się na:
- wbudowane (nie do usunięcia): Access i VBA
- domyślnie podłączone (dla wygody (?) programisty): DAO, ADO, OLE
- te, które dołączą sie automatycznie, jeśli osadzisz na formularzu jakiś
ActiveX (ocx): np. CommonControl
(ale "niestety" ne odznaczą się, gdy kontrolkę usuniesz)
- te, które świadomie dołączasz sam.
||| -Microsoft DAO 3.6 Object Library
||| -Microsoft Active X Data Object 2.5 Library
|| korzystasz z obu ?
|
| Staram się tylko z DAO korzystać. Nie wiem dlaczego ADO zostało dodane
| ale będę musiał sprawdzić dokładnie.
Jest tak domyślnie dla każdej nowej bazy, bo tak to zaprojektowano,
począwszy od A'2000.
Ale jeśli z ADO świadomie nie korzystałeś, to spokojnie możesz odhaczyć.
||| -Microsoft Windows Common Control 6.0 (sp6)
|| ufff, no tutaj może być kiepsko ...
|
| Wydaje się, że obsługiwanie standardowych kontrolek formularzy jest
| czerpane z tej biblioteki!? Jeśli tak to bez niej nie da się obejść.
Absolutnie nie. Standardowe kontrolki siedzą w bibliotece "Access".
||| -Microsoft Office 11 Object Library
|| też dałoby się zrezygnować ...
|
| Chyba FileSystemObject pochodzi się stąd. Ponieważ jestem leniwy przy
| tworzeniu obiektów typu piker czy przy operacjach na folderach
| korzystam z tego obiektu.
OK, stworzono tę bibliotekę dla wygody użytkownika.
Jeśli wszędzie jest Office 2003, to prawdopodobnie nie ona stwarza
problemy, niemniej ...
Generalnie, cokolwiek jest w referencjach (poza dwiema referencjami
stałymi), możesz odhaczyć i sprawdzić czy kod się kompiluje.
To nic nie kosztuje, najwyżej będziesz musiał zaznaczyć ją ponownie ;-)
Potem, w razie czego, możesz pomyśleć jak niezbędną (póki co) bibliotekę,
zastąpić czymś mniej kolizyjnym.
Np. dla CommonControl jest w zasadzie tyle zamienników DLL, że aż prosi
się by nie narażać się na urwane referencje z powodu różnych jej wersji na
różnych komputerach.
Wracając do DAO i ADO ...
Accessowi te biblioteki w referencjach do niczego nie są potrzebne.
Są one potrzebne programiście, jeśli będzie chciał programowo dobrać się
do danych.
Oczywiście Access i Jet wykorzystują DAO, ale korzystają z niej tak czy
siak, bez względu na jej obecność w referencjach.
To samo może zrobić programista!
Dostęp do wszystkich (?) obiektów DAO mamy poprzez accessowe funkcje
CurrentDb, CodeDb, czy DBEngine oraz przez formularzowe Me.Recordset,
Me.RecordsetClone.
Zaznaczenie DAO w referencjach podnosi więc głównie wygodę programowania,
poprzez całe IntelliSense itd. Ale konieczne nie jest.
Co piszę bardziej by pewne sprawy naświetlić, niż aby kogoś od
zaptaszkowania referencji odwodzić ;-)
© 2009 Najlepszy miesiąc kawalerski w Polsce !!! - Ceske - Sjezdovky .cz. Design downloaded from free website templates