Funkcja Accessa Clng()

Funkcja Clng() jest jedną z funkcji konwersji Accessa. Ma jeden argument:

    • wyrażenie

zamienia wyrażenie na liczbę typu Long. Wyrażenie może być datą, liczbą (ułamkowe zaokrągla) czy tekstem, ale złożonym z cyfr.
Ja stosuję tą funkcję bardzo często – szczególnie w stosunku do dat. Opisałam to tu:
Data jako parametr kwerendy

Funkcja Clng() występuje i działa tak samo w Accessie (czyli w kreatorze wyrażeń) jak i kodzie VBA.


Kurs Access 2013 od podstaw

 

Konstruktor wyrażeń

Konstruktor wyrażeń to wbudowany w Accessa kreator formuł. Jest on dostępny we wszystkich obiektach m.in. kwerendach, tabelach, raportach – wszędzie tam, gdzie chcemy wstawić pole obliczeniowe.
Np. w siatce kwerendy na wolnym polu wystarczy kliknąć prawym przyciskiem myszy i z menu podręcznego wybrać Konstruuj….

kliknij, aby powiększyć

Otworzy się nowe okno. Po lewej stronie wybieramy np.funkcje

i zobaczymy wszystkie funkcje Accessa:

W Bibliotece będą widoczne funkcje publiczne wstawione w modułach ogólnych VBA. 
Niżej można też rozwinąć wszystkie tabele/kwerendy/raporty wraz z ich polami i wstawić je do formuł.

Chcąc utworzyć w kwerendzie nowe pole i przypisać mu nazwę, wpisujemy tą nazwę z dwukropkiem na końcu.
Np.:

W arkuszu danych kwerendy wygląda to tak:


Zamykanie Accessa

Metoda obiektu docmd Quit służy do zamknięcia bazy danych i wyjścia z Accessa.
Metoda Docmd.Quit ma jeden argument opcjonalny, który może przybierać jedną z trzech opcji:

    • acQuitPrompt – z monitem o zapis zmian
    • acQuitSaveAll – zapisuje wszystkie zmiany (wartość domyślna)
    • acQuitSaveNone – bez zapisu wszystkich zmian
kliknij, aby powiększyć

Często stosuję tę metodę do szybkiego zamykania Accessa z różnych miejsc bazy danych.


Kurs Access - programowanie w VBA

 

Zamykanie bazy danych

Do zamykania bazy danych kodem VBA służy metoda docmd CloseDatabase.
Metoda Docmd.CloseDatabase nie ma żadnych argumentów – zamyka po prostu aktywną bazę danych.
Jakoś nie przypominam sobie, żeby w swoich projektach kiedyś stosowała tę metodę.


Kurs Access - programowanie w VBA

 

Zamykanie obiektu

Do zamykania obiektów (np.formularzy,  raportów) w VBA służy metoda docmd Close.

kliknij, aby powiększyć

Metoda Docmd.Close ma 3 argumenty:

      • ObjectType – typ zamykanego obiektu
      • ObjectName – nazwa zamykanego obiektu
      • Save – zapis zmian

Wszystkie te argumenty są opcjonalne. Jeżeli pierwszy i drugi argument zostaną opuszczone, domyślnym obiektem jest ten, który jest aktywny.  Trzeci argument jest związany z zapisem zmian w zamykanym obiekcie – wartość domyślna to acSavePrompt czyli monit.

W swoich projektach często stosuję tę metodę, również do poruszania się między formularzami. Jeżeli chcę np. po naciśnięciu przycisku polecenia zamknąć formularz i otowrzyć inny – robię to najczęściej tak:

Private Sub PolecenieDoSpisu_Click()
DoCmd.Close
'(…)
End Sub

Jeżeli w kolejnym kroku ma zostać otwarty inny formularz – najpierw zamykamy ten aktywny, a w kolejnych liniach kodu dopiero otwieramy nowy.
Jeżeli ten nowy formularz ma być otwarty z parametrem, którego źródłem jest jakieś pole z zamykanego formularza – konieczne jest przypisanie tej wartości do zmiennej w procedurze  jeszcze przed zamknięciem formularza.
Np.

Private Sub PolecenieDoSpisu_Click()
Dim JParam
JParam=Me.PoleP
DoCmd.Close
DoCmd.OpenForm „SpisKsiazek”, , , , , , JParam
'(…)
End Sub

 


