Materiały pomocnicze do zajęć z przedmiotu Projekt ADP



Podobne dokumenty
Materiały pomocnicze do zajęć z przedmiotu Projekt ADP

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

BAZY DANYCH Panel sterujący

Aplikacje w środowisku VBA. Visual Basic for Aplications

Materiały do laboratorium MS ACCESS BASIC

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

MsgBox(Komunikat [, Przyciski] [, Tytuł] [, PlikHelp, HelpContext])

Przewodnik Szybki start

Rejestracja sprzedaży

Obowiązuje od wersji

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Bazy danych. Polecenia SQL

5.4. Tworzymy formularze

SQL (ang. Structured Query Language)

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika

DECLARE VARIABLE zmienna1 typ danych; BEGIN

5. Bazy danych Base Okno bazy danych

System imed24 Instrukcja Moduł Analizy i raporty

Zapytania i wstawianie etykiet z bazy danych do rysunku

Karty pracy. Ustawienia. W tym rozdziale została opisana konfiguracja modułu CRM Karty pracy oraz widoki i funkcje w nim dostępne.

Microsoft Access. Prezentacja

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Ćwiczenia 2 IBM DB2 Data Studio

INSTRUKCJA. ERP OPTIMA - Obsługa w zakresie podstawowym dla hufców. Opracował: Dział wdrożeń systemów ERP. Poznań, wersja 1.

Tworzenie bazy danych na przykładzie Access

Symfonia Mała Księgowość 2013 Specyfikacja zmian

Składowane procedury i funkcje

Makra Access 2003 wg WSiP Wyszukiwanie, selekcjonowanie i gromadzenie informacji Ewa Mirecka

Formularze w programie Word

MS Excell 2007 Kurs podstawowy Filtrowanie raportu tabeli przestawnej

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Przygotowanie formularza do wypożyczenia filmu:

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Bazy danych Ćwiczenie 1 Instrukcja strona 1 Wersja ogólna

Rejestracja faktury VAT. Instrukcja stanowiskowa

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Tworzenie makr warunkowych

1. Zarządzanie informacją w programie Access

Hurtownia Świętego Mikołaja projekt bazy danych

Wykład 5. SQL praca z tabelami 2

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Podstawy technologii WWW

Instrukcja użytkownika. Aplikacja Smart Paczka DPD

MODUŁ INTEGRUJĄCY ELEKTRONICZNEGO NADAWCĘ Z WF-MAG SPIS TREŚCI

15. Funkcje i procedury składowane PL/SQL

5.3. Tabele. Tworzenie tabeli. Tworzenie tabeli z widoku projektu. Rozdział III Tworzenie i modyfikacja tabel

Visual Basic for Applications. Wstęp

QUERY język zapytań do tworzenia raportów w AS/400

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Autor: Joanna Karwowska

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Wprowadzenie (17) Część I. Makra w Excelu - podstawy (23)

Tworzenie raportów. Ćwiczenie 1. Utwórz Autoraport przedstawiający tabelę Studenci

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Bazy danych Karta pracy 1

Instrukcje cykliczne (pętle) WHILE...END WHILE

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Oracle Application Express

Obsługa zdarzeń w formularzach przy pomocy makr

ACCESS ćwiczenia (zestaw 1)

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

MS Access formularze

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PODSTAWOWY.

UWAGA!!! Przed przystąpieniem do zamknięcia roku proszę zrobić kopie bezpieczeństwa

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

LibreOffice Calc VBA

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Relacyjne bazy danych. Podstawy SQL

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

DAO. tworzenie tabeli

Wykład III. dr Artur Bartoszewski Wydział Nauczycielski, Kierunek Pedagogika Wprowadzenie do baz danych

Wyzwalacze (triggery) Przykład

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 4. Instrukcja warunkowa.

PL/SQL. Zaawansowane tematy PL/SQL

KaŜdy z formularzy naleŝy podpiąć do usługi. Nazwa usługi moŝe pokrywać się z nazwą formularza, nie jest to jednak konieczne.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Zadanie. Menu Plik niech posiada dwie pozycje: Tekstowy i Excel, a każda z nich niech posiada dwie pozycje Otwórz i Zapisz, patrz rys. 2.

Zastanawiałeś się może, dlaczego Twój współpracownik,

LABORATORIUM 6: ARKUSZ MS EXCEL JAKO BAZA DANYCH

Podstawy Programowania 2

Symfonia Handel 2013 Specyfikacja zmian

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Połączenie AutoCad'a z bazą danych

MenadŜer haseł Instrukcja uŝytkownika

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

1. Przypisy, indeks i spisy.

Transkrypt:

Dr Janusz Górczyński Materiały pomocnicze do zajęć z przedmiotu Projekt ADP Czym jest projekt ADP? Projekt Microsoft Access (.adp) jest typem pliku programu Access, który zapewnia skuteczny dostęp w trybie macierzystym do bazy danych Microsoft SQL Server za pomocą architektury składnika OLE DB. Używając projektu Access, można utworzyć aplikację klient/serwer, w której projekt ADP może być połączony ze zdalną bazą danych SQL Server lub lokalną bazą danych SQL Server Charakterystyczną cechą projektu ADP jest: 1. Połączenie projekt programu Access z bazą danych SQL Server. 2. Przechowywanie w bazie danych SQL Server takich obiektów jak: Tabele, Widoki, Diagramy. 3. Przechowywanie w projekcie Access formularzy, raportów i modułów. W jaki sposób tworzymy nowy projekt ADP? Wystarczy po prostu utworzyć nowy plik bazy danych, przy czym jako typ pliku wybieramy opcję *.adp, po jego utworzeniu Access wyświetla okna dialogowe, w którym wskazujemy serwer SQL i bazę danych, z którą zwiążemy utworzony projekt. Poniżej okno dialogowe w którym wskazujemy serwer SQL, sposób identyfikacji użytkownika oraz bazę danych.

