Mały poradnik do projektu z baz danych macie przykładowe kody DAO I ADODB, pewnie nie wszystkie, jak będą prośby to się dopisze co trzeba na razie będzie to wersja: 0.1 tego dokumentu. Na czerwono zaznaczyłem w kodzie takie rzeczy jak nazwy pól i tabel czy nazwy plików które należy przed uruchomieniem zamienić na własne wartości inaczej z dużym prawdopodobieństwem wszystko się pierdolnie ;) Jeśli macie problem z otwarciem z poziomu VBA plików Accessa 2007 (rozszerzenie accdb) to całkiem prawdopodobne ze potrzebujecie zainstalować sobie to cos: http://www.microsoft.com/downloads/details.aspx?familyid=7554f536 8C28 4598 9B72 EF94E038C891&displaylang=en Przyjemność korzystania z tej publikacji zawdzięczacie mnie i tadziowi który odwrotnie niż ja nie odkłada wszystkiego na ostatnia chwile i jakoś mnie zmobilizował żeby się za to zabrać. Kody testowane, działały u nas, ale pomimo moich starań mogą tu być błędy. DAO tworzenie tabeli Dim pole As DAO.Field Dim tabela As DAO.TableDef Dim txt As String txt = InputBox("Podaj nazwę dla tabeli") Set tabela = baza.createtabledef(txt) txt = InputBox("Podaj nazwę kolumny") Set pole = tabela.createfield(txt, dbtext) 'Możliwe typy pola to dbbigint, dbbinary, dbboolean, dbbyte, dbchar, dbcurrency, dbdate, dbdecimal, dbdouble, dbfloat, dbguid, dbinteger, dblong, dblongbinary, dbmemo, dbnumeric, dbsingle, dbtext, dbtime, dbtimestamp, dbvarbinary tabela.fields.append pole tabela.fields.refresh baza.tabledefs.append tabela baza.tabledefs.refresh tworzenie indeksu Dim baza As Dao.Database
Dim pole As Dao.Field Dim indeks As Dao.Index Dim txt As String Dim tabela As Dao.TableDef Set tabela = baza.tabledefs("nazwatabeli") txt = InputBox("Podaj nazwę dla indeksu") Set indeks = tabela.createindex(txt) txt = InputBox("Podaj nazwe pola") Set pole = indeks.createfield(txt) indeks.fields.append pole tabela.indexes.append indeks tabela.indexes.refresh tworzenie relacji Dim relacja As DAO.Relation Dim pole As DAO.Field Set relacja = baza.createrelation("nazwarelacji", "nazwatabeli1", "nazwatabeli2") relacja.attributes = dbrelationupdatecascade Set pole = relacja.createfield("nazwapolawtabeli1") pole.foreignname = "NazwaPolawTabeli2" relacja.fields.append pole baza.relations.append relacja tworzenie kwerend wybierających Dim txt, sql As String Dim zapytanie As DAO.QueryDef txt = InputBox("Podaj nazwę dla zapytania", "Nazwa?") Tutaj podane jest przykładowe domyślne zapytanie sql = InputBox("Podaj zapytanie sql", "SQL", "SELECT * FROM nazwatabeli") Set zapytanie = baza.createquerydef(txt, sql) tworzenie kwerend modyfikujących Dim txt, sql As String Dim zapytanie As DAO.QueryDef txt = InputBox("Podaj nazwę dla zapytania", "Nazwa?") Tutaj możecie sobie wstawić zapytanie SQL na sztywno, ważne żeby to zapytanie cos modyfikowało sql = InputBox("Podaj zapytanie sql", "SQL", "UPDATE Znajomi SET majatek = 300000 WHERE majatek>150000") Set zapytanie = baza.createquerydef(txt, sql) transakcja Dim workspace As workspace
Dim zapytanie As DAO.QueryDef Dim zapytanie2 As DAO.QueryDef Dim q As Integer Set workspace = DBEngine(0) Przykładowe 2 zapytania modyfikujace które będą Stanowic nasza transakcje Set zapytanie = baza.createquerydef("modyfik", "UPDATE Znajomi SET majatek = majatek*1.5") Set zapytanie2 = baza.createquerydef("modyfik2", "UPDATE Znajomi SET inteligencja = 'geniusz' WHERE wzrost='wysoki'") baza.querydefs.refresh workspace.begintrans zapytanie.execute zapytanie2.execute q = MsgBox("Pierwsze zapytanie modyfikuje " & zapytanie.recordsaffected & ", drugie " & zapytanie2.recordsaffected & "czy napewno wykonac", vbyesno, "Czy wykonac transakcje?") If (q = vbyes) Then workspace.committrans Else workspace.rollback Tutaj usuwam zapytania ktore wczesniej zadeklarowalismy bo inaczej to przy ponownym wykonaniu kodu by się wywalil baza.querydefs.delete ("modyfik") baza.querydefs.delete ("modyfik2") baza.querydefs.refresh workspace.close metoda Seek Tabela musi miec zdefiniowany indeks tabela.index = "nazwaindeksu" Przykładowo poniżej wyszukujemy wyrazy zaczynajace się od litery R tabela.seek ">=", "R" If Not tabela.nomatch Then Nazwa pola dla ktorego zdefiniowany jest wyzej podany indeks MsgBox tabela("nazwapola") Else MsgBox "Nie znaleziono" metoda Find Podany poniżej kod przeszukuje podane pole szukając y stringów które zaczynają sie od litery R. FindFirst i FIndNext jako kryteria wyszukiwania przyjmują string który wyglada tak jak sqlowa klauzula WHERE tyle ze bez słowa WHERE.
Dim vrpowrot As Variant Set tabela = baza.openrecordset("nazwatabeli", dbopendynaset) MsgBox "Biezacy:" & tabela("nazwapola") vrpowrot = tabela.bookmark tabela.findfirst "Left(NazwaPola, 1) = 'R'" Do While Not tabela.nomatch MsgBox tabela("nazwapola ") tabela.findnext "Left(NazwaPola, 1) = 'R'" tabela.bookmark = vrpowrot MsgBox "Powrot do: " & tabela("nazwapola ") dodawanie rekordu Przykład uniwersalny wystarczy podać nazwe tabeli a reszta zrobi sie sama. Jednak dodaje tylko pola które są tekstem lub liczba dziesiętną, co ogranicza możliwość wystąpienia błędów przy konwersji typow. Dim txt As Variant tabela.addnew For i = 0 To tabela.fields.count 1 If tabela.fields(i).type = dbtext Or tabela.fields(i).type = dbdecimal Then txt = InputBox("Podaj wartość dla pola " & tabela.fields(i).name) tabela(tabela.fields(i).name) = txt Next i tabela.update a tutaj wersja mniej uniwersalna zmieniająca konkretne pola With tabela.addnew!nazwapola1 = wartość pola 1!nazwapola2 = wartość pola 2!nazwapola3 = 3.Update End With edycja rekordów Przykładowy kod zmieniający podane pole zamieniając wszystkie litery na duze.
tabela.movefirst Do While Not tabela.eof tabela.edit tabela!nazwapola = UCase(tabela! NazwaPola) tabela.update tabela.movenext usuwanie rekordow Dim ile As Integer ile = 0 tabela.movefirst Do While Not tabela.eof If tabela!nazwapola < 220000 Then tabela.delete ile = ile + 1 tabela.movenext MsgBox "Usunieto rekordów: " & ile ADO łaczenie jawne Dim con As New ADODB.Connection Dim rst As New ADODB.Recordset con.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = c:\\nazwapliku.mdb;" rst.open "NazwaTabeli", con, adopenforwardonly, adlockreadonly, adcmdtable Wyswietlenie zawartosci 2 pierwszych kolumn w tabeli MsgBox rst.fields(0).value & vbtab & rst.fields(1).value rst.close con.close łaczenie niejawne Dim rst As New ADODB.Recordset rst.open "NazwaTabeli", "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = NazwaPliku.accdb", adopenkeyset, adlockreadonly, 2 MsgBox rst.fields(0).value & vbtab & rst.fields(1).value
rst.close wykorzystanie metody execute obiektu connection Dim con As New ADODB.Connection Dim rst As ADODB.Recordset con.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = Nazwapliku.accdb" con.open Pobranie z tabeli ksiegarnia wszystkich rekordów I wyswietlenie zawartosci 2 pierwszych kolumn 1 rekordu Set rst = con.execute("select * FROM ksiegarnia") MsgBox rst.fields(0).value & vbtab & rst.fields(1).value rst.close con.close obiekt connection (jawnie, niejawnie), metoda execute metoda save obiektu recordset zapis do pliku txt jako XML Dim con As New ADODB.Connection Dim rst As ADODB.Recordset con.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = ksiegarnia.accdb" con.open Set rst = con.execute("select * FROM ksiegarnia") rst.save "ksiegarnia.txt", adpersistxml rst.close con.close Lub wersja z wykorzystaniem obiektu Stream Dim con As New ADODB.Connection Dim rst As ADODB.Recordset Dim str As New ADODB.Stream con.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = ksiegarnia.accdb" con.open Set rst = con.execute("select * FROM ksiegarnia") rst.save str, adpersistxml str.savetofile "C:\dane2.txt", adsavecreateoverwrite rst.close con.close metoda move obiektu recordset Przykładowy kod który przesuwa wskaźnik na srodkowy rekord Dim d As Long rekord.activeconnection = CurrentProject.Connection rekord.open "Nazwatabeli",, adopenstatic, adlockoptimistic, adcmdtable d = (rekord.recordcount / 2) rekord.movefirst MsgBox rekord.fields("nazwapola") rekord.move d, 0 MsgBox rekord.fields("nazwapola") dodawanie rekordu Dim txt As Variant
rekord.activeconnection = CurrentProject.Connection rekord.open "Nazwatabeli",, adopenkeyset, adlockoptimistic, adcmdtable rekord.addnew txt = InputBox("Podaj wartosc pola1") rekord.fields("pole1").value = txt txt = InputBox("Podaj wartosc pola2") rekord.fields("pole2").value = txt txt = InputBox("Podaj wartosc pola3") rekord.fields("pole3").value = 200000 rekord.update usuwanie rekordów Kod przechodzi przez cała tabele I pyta dla kazdego rekordu czy wyrzucic Dim d As Integer rekord.activeconnection = CurrentProject.Connection rekord.open "Nazwatabeli",, adopenforwardonly, adlockoptimistic, adcmdtable Do Until rekord.eof d = MsgBox("Czy chcesz wyrzucic rekord " & rekord.fields("nazwapola").value, vbyesno) If d = vbyes Then rekord.delete rekord.movenext metoda find obiektu recordset Dim info As String info = InputBox("znajdź:") rekord.activeconnection = CurrentProject.Connection rekord.open "NazwaTabeli",, adopenkeyset, adlockpessimistic, adcmdtable rekord.movefirst Wyszukuje pola ktore zaczynaja sie od znakow podanych w inputboxie rekord.find ("NazwaPola like " & info & "*") If (rekord.bof = True) Or (rekord.eof = True) Then MsgBox "nie znaleziono" Else MsgBox rekord.fields("nazwapola ") metoda filter obiektu recordset Poniższy kod filtruje pole NazwaPola tabeli NazwaTabeli I zostawia te rekordy ktorych wartość NazwaPola zaczyna sie od litery K rekord.activeconnection = CurrentProject.Connection rekord.open "NazwaTabeli",, adopenkeyset, adlockoptimistic, adcmdtable rekord.filter = "NazwaPola" & " Like 'K*'"
Do Until rekord.eof MsgBox rekord.fields("nazwapola ") rekord.movenext