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

Transkrypt

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów
Projekt Hurtownia, realizacja skojarzeń dostawców i produktów
W bazie danych HurtowniaSP istnieją tabele Dostawcy oraz Produkty, ich definicje przypomniane są
niżej.
W bazie zdefiniowano także tabelę DostawcyProdukty, która będzie wykorzystywana przy rejestracji
dostaw produktów danego dostawcy.
W tabeli tej zdefiniowano klucz złożony zbudowany z dwóch kluczy obcych będących identyfikatorami obu
wymienionych wyżej tabel.
Zajmiemy się teraz problemem zbudowania formularza ułatwiającego kojarzenie dostawców i oferowanych
przez nich produktów. Zadanie to można zrealizować na wiele sposobów, w tym materiale zostanie przedstawione
rozwiązanie maksymalnie optymalne dla użytkownika.
Koncepcja formularza frmSkojarzeniaDostawcyProdukty
Wydaje się, że najlepszym rozwiązaniem będzie przyjęcie takiego projektu formularza, który maksymalnie
wyeliminuje możliwość popełnienia choćby takiego błędu jak próba zapisania w tabeli DostawcyProdukty
rekordu o takiej kombinacji obu kluczy, który już w tej tabeli jest. Konsekwencją byłoby zgłoszenie błędu przez
serwer SQL, co nie jest zbyt eleganckim rozwiązaniem.
Zbudujemy taki formularz, który pozwoli na wybór dostawcy z pola kombi, a po jego wyborze wyświetli w
formancie typu ListBox te produkty, które jeszcze nie występują w tabeli DostawcyProdukty w kombinacji z
identyfikatorem wybranego dostawcy.
Zadanie to zrealizuje pokazana niżej procedura przechowywana SQL, która otrzymuje jako argument
identyfikator dostawcy.
Bezparametrowa procedura SQL będzie odpowiedzialna za dostarczenie źródła danych dla pola kombo
wyświetlającego listę potencjalnych dostawców.
W standardowy sposób dodajemy do rozwiązania nowy formularz, którego nazwę zmieniamy na
frmSkojarzenieDostawcyProdukty. Na powierzchni formularza umieszczamy cztery formanty:
cboDostawcy – formant typu ComboBox, w nim będziemy wyświetlać dostawców z tabeli Dostawcy;
lstProdukty – formant typu ListBox, po wyborze dostawcy w polu cboDostawcy wyświetlimy w nim
te produkty, które mogą być skojarzone z wybranym dostawcą (czyli te, których
identyfikatory nie są jeszcze skojarzone z identyfikatorem wybranego dostawcy w tabeli
DostawcyProdukty);
btnZapisz – formant typu Button, jego klik będzie uruchamiał metodę z klasy CDostawcyProdukty
odpowiedzialną za zapisanie skojarzeń w tabeli DostawcyProdukty;
etykietę – formant typu Label opisującą pole cboDostawcy z właściwością Text równą „Wybierz
dostawcę”. Etykieta ta ma pozostawioną nazwę domyślną, bowiem nie będziemy się do
niej odwoływać w trakcie działania programu;
lblKomunikat – formant typu Label wyświetlający tekst wyjaśniający dlaczego nie widzimy listy
produktów. Etykieta ta będzie ustawiona tak, jak to pokazano niżej i będzie „przykryta”
przez listę lstProdukty.
Końcowe ustawienie formantu lstProdukty zakrywa etykietę lblKomunikat, za pomocą właściwości
Visible będziemy jeden z tych formantów ukrywać, a drugi pokazywać.
Uzupełnienia w klasie CDostawcyProdukty
Zaczynamy od dodania nowego interfejsu, tak jak to pokazano niżej.
Interfejs ten deklaruje (zapowiada, opisuje) dwie funkcje, przy czym funkcja Komunikat spełnia
analogiczne zadanie jak we wcześniejszych interfejsach, a funkcja DajTabele ma za zadanie dostarczyć źródło
danych dla listy lstProdukty.
Metoda PrzygotujSkojarzenieDostawcyProdukty będzie odpowiedzialna za przygotowanie
instancji formularza frmSkojarzenieDostawcyProdukty do pokazania użytkownikowi, czyli za pobranie
danych o dostawcach (via procedura SQL vb_DajDostawcow), zdefiniowanie źródła danych dla cboDostawcy
oraz ukrycie listy lstProdukty z pokazaniem etykiety lblKomunikat. Metoda spowoduje także, że przycisk
polecenia btnZapisz stanie się nieaktywny.
Metoda DajProduktyDostawcy będzie odpowiedzialna za pobranie z bazy danych (korzystając z
procedury SQL vb_DajProduktyWgDostawcy) tych produktów, które mogą jeszcze być skojarzone dostawcą
wybranym w polu kombi cboDostawcy.
Metoda ZapiszSkojarzeniaDostawcyProdukty będzie odpowiadać za zapisanie wybranych
skojarzeń w tabeli DostawcyProdukty, kod procedury SQL realizującej to zadanie będzie pokazany później.
W kolejnym kroku przechodzimy do kodu klasy i zapowiadamy implementację tego nowego interfejsu (jego
funkcji i metod).
Implementacja funkcji Komunikat wymaga jedynie uzupełnienia istniejącej implementacji tej funkcji
dopisując do wykazu interfejsów IProduktyDostawcy.
Analogicznie postępujemy z funkcją DajTabele.
Kod pozostałych trzech metod musimy napisać „od początku”.
Ostatnia z tych metod wywołuje procedurę SQL, której kod pokazany jest niżej.
Jeszcze mały komentarz odnośnie kodu metody ZapiszSkojarzeniaDostawcyProdukty. Metoda
jako argumenty otrzymuje identyfikator wybranego dostawcy oraz kopię formantu ListBox (lstProdukty), który
miał tak ustawioną właściwość selekcji, aby można było zaznaczyć więcej niż jedną pozycję listy. Odczytanie
zaznaczonych pozycji (identyfikatorów produktów) odbywa się poprzez przegląd kolekcji indeksów zaznaczonych
pozycji, która zostaje zwrócona właściwością SelectedIndices tego formantu (czyli ListBox). Przegląd wykonywany
jest standardową pętlą dedykowaną do tego celu (przejściu po elementach kolekcji, czyli For Each). Po odczytaniu
indeksu zaznaczonego elementu pobierany jest sam element właściwością Items i przypisywany do zmiennej
wiersz, która wcześniej została zadeklarowana jako typ DataRowView (mocna nazwa typu, czyli
System.Data.DataRowView nie jest konieczna z uwagi na wcześniejsze zaimportowanie przestrzeni nazw
System.Data. Z kolei identyfikator produktu pobierany jest ze zmiennej wiersz z wykorzystaniem właściwości Item
tej zmiennej.
Kod formularza frmSkojarzeniaDostawcyProdukty
Po przygotowaniu metod i funkcji interfejsu IProduktyDostawcy musimy jeszcze utworzyć kilka
procedur w kodzie formularza frmSkojarzeniaDostawcyProdukty.
Pokazana niżej procedura będzie uruchamiana w momencie wyboru dostawcy w polu kombi cboDostawcy.
Jeżeli metoda DajProduktyDostawcy została wykonana poprawnie, to lista lstProdukty otrzymuje nowe
źródło danych i zostaje pokazana użytkownikowi
Skromna procedura obsługująca klik listy lstProdukty dba o to, żeby przycisk polecenia btnZapisz
był dostępny dla użytkownika wtedy, gdy w liście produktów został zaznaczony co najmniej jeden z nich. Jeżeli
żaden produkt nie został zaznaczony, to przycisk jest ustawiany jako niedostępny.
Ostania z procedur odpowiada za realizację kliku przycisku btnZapisz.