Czy można zmienić bazę danych i serwer SQL? Oczywiście tak, w przycisku głównym Accessa znajdziemy polecenie Serwer, a dalej Połączenie. Jego klik otworzy pokazane wcześniej okno Właściwości łącza danych. Przykładowy Projekt Na dysku wspolny\podyplomowe jest plik o nazwie AnkietaSQL.adp, możemy go wykorzystać jako przykładowy projekt ADP. Po jego uruchomieniu trzeba wywołać okno właściwości łącza danych i zmienić serwer oraz bazę danych na włną. Jak wywołać procedurę przechowywaną? W bazie SQL utworzono procedurę przechowywaną zwracającą liczbę rekordów w tabeli PrzedmiotProwadzacy dla określonej wartości pola id_w i określonej wartości pola id_p. Definicja tej procedury pokazana jest niżej. Jak widzimy w procedurze zdefiniowano dwa parametry typu input o nazwach odpowiednio @idw oraz @idp, oba typu integer, oraz parametr typu output o nazwie @TakNie, także typu integer. create procedure [dbo].[pczymoznadodacprzedmiotwykladowca] @idw int, @idp int, @TakNie int out select @TakNie = COUNT(*) from PrzedmiotProwadzacy where id_w=@idw and id_p=@idp Klyczny sposób wywołania tej procedury przechowywanej przedstawiony jest w procedurze o nazwie TestProcedury utworzonej w module o nazwie Testowy w projekcie ADP. Komentarze powinny wyjaśnić sens i znaczenie poszczególnych instrukcji. Public Sub TestProcedury() ' deklaracja potrzebnych zmiennych i obiektów Dim cmd As ADODB.Command, prm As ADODB.Parameter ' tworzymy obiekt command Set cmd = New ADODB.Command ' podajemy nazwę procedury do wykonania cmd.commandtext = "dbo.pczymoznadodacprzedmiotwykladowca" ' określamy typ polecenia (jako procedurę przechowywaną) cmd.commandtype = adcmdstoredproc ' tworzymy kolejne parametry tej procedury i dodajemy je do kolekcji parametrów Set prm = cmd.createparameter("idw", adinteger, adparaminput) prm.value = 1 'przykładowa wartosc 'dodanie parametru do kolekcji parametrów obiektu command cmd.parameters.append prm ' drugi parametr typu input Set prm = cmd.createparameter("idp", adinteger, adparaminput) prm.value = 2 'przykładowa wartosc 'dodanie parametru do kolekcji paramaetrów obieku command cmd.parameters.append prm

' parametr wychodzący output Set prm = cmd.createparameter("taknie", adinteger, adparamoutput) 'dodanie parametru do kolekcji paramaetrów obieku command cmd.parameters.append prm ' zdefinuiwanie aktywnego połączenia dla obiektu command Set cmd.activeconnection = CurrentProject.Connection ' wykonanie polecenia cmd.execute ' odebranie I wyświetlenie zwróconego parametru MsgBox cmd.parameters("taknie") ' zwalniamy pamięć RAM Set cmd = Nothing Set prm = Nothing Jak widać musimy zrealizować kilka kroków: 1. Utworzyć obiekt Command modelu ADO i określić jego właściwości CommandText i CommandType; 2. Zbudować kolekcję parametrów obiektu Command, czyli dla każdego parametru wykonujemy: a) Tworzymy obiekt Parameter podając jego nazwę, typ danych, kierunek i opcjonalnie rozmiar; b) Dla parametrów wchodzących przypisujemy jego wartość; c) Dodajemy utworzony parametr do kolekcji parametrów obiektu Command; 3. Przypisujemy aktywne połączenie do właściwości ActiveConnection obiektu Command; 4. Wykonujemy polecenie poprzez wywołanie metody Execute obiektu Command; 5. Jeżeli przewiduje to procedura przechowywana, to odbieramy parametr zwracany (typu output). W przykładowej bazie danych utworzyłem dedykowany moduł o nazwie ForStorageSub, moduł ten zawiera procedury i funkcje znakomicie ułatwiające wywoływanie procedur przechowywanych. Pokazana niżej procedura realizuje dokładnie to samo, co pokazana wyżej procedura TestProcedury. Public Sub TestForStorageSub() ' dokładnie to samo, ale z wykorzystaniem funkcji fdajwartosc MsgBox fdajwartosc("dbo.pczymoznadodacprzedmiotwykladowca", _ "idw", 1, p_integer, 0, _ "idp", 1, p_integer, 0, _ "TakNie", p_integer, 0) Jak utworzyć rekordset? W bazie mamy procedurę przechowywaną o nazwie dbo.pdajkierunki, jej zadaniem jest zwrócenie posortowanych informacji z tabeli Kierunki. ALTER procedure [dbo].[pdajkierunki] @idp int select id_k, Kierunek from Kierunki order by kierunek W procedurze zdefiniowano, z uwagi na moduł ForStorageSub, jeden pusty parametr o nazwie @idp typu integer. Pusty w tym sensie, że jest potrzebny z uwagi na procedury wspomnianego modułu, bowiem w samej procedurze przechowywanej nie jest wykorzystywany w żadnym warunku Where. Zestaw rekordów zwracany przez tę procedurę pokazany jest niżej.

