Metoda Recordset.Close

Close to metoda obiektu Recordset zamykająca otwarty Recordset. 

kliknij, aby powiększyć

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

 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Metoda Recordset.Update

Update to metoda obiektu Recordset, służąca do zapisywania dodawanych/usuwanych/edytowanych rekordów w tabeli. 

kliknij, aby powiększyć

Przykład przy dodawaniu rekordu opisałam tu:
Recordset.Addnew

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


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Błąd wykonania 3251

kliknij, aby powiększyć

Błąd wykonania 3021 – brak możliwości aktualizacji

Błąd występuje przy próbie aktualizacji obiektu Recordset otwartego w trybie tylko do odczytu. 

Inne błędy wykonania VBA (Run-time) są tu:
Błędy wykonania VBA

 

 

Metoda Recordset.Addnew

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. 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Obiekt Me w module formularza

Słowo kluczowe Me w module formularza to obiekt będący  zbiorem wszystkich referencji tego formularza. 

kliknij, aby powiększyć

Widoczne są tu też wszystkie obiekty umieszczone w formularzu. W ten sposób szybko i prosto można się odwołać do różnych elementów formularza. 

Przykładowy kod  może wyglądać tak:

Private Sub Form_Current()
If IsNull(Me.TAutor) Then Me.TAutor.SetFocus
End Sub

TAutor w tym przypadku to pole formularza – procedura odwołuje się do tego pola za pomocą właśnie obiektu Me. 


Egzamin Specjalista MS Access

A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

 

Metoda Recordset.Open

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


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Błąd wykonania 3021

kliknij, aby powiększyć

Błąd wykonania 3021 – brak bieżącego rekordu

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. 

Inne błędy wykonania VBA (Run-time) są tu:
Błędy wykonania VBA