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.