Napiszemy teraz procedurę VBA, której zadaniem będzie wykonanie procedury przechowywanej pkierunki, a ntępnie z wykorzystaniem funkcji MsgBox wyświetlimy zwrócone informacje na ekranie. Public Sub KlycznyTestRekordsetu() ' deklaracja potrzebnych zmiennych i obiektów Dim cmd As ADODB.Command, prm As ADODB.Parameter, rst As ADODB.Recordset, _ t As String, i As Integer ' tworzymy obiekt command Set cmd = New ADODB.Command ' podajemy nazwę procedury do wykonania cmd.commandtext = "dbo.pdajkierunki" ' określamy typ polecenia (jako procedurę przechowywaną) cmd.commandtype = adcmdstoredproc ' tworzymy kolejne parametry tej procedury i dodajemy je do kolekcji parametrów Set prm = cmd.createparameter("idp", adinteger, adparaminput) prm.value = 1 'przykładowa wartosc ' dodanie parametru do kolekcji parametrów obiektu command cmd.parameters.append prm Set cmd.activeconnection = CurrentProject.Connection ' wykonanie polecenia Set rst = cmd.execute ' jeżeli są rekordy, to budujemy zmienną t If rst.recordcount > 0 Then t = "" For i = 1 To rst.recordcount t = t & Str(rst(0)) & " " & rst(1) & vbcrlf rst.movenext Next i t = Left(t, Len(t) - 1) MsgBox t, vbinformation, "Test rekordsetu" Else MsgBox "Brak rekordów", vbcritical, "Test rekordsetu" End If ' zamykamy obiekt recordset rst.close ' usuwamy wszytskie obiekty Set rst = Nothing Set cmd = Nothing Set conn = Nothing Z wykorzystaniem funkcji fdajrekordset z modułu ForStorageSub można to zrealizować znacznie prościej (w części dotyczącej uzyskania rekordsetu). Public Sub TestRekordsetuWgJG() Dim rst As ADODB.Recordset, t As String, i As Integer ' przypisanie do obiektu rst rekordsetu zwróconego przez fdajrekordset Set rst = fdajrekordset("dbo.pdajkierunki", _ "idp", 1, p_integer, 0) If rst.recordcount > 0 Then t = "" For i = 1 To rst.recordcount t = t & Str(rst(0)) & " " & rst(1) & vbcrlf rst.movenext Next i t = Left(t, Len(t) - 1) MsgBox t, vbinformation, "Test rekordsetu wg JG" Else MsgBox "Brak rekordów", vbcritical, "Test rekordsetu wg JG" End If rst.close Set rst = Nothing Myślę, że porównanie kodów obu procedur pozwala na sformułowanie wniosku, że warto było poświęcić trochę czu na wymyślenie modułu ForStorageSub. Autor tego tekstu wykorzystuje ten moduł w aplikacjach zarówno VBA (Word, Excel, Access) jak i VB.NET do komunikacji z bazą danych MS SQL.

Dostosowanie dotychczowego projektu do potrzeb adp. Na wcześniejszych zajęciach zajmowaliśmy się bazą danych AnkietaNew.accdb, między innymi był w niej tworzony formularz o nazwie frmludzieprzedmioty, był on przeznaczony do zarejestrowania w bazie danych przedmiotów realizowanych przez danego wykładowcę. Poszczególne kontrolki tego formularza (dokładniej zdarzenia z nimi związane) były obsługiwane przez procedury VBA wykorzystujące jawnie język SQL do definiowania zapytań, zarówno wybierających jak i wykonawczych (typu insert, update, delete). Procedury te były najpierw tworzone w module tego formularza, a ntępnie została utworzona kla o nazwie CLudziePrzedmioty z metodami realizującymi obsługę potrzebnych zdarzeń. Poniżej widok kodu metody obsługującej zdarzenie związane z otwarciem formularza, dwie ostatnie instrukcje definiują źródła wierszy kontrolek cbowykladowca oraz lstdowyboru. Public Sub FormOpen(ByRef frm As Form_frmLudziePrzedmioty) Dim i As Integer With frm.lstwybrane If.ListCount > 0 Then For i =.ListCount - 1 To 0 Step -1.RemoveItem i Next i End If End With frm.etykieta8.visible = False frm.lstdowyboru.enabled = False frm.cbowykladowca.rowsource = _ "SELECT Wykladowcy.id_w, [Tytul] & chr(032) & [Prowadzacy] AS Ktos " & _ "FROM Wykladowcy ORDER BY Wykladowcy.Prowadzacy" ' zdefiniowanie źródła danych dla lstdowyboru (komplet przedmiotów) frm.lstdowyboru.rowsource = _ "SELECT Przedmioty.id_p, Przedmioty.Przedmiot FROM Przedmioty " & _ " order by Przedmioty.Przedmiot" Utworzony formularz frmludzieprzedmioty możemy wykorzystać w projekcie adp bez dokonywania jakiejkolwiek zmiany, wystarczy po prostu jego zaimportowanie z poprzedniego rozwiązania (czyli z bazy AnkietaNew.accdb). Musimy także zaimportować klę CLudziePrzedmioty, ale kod tej kly musimy dostosować do faktu, że mamy do czynienia z projektem adp, tym samym nie będziemy korzystać z jawnie definiowanych zapytań SQL, lecz z procedur przechowywanych. Jak zaimportować potrzebne obiekty z bazy AnkietaNew.accdb? Kolejne kroki importu to: 1. Otwieramy docelowy projekt (np. AnkietaSQL.adp); 2. Odszukujemy zakładkę Dane zewnętrze we wstążce, rozwijamy, wykonujemy klik na typie pliku źródłowego (my wybieramy Access); 3. W oknie dialogowym Pobieranie danych zewnętrznych wskazujemy folder i plik źródłowy, czyli bazę AnkietaNew.accdb.

