Wstawianie połączonych obrazów w rekordach formularza

Wstawianiu obrazów w obrazach poświęcona jest notka:
Wstawianie obrazów w formularzu
Opisany tam jest jednak sposób do wstawiania obrazów „stałych”, identycznych dla każdego rekordu, a więc przeznaczonych raczej dla części wspólnych formularza np.nagłówka czy stopki. Chcąc uzależnić wyświetlany obraz od aktualnego rekordu konieczne jest jego powiązanie z źródłem danych formularza. 

Załóżmy, że mamy tabelę o takim układzie danych:

W kolumnie Foto oczywiście może być zamieszczony pełna nazwa pliku (czyli wraz z pełną ścieżką), ale ja stosuję w swoich projektach metodę bardziej elastyczną, umożliwiającą przeniesienie całości na inny komputer czy też do innej lokalizacji. bez konieczności aktualizacji adresów w tabeli.  
Najczęściej przyjmuję tu zasadę, że katalogiem nadrzędnym jest katalog, w którym znajduje się aplikacja Access. Tworzę w nim folder FOTO (i ewentualnie w nim podkatalogi) i tam umieszczam zdjęcia czy też inne pliki połączone. 

W praktyce wygląda to tak. 
W formularzu , dla którego źródłem danych jest tabela jw. wstawiam formant Obraz i w arkuszu  właściwości jako źródło danych wskazuję Kreatora wyrażeń:

kliknij, aby powiększyć

W kreatorze wyrażeń przechodzę do Funkcje –> Biblioteka(to nazwa moje aplikacji) i z modułu ModuleFunctionPUB wybieram funkcję AdresSG()> 

W module ModuleFunctionPUB mam zapisaną funkcję zwracającą adres bieżącej aplikacji Access. Wygląda ona tak: 

Public Function AdresSG()
’Adres folderu, w którym znajduje się aktualna aplikacja Access
AdresSG = CurrentProject.Path
End Function

Dokładam do tego fragment do podkatalogów, a następnie z pól formularza wybieram Foto czyli nazwę pliku obrazu:

Finalnie – źródłem danych dla tego formantu jest wyrażenie: 
=AdresSG() & „\Foto\Kategorie\” & [Foto]

Efekt końcowy wygląda tak:

Dla każdego rekordu jest widoczne przypisane do niego zdjęcie. Po przeniesieniu w inne miejsce, jeżeli zostanie zachowany ten sam układ katalogu – nie trzeba zmieniać żadnych linków, gdyż funkcja sama zlokalizuje na dysku położenie obrazu. 

      •  

 

 

 

Funkcja Switch() w Accesie

Funkcja Switch() to funkcja sterowania Accessa.  

Funkcja wyszukuje pierwsze wyrażenie, które zwraca Prawda i zwraca przypisaną do niego wartość.
Argumenty funkcji to pary:

    • Expr_1- wyrażenie zwracające wartość Prawda/Fałsz
    • Value_1– zwracana wartość funkcji, jeżeli Expr_1 to Prawda
    • ….
    • Expr_n- wyrażenie zwracające wartość Prawda/Fałsz
    • Value_n– zwracana wartość funkcji, jeżeli Expr_n to Prawda

Przy znalezieniu pierwszego spełnionego warunku kolejne warunki nie są już sprawdzane. 
Jeżeli żaden z warunków nie jest spełniony – funkcja Switch() zwróci wartość null
Ilość par argumentów nie jest określona (nie ma jej w dokumentacji Accessa), ale ilość znaków w formule nie powinna przekraczać 2048. 

Funkcja występuje w kreatorze wyrażeń. Na przykład w takiej kwerendzie: 

Kolumna Przyklad1 jest oparta o formułę:

Switch([DataP] Is Null;”brak daty”;Weekday([DataP];2)<6;”dzień roboczy”;Weekday([DataP];2)>5;”weekend”)

Kolumna Przyklad2 jest oparta o formułę:

Switch([DataP] Is Null;”brak daty”;[NumerKatalogowy]<1010;”numer”;Weekday([DataP];2)<6;”dzień roboczy”;Weekday([DataP];2)>5;”weekend”)

W tym drugim przykładzie  warunek Expr_2 jest oparty o inne pole niż pozostałe warunki – ważne jest tylko to, czy jest spełniony. 

Odpowiednikiem funkcji w kodzie VBA jest ta sama funkcja Switch()


Edytor VBA – prywatne i publiczne

W edytorze  VBA każdy moduły własne obiektów ma charakter prywatny. Oznacza to, że wszystkie zapisane w nim funkcje i procedury są dostępne tylko z poziomu VBA.

