Rozdzia³ 20 Udoskonalanie bazy danych za pomoc¹ kodu VBA Czêœæ VI: Zaawansowane techniki Accessa Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA Chocia prost¹ aplikacjê w programie Microsoft Access mo esz przygotowaæ, nie napisawszy wiersza kodu, to jednak je eli myœlisz o czymœ bardziej ambitnym musisz nauczyæ siê programowaæ w jêzyku Microsoft Visual Basic for Applications (VBA). Za pomoc¹ interfejsu Accessa i licznych kreatorów da siê utworzyæ tabele, kwerendy, formularze i raporty, jednak efektywne aplikacje charakteryzujace siê wysok¹ wydajnoœci¹ wykorzystuj¹ o wiele szerszy zestaw obiektów bazodanowych. W szczególnoœci wiele formularzy i raportów wymaga zastosowania kodu obs³uguj¹cego pojawiaj¹ce siê w nich zdarzenia. Dziêki temu interakcja wszystkich sk³adników przebiega o wiele p³ynniej. Uwagi o programowaniu w jêzyku VBA Z formularzami, raportami i formantami Accessa s¹ zwi¹zane zdarzenia. Dziêki nim mo na pisaæ kod, który jest wykonywany w momencie zg³oszenia okreœlonego zdarzenia, na przyk³ad w momencie zamykania formularza, klikniêcia przycisku polecenia lub formatowania raportu. Kod uzupe³niaj¹cy formularze jest zapisywany w modu³ach klas kod ka dego formularza lub raportu jest zapisany w oddzielnym module. Jak dobraæ siê do kodu Istnieje kilka sposobów, które pozwalaj¹ nam na dotarcie do kodu VBA w Accessie. Wybór zale y od tego, czy kod jest zwi¹zany z formularzem lub raportem, czy te jest zdefiniowany w module klasy lub module standardowym. Je eli pracujesz z formularzem lub raportem w widoku Projekt, mo esz otworzyæ zwi¹zany z nimi kod, klikaj¹c przycisk Kod na pasku narzêdzi Projekt formularza (Projekt raportu). Spowoduje to otwarcie edytora Visual Basica i wyœwietlenie modu³u kodu formularza lub raportu. Je eli chcesz bezpoœrednio przejœæ do procedury jakiegoœ formantu, zaznacz go w formularzu lub raporcie (otwartym w widoku Projekt), otwórz arkusz w³aœciwoœci formantu i przejdÿ do karty Zdarzenia. Kliknij zdarzenie zwi¹zane z procedur¹, któr¹ chcesz zbadaæ lub utworzyæ, a nastêpnie z listy rozwijanej wybierz opcjê [Procedura zdarzenia]. Nastêpnie kliknij przycisk Konstruuj, aby otworzyæ edytor Visual Basica. W oknie kodu wyœwietli siê modu³ formularza lub raportu, zaœ punkt wstawiania bêdzie ustawiony w wybranej procedurze zdarzenia. Je eli wybrane zdarzenie nie ma jeszcze procedury obs³ugi, pojawi siê jej pow³oka (nag³ówek i zakoñczenie), któr¹ mo na wype³niæ odpowiednim kodem.
670 Czêœæ VI: Zaawansowane techniki Accessa W przypadku przycisków poleceñ mo na zastosowaæ krótsz¹ drogê. Prawym przyciskiem myszy kliknij przycisk, a nastêpnie wybierz polecenie Konstruuj zdarzenie, aby od razu przejœæ do zdarzenia Click tego przycisku. (Jeœli chodzi o przyciski poleceñ, zdarzenie klikniêcia jest obs³ugiwane najczêœciej). Tej samej techniki mo na równie u yæ w stosunku do innych formantów, lecz domyœlna procedura zdarzenia (najczêœciej BeforeUpdate) zwykle nie jest t¹, któr¹ chcemy oprogramowaæ. Modu³ standardowy lub modu³ klasy mo na otworzyæ na dwa sposoby. Je eli u ywasz bazy danych Accessa, przejdÿ do grupy Modu³y, a nastêpnie dwukrotnie kliknij modu³, który chcesz otworzyæ. Je eli jesteœ w edytorze Visual Basica, otwórz folder Modules lub Class Modules w okienku Project, a nastêpnie dwukrotnie kliknij wybrany modu³. Kod zapisuje siê równie w modu³ach standardowych, dostêpnych z dowolnego miejsca aplikacji. Ponadto, pocz¹wszy od Accessa 97, mo na tworzyæ specjalny typ modu³u klasy (niepo³¹czony z adnym formularzem lub raportem), definiuj¹cy nowy typ obiektu. Rysunek 20.1 przedstawia okienko Project edytora Visual Basica. W okienku tym s¹ wyœwietlone modu³y klas formularzy i raportów oraz jeden modu³ standardowy. Rysunek 20.1. Modu³y klas i modu³y standardowe s¹ wyœwietlane w okienku Project edytora Visual Basica Gdzie jest umieszczony kod Kod Accessa jest przechowywany w modu³ach, które z kolei s¹ zbiorem deklaracji, instrukcji i podprogramów (procedur i funkcji). Modu³y standardowe s¹ przechowywane w oddzielnych obiektach bazy danych i mamy do nich dostêp za pomoc¹ karty Modu³y okna Baza danych. Z kolei kod zwi¹zany z formularzami i raportami jest dostêpny poprzez te formularze i raporty lub w folderze Microsoft Access Class Objects w oknie edytora Visual Basica. W Accessie wystêpuje kilka typów modu³ów: Modu³y klas (kod zwi¹zany z formularzami i raportami). Zawieraj¹ procedury zdarzeñ formularzy i raportów, sekcji formularzy i raportów oraz formantów. Mog¹ siê w nich równie znajdowaæ funkcje wywo³ywane z procedur zdarzeñ.
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 671 Modu³ klasy jest tworzony, gdy przystêpujesz do pisania pierwszej procedury zwi¹zanej z okreœlonym formularzem lub raportem. Modu³y standardowe. Zawieraj¹ funkcje i procedury, które mog¹ byæ wywo³ywane przez procedury zdarzeñ ró nych formularzy i raportów oraz przez inne podprogramy. Modu³y klas (nowy typ obiektu). Tworz¹ definicjê obiektu niestandardowego. Metody tego obiektu s¹ definiowane przez procedury; procedury Property Let, Property Get i Property Set definiuj¹ w³aœciwoœci tego obiektu. Funkcje a procedury Podprogramy umieszczane w modu³ach mog¹ byæ funkcjami lub procedurami. Procedury i funkcje mog¹ przyjmowaæ argumenty (sta³e, zmienne lub wyra enia), lecz tylko funkcje zwracaj¹ wartoœci. WSKAZÓWKA Je eli podczas wywo³ania procedury, instrukcji lub metody podajesz argumenty, nie musisz ujmowaæ ich w nawiasy, za wyj¹tkiem sytuacji, gdy wywo³ujesz funkcjê lub metodê zwracaj¹c¹ jak¹œ wartoœæ. Poni sza funkcja ToDate zosta³a zaczerpniêta z modu³u basgeneral z bazy danych Rzemios³o. Funkcji tej oraz podobnej funkcji FromDate u ywam w wielu moich bazach danych. Pobiera ona wartoœæ pola ToDate z tabeli tblinfo, zawsze, gdy jest to potrzebne do jakiegoœ celu, na przyk³ad do filtrowania raportów wed³ug daty zamówienia. Public Function ToDate() As Date On Error GoTo ErrorHandler 'Z tabeli Info wybiera pole Do kiedy Set dbs = CurrentDb Set rst = dbs.openrecordset("tblinfo", dbopentable) With rst.movefirst ToDate = Nz(![Do kiedy], "12/31/2002").Close End With ErrorHandlerExit: Exit Function ErrorHandler: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ErrorHandlerExit End Function Poni sza procedura równie pochodzi z modu³u basgeneral z bazy danych Rzemios³o. Jej zadaniem jest sformatowanie wartoœci txtstateprovince tak, aby wszystkie jej litery by³y wielkie, je eli krajem jest U.S.A. Procedura ta przyjmuje trzy argumenty: strstateprovince, strcountry i txt. Dziêki temu jest ona uniwersalna i mo na j¹ wywo³ywaæ z ró nych procedur zdarzeñ, w ró nych formularzach i formantach.
672 Czêœæ VI: Zaawansowane techniki Accessa Public Sub FormatStateProvince(strStateProvince As String, _ strcountry As String, txt As Access.TextBox) On Error GoTo ErrorHandler If strstateprovince = "" Then Exit Function End If If strcountry = "U.S.A." Then If Len(strStateProvince) = 2 Then txt.value = UCase(strStateProvince) End If End If ErrorHandlerExit: Exit Function ErrorHandler: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ErrorHandlerExit End Sub Poni sza procedura obs³uguje zdarzenia AfterUpdate wystêpuj¹ce w formancie pola tekstowego txtsalesstateprovince, umieszczonym na formularzu frmwydawnictwa. Wywo³uje ona zdefiniowan¹ powy ej procedurê FormatStateProvince, uprzednio ustalaj¹c wartoœci trzech zmiennych, u ytych jako argumenty wywo³ywanej procedury. Private Sub txtsalesstateprovince_afterupdate() On Error GoTo ErrorHandler strstateprovince = Nz(Me![txtSalesStateProvince].Value) strcountry = Nz(Me![txtSalesCountry].Value) Set txt = Me![txtSalesStateProvince] Call FormatStateProvince(strStateProvince, strcountry, txt) ErrorHandlerExit: ErrorHandler: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ErrorHandlerExit End Sub Zmienne i sta³e Zmienna jest miejscem, w którym s¹ przechowane jakieœ dane. Zmienna mo e byæ modyfikowana w czasie dzia³ania kodu. Sta³e równie s¹ miejscami do przechowywania danych, lecz ich wartoœci nie mo na modyfikowaæ w czasie dzia³ania kodu. Zarówno zmienne, jak i sta³e mog¹ byæ deklarowane jako wartoœci okreœlonego typu. Chocia sta³e i zmienne definiowane w podprogramie mo na umieszczaæ w dowolnym jego miejscu, czytelnoœæ kodu znacznie wzroœnie, je eli umieœcisz je na pocz¹tku podprogramu. Zmienne i sta³e definiowane na poziomie modu³u powinny siê znaleÿæ w sekcji Declarations na pocz¹tku tego modu³u.
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 673 Typy danych Definiowanie typu danych zmiennej (lub w skrócie: typu zmiennej) jest dobrym zwyczajem. W ten sposób chronimy zasoby pamiêci, zwiêkszamy szybkoœæ dzia³ania kodu, poprawiamy jego czytelnoœæ i u³atwiamy jego debugowanie. Typu danych Variant nale y u ywaæ tylko wtedy, je eli nie wiemy, jakiego typu wartoœci zostan¹ przypisane zmiennej w czasie dzia³ania programu lub je eli zmiennej mog¹ byæ przypisywane dane ró nych typów. (Typ Variant jest przyjmowany we wszystkich zmiennych, których typ nie zosta³ jawnie okreœlony. Przyp. t³um.). Tabela 20.1 przedstawia najczêœciej stosowane typy zmiennych u ywane w kodzie VBA; znajduj¹ siê w niej równie odpowiedniki typów u ywanych do definiowania pól danych w tabelach Accessa. Tabela 20.1.Typy danych VBA, DAO i ADO Typ danych u ywany Typ danych VBA Typ danych DAO Typ danych ADO w polach tabel Accessa <brak> <brak> dbnumeric* adnumeric <brak> <brak> dbtime* addbdate <brak> <brak> dbtimestamp* addbtimestamp <brak> <brak> dbvarbinary* advarbinary <brak> <brak> dbbigint* adbigint <brak> <brak> dbbinary adbinary Tak/Nie Boolean dbboolean adboolean <brak> <brak> dbchar* adchar Walutowy Currency dbcurrency adcurrency Data/Godzina Date dbdate addate <brak> <brak> dbdecimal* addecimal Liczba (Rozmiar pola: Double dbdouble addouble Podwójna precyzja) Autonumerowanie (Rozmiar <brak> dbguid adguid pola: Identyfikator replikacji) Autonumerowanie (Rozmiar Long dblong adinteger pola: Liczba ca³kowita d³uga) Liczba (Rozmiar pola: Liczba Long dblong adinteger ca³kowita d³uga) Obiekt OLE String dblongbinary adlongvarbinary Nota String dbmemo adlongvarwchar Hiper³¹cze String dbmemo adlongvarwchar Liczba (Rozmiar pola: Single dbsingle adsingle Pojedyncza precyzja) Liczba (Rozmiar pola: Liczba Integer dbinteger adsmallint ca³kowita) Liczba (Rozmiar pola: Bajt) Byte dbbyte adunsignedtinyint <brak> Variant <brak> advariant Tekst String dbtext advarwchar *Tylko ODBCDirect
674 Czêœæ VI: Zaawansowane techniki Accessa PóŸne i wczesne wi¹zanie Gdy tworzysz kod wykorzystuj¹cy obiekt udostêpniany przez bibliotekê typów innej aplikacji, VBA realizuje proces nazywany wi¹zaniem (ang. binding), aby stwierdziæ, czy ten obiekt istnieje i czy odwo³uj¹cy siê do niego kod prawid³owo u ywa jego metod i w³aœciwoœci. VBA obs³uguje dwa typy wi¹zania: póÿne i wczesne. PóŸne wi¹zanie ma miejsce w czasie wykonania i jest znacznie wolniejsze ni wczesne wi¹zanie, poniewa VBA musi szukaæ obiektu oraz jego metod i w³aœciwoœci za ka dym razem, gdy jest wykonywana linia kodu, która odwo³uje siê do tego obiektu. Wczesne wi¹zanie ma miejsce podczas kompilacji, dziêki czemu jest znacznie bardziej efektywne. By móc korzystaæ z wczesnego wi¹zania, musisz zdefiniowaæ odwo³anie do biblioteki typów serwera automatyzacji (na przyk³ad Microsoft DAO 3.60 Object Library) oraz zadeklarowaæ zmienne obiektowe okreœlonego typu (na przyk³ad DAO.Recordset). Je eli zadeklarujesz zmienn¹ ogólnego typu danych Object, dochodzi do póÿnego wi¹zania. W tym przypadku zmienna obiektowa przybiera okreœlony typ dopiero wtedy, gdy w kodzie zostanie jej przypisany jakiœ obiekt. PóŸne wi¹zanie nie wymaga odwo³ywania siê do biblioteki obiektowej. Z tego wzglêdu jest przydatne, gdy kod operuje na obiektach (takich jak dokument edytora Microsoft Word czy arkusz kalkulacyjny Microsoft Excela), które mog¹ ró niæ siê wersjami, lub gdy tworzymy kod, który bêdzie importowany do innych baz danych, i nie wiemy, z jakimi obiektami bêdzie on wi¹zany. Za wyj¹tkiem tych specjalnych przypadków, zwykle preferowane jest wczesne wi¹zanie. Zasiêg i czas ycia zmiennych i sta³ych Wszystkie zmienne maj¹ okreœlony zasiêg i czas ycia. Zasiêg zmiennej okreœla obszar kodu, w którym ta zmienna jest dostêpna. Zmienna mo e mieæ zasiêg globalny, co oznacza, e jest ona dostêpna w ca³ym kodzie programu, lub lokalny, gdy jest widoczna w pojedynczej procedurze. Czas ycia zmiennej informuje o tym, jak d³ugo zmienna istnieje w kodzie. Zmienna mo e istnieæ przez ca³y czas dzia³ania programu lub tylko w czasie wykonywania jakiejœ procedury. W zale noœci od sposobu i miejsca zadeklarowania zmiennej, wyró nia siê trzy poziomy zasiêgu: Poziom procedury. Zmienne lub sta³e zadeklarowane w procedurze. Dostêpne tylko w tej procedurze. Prywatny poziom modu³u. Zmienne lub sta³e zadeklarowane jako Private (lub zadeklarowane bez tego s³owa kluczowego, co jest równowa ne z utworzeniem zmiennej prywatnej) w sekcji Declarations modu³u. Dostêpne tylko w tym module. Publiczny poziom modu³u. Zmienne lub sta³e zadeklarowane jako Public w sekcji Declarations modu³u. Mo e siê do nich odwo³ywaæ dowolny modu³ projektu. Tabela 20.2 opisuje zasiêg i dostêpnoœæ procedur, zmiennych i sta³ych w ró nych typach modu³ów, w zale noœci od sposobu ich zadeklarowania.
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 675 Tabela 20.2. Zasiêg i czas ycia procedur, zmiennych i sta³ych S³owa kluczowe deklaracji Poziom deklaracji Zasiêg i czas ycia zmiennej Public Sub Poziom modu³u Dostêpna we wszystkich modu³ach we wszystkich projektach. Public Function Poziom modu³u Dostêpna we wszystkich modu³ach we wszystkich projektach. Public Sub Poziom procedury <brak> Public Function Poziom procedury <brak> Private Sub Poziom modu³u Dostêpna tylko w module, w którym jest zadeklarowana. Private Function Poziom modu³u Dostêpna tylko w module, w którym jest zadeklarowana. Dim zmienna Private zmienna Poziom modu³u Dostêpna tylko w module, w którym jest zadeklarowana; jej wartoœæ jest pamiêtana przez czas dzia³ania modu³u. Static zmienna Poziom modu³u <brak> Public zmienna Poziom modu³u Dostêpna we wszystkich procedurach we wszystkich modu³ach. Dim zmienna Poziom procedury Dostêpna tylko w procedurze, w której zosta³a zadeklarowana; jej wartoœæ jest pamiêtana przez czas dzia³ania procedury. Public zmienna Poziom procedury <brak> Static zmienna Poziom procedury Dostêpna tylko w swojej procedurze; jej wartoœæ jest pamiêtana przez ca³y czas dzia³ania aplikacji. Const sta³a Poziom modu³u Dostêpna tylko w module, w którym jest zadeklarowana. Public Const sta³a Poziom modu³u (tylko modu³y standardowe) Dostêpna we wszystkich procedurach we wszystkich modu³ach. Const sta³a Poziom procedury Dostêpna tylko w procedurze, w której zosta³a zadeklarowana. Sterowanie przebiegiem kodu za pomoc¹ instrukcji jêzyka VBA W jêzyku VBA istnieje szereg instrukcji s³u ¹cych do przetwarzania danych w procedurach i wykorzystuj¹cych ró ne struktury logiczne. W tym podrozdziale zosta³y opisane te najczêœciej u ywane. Instrukcja Call Instrukcja Call s³u y do wykonania procedury z poziomu innego podprogramu. S³owo kluczowe Call mo na pomin¹æ, jednak jego zastosowanie na pewno poprawi czytelnoœæ kodu. Poni sza procedura wywo³uje inn¹ procedurê, aby sprawdziæ poprawnoœæ numeru telefonu. UWAGA Do wykonywania funkcji nie u ywa siê instrukcji Call. W momencie wywo³ania funkcji przypisuje siê j¹ zmiennej (lub polu czy te formantowi), w której zostanie zapamiêtany zwrócony przez ni¹ wynik.
676 Czêœæ VI: Zaawansowane techniki Accessa Private Sub txtgeneralphone_beforeupdate(cancel As Integer) On Error GoTo ErrorHandler strcountry = Nz(Me![txtSalesCountry].Value) strphone = Nz(Me![txtGeneralPhone].Value) intlength = Len(strPhone) Call CheckPhone(strCountry, strphone, intlength) ErrorHandlerExit: ErrorHandler: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ErrorHandlerExit End Sub Instrukcja Do While...Loop Ta struktura logiczna s³u y do powtarzania bloku instrukcji, gdy jest spe³niony (ma wartoœæ True) podany warunek. W po³¹czeniu z w³aœciwoœci¹ EOF (wskazuj¹c¹ na koniec zestawu rekordów) struktury Do While...Loop s¹ przydatne do iteracyjnego przechodzenia przez zestaw rekordów. Przyk³adem takiego rozwi¹zania jest poni - szy kod, zaczerpniêty z pewnej dosyæ d³ugiej procedury, pobieraj¹cej dane z tabel Accessa i zapisuj¹cej je w dokumencie Worda. (Zobacz rozdzia³ 17, Eksportowanie danych z Accessa, w którym znajdziesz pe³ny tekst tej procedury). Set rst = dbs.openrecordset("tmakfakturaszczegó³y", dbopendynaset) 'Zapisuje szczegó³y w zmiennych. 'Wykorzystuje funkcjê Format, aby nadaæ odpowiedni format 'polom wartoœci walutowych i procentowych. With rst.movefirst Do While Not.EOF lngproductid = Nz(![NrProduktu]) Debug.Print "Nr produktu: " & lngproductid strproductname = Nz(![NazwaProduktu]) Debug.Print "Nazwa produktu: " & strproductname dblquantity = Nz(![Iloœæ]) Debug.Print "Iloœæ: " & dblquantity strunitprice = Format(Nz(![CenaJednostkowa]), "# ###.00 z³") Debug.Print "Cena jednostkowa: " & strunitprice strdiscount = Format(Nz(![Rabat]), "0%") Debug.Print "Rabat: " & strdiscount strextendedprice = Format(Nz(![Cena]), "# ###.00 z³") Debug.Print "Cena: " & strextendedprice 'Przechodzi przez tabelê, zapisuj¹c wartoœci 'ze zmiennych do komórek tabeli Worda. With objword.selection.typetext Text:=CStr(lngProductID).MoveRight Unit:=wdCell.TypeText Text:=strProductName.MoveRight Unit:=wdCell.TypeText Text:=CStr(dblQuantity).MoveRight Unit:=wdCell
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 677.TypeText Text:=strUnitPrice.MoveRight Unit:=wdCell.TypeText Text:=strDiscount.MoveRight Unit:=wdCell.TypeText Text:=strExtendedPrice.MoveRight Unit:=wdCell End With.MoveNext Loop.Close End With Instrukcja Do Until...Loop Struktura logiczna Do Until...Loop wykonuje blok instrukcji, dopóki podany warunek ma wartoœæ True. Poni sza procedura eksportuje dane z tabeli Accessa do kalendarza Outlooka. Private Sub cmdexportdates_click() On Error GoTo ErrorHandler Dim dbs As Database Dim rst As Recordset Dim appoutlook As New Outlook.Application Dim nms As Outlook.NameSpace Dim flds As Outlook.Folders Dim fld As Outlook.MAPIFolder Dim itm As Object Dim lngcount As Long Set nms = appoutlook.getnamespace("mapi") Set fld = nms.folders("foldery osobiste").folders("wyk³ady") Set dbs = CurrentDb Set rst = dbs.openrecordset("tbldatywyk³adów", dbopendynaset) lngcount = rst.recordcount MsgBox lngcount & " rekordów do przes³ania do programu Outlook" 'Przegl¹da w pêtli tabelê i eksportuje ka dy rekord 'do Outlooka. Do Until rst.eof Set itm = fld.items.add("ipm.appointment") itm.subject = rst!classname itm.start = rst!classdate itm.duration = 60 itm.close (olsave) rst.movenext Loop ErrorHandlerExit: ErrorHandler: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ErrorHandlerExit End Sub
678 Czêœæ VI: Zaawansowane techniki Accessa Instrukcja For...Next Instrukcja For...Next s³u y do powtarzania bloku instrukcji okreœlon¹ liczbê razy. Czêsto wykonuje siê j¹ tyle razy, ile wynosi liczba jakichœ zliczonych elementów; je eli jednak elementy te s¹ sk³adnikami kolekcji, mo esz zastosowaæ bardziej wydajn¹ konstrukcjê For Each...Next. W poni szym fragmencie kodu struktura For...Next s³u y do pobierania danych z tabeli Worda i zapisywania ich w tabeli Accessa. W kodzie zastosowano zestaw rekordów DAO (Data Access Objects) oraz zmienn¹ lngtablerows, w której jest przechowywana liczba wierszy tabeli Worda. WSKAZÓWKA Pêtli For Each...Next nie mo na u ywaæ w stosunku do wierszy tabeli Worda, poniewa w modelu obiektowym Worda wiersze nie tworz¹ kolekcji. 'Pobiera dane z komórek tabeli Worda i zapisuje je w tabeli 'bazy danych. Set sel = appword.selection For lngrow = 0 To lngtablerows - 2 rst.addnew strname = Nz(sel.Text) Debug.Print "Nazwa: " & strname If strname = "" Then GoTo Done Else rst![employeename] = strname End If sel.moveright Unit:=wdCell, Count:=1 strext = sel.text rst![extension] = strext sel.moveright Unit:=wdCell, Count:=1 rst.update Next lngrow Instrukcja For Each...Next Gdy pracujesz ze sk³adnikami kolekcji lub elementami tablicy, mo esz skorzystaæ z konstrukcji For Each...Next, aby iterowaæ tê kolekcjê lub tablicê i za pomoc¹ odpowiedniej zmiennej odwo³ywaæ siê do jej sk³adników. W poni szym fragmencie kodu instrukcja For Each...Next s³u y do przegl¹dania kolekcji ItemsSelected, nale ¹cej do formantu pola listy umieszczonego na formularzu Accessa. W wyniku tego procesu s¹ uzyskiwane informacje, które znajd¹ siê w dokumencie Worda: For Each varitem In lst.itemsselected 'Sprawdza, czy zosta³y podane wszystkie czêœci adresu. strtest = Nz(lst.Column(5, varitem)) Debug.Print "Adres (ulica): " & strtest If strtest = "" Then Debug.Print "Nie mo na wys³aæ listu -- brak ulicy w adresie!" End If strtest = Nz(lst.Column(6, varitem)) Debug.Print "Miasto: " & strtest If strtest = "" Then
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 679 Debug.Print "Nie mo na wys³aæ listu -- brak miasta w adresie!" End If strtest = Nz(lst.Column(8, varitem)) Debug.Print "Kod pocztowy: " & strtest If strtest = "" Then Debug.Print _ "Nie mo na wys³aæ listu -- brak kodu pocztowego w adresie!" End If strname = Nz(lst.Column(2, varitem)) & _ " " & Nz(lst.Column(3, varitem)) strjobtitle = Nz(lst.Column(11, varitem)) If strjobtitle <> "" Then strname = strname & vbcrlf & strjobtitle End If straddress = Nz(lst.Column(5, varitem)) & vbcrlf & _ Nz(lst.Column(6, varitem)) & ", " & _ Nz(lst.Column(7, varitem)) & _ " " & Nz(lst.Column(8, varitem)) Debug.Print "Adres: " & straddress strcountry = Nz(lst.Column(9, varitem)) If strcountry <> "USA" Then straddress = straddress & vbcrlf & strcountry End If 'Otwiera nowy list w oparciu o wybrany szablon. appword.documents.add strwordtemplate 'Zapisuje informacje w niestandardowych w³aœciwoœciach 'dokumentu Worda. Set prps = appword.activedocument.customdocumentproperties prps.item("name").value = strname On Error Resume Next prps.item("salutation").value = Nz(lst.Column(4, varitem)) prps.item("companyname").value = Nz(lst.Column(10, varitem)) prps.item("address").value = straddress prps.item("todaydate").value = strlongdate 'Sprawdza obecnoœæ poprzednio zapisanego listu w folderze 'z dokumentami i do³¹cza inkrementowany numer, je eli taki 'dokument zostanie znaleziony. strdoctype = appword.activedocument.builtindocumentproperties(2) strsavename = strdoctype & " to " & _ lst.column(2, varitem) & " " & lst.column(3, varitem) strsavename = strsavename & " on " & strshortdate & ".doc" i = 2 intsavenamefail = True Do While intsavenamefail strsavenamepath = strdocspath & strsavename Debug.Print "Proponowana nazwa pliku i œcie ka: " _ & vbcrlf & strsavenamepath strtestfile = Nz(Dir(strSaveNamePath)) Debug.Print "Plik testowy: " & strtestfile If strtestfile = strsavename Then Debug.Print "Ta nazwa pliku jest ju wykorzystana: " & _ strsavename 'Tworzy now¹ nazwê pliku z wykorzystaniem 'inkrementowanego numeru.
680 Czêœæ VI: Zaawansowane techniki Accessa intsavenamefail = True strsavename = strdoctype & " " & CStr(i) & " to " & _ lst.column(2, varitem) & " " & lst.column(3, varitem) strsavename = strsavename & " on " & strshortdate & ".doc" strsavenamepath = strdocspath & strsavename Debug.Print "Nowa nazwa pliku i œcie ka: " _ & vbcrlf & strsavenamepath i = i + 1 Else Debug.Print "Ta nazwa pliku nie jest wykorzystywana: " & _ strsavename intsavenamefail = False End If Loop 'Aktualizuje pola w dokumencie Worda i uaktywnienia dokument. With appword.selection.wholestory.selection.fields.update.selection.homekey Unit:=6.ActiveDocument.SaveAs strsavename End With Next varitem Instrukcja GoTo Instrukcja GoTo s³u y do wykonania skoku bezpoœrednio do etykiety, której nazwa jest umieszczona gdzieœ w kodzie. Instrukcji tej zwykle u ywa siê w procedurach obs³ugi b³êdów. Na przyk³ad poni sz¹ liniê kodu umieszcza siê na pocz¹tku procedury, dziêki czemu w przypadku wyst¹pienia b³êdu nastêpuje przeskok do etykiety ErrorHandler. On Error GoTo ErrorHandler Instrukcja If...Then...Else Instrukcja If...Then...Else s³u y do wykonania bloku instrukcji, je eli jest spe³niony podany warunek, zaœ drugi, opcjonalny blok instrukcji jest wykonywany, gdy warunek nie jest spe³niony. Do instrukcji If...Then...Else mo na do³¹czyæ instrukcje ElseIf (jedn¹ lub wiêcej). Mo na w nich badaæ dalsze warunki, je eli poprzednie nie zosta³y spe³nione. W poni szym fragmencie kodu zmiennej straddress s¹ przypisywane sk³adniki adresu s³u bowego (pobrane z elementu kontaktu Outlooka), je eli zmienna intaddresstype jest równa 1, lub sk³adniki adresu prywatnego, je eli ta zmienna ma wartoœæ 2: If intaddresstype = 1 Then straddress = IIf(![Company] <> strempty,![company] & vbcrlf, _![Company]) & IIf(![BusinessStreet1] <> strempty, _![BusinessStreet1] & vbcrlf,![businessstreet1]) & _ IIf(![BusinessStreet2] <> strempty,![businessstreet2] & _ vbcrlf,![businessstreet2]) & IIf(![BusinessCity] <> strempty, _![BusinessCity] & Chr$(44) & Chr$(32),![BusinessCity]) & _ IIf(![BusinessState] <> strempty,![businessstate] & Chr$(32) _ & Chr$(32),![BusinessState]) &![BusinessPostalCode] ElseIf intaddresstype = 2 Then straddress = IIf(![HomeStreet1] <> strempty,![homestreet1] _ & vbcrlf,![homestreet1]) & IIf(![HomeStreet2] <> strempty, _![HomeStreet2] & vbcrlf,![homestreet2]) & IIf(![HomeCity] _ <> strempty,![homecity] & Chr$(44) & Chr$(32),![HomeCity]) & _
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 681 IIf(![HomeState] <> strempty,![homestate] & Chr$(32) & Chr$(32), _![HomeState]) &![HomePostalCode] End If Instrukcja Select Case Instrukcja Select Case s³u y do uruchamiania ró nych bloków kodu w zale noœci od wartoœci podanego wyra enia (mo na badaæ wiêcej przypadków ni przy u yciu zwyk³ej instrukcji If...Then...Else). Wed³ug niepisanej zasady przyjmuje siê, e instrukcjê Select Case nale y stosowaæ, gdy liczba mo liwych wartoœci jest wiêksza ni 3. Poni sza funkcja, zaczerpniêta z dodatku Mened er menu, wykorzystuje instrukcjê Select Case do badania mo liwych wartoœci grupy opcji na formularzu Accessa. (Ta grupa opcji s³u y do wyboru obrazu t³a w menu formularza). Wiêcej informacji na temat dodatku Mened er menu znajdziesz w rozdziale 15, Stosowanie dodatków zwiêkszaj¹cych funkcjonalnoœæ Accessa. Public Function ChangePicture() As String On Error GoTo ChangePictureError Dim intpicture As Integer Dim strpicture As String Dim ctlpicture As Control Set frm = Screen.ActiveForm intpicture = frm![frapicture] Set ctlpicture = frm![imgbackground] Select Case intpicture Case 1 strpicture = "imgbooks" Case 2 strpicture = "imgcontacts" Case 3 strpicture = "imgmusic" Case 4 strpicture = "imgfood" Case 5 strpicture = "imghoushold" Case 6 strpicture = "imginventory" Case 7 strpicture = "imgmembers" Case 8 strpicture = "imgmoney" Case 9 strpicture = "imgphoneorders"
682 Czêœæ VI: Zaawansowane techniki Accessa Case 10 strpicture = "imgphotos" Case 11 strpicture = "imgresources" Case 12 strpicture = "imgschool" Case 13 strpicture = "imgvideos" Case 14 strpicture = "imgworkout" End Select ctlpicture.picture = frm.controls(strpicture).picture ChangePicture = frm.controls(strpicture).picture ChangePictureExit: Exit Function ChangePictureError: MsgBox "B³¹d nr: " & Err.Number & "; Opis: " & Err.Description Resume ChangePictureExit End Function Instrukcja While...Wend Ta konstrukcja wykonuje seriê instrukcji, gdy spe³niony jest podany warunek. U ywa siê jej stosunkowo rzadko, poniewa struktura Do...Loop jest znacznie bardziej elastyczna. Instrukcja With Instrukcja With (pojawi³a siê w Accessie 97) u³atwia wykonywanie wielu operacji na jakimœ obiekcie (lub zmiennej), gdy pozwala unikn¹æ powtarzania nazwy tego obiektu. Poni szy fragment kodu (pochodz¹cy z jednego z formularzy Accessa) ustawia w³aœciwoœæ Visible formantu pola kombi i wywo³uje dwie metody tego formantu: With Me![cboAuthorSearchList].Visible = True.SetFocus.Dropdown End With Konwencje nazewnicze Podczas pracy nad pierwszymi wersjami Accessa dwóch jego wspó³twórców, Stan Leszynski i Greg Reddick, opracowa³o konwencjê nazewnicz¹ obiektów Accessa, opart¹ na tzw. notacji wêgierskiej Charlesa Simonyiego, i zaproponowa³o j¹ jako standard. Konwencja nazewnicza Leszynskiego-Reddica (L/R; Leszynski-Reddick Naming Convention) tak przyjêto j¹ nazywaæ ma u³atwiaæ programistom-projektantom zrozumienie w³asnego kodu (zw³aszcza w sytuacjach, gdy wracaj¹ do niego po up³ywie pewnego czasu), a innym programistom analizowanie kodu obcego autor-
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 683 stwa. Konwencja L/R zosta³a opublikowana w lutym 1993 roku w dokumencie Smart Access i by³a powszechnie stosowana przez programistów Accessa a do pojawienia siê wersji 95. PóŸniej konwencja ta rozwinê³a siê w dwóch kierunkach: LNC (Leszynski Naming Convention) oraz RVBA (Reddick VBA Naming Convention), lecz w dalszym ci¹gu oba wymienione rozwi¹zania w znacznym stopniu siê pokrywaj¹. Po co stosowaæ konwencjê nazewnicz¹? Mówi¹c najproœciej, jej u ycie w odniesieniu do obiektów i formantów bazy danych sprawia, e kod tej bazy sam siê dokumentuje. Za ka dym razem, gdy widzisz listê rozwijan¹ z obiektami bazy danych, tag ka dego elementu bêdzie ciê informowa³ o rodzaju obiektu, który opisuje. Analogicznie, gdy w kodzie VBA widzisz odwo³anie do jakiegoœ obiektu, formantu lub pola, od razu wiesz, jakiego typu jest ten element atoprzecie jest kluczow¹ informacj¹ potrzebn¹ do zrozumienia, co mo na zrobiæ z danym elementem. Mo esz wywo³aæ procedurê, ustawiæ wartoœæ formantu lub zastosowaæ zmienn¹ jako argument funkcji. Je eli jednak spróbujesz wywo³aæ formant, podaæ nazwê formularza jako argument typu Integer funkcji lub odwo³aæ siê do w³aœciwoœci Height zmiennej, wyst¹pi b³¹d kompilacji lub b³¹d czasu wykonania. Konsekwentne stosowanie konwencji nazewniczej pozwala unikn¹æ takich b³êdów, poniewa na podstawie tagu wiesz, e frmsales jest nazw¹ formularza, a intchildren nazw¹ zmiennej typu Integer, zaœ CalcTotals to nazwa procedury (poniewa w przypadku procedur tagi nie s¹ stosowane). W notacji wêgierskiej (nazwa zosta³a zaczerpniêta od narodowoœci jej autora) podczas nazywania obiektów stosuje siê nastêpuj¹cy schemat: [przedrostki][tag]nazwabazowa[przyrostek/kwalifikator] W tabeli 20.3 znajduje siê opis ka dego z elementów tego schematu. Tabela 20.3. Sk³adniki notacji wêgierskiej Sk³adnik Opis Przyk³ad Przedrostki Tag NazwaBazowa Przyrostek (RVBA) lub Kwalifikator (LNC) Ma³a litera, uzupe³niaj¹ca informacje dostarczane przez tag. Trzy- lub czteroliterowa sekwencja okreœlaj¹ca typ obiektu. Jedno lub wiêcej s³ów, opisuj¹cych sam obiekt. Ka de s³owo w nazwie rozpoczyna siê wielk¹ liter¹. S³owo dostarczaj¹ce dodatkowych informacji o nazwie bazowej. Jego pocz¹tkowa litera jest wielka. p w przypadku zmiennych Public frm w przypadku formularzy PracownicyWgID, co mo e oznaczaæ na przyk³ad pracowników uporz¹dkowanych wed³ug identyfikatorów. Max w przypadku ostatniego elementu tablicy Z wymienionych czterech sk³adników wymagany jest tylko tag, chocia wiêkszoœæ nazw obiektów sk³ada siê z tagu i nazwy bazowej. Samodzielny tag jest przydatny podczas deklarowania zmiennej w kodzie VBA, na przyk³ad frm jako oznaczenie zmiennej reprezentuj¹cej formularz. Nie musisz u ywaæ wszystkich opisanych sk³adników najwiêcej korzyœci daje pos³ugiwanie siê samymi tagami.
684 Czêœæ VI: Zaawansowane techniki Accessa UWAGA W tej ksi¹ ce pos³ugujê siê konwencj¹ LNC, poniewa najbardziej przypomina ona oryginaln¹ konwencjê nazewnicz¹ L/R, z której korzystam, odk¹d sie pojawi³a. Zarówno LNC, jak i RVBA rozwinê³y siê w oparciu o nazewnictwo obiektów Accessa oraz jêzyk Access Basic (póÿniejszy Access VBA). Obecnie standardy te upowszechni³y siê równie w innych dialektach jêzyka VBA, a wiêc obejmuj¹ znacznie szerszy obszar, ni oryginalne sk³adniki Accessa. Pe³ny opis tych konwencji nazewniczych wykracza poza tematykê tej ksi¹ ki. Je eli jednak chcesz uzyskaæ najnowsz¹ wersjê konwencji LNC, mo esz j¹ pobraæ ze strony http://www.kwery.com. Najnowsz¹ wersjê konwencji RVBA znajdziesz na stronie http://www.xoc.net. Wprowadzanie konwencji nazewniczej w nowej bazie danych Aby zastosowaæ konwencjê LNC w nowej bazie danych, wystarczy odpowiednio nazywaæ tworzone obiekty, formanty, zmienne i (je eli trzeba) pola, wykorzystuj¹c w tym celu tagi i nazwy bazowe. (Wykaz tagów LNC stosowanych w bazach danych Accessa znajdziesz w tabelach od 20.4 do 20.10). Chocia pocz¹tkowo konwencja LNC mo e siê wydawaæ niewygodna, szybko odczujesz korzyœci. Je eli w nazwach wszystkich obiektów bazy danych zastosujesz trzylub czteroliterowe tagi, od razu bêdziesz w stanie stwierdziæ, jakiego typu obiekt masz przed sob¹. Chocia Access (pocz¹wszy od wersji Access 2000) na listach rozwijanych Ÿróde³ rekordów oferuje oddzielne karty dla tabel i kwerend oraz, w niektórych przypadkach, poprzedza nazwy tych obiektów informacj¹, czy s¹ one tabelami czy obiektami, to jednak stosowanie konwencji LNC pozwala uzyskaæ o wiele wiêcej informacji i u³atwia wskazanie odpowiednich obiektów (na przyk³ad wybranie kwerendy dla podformularza). W bazie danych, w której zastosowano konwencjê nazewnicz¹, gdy w kodzie lub kryterium kwerendy tworzysz wyra enie odwo³uj¹ce siê do pola lub formantu formularza, tag nazwy obiektu informuje, czy jest on formantem na formularzu, czy te zwi¹zanym z nim polem tabeli. Spróbuj porównaæ to rozwi¹zanie z nazwami u ywanymi w formularzach lub raportach utworzonych za pomoc¹ kreatora niestety Access przypisuje formantom takie same nazwy, jakie maj¹ zwi¹zane z nimi pola, co mo e prowadziæ do czêstych b³êdów w wyra eniach. Je eli jednak stosujesz konwencjê nazewnicz¹, nie dojdzie do pomylenia formantów z polami. Od razu bêdziesz wiedzia³, czy jakaœ tabela jest tabel¹ odnoœników, tabel¹ systemow¹ lub tabel¹ po³¹czon¹ albo czy jakaœ kwerenda jest kwerend¹ do³¹czaj¹c¹, tworz¹c¹ tabelê lub jeszcze innego typu. Gdy do swojego kodu powrócisz po szeœciomiesiêcznej przerwie, z pewnoœci¹ szybciej go zrozumiesz. Nie tylko ty, równie inni programiœci. Je eli zaœ pracujesz w zespole programistów i wszyscy twoi wspó³pracownicy stosuj¹ tê sam¹ konwencjê, o wiele ³atwiej bêdzie ci zrozumieæ kod ich autorstwa. Oczywiœcie ka dy programista (równie ty) mo e dodawaæ swoje w³asne rozszerzenia do konwencji nazewniczej. Na przyk³ad ja zastosowa³am tag tmp, oznaczaj¹cy szablon formularza lub raportu, tag fpri, oznaczaj¹cy formularz podstawowy bazy danych, tag qtot, u ywany w kwerendach sumuj¹cych oraz tag tmak stosowany w tabelach utworzonych za pomoc¹ kwerendy. Ten ostatni tag przypomina mi, e je eli chcê zmieniæ strukturê takiej tabeli, muszê zmodyfikowaæ odpowiedni¹ kwerendê qmak, a nie sam¹ tabelê.
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 685 Chocia konwencja LNC wprowadza tagi dla wielu ró nych obiektów, z którymi mo e zetkn¹æ siê autor kodu VBA, niektóre z nich (na przyk³ad struktury typów) s¹ rzadko wykorzystywane przez typowego u ytkownika. Wszyscy u ytkownicy Accessa powinni u ywaæ tagów przynajmniej w nazwach obiektów bazy danych, nazwach formantów i zmiennych. Zaawansowani u ytkownicy prawdopodobnie bêd¹ ich równie u ywaæ w nazwach innych obiektów, skorzystaj¹ te pewnie z przedrostków i kwalifikatorów. Poni sze tabele zawieraj¹ nazwy tagów w konwencji LNC, uzupe³nionej o kilka elementów mojego autorstwa. Tabela 20.4 przedstawia tagi LNC dotycz¹ce obiektów bazy danych. Tabela 20.5 zawiera tagi zwi¹zane z polami. W tabeli 20.6 znajdziesz tagi u ywane do nazywania zmiennych. W tabeli 20.7 znajduj¹ siê tagi kontrolek a w tabeli 20.8 przedrostki obiektów. Tabela 20.9 przedstawia listê przedrostków okreœlaj¹cych zasiêg i czas ycia zmiennych, natomiast tabela 20.10 listê kwalifikatorów. UWAGA Tagi i inne identyfikatory przedstawione w tych tabelach s¹ jedynie czêœci¹ ca³ej konwencji LNC. Aby uzyskaæ pe³ny wykaz tych identyfikatorów, zapoznaj siê z opracowaniem LNC for Access dostêpnym na stronie http://www.kwery.com. Tabela 20.4. Tagi LNC obiektów bazy danych Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Modu³ klasy Class module cls Strona dostêpu do danych Data access page dap Formularz Form frm Formularz (dialogowy) Form (dialog) fdlg Formularz (menu) Form (menu) fmnu Formularz (komunikat) Form (message) fmsg Form (podformularz) Form (subform) fsub Makro Macro mcr Modu³ Module bas Kwerenda (dowolnego typu) Query qry Kwerenda (do³¹czaj¹ca) Query (append) qapp Kwerenda (krzy owa) Query (crosstab) qxtb Kwerenda (definiuj¹ca dane) Query (data definition) qddl Kwerenda (usuwaj¹ca) Query (delete) qdel Kwerenda (z filtra) Query (form filter) qflt Kwerenda (odnoœnika) Query (lookup) qlkp Kwerenda (tworz¹ca tabele) Query (make-table) qmak Kwerenda (wybieraj¹ca) Query (select) qry (lub qsel) Kwerenda (przekazuj¹ca SQL) Query (SQL pass-through) qspt Kwerenda (sumuj¹ca) Query (totals) qtot Dokoñczenie tabeli na nastêpnej stronie
686 Czêœæ VI: Zaawansowane techniki Accessa Dokoñczenie tabeli z poprzedniej strony Tabela 20.4. Tagi LNC obiektów bazy danych Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Kwerenda (sk³adaj¹ca) Query (union) quni Kwerenda (aktualizuj¹ca) Query (update) qupd Raport Report rpt Raport (podraport) Report (subreport) rsub Tabela Table tbl Tabela (do³¹czona dbase) Table (attached dbase) tdbf Tabela (do³¹czona Excel) Table (attached Excel) txls Tabela (do³¹czona FoxPro) Table (attached FoxPro) tfox Tabela (do³¹czona Lotus) Table (attached Lotus) twks Tabela (do³¹czona ODBC) Table (attached ODBC) todb Tabela (do³¹czona Paradox) Table (attached Paradox) tpdx Tabela (do³¹czona SQL Server) Table (attached SQL Server) tsql Tabela (do³¹czona tekstowa) Table (attached text) ttxt Tabela (odnoœników) Table (lookup) tlkp Tabela (relacja wiele-do-wielu) Table (many-to-many relationship) trel Tabela 20.5. Tagi LNC pól tabeli Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Autonumerowanie Autonumber (random non-sequential) idn (losowe niesekwencyjne) Autonumerowanie Autonumber (replication ID) idr (identyfikator replikacji) Autonumerowanie (sekwencyjne) Autonumber (sequential) ids Binarny Binary bin Bajt Byte byt Walutowy Currency cur Data/Godzina Date/Time dtm Podwójna precyzja Double dbl Hiper³¹cze Hyperlink hlk Liczba ca³kowita Integer int Liczba ca³kowita d³uga Long lng Nota Memo mem OLE OLE ole Pojedyczna precyzja Single sng Tekst (znakowy) Text (character) chr Tak/Nie (boole'owska) Yes/No (Boolean) bln
Rozdzia³ 20: Udoskonalanie bazy danych za pomoc¹ kodu VBA 687 Tabela 20.6. Tagi LNC zmiennych jêzyka VBA Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Pole kombi Combo box cbo Pasek polecenia Command bar cbr Formant (ogólnie) Control (generic) ctl Walutowy Currency cur Baza danych Database dbs Podwójna precyzja Double dbl Formularz Form frm Liczba ca³kowita Integer int Etykieta Label lbl Pole listy List box lst Liczba ca³kowita d³uga Long lng Definicja kwerendy QueryDef qdf Raport Report rpt Pojedyncza precyzja Single sng Migawka Snapshot snp Ci¹g znaków String str Tabela Table tbl Pole tekstowe Text box txt Typ (zdefiniowany przez u ytkownika) Type (user-defined) typ Wariant Variant var Tabela 20.7. Tagi LNC formantów Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Zwi¹zana ramka obiektu Bound object frame frb Wykres Chart cht Pole wyboru Check box chk Pole kombi Combo box cbo Przycisk polecenia Command button cmd Formant niestandardowy (ActiveX) Custom control (ActiveX control) ocx Ramka Frame fra Hiper³¹cze Hyperlink hlk Obraz Image img Etykieta Label lbl Linia Line lin Pole listy List box lst Przycisk opcji Option button opt Grupa opcji Option group grp Strona (karta) Page (tab) pge Koniec strony Page break brk Dokoñczenie tabeli na nastêpnej stronie
688 Czêœæ VI: Zaawansowane techniki Accessa Dokoñczenie tabeli z poprzedniej strony Tabela 20.7. Tagi LNC formantów Obiekt (nazwa polska) Obiekt (nazwa angielska) Tag Prostok¹t (kszta³t) Rectangle (shape) shp Podformularz/podraport Subform/report sub Pole tekstowe Text box txt Przycisk prze³¹cznika Toggle button tgl Niezwi¹zana ramka obiektu Unbound object frame fru Tabela 20.8. Przedrostki LNC obiektów bazy danych Obiekt Obiekty niegotowe lub w trakcie projektowania oraz kopie zapasowe Ukryte (h =hidden) obiekty systemowe Wyœwietlone obiekty systemowe (s = system) Tworzone programowo obiekty tymczasowe (t=temporary) Kopie zapasowe obiektów, przeznaczone do dalszego kopiowania lub u ycia Przedrostek _ lub - (W Accessie 2000 i nowszych myœlniki sortuj¹ do pocz¹tku listy obiektów bazy danych) zh zs zt zz Tabela 20.9. Przedrostki LNC okreœlaj¹ce zasiêg i czas ycia obiektów Typ zmiennej Zmienna lokalna Statyczna zmienna lokalna Zmienna na poziomie modu³u Zmienna publiczna w module formularza lub raportu Zmienna publiczna zadeklarowana w sekcji Declarations modu³u standardowego Przedrostek [bez przedrostka] s m p g Tabela 20.10. Kwalifikatory LNC Kwalifikator Curr Dest First Hold Last Max Min New Next Opis Bie ¹cy (ang. current) element zestawu Docelowy (ang. destination) Pierwszy (ang. first) element zestawu Przechowuje (ang. hold) wartoœæ do póÿniejszego u ycia Ostatni (ang. last) element zestawu Najwiêkszy (ang. maximum) element zestawu Najmniejszy (ang. minimum) element zestawu Nowe (ang. new) wyst¹pienie lub wartoœæ Nastêpny (ang. next) element zestawu