4. Po wskazaniu pliku źródłowego otwieramy go poprzez klik przycisku Otwórz, w nzym przypadku przed jego otwarciem zostanie wyświetlony komunikat ostrzegający o tym, że chcemy importować obiekty z innego formatu danych, co może spowodować pewne problemy z ich obsługą. 5. Wybieramy przycisk OK dla kontynuacji, co skutkuje otwarciem okna Importowanie obiektów, w oknie tym uaktywniamy zakładkę Formularze, a ntępnie wskazujemy formularz do zaimportowania. Klik przycisku OK kończy import tego obiektu. W analogiczny sposób importujemy klę CLudziePrzedmioty.

Modyfikacja kly CLudziePrzedmioty Modyfikacja dotyczyć będzie tych metod i właściwości kly, które odwołują się do bazy danych. Poniżej kod metody ZmianaPracownika, metoda ta obsługuje zdarzenie aktualizacji pola cbowykladowca, zmieniony fragment kodu został pogrubiony. Public Sub ZmianaPracownika(ByRef frm As Form_frmLudziePrzedmioty) frm.etykieta8.caption = frm.cbowykladowca.column(1) & _ ": wybrane przedmioty" frm.lstdowyboru.enabled = True ' dynamiczne zdefiniowanie źródła danych dla lstdowyboru, chodzi o to, aby ' nie były wyświetlane te przedmioty, które już przypisano wybranemu wykładowcy frm.lstdowyboru.rowsource = _ "execute dbo.pprzedmiotydowyborudanegopracownika " & frm.cbowykladowca Proszę zwrócić uwagę na wywołanie procedury przechowywanej (zwracającej rekordset) jako źródła wierszy dla takich formantów jak ComboBox czy ListBox. W dalszej części zobaczymy podobne rozwiązanie w przypadku przypisywania źródła danych dla raportu (także formularza). Zawsze będzie to składnia jak niżej: Formant.RowSource = execute nazwa_procedury_przechowywanej ewentualne_parametry W przypadku, gdy parametry są dynamiczne, stosujemy operator & do ich dołączenia (jak w metodzie ZmianaPracownika). Podobne zmiany wprowadzamy w metodzie FormOpen. Public Sub FormOpen(frm As Form_frmLudziePrzedmioty) Dim i As Integer With frm.lstwybrane If.ListCount > 0 Then For i =.ListCount - 1 To 0 Step -1.RemoveItem i Next i End If End With frm.etykieta8.visible = False frm.lstdowyboru.enabled = False frm.cbowykladowca.rowsource = "execute dbo.pdajlisteludzi 1" ' zdefiniowanie źródła danych dla lstdowyboru (komplet przedmiotów) frm.lstdowyboru.rowsource = "execute dbo.pdajlisteprzedmiotow 0" W metodzie ZapiszDane zmian jest trochę więcej (są wytłuszczone). Public Sub ZapiszDane(frm As Form_frmLudziePrzedmioty) On Error GoTo errhandler Dim idw As Integer, idp As Integer If frm.lstdowyboru.itemsselected.count = 0 Then mkomunikat = "Bądź uprzejmy wybrać przynajmniej jeden przedmiot " & _ vbcrlf & "dla kierunku " & frm.cbowykladowca.column(1) mstate = -1 Else idw = frm.cbowykladowca.value Dim i As Integer, t As String, X As Integer ' będziemy przeglądać kolekcje zaznaczonych elementów odczytując ich indeks Dim ip As Variant ' zmienna dla pętli For Each For Each ip In frm.lstdowyboru.itemsselected 'ip zawiera indeks zaznaczonego elementów, a my potrzebujemy idp przedmiotu idp = frm.lstdowyboru.itemdata(ip) ' trzeba zapisać dane w tabeli PrzedmiotWykladowca ' czy mogę zapisać kombinację idw, idp i = fdajwartosc("dbo.pczymoznadodacprzedmiotwykladowca", _ "idw", idw, p_integer, 0, _ "idp", idp, p_integer, 0, _ "TakNie", p_integer, 0) If i = 0 Then ' zapisujemy pwykonajprocedure "dbo.pwstawprzedmiotprowadzacy", _ "id_w", idw, p_integer, 0, _ "id_p", idp, p_integer, 0

