Dla formularza niezwiązanego – pole to jest puste.
Jeżeli formularz ma być oparty bezpośrednio na tabeli lub kwerendzie – możemy ją odszukać na liście, naciskając znak strzałki: Naciskając znajdujący się tuż obok przycisk z 3 kropkami – przejdziemy do widoku siatki kwerendy, gdzie możemy zdefiniować nową kwerendę.
Ja preferuję właśnie ten ostatni sposób na zdefiniowanie źródła danych. Łatwiej w ten sposób rozbudować kwerendę tylko dla danego formularza.
Funkcja DSum() jest jedną z funkcji agregatu domeny Accessa. Zwraca sumę wartości określonego pola tabeli/kwerendy, dla rekordów spełniających określone warunki.
Jest podobna do funkcji Excela Suma.Jeżeli() i Suma. Warunków()
Ma trzy argumenty:
wyrażenie – nazwa kolumny, w której będą sumowane wartości, argument obowiązkowy
domena – nazwa zestawu rekordów, z którego mają być zlczone kolumny (np.nazwa tabeli czy kwerendy), argument obowiązkowy
kryteria – kryteria, które rekordy mają być zliczone
Jeżeli argument kryteria zostanie pominięty – zwrócona zostanie suma wartości wszystkich rekordów w danym zestawie.
Przykład takiej formuły z zastosowaniem funkcji DSum():
Funkcja DCount() jest jedną z funkcji agregatu domeny Accessa. Zwraca ilość rekordów z tabeli/kwerendy spełniających określone warunki.
Ma trzy argumenty:
wyrażenie – nazwa kolumny, w której będą zliczane rekordy, argument obowiązkowy
domena – nazwa zestawu rekordów, z którego mają być zlczone kolumny (np.nazwa tabeli czy kwerendy), argument obowiązkowy
kryteria – kryteria, które rekordy mają być zliczone
Jeżeli argument kryteria zostanie pominięty – zwrócona zostanie liczba wszystkich rekordów w danym zestawie.
Przykład takiej kwerendy z zastosowaniem funkcji DCount():
A sama funkcja:
LiczRek: DCount(„Numerkatalogowy”;”TabelaKsiazki”;”datap is null”)
Najczęściej stosuje się tę funkcję w kwerendach, w których jest wiele rekordów, a pole oparte o funkcję Dcount() wykorzystuje inne pola kwerendy jako parametry:
Kolumna IleKsiazekAutora wskazuje ile pozycji danego autora jest w tabeli (bez wykorzystania kwerendy grupującej). Formuła wygląda tak:
Warto zwrócić uwagę, że ponieważ pole Autor jest polem typu String – konieczne jest dodanie apostrofu górnego przed i po parametrze [Autor] („’„). Dla daty – byłby to znak #.
Funkcja DCount() występuje i działa tak samo w Accessie (czyli w kreatorze wyrażeń) jak i kodzie VBA.
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]
Jakoś 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.
Oczywiście to tylko proste przykłady i dla kwerend bezpośrednio w Accessie. A jak zrobić to w VBA?
Załóżmy, że mamy taki formularz ciągły:
kliknij, aby powiększyć
Jego źródłem rekordów jest kwerenda
SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat;
W nagłówku formularza jest też niezwiązane pole tekstowe TSzukaj oraz przycisk polecenia PolecenieSzukaj , pod którym jest procedura VBA. Załóżmy, że chcemy wyfiltrować rekordy, gdzie w tytule jest zawarty jest tekst wpisany do pola TSzukaj. Taka procedura mogłaby wyglądać tak:
Private Sub PolecenieSzukaj_Click()
Dim MojaKwerenda As String
Dim CoSzukam As String
CoSzukam = Nz(Me.TSzukaj, „”)
If CoSzukam = „” Then
MojaKwerenda = „SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP ” & _
„FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat;”
Else
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.Tytul Like '*” & CoSzukam & „*’;”
End If
Me.RecordSource = MojaKwerenda
Me.Requery
End Sub
We wpisie na blogu, w zależności od przeglądarki, może to różnie wyglądać, więc na wszelki wypadek zwracam uwagę na łamanie linii w zapisie kodu SQL w edytorze VBA – jest to ciąg tekstowy, więc koniec linii musi być zakończony znakami & _ (pomiędzy znakami jest spacja).
Sam parametr – w tym przypadku prezentowany przez zmienną CoSzukam, też ma swoje wymagania. Jest zapisany w linii kodu: WHERE TabelaKsiazki.Tytul Like ’*” & CoSzukam & „*’;”
Na czerwono zaznaczyłam znaki apostrofu górnego – sa konieczne, jeśli będąca parametrem zmienna jest typu String czyli tekstowa. Natomiast te gwiazdki – to symbole zastępcze związane z operatorem Like. Oczywiście można użyć innych symboli z listy tam wymienionych. Gdyby na początku nie było gwiazdki – kwerenda zwróciłaby rekordy, gdzie powiązane pole zaczynałoby się dokładnie tym, co jest wpisane w TSzukaj.
Dla wartości wartości typu Data – zamiast apostrofów musi być natomiast znak #. Dla wartości liczbowych – nie ma w ogóle znaków, w które wstawiany jest parametr. Nie stosuje się też tu operatora Like.
Operator Like występuje często i to w różnych miejscach aplikacji Access. Jest niezbędny m.in. w kwerendach parametrycznych.
Załóżmy, że w tabeli:
kliknij, aby powiększyć
chcemy wyszukać książki, których autorką jest Agata Christie. Oczywiście można w kryteriach siatki kwerendy wpisać po prostu Agata Christie:
Zdecydowanie jednak częściej stosowane jest kryterium z użyciem operatora Like i symboli wieloznacznych.
Kod SQL takiej kwerendy wygląda tak:
SELECT KwerendaKsiazki.NumerKatalogowy, KwerendaKsiazki.Autor, KwerendaKsiazki.Tytul, KwerendaKsiazki.Cena, KwerendaKsiazki.DataP, KwerendaKsiazki.Bestseller, KwerendaKsiazki.Dzial
FROM KwerendaKsiazki
WHERE (((KwerendaKsiazki.Autor) Like „*Christie*”));
W ten sposób pokazane zostaną wszystkie rekordy, w których jest ciąg tekstowy Christie, czyli np. Agata Christie czy Christie Agata.
Jeżeli chcemy wprowadzić kilka różnych kryteriów istotna jest linia, w których je definiujemy. Wpisane w tej samej linii – muszą być spełnione jednocześnie czyli np.
W ten sposób wyfiltrowane rekordy, której autor zawiera ciąg Christie oraz tytuł zaczyna się na A.
Jeżeli kryteria zostaną zapisane w różnych liniach:
zostaną wyfiltrowane rekordy gdzie autor zawiera ciąg Christie lub tytuł zaczyna się na A.
Kwerenda składająca to kwerenda, w której znajdują się rekordy z 2 lub więcej tabel/kwerend. Tak jak każdą inna kwerendę tworzymy ją w oknie tworzenia kwerend:
W odróżnieniu od innych kwerend jednak nie można tu wykorzystać siatki kwerendy – po wybraniu kwerendy składającej – od razu następuje przełączenie do widoku SQL.
Okno jest puste, trzeba wpisać tam kod SQL kwerendy.
Ja najczęściej robię to w ten sposób, że w innym oknie tworzę kwerendę, przełączam do widoku SQL, kopiuję kod i wklejam do okna kwerendy składającej.
W kolejnej linii -wpisujemy słowo kluczowe UNION, a następnie – kod SQL kolejnej kwerendy wybierającej z innej tabeli.
SELECT TabelaKsiazki.Autor, TabelaKsiazki.Tytul
FROM TabelaKsiazki
UNION SELECT TabelaArchiwum.Autor, TabelaArchiwum.Tytul
FROM TabelaArchiwum;
Po uruchomieniu wynik działania kwerendy wygląda tak:
W oknie nawigacji projektu kwerenda składająca ma swój charakterystyczny znaczek:
Taka kwerenda składająca może być podstawą do innych kwerend czy obliczeń. Nie jest to kwerenda funkcjonalna – nie zmienia rekordów czy danych w niej zapisanych. Jest to specyficzny rodzaj kwerendy wybierającej.
W projektach praktycznych często stosuję ją w przypadkach, gdy część rekordów jest w tabeli bieżącej, część jest przenoszona do tabel archiwum, ale w niektórych przypadkach potrzebne są obliczeia na całości danych.