Źródło rekordów formularza

Źródło rekordów formularza to pole, w którym definiujemy jego źródło danych.

Właściwość tę można zmienić w zakładce Dane Arkusza właściwości formularza.

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. 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Funkcja DSum()

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():

Wartosc: DSum(„Cena”;”TabelaKsiazki”;”Tytul like'” & „*#*” & „'”)

W tym przypadku – zwracana jest wartość sumy tych pozycji, które w tytule mają cyfrę.
Wykorzystany jest też operator Like.

Ponieważ funkcje agregatu domeny działają bardzo podobnie – warto też zajrzeć do przykładów w innych funkcjach tej grupy:
Funkcje agregatu domeny

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


Kurs Access 2010 esencja

 

Funkcja DCount()

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:

IleKsiazekAutora: DCount(„Numerkatalogowy”;”TabelaKsiazki”;”Autor='” & [Autor] & „'”)

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.


Kurs Access 2013 od podstaw

 

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.


 

Kwerenda parametryczna w kodzie VBA

Prostą kwerendę parametryczną opisałam tu:
Kwerenda parametryczna
Operator Like

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.


Kurs SQL w analizie danych - zaawansowane techniki

 

Operator 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.

Symbole zastępcze dla pól tekstowych to:

Symbol zastępczy Znaczenie
* dowolny ciąg znaków, również o zerowej długości
?
pojedynczy znak
#
pojedyncza cyfra
 [lista znaków]
pojedynczy znak z listy znaków
 [!lista znaków]
pojedynczy znak spoza listy znaków

Pobierz ebooka za darmo:

 

Kwerenda składająca

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.


Kurs Access - kwerendy