X = X + 1 End If Next mkomunikat = "Zapisano w tabeli " & Str(X) & " rekordy" ' przygotowanie formularza do nowego kojarzenia ' usunięcie wyboru z pola kombi frm.cbowykladowca.value = 0 ' usunięcie zaznaczeń z listy lstdowyboru For Each ip In frm.lstdowyboru.itemsselected frm.lstdowyboru.selected(ip) = False Next ' usunięcie pozycji z listy lstwybrane For i = frm.lstwybrane.listcount - 1 To 0 Step -1 frm.lstwybrane.removeitem i Next i ' zmieniamy źródło danych dla lstdowyboru (na komplet przedmiotów) frm.lstdowyboru.rowsource = "execute dbo.pdajlisteprzedmiotow 0" mstate = 0 Exit Sub End If errhandler: mstate = -1 mkomunikat = "Wystąpiły problemy z zapisaniem danych" Oczywiście konieczne jest utworzenie na serwerze SQL wszystkich wykorzystanych procedur przechowywanych. CREATE procedure [dbo].[pprzedmiotydowyborudanegopracownika] @idw int SELECT Przedmioty.id_p, Przedmioty.Przedmiot FROM Przedmioty WHERE Przedmioty.id_p not in (select id_p from PrzedmiotProwadzacy where id_w = @idw) order by Przedmioty.Przedmiot create procedure [dbo].[pdajlisteludzi] @idp int select id_w, rtrim(tytul) + ' ' + Wykladowca Ktos from dbo.wykladowcy order by Wykladowca create procedure [dbo].[pdajlisteprzedmiotow] @idk int if @idk=0 select id_p, Przedmiot from Przedmioty order by Przedmiot else SELECT Przedmioty.id_p, Przedmioty.Przedmiot FROM Przedmioty INNER JOIN KierunkiPrzedmioty ON Przedmioty.id_p = KierunkiPrzedmioty.id_p WHERE (KierunkiPrzedmioty.id_k = @idk) order by Przedmioty.Przedmiot CREATE procedure [dbo].[pczymoznadodacprzedmiotwykladowca] @idw int, @idp int, @TakNie int out select @TakNie=COUNT(*) from PrzedmiotProwadzacy where id_w=@idw and id_p=@idp create procedure [dbo].[pwstawprzedmiotprowadzacy] @id_w int, @id_p int insert into PrzedmiotProwadzacy (id_w, id_p) values (@id_w, @id_p)

Rejestracja wykonania zajęć Nza baza danych powinna pozwolić także na rejestrację wykonanych zajęć dydaktycznych. Wymagać to będzie utworzenia dedykowanej tabeli, procedur przechowywanych oraz formularza ekranowego. Projekt tabeli o nazwie Wykonanie pokazany jest poniżej. Pola semestr, zjazd, idw, idp pozwolą na identyfikację semestru, zjazdu, wykładowcy i przedmiotu. Pola ilegodzin i Temat pozwolą na zapisanie liczby zajęć dydaktycznych oraz tematu zrealizowanych zajęć. Pole datar będzie przechowywać datę rozliczenia danego rekordu, a będzie wypełniane dopiero w momencie wystawienia zlecenia przelewu. Po stronie interfejsu musimy utworzyć odpowiedni formularz, będziemy go wykorzystywali do wprowadzania danych do powyższej tabeli. Formularz ten może mieć taki wygląd, jak pokazano to niżej. Zadanie utworzenia tego formularza wraz ze wszystkimi procedurami VBA i SQL będzie pracą włną studentów wykonywaną na zajęciach niedzielnych.

Rozliczenie wykonanych zajęć W poprzednim rozdziale wprowadziłem tabelę Wykonanie, tabela ta rejestruje fakt wykonania odpowiedniej liczby godzin przez poszczególnych wykładowców. Wykorzystamy teraz te dane do zautomatyzowania procesu wystawiania przelewów bankowych. Zrealizowanie tej funkcjonalności wymagało modyfikacji tabeli Wykladowcy do pokazanej niżej postaci. Pola NazwaBanku, Rachunek, FormaZ, StawkaG, Adres i Kod wprowadzono właśnie na potrzeby wystawiania przelewów bankowych. Finansowa obsługa studiów podyplomowych realizowana jest przy pomocy dwóch dedykowanych rachunków bankowych wspomaganych rachunkiem podstawowym uczelni. Konieczne było utworzenie odpowiednich tabel. Tabela Rachunki przechowuje numery rachunków wykorzystywanych w tym projekcie. Tabela RachunkiOperacje będzie przechowywać wszystkie operacje na tych rachunkach wraz z bieżącym stanem każdego z rachunków. Będzie potrzebna jeszcze jedna tabela, tym razem o charakterze tymczowym, stąd jej nazwa z prefiksem temp. Tabela temprozliczenie poza danymi pobranymi z tabeli Wykladowcy zawiera pole kwota, tu będziemy umieszczać kwotę do wypłaty dla danego wykładowcy. Dane tej tabeli będą tworzone dynamicznie za pośrednictwem odpowiedniej procedury przechowywanej.

Procedury przechowywane Procedura przechowywana pzestawienierozliczenia realizuje dwa zadania: po pierwsze usuwa wszystkie wpisy z tabeli temprozliczenie, a ntępnie wstawia wszystkie niezbędne dane do rozliczenia pracowników. Dane te pobierane są z tabel Wykladowcy i Wykonanie, uwzględniając te rekordy, które jeszcze nie zostały rozliczone (pole datar jest puste). Create procedure [dbo].[pzestawienierozliczenia] @semestr int, @zjazd int delete from dbo.temprozliczenie insert into dbo.temprozliczenie (idp, Kto, rozliczyc, ilegodzin, formaz, stawka, Bank, NrRachunku, Adres, Kod, Kwota) SELECT Wykonanie.idw, Wykladowcy.Wykladowca, 0, SUM(Wykonanie.ileGodzin), Wykladowcy.FormaZ, Wykladowcy.StawkaG, Wykladowcy.NazwaBanku, Wykladowcy.Rachunek, Wykladowcy.Adres, Wykladowcy.Kod, dbo.foblicz(sum(wykonanie.ilegodzin),wykladowcy.formaz,wykladowcy.stawkag) FROM Wykladowcy INNER JOIN Wykonanie ON Wykladowcy.id_w = Wykonanie.idw WHERE Wykonanie.dataR IS NULL and Wykonanie.semestr=@semestr and Wykonanie.zjazd=@zjazd GROUP BY Wykonanie.idw, Wykladowcy.Wykladowca, Wykladowcy.FormaZ, Wykladowcy.StawkaG, Wykladowcy.NazwaBanku, Wykladowcy.Rachunek, Wykladowcy.Adres, Wykladowcy.Kod order by Wykladowcy.Wykladowca Procedura powyższa korzysta z funkcji skalarnej foblicz, jej zadaniem jest wyliczenie kwoty przelewu biorąc pod uwagę liczbę godzin, formę zatrudnienia oraz stawkę godzinową. create function [dbo].[foblicz] (@ileg int, @forma nvarchar(1), @stawka int) RETURNS money begin declare @brutto money, @dowyplaty money if @forma='p' begin set @brutto=round(1.1765*@stawka,2) set @dowyplaty=round(@brutto*@ileg*0.77347,2) end else begin set @brutto=@stawka set @dowyplaty=round(@brutto*@ileg*0.91,2) end return @dowyplaty end Będą potrzebne jeszcze dodatkowe procedury przechowywane, ale będziemy je tworzyć jednocześnie z projektem formularza i raportu.