Moduły ogólne są domyślnie publicznie. Zdefiniowane w nich procedury i funkcje publiczne są widoczne również z poziomu Accessa (m.in. w kreatorze wyrażeń). Funkcje i procedury prywatne mogą być wykorzystane jedynie z poziomu procedur zapisanych w tym samym module. 

Np. taka funkcje w module ogólnym:

Public Function PierwszyNumer()
   'funkcja publiczna
Pierwszy = DFirst(„NumerKatalogowy”, „TabelaKsiazki”, „DataP is null”)
End Function


Private Function OstatniNumer()
   'funkcja prywatna
OstatniNumer = DLast(„NumerKatalogowy”, „TabelaKsiazki”, „DataP is null”)
End Function

W kreatorze wyrażeń wygląda to tak:

kliknij, aby powiększyć

W bazie Biblioteka, w module ModuleFunction  widoczna jest tylko jedna funkcja – zdeklarowana jako Public. Prywatna funkcja OstatniNumer nie jest tu widoczna, może być wykorzystana tylko w obrębie tego samego modułu. 

Przy bardziej rozbudowanych projektach i  wielu procedurach w kodzie może być więcej modułów ogólnych z różnymi procedurami i funkcjami. Nie wszystkie z nich muszą być widoczne i dostępne również bezpośrednio w Accessie, czasem warto je „utajnić”. Wystarczy na początku modułu ogólnego wstawić Option Private Module

kliknij, aby powiekszyć

Od tej pory – wszystkie funkcje i procedury publiczne w takim module będą dostępne z innych modułów, ale nie w Accessie. 
W praktyce zawsze tak robię, porządkując funkcje i procedury i część z nich umieszczając je modułach prywatnych, a część – publicznych. Zmieniam też nazwy modułów, żeby się nie pogubić i utrzymać porządek w kodzie. 
Np. tak:

kliknij, aby powiększyć

 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Zdarzenia formularza

Zdarzenia formularza  to makra i procedury uruchamiane automatycznie na skutek któregoś z działań tego formularza. 
Procedury VBA znajdują się w module własnym formularza. 
Przypisujemy je w zakładce Zdarzenia  Arkusza właściwości formularza.

Do każdego zdarzenia możemy przypisać po nazwie konkretne makro zzapisane w aplikacji:

kliknij, aby powiększyć

Można też uruchomić konstruktora:

Istnieją tu 3 możliwości:

    • Konstruktor makr
      w nowym oknie definiujemy makro. Po zapisaniu nie jest ono widoczne w grupie makr w oknie nawigacji i nie można go wykorzystać w innych formularzach. W arkuszu właściwości będzie widoczne jako makro osadzone.


      kliknij, aby powiększyć
    • Konstruktor wyrażeń 
      – w nowym oknie możemy wybrać dowolną funkcję lub metodę

    • Konstruktor kodu
      – przejście do edytora VBA, do modułu formularza

A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Funkcja nz()

Funkcja nz to funkcja konwersji Accessa.  

kliknij, aby powiększyć

Funkcja ma 2 obowiązkowe argumenty:

    • wartość typu wariant – wartość danego pola, mogącą być również brakiem wartości czyli null
    • wartość_jeśli _null – wartość wynikowa funkcji jeżeli pierwszy argument to null 

Funkcja pożyteczna i często ją stosuję. Opisałam to szczegółowo tu:
Null to nie zero

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


Funkcja DateAdd

Funkcja DateAddl() to jedna z funkcji Daty i Czasu . Tworzy datę przesuniętą o określony interwał czasu. 

Argumenty funkcji to:

    • Interwał – symbol jednostki daty, wartość typu String. 
      Możliwe opcje to:

        • yyyy – rok
        • q– kwartał
        • m– miesiąc
        • d– dzień
        • ww– tydzień
        • h– godzina
        • n– minuta
        • s– sekunda
    • Liczba-liczba jednostek czasu, wartość typu Double
    • Data-data początkowa, wartość typu Date

Wszystkie argumenty są obowiązkowe. 

Funkcja ta wygląda i działa tak samo w konstruktorze wyrażeń, jak i w VBA.

I na wszelki wypadek przypominam:

Data i czas to liczba


Funkcja DateSerial

Funkcja DateSerial() to funkcja daty i czasu Accessa.  Wynikiem jej działania jest data stworzona z argumentów wejściowych.

Funkcja ma 3 obowiązkowe argumenty:

    • Rok  – wartość roku, typu Integer
    • Miesiąc – wartość miesiąca, typ Integer
    • Dzień – numer dnia miesiąca, typ Integer

Po wpisaniu wartości poszczególnych argumentów funkcji, otrzymujemy wartość typu Data

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