Kurs Access 2013 od podstaw

 

Błąd wykonanie 94

kliknij, aby powiększyć

Błąd wykonania 94 – nieprawidłowe użycie Null

Błąd ten pojawia się w sytuacji, gdy następuje odwołanie do wartości Null w miejscu (np. jako argument funkcji), gdzie wartość jest wymagana.
Najlepszym zabezpieczeniem kodu przed tym błędem jest zastosowanie funkcji nz.
Null to nie zero
Przykładowy kod może wyglądać tak:

Private Sub PolecenieSzukaj_Click()
Dim JData As Date
JData = Nz(Me.TOD, Date)
'(…)
End Sub

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

 

 

Data jako parametr kwerendy

Czy data/czas może być parametrem kwerendy? Oczywiście.
W dodatku najczęściej stosowana jest tu nie pojedyncza data tylko zakres dat od-do.

W siatce kwerendy wpisujemy kryterium:

kliknij, aby powiększyć

Zakres dat wpisujemy przy zastosowaniu słów kluczowych Between i And. Oczywiście można też wstawić tu kryterium w formie pola parametru, gdzie zamiast sztywnego wpisania dat – można wstawić je jako parametr np.
Between [DataOd] And [DataDO]
J
akoś jednak nie polecam, gdyż praktyka wskazuje, że tam gdzie użytkownik wpisuje daty – wcześniej czy później pojawią się problemy związane z formatem tej daty i w konsekwencji – będą błędy.

Jako parametry kwerendy można też wykorzystać pola formularza.
Np.

kliknij, aby powiększyć

W formularzu są 2 pola TOD i TDO, w których wpisujemy daty, a w kwerendzie odwołania do tych pól:
Between [Formularze]![SpisKasiazek]![TOD] And [Formularze]![SpisKasiazek]![TDO]
Oczywiście w porządnej aplikacji należałoby zabezpieczyć się przed wstawieniem tu innej wartości niż data, rozważyć możliwość, że jedno pole jest puste lub data DO jest mniejsza od daty OD itp., ale w formularzu da się bez problemu wprowadzić takie mechanizmy przed błędami.

A jak to wygląda w kodzie VBA? Na przykład tak.

Private Sub PolecenieSzukaj_Click()
Dim MojaKwerenda As String
Dim DataOD As Date
Dim DataDO As Date
DataOD=Me.TOD
DataDO=Me.TDO
MojaKwerenda = „SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP ” & _
„FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat ” & _
„WHERE TabelaKsiazki.DataP  Between #” & DataOD &_
„# AND #” &  DataDO & „#;”
Me.RecordSource = MojaKwerenda
Me.Requery
End Sub

Teoretycznie – wszystko to powinno działać. A w praktyce – może się okazać, że nie zawsze i nie wszędzie. Na kilku komputerach – jest OK, a na jakimś jednym – nagle nie. Ostatnio taki problem pojawił się u mnie w aplikacje Excela – opisałam to tu:
Filtrowanie tabeli
Tego typu problemy zdarzały mi się już wcześniej. Teraz zapobiegawczo, wszędzie tam gdzie daty są kluczowym elementem – zamieniam je na liczby, gdyż:
Data i czas to liczba

W tym konkretnym przypadku:

    • w kwerendzie, w której wstawiam kryteria parametryczne – dokładam dodatkową kolumnę oparta o formułę:
      =Clng(DataP)
    • taką samą konwersję wykonuję w stosunku do dat w polach formularza
Private Sub PolecenieSzukaj_Click()
Dim MojaKwerenda As String
Dim DataOD As Date
Dim DataDO As Date
Dim LDataOD As Long
Dim LDataDO As Long
DataOD=Me.TOD
DataDO=Me.TDO
LDataOD=Clng(DataOD)
LDataDO=Clng(DataDO)
MojaKwerenda = „SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Dzial,  ” & _ „TabelaKsiazki.DataP, CLng([DATAP]) AS LDataP ” & _
„FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat ” & _
„WHERE TabelaKsiazki.LDataP  Between ” & LDataOD &_
” AND ” &  LDataDO & „;”
Me.RecordSource = MojaKwerenda
Me.Requery
End Sub

Oczywiście – tu już nie ma znaków # przed i po zmiennych – one są tylko w stosunku do zmiennych typu Data.