Formularz frmrozliczenie Na powierzchni formularza umieścimy listę o nazwie lstsemestrzjazd, będziemy mogli wybrać semestr i zjazd do rozliczenia (tylko spośród tych, które jeszcze nie były rozliczone w pełni). Po wyborze semestru i zjazdu klik przycisku cmdprzygotuj uruchomi procedurę przygotowującą listę wykładowców do rozliczenia. Ramka o nazwie frerachunek z trzema przyciskami opcji pozwala na wybranie jednego z trzech rachunków, z którego zostanie zrealizowana płatność. Poniżej listy lstsemestrzjazd i ramki umieścimy listę o nazwie lstdorozliczenia, będziemy w niej wyświetlać dane z tabeli temp rozlicznie (pierwsze trzy pola). Pod listą umieszczone jest pole tekstowe o nazwie txtsaldo, będziemy w nim wyświetlać aktualne saldo dwóch pierwszych rachunków po zrealizowaniu wybranych pozycji, a w przypadku ostatniego rachunku wartość zobowiązań wobec tego rachunku. Przycisk cmddrukuj uruchamia proces druku przelewów bankowych wraz z wpisami o zrealizowanych rozliczeniach. Lista lstdorozliczenia ma zadeklarowane trzy kolumny o szerokościach odpowiednio 0, 7 i 2 cm, wyjątkowo z pokazywaniem nagłówków kolumn. W module formularza frmrozliczenie utworzono szereg procedur obsługujących zdarzenia związane z tym formularzem. Private Sub Form_Open(Cancel As Integer) ' wywołanie procedury ustawiającej źródło wierszy lstsemestrzjazd Me.lstSemestrZjazd.RowSource = "execute dbo.pjakisemestrzjazd" ' usunięcie źródła wierszy lstdorozlicznia Me.lstDoRozliczenia.RowSource = "" ' ustawienie pierwszego konta jako aktywenego Me.freRachunek.Value = 1 ' ustalenie aktualnej wartości pola txtsaldo UstawKwote

Procedura obsługująca zdarzenie otwarcia formularza wywołuje procedurę przechowywaną o nazwie pjakisemestrzjazd, która zwraca rekordset zawierający numery semestrów i zjazdów do rozliczenia. create procedure [dbo].[pjakisemestrzjazd] select distinct semestr, zjazd from dbo.wykonanie where datar is null Efektem wykorzystania tej procedury jest dostarczenie danych do wyświetlenia w liście lstsemestrzjazd, co pozwoli na wybór terminu zjazdu, który chcemy rozliczyć. Procedura UstawKwote odpowiada za ustalenie bieżącego salda na wybranym rachunku lub zobowiązania wobec rachunku podstawowego Uczelni. Private Sub UstawKwote() Dim ile As Currency, zob As Currency zob = fdajwartosc("dbo.pdajkwotebruttorazem", _ "kwota", 3, 0) If Me.freRachunek.Value < 3 Then ile = fdajwartosc("dbo.pdajstanrachunku", _ "idr", Me.freRachunek.Value, 1, 0, _ "saldo", 3, 0) Else ile = 0 End If Me.txtSaldo.Value = ile - zob Procedura powyższa wywołuje dwie procedury przechowywane, pierwsza z nich zwraca sumę zobowiązań brutto, a druga rekordset sald wybranego rachunku (aktualne jest w pierwszym rekordzie). create procedure [dbo].[pdajkwotebruttorazem] @kwota money out select @kwota=isnull(sum(round(ilegodzin*stawka,2)),0) from dbo.temprozliczenie where rozliczyc=1 create procedure [dbo].[pdajstanrachunku] @idr int, @saldo money out select top(1) @saldo=saldo from dbo.rachunkioperacje where idr = @idr order by id desc Po wyborze terminu rozliczenia klik przycisku cmdprzygotuj uruchomi procedurę przygotowującą formularz do dalszej pracy. Private Sub cmdprzygotuj_click() If Me.lstSemestrZjazd.ListIndex = -1 Then Exit Sub semestr = Me.lstSemestrZjazd zjazd = Me.lstSemestrZjazd.Column(1) ' dostarczenie danych do tabeli temprozliczenie pwykonajprocedure "dbo.pzestawienierozliczenia", _ "semestr", semestr, 1, 0, _ "zjazd", zjazd, 1, 0 ' zdefiniowanie źródła wierszy dla lstdorozliczenia Me.lstDoRozliczenia.RowSource = "execute dbo.pdajpozycjedorozliczenia 1" W powyższym kodzie wywoływane są dwie procedury przechowywane, pierwsza z nich była już przedstawiona wcześniej, a kod procedury pdajpozycjedorozliczenia pokazany jest niżej. W procedurze utworzono polskie nazwy zwracanych pól. create procedure [dbo].[pdajpozycjedorozliczenia] @idp int select idp, Kto Wykładowca, rozliczyc Rozliczyć from dbo.temprozliczenie order by Kto

