Metoda ta nie ma żadnych parametrów i jest właściwie oczywista – każdy otwarty obiekt powinien być finalnie zamknięty.
Ja standardowo po linii kodu zamykającej Recordset, zwalniam pamięć. Teoretycznie nie jest to wymagane, ale praktyka wskazuje, że warto zrobić.
Private Sub PolecenieZapisz_Click() Dim RST As ADODB.Recordset (…) RST.Close Set RST = Nothing End Sub
W przypadku edycji i zapisaniu wartości w rekordach może wyglądać to tak:
Private Sub PolecenieZapisz_Click() Dim RST As ADODB.Recordset Set RST = New ADODB.Recordset
RST.Open „TabelaKsiazki”, CurrentProject.Connection, adOpenDynamic, adLockOptimistic With RST If Not .EOF Then .MoveFirst While Not .EOF
!Cena = 1.2 * !Cena
.Update If Not .EOF Then .MoveNext Wend .Close End With Set RST = Nothing
DoCmd.Close End Sub
W pętli następuje odczyt pola Cena z każdego rekordu i zwiększenie tej wartości.
W tym przypadku warto jednak pamiętać, że ponieważ następuje przejście do następnego rekordu (MovaNext), Access w tle i tak zapisuje każdy rekord, metoda Update nie jest tu potrzebna. Ja mam jednak zwyczaj, że i tak wpisuję, dla czytelności kodu.
Jeżeli Recordset jest otwarty tylko do odczytu – metoda Update wywoła błąd 3521.
Addnew to jedna z metod obiektu Recordset, służaca do dodawania nowych rekordów w tabeli.
kliknij, aby powiększyć
Ja zawsze używam tej metody przy dodawaniu nowych rekordów.
Stosuję do tego specjalny formularz, z niezwiązanymi polami.
kliknij, aby powiększyć
Pod przyciskiem Zapis jest procedura sprawdzająca, czy wszystkie wymagane pola zostały wypełnione i jeżeli tak, otwierany jest Recordset i dane są zapisywane do tabeli. Jeżeli pola wymagane są puste (w tym przypadku – Autor i Tytuł) – następuje wyjście z procedury, wyświetlenie komunikatu i przeniesienie fokusu do tego pola..
Przycisk Anuluj zamyka formularz bez zapisywania.
Przykład procedury:
Private Sub PolecenieZapisz_Click() Dim RST As ADODB.Recordset Dim RAutor As String Dim RTytul As String Dim RDzial As Long Dim RCena As Currency Dim RBestseller As Boolean If IsNull(Me.TAutor) Then’pole wymagane
MsgBox „Wpisz autora!”, vbCritical, „Brak wymaganych danych”
Me.TAutor.SetFocus Exit Sub Else
RAutor = Me.TAutor End If If IsNull(Me.TTytul) Then’pole wymagane
MsgBox „Wpisz Tytuł!”, vbCritical, „Brak wymaganych danych”
Me.TTytul.SetFocus Exit Sub Else
RTytul = Me.TTytul End If If IsNull(Me.TDzial) Then’jeżeli brak – to dział Różne
RDzial = 11 Else
RDzial = Me.TDzial End If If IsNull(Me.TBestseller) Then’jeżeli brak – to fałsz
RBestseller = False Else
RBestseller = Me.TBestseller End If Set RST = New ADODB.Recordset
RST.Open „TabelaKsiazki”, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
RST.AddNew With RST
!Autor = RAutor
!Tytul = RTytul
!Dzial = RDzial
!Bestseller = RBestseller If Not IsNull(Me.TCena) Then !Cena = Me.TCena
.Update
.Close End With Set RST = Nothing
DoCmd.Close End Sub
To naprawdę dobry sposób na dodawanie rekordów. Unika się w ten sposób generowania błędnych rekordów, z niepełnymi danymi i opuszczoną częścią pól.
Open to jedna z metod obiektu Recordset . Służy do utworzenia zestawu rekordów do wykorzystania w kolejnych krokach kodu VBA.
kliknij, aby powiększyć
Argumenty wejściowe to:
Source źródło danych rekordów, najczęściej jest to tabela lub kwerenda;
ActiveConnection aktywne połączenie, odwołanie do miejsca, gdzie znajduje się źródło danych. Jeżeli odwołujemy się do bieżącej bazy danych – stosuje się tu
CurrentProject.Connection
CursorType typ kursora:
adOpenDynamic kursor dynamiczny, na bieżąco odzwierciedla wszystkie zmiany dokonane przez innych użytkowników.
adOpenForwardOnly kursor statyczny, nie odzwierciedla zmian dokonanych przez innych użytkowników, umożliwia przewijanie zestawu rekordów tylko do przodu.
Wartość domyślna.
adOpenKeyset podobny do kursora dynamicznego, na bieżąco odzwierciedla wszystkie zmiany dokonane przez innych użytkowników, ale nie dostrzega dodanych przez nich rekordów.
adOpenStatic kursor statyczny, nie widzi zmian dokonanych przez innych użytkowników
LockType typ blokady podczas edycji rekordów:
adLockBatchOptimistic blokada dla aktualizacji wsadowych
adLockOptimistic rekordy są blokowane tylko podczas zapisywania zmian
adLockPessimistic rekordy są blokowane od razu po rozpoczęciu edycji
adLockReadOnly rekordy w zestawie są pobierane tylko do odcytu, nie można ich edytować
Options stosowane tylko, gdy źródło danych jest pobierane komendą Command
Przykład takiej procedury:
Public Sub OdczytRST() Dim RST As ADODB.Recordset Dim RTytul As String Dim RAutor As String Set RST = New ADODB.Recordset
RST.Open „TabelaKsiazki”, CurrentProject.Connection, adOpenDynamic, adLockReadOnly While Not RST.EOF
RTytul = RST!Tytul
RAutor = RST!Autor '(…) 'kod wykorzytsujące odczytane wartości '(…) If Not RST.EOF Then RST.MoveNext Wend
RST.Close Set RST = Nothing End Sub
W tym przypadku – otwierany jest Recordset z tabeli SpisKsiazek, a następnie w pętli odczytywane są wartości 2 kolumn każdego rekordu, które mogą być wykorzystane w dalszej części.
Na końcu – Recordset jest zamykany (warto o tym pamiętać). Wejście do pętli jest tylko wtedy, gdy są rekordy. Pozwala to na zabezpieczenie przed błędem 3021.
Błąd występuje, gdy próbuje się odwołać do rekordu w obiekcie Recordset, który jest pusty lub nie zawiera żadnych danych. Innymi słowy, nie ma aktywnego rekordu, do którego można by się odwołać w danym momencie
Chcąc go uniknąć – warto sprawdzić, czy i ile rekordów ma Recordset, czy nie osiągnięto już ostatniego rekordu ewentualnie wprowadzić obsługę błędów.