W liście lstdorozliczenia wyświetlane są dwie kolumny danych, pierwsza zawiera nazwisko wykładowcy, a druga wartość pola rozliczyc z tabeli temprozliczenie. Pole to przechowuje informację logiczną, jeżeli jest ustawione na True (PRAWDA), to rozliczenie będzie wykonane. Pokazana niżej procedura obsługuje zdarzenie podwójnego kliku listy lstdorozliczenia, a jej zadaniem jest zarówno cykliczna zmiana wartości pola rozlicz, jak i aktualizacja salda bieżącego rachunku wyświetlanego w polu txtsaldo. Private Sub lstdorozliczenia_dblclick(cancel As Integer) If Me.lstDoRozliczenia.Column(2) = "PRAWDA" Then pwykonajprocedure "pupdatetemprozliczenie", _ "idp", Me.lstDoRozliczenia, 1, 0, _ "jak", False, 1, 0 ' zmieniamy stan salda w formularzu Me.txtSaldo.Value = Me.txtSaldo.Value + _ fdajwartosc("dbo.pdajkwotebrutto", _ "idp", Me.lstDoRozliczenia, 1, 0, _ "kwota", 3, 0) Else pwykonajprocedure "pupdatetemprozliczenie", _ "idp", Me.lstDoRozliczenia, 1, 0, _ "jak", True, 1, 0 ' zmieniamy stan salda w formularzu Me.txtSaldo.Value = Me.txtSaldo.Value - _ fdajwartosc("dbo.pdajkwotebrutto", _ "idp", Me.lstDoRozliczenia, 1, 0, _ "kwota", 3, 0) End If ' odświeżamy listę Me.lstDoRozliczenia.Requery Procedura powyższa wywołuje dwie procedury przechowywane, pierwsza z nich aktualizuje pole rozliczyc w tabeli temprozliczenie, a druga zwraca wartość brutto (w kosztach WSZiM) wypłaty dla danego pracownika. create procedure [dbo].[pupdatetemprozliczenie] @idp int, @jak bit update dbo.temprozliczenie set rozliczyc=@jak where idp=@idp create procedure [dbo].[pdajkwotebrutto] @idp int, @kwota money out select @kwota=round(ilegodzin*stawka,2) from dbo.temprozliczenie where idp=@idp W momencie zmiany rachunku musi być zaktualizowana zawartość pola txtsaldo, robi to pokazana niżej procedura zdarzeniowa. Private Sub frerachunek_afterupdate() UstawKwote W momencie kliku przycisku Drukuj wykonywana jest pokazana niżej procedura, jej zadaniem jest otwieranie w pętli raportu rwyplata. Private Sub cmddrukuj_click() On Error Resume Next Dim ile As Integer, rst As New ADODB.Recordset, id As Integer ' tworzymy rekorset identyfikatorów wykładowców wybranych do rozliczenia Set rst = fdajrekordset("dbo.pileprzelewow", "ile", 1, 1, 0) ' ile jest tych rekordów? ile = rst.recordcount If ile > 0 Then ' w pętli uruchamiamy wydruk raportu For i = 1 To ile idprzelew = rst(0)

' zamykamy raport (jak był otwarty) DoCmd.Close acreport, "rwyplatajg", acsaveno ' otwieramy raport DoCmd.OpenReport "rwyplatajg", acviewpreview rst.movenext ' update pola datar w tabeli Wykonanie pwykonajprocedure "dbo.pupdatewykonanie", _ "idw", idprzelew, 1, 0, _ "semestr", semestr, 1, 0, _ "zjazd", zjazd, 1, 0, _ "droz", Format(Now(), "yyyy-mm-dd"), 4, 0 ' wstawiamy kwotę operacji dla aktywnego rachunku pwykonajprocedure "dbo.pwstawrachunkioperacje", _ "idr", Me.freRachunek.Value, 1, 0, _ "idw", idprzelew, 1, 0, _ "datar", Format(Now(), "yyyy-mm-dd"), 4, 0 If MsgBox("OK dla kontynuacji", vbokcancel, "Ankieta") = vbcancel Then Exit For End If Next i rst.close Set rst = Nothing Procedura powyższa wywołuje procedurę przechowywaną zwracającą rekordset identyfikatorów tych pracowników, dla których zostało zadysponowane rozliczenie wykonanych zajęć. create procedure [dbo].[pileprzelewow] @ile int select idp from dbo.temprozliczenie where rozliczyc = 1 Inną procedurą przechowywaną wywoływaną przez procedurę druku przekazu jest pupdatewykonanie, która odpowiada za wstawienie daty rozliczenia do tabeli Wykonanie. create procedure [dbo].[pupdatewykonanie] @idw int, @semestr int, @zjazd int, @droz smalldatetime update dbo.wykonanie set datar=@droz where idw=@idw and semestr=@semestr and zjazd=@zjazd Procedura pwstawrachunkioperacje aktualizuje stan bieżącego rachunku. create procedure [dbo].[pwstawrachunkioperacje] @idr int, @idw int, @datar smalldatetime declare @saldo money, @kwota money select top(1) @saldo=saldo from dbo.rachunkioperacje where idr = @idr order by id desc select @kwota=round(ilegodzin*stawka,2) from dbo.temprozliczenie where idp=@idw insert into dbo.rachunkioperacje (idr, saldo, operacja, dataoperacji, idw) values (@idr, @saldo-@kwota, -@kwota, @datar, @idw) Raport rwyplata Pozostało nam zaprojektowanie raportu w formie przelewu bankowego. Zrobimy to na kartce papieru formatu A4 w ustawieniu pionowym umieszczając na powierzchni formularza, w jego sekcji Szczegóły kontrolki typu pola tekstowe i etykiety. Źródło danych raportu zdefiniujemy dynamicznie w procedurze uruchamianej w momencie otwierania raportu.

Kontrolki raportu są tak ustawione, że tworzą oryginał przelewu (odcinek A) i jego kopię. Oba odcinki oddzielone są przerywaną linią. Po umieszczeniu pól tekstowych ręcznie nadawane są ich nazwy oraz określane źródła danych. Poniżej widok pola tekstowego Kto, którego źródło danych ustawiono na pole o nazwie Kto w źródle danych raportu. To ręczne ustawianie nazwy pól i źródeł danych wynika z faktu, że źródło danych raportu będzie tworzone dynamicznie. Oczywiście aby to zrobić (przypisać źródła danych) musimy wiedzieć, jak będzie zdefiniowane źródło danych raportu. W nzym przypadku źródło danych raportu będzie budowane przez procedurę przechowywaną, której kod pokazany jest niżej. create procedure [dbo].[pdajdanedoprzelewu] @idp int select * from dbo.temprozliczenie where idp=@idp Jak widzimy źródłem danych nzego raportu jest pojedynczy rekord z tabeli temprozliczenie, tym samym jako źródła formantów (pól tekstowych) możemy wykorzystać nazwy pól tej tabeli.

Zadanie utworzenia źródła danych raportu realizuje pokazana niżej procedura zdarzenia Open raportu rwyplata. Zmienna idprzelew została wykorzystana do przekazania identyfikatora wykładowcy. Private Sub Report_Open(Cancel As Integer) Me.RecordSource = "execute dbo.pdajdanedoprzelewu " & idprzelew Rozliczenie wykładowców w praktyce Poniżej wygląd formularza frmrozliczenie po jego otwarciu, w polu tekstowym widzimy bieżące saldo na rachunku 080, a lista Rozliczenie wykładowców jest pusta (zrzut po lewej stronie). Klik przycisku Przygotuj rozliczenie powoduje, że lista Rozliczenie wykładowców wyświetla nazwiska tych wykładowców, którzy powinni otrzymać wynagrodzenie za wybrany zjazd (prawy zrzut). W liście Rozliczenie wykładowców poprzez podwójny klik zmieniamy wartość pola Rozliczyć, przykładowo w obu wierszach na PRAWDA. Proszę zauważyć, że każda zmiana wartości tego pola powoduje zmianę wielkości dostępnych środków. Na kolejnej stronie pokazany jest widok przelewu dla jednego z pracowników.

Zarządzanie wstążką Programowa modyfikacja wstążki (Ribbon) w MS Office 2007 nie jest łatwa i wymaga znajomości zarówno VBA jak i języka XML. W nzej bazie danych AnietaSQL.adp dodamy do wstążki włną zakładkę o nazwie Ankieta, zakładka ta będzie zawierać kilka grup przycisków związanych tematycznie z określoną funkcjonalnością nzej aplikacji. Wymagać to będzie od n kilku działań: Na serwerze SQL musimy utworzyć dedykowaną do tych zadań tabelę o nazwie USysRibbons z polami RibbonName (nvarchar(100)) i RibbonXML (nvarchar(2000)). Pierwsze z tych pól będzie zawierać nazwę nzej wstążki, a drugie jej definicję zapisaną zgodnie ze schematem języka XML. Poniżej widok tej tabeli, zdefiniowano w nim trzy grupy przycisków przeznaczonych do uruchamiania poszczególnych formularzy. W module ogólnym tworzymy teraz publiczną funkcję, której zadaniem będzie pobranie z bazy danych definicji nzej wstążki. Ja utworzyłem moduł o nazwie Ribbon i funkcję o nazwie LoadRibbons, jej kod pokazany jest niżej. Funkcja ta wykorzystuje obiekt Application i jego metodę LoadCustomUI. Public Function LoadRibbons() Dim rst As New ADODB.Recordset Set rst = fdajrekordset("dbo.pdajuserribbon", "idp", 1, 1, 0) If Not rst.bof Then Application.LoadCustomUI rst("ribbonname").value, rst("ribbonxml").value End If rst.close Set rst = Nothing End Function Funkcja LoadRibbons musi być wykonana w momencie otwierania aplikacji, wywołamy ją za pośrednictwem makra o nazwie AutoExec. Zaczynamy od utworzenia nowego makra, w kolumnie Akcja odszukujemy polecenie UruchomKod, a w polu Nazwa funkcji wpisujemy LoadRibbons. Możemy już zapisać makro pod nazwą AutoExec.

Z menu głównego Accessa wywołujemy polecenie Opcje programu Access, a ntępnie w otwartym oknie dialogowym przechodzimy do zakładki Bieżąca baza danych. W grupie Opcje wstążki i pka narzędzi w polu kombi Nazwa wstążki musimy wpisać nazwę nzej wstążki (w moim przypadku jest to Ankieta). Po zatwierdzeniu zmian przyciskiem OK musimy zamknąć nzą aplikację i ponownie ją otworzyć. Zobaczymy wtedy nzą wstążkę. Musimy jeszcze utworzyć makra zgodnie z definicją zapisaną w polu RibbonXML wywołujące poszczególne formularze. Przykładowo, przycisk Wprowadzanie danych w grupie Ankieta PARP ma wyświetlić na ekranie formularz frmdane. Zgodnie z zapisem XML makro to ma mieć nazwę LoadFrmDane.