1. Uruchom program Form Builder. Wywołaj kreator bloków danych (np. Tools-Data Block Wizard) i utwórz blok bazodanowy oparty na tabeli MARKI. Wyświetl pola: KOD, NAZWA. Umieść je na kanwie typu Karty (Tab). Zapewnij wyświetlenie 15 wierszy w formie tabelarycznej (tabular). Dodaj pasek przewijania, a ramkę zatytułuj Marki samochodów. Dodaj podpowiedzi i opisy dla pól KOD i NAZWA (KOD- Property Palette-Help-Hint, ustaw Display Hint Automatically na Yes). Uporządkuj dane według nazwy marki (własność ORDER BY bloku danych Marki). 2. Zmień nazwę okna na OKNO_MARKI_TYPY (własność General-Name okna). Ustaw tytuł okna na Marki samochodów i typy nadwozi (własność Functional-Title okna). Ustaw jako główną kanwę okna zdefiniowaną wcześniej kanwę kart (własność Functional-Primary Canvas okna). Zapewnij aby nie była dozwolona maksymalizacja okna (własność Functional-Maximize Allowed okna) i zmiana jego rozmiarów (własność Functional-Resize Allowed okna). 3. Zmień nazwę kanwy kart na KANWA_MARKI_TYPY (własność General- Name kanwy), a istniejącej karty na MARKI (własność General-Name podobiektu Tab Pages ). Dodatkowo ustaw etykietę karty na Marki (własność Functional-Label podobiektu Tab Pages ).. 4. Utwórz na poziomie formularza wyzwalacz WHEN_NEW_FORM_INSTANCE, który zapewni automatyczne wyświetlanie danych po wyświetleniu formularza. Wykorzystaj kod: -- Przejdź do bloku MARKI go_block('marki'); -- Wykonaj zapytanie 5. Utwórz atrybut wizualny (kliknąć dwukrotnie element Visual Attributes fromularza) AKTUALNY_REKORD i ustaw dla niego własność definiującą kolor tła na green (własność Color-Background Color obiektu Visual Attribute). Dla bloku MARKI określ własność definiującą grupę atrybutów wizualnych bieżącego rekordu na AKTUALNY_REKORD (własność Records-Current Record Visual Attribute Group bloku danych MARKI). 6. Zapisz formularz pod nazwą marki_typy.fmb i przetestuj jego działanie. 7. Utwórz za pomocą kreatora bazodanowy blok danych TYPY_NADWOZI oparty na tabeli TYPY_NADOWZI. Zapewnij wyświetlanie wszystkich kolumn w postaci 15 wierszy, w sposób tablaryczny. Dodaj stosowne opisy i podpowiedzi dla wszystkich pól bloku. Pola nowego bloku mają być wyświetlone na nowej karcie (tej samej kanwy). Dodaj pasek przewijania, a ramkę zatytułuj Typy nadwozi. Zapewnij porządkowanie danych po nazwie oraz kodzie typu nadwozia (własność ORDER BY). 8. Zmień nazwę nowej karty na kanwie na TYPY_NADWOZI, zaś etykietę na Typy. 9. Zdefiniuj grupę atrybutów wizualnych bieżącego rekordu na AKTUALNY_REKORD.
10.Zapisz formularz i go przetestuj. Zauważ, że przełączanie pomiędzy kartami nie powoduje automatycznego odświeżenia i wczytania danych. 11.Zapewnij automatyczne odświeżanie i wczytywanie danych w momencie przechodzenia pomiędzy kartami. Wykorzystaj wyzwalacz WHEN- TABPAGE-CHANGED na poziomie formularza. Wykorzystaj kod DECLARE tp_nm VARCHAR2(30); tp_id TAB_PAGE; tp_lb VARCHAR2(30); BEGIN -- Znajdź kartę tp_nm:= GET_CANVAS_PROPERTY('KANWA_MARKI_TYPY', topmost_tab_page); -- Odczytaj id karty tp_id := FIND_TAB_PAGE(tp_nm); -- Pobierz etykietę karty tp_lb := GET_TAB_PAGE_PROPERTY(tp_id, label); -- Odśwież odpowiedni blok IF tp_lb='marki' THEN go_block('marki'); ELSIF tp_lb='typy' THEN go_block('typy_nadwozi'); ELSE null; END IF; END; 12.Zapisz formularz i zweryfikuj jego funkcjonowanie. 13.Utwórz nowe menu (File->New->Menu). Kliknij dwukrotnie na ikonie przy nazwie modułu menu i uruchom edytor menu. Zdefiniuj element menu o nazwie Słowniki. W ramach niego zdefiniuj element Marki i typy nadwozi. Napisz dla tego elementu kod, który wywoła on formularz marki_typy po jego wybraniu. Wykorzystaj kod: -- wywołaj formularz marki_typy CALL_FORM('marki_typy', no_hide, do_replace, no_query_only, ''); 14.Zapisz menu pod nazwą menu_main.mmb i skompiluj zawartość generując postać uruchomieniową mmx. 15.Utwórz nowy formularz (File->New->Form). W nowym formularzu utwórz ręcznie kanwę. We własnościach formularza podaj nazwę modułu menu menu_main. W ramach kanwy zapewnij oprawę graficzną strony tytułowej aplikacji, np. umieść zdjęcie poprzez wybranie Edycja- Import-Image. Wcześniej dwukrotnie kliknij na kanwę.
16.Zapisz formularz pod nazwą main.fmb. Przed uruchomieniem go zapewnij aby pliki menu_main.mmx i marki_typy.fmx znajdowały się na ścieżce FORMS90_PATH (np. w pracowni C:\oracle\ids\cgenf61\admin). W razie konieczności zmodyfikuj wpis w rejestrze. Pliki fmx i mmx można wygenerować wybierając z menu opcję Program->Compile module. Uruchom formularz main.fmb. Sprawdź czy prawidłowo wyświetla się zdefiniowane menu i czy wybór opcji Marki i typy nadwozi powoduje uruchomienie stosownego formularza. 17.Utwórz nowy formularz (File->New->Form). Zapisz go pod nazwą marki_modele.fmb.dodaj do niego za pomocą kreatora (Tools->Data Block Wizard) blok oparty na tabeli MARKI.Blok ten umieść na kanwie typu Content. Zapewnij wyświetlanie 5 wierszy zawierających kolumnę KOD (kod marki) i NAZWA (nazwa marki), w sposób tabularyczny. Ustaw tytuł na Marki.Dodaj pasek przewijania. Uzupełnij stosownie podpowiedzi dla wyświetlanych pól. 18.Dodaj za pomocą kreatora blok oparty na tabeli MODELE. Powiąż go relacją z blokiem MARKI i umieść na tej samej kanwie co blok MARKI. Zapewnij wyświetlanie 10 wierszy zawierających kolumnę NAZWA (nazwa modelu), w sposób tabularyczny. Ustaw tytuł na Modele. Dodaj pasek przewijania. Uzupełnij stosownie podpowiedzi dla wyświetlanego pola. 19. Ustaw tytuł okna na Marki i modele samochodów. Dodaj atrybut wizualny AKTUALNY_REKORD zapewniający kolorowanie tła bieżącego rekordu. 20. Dodaj na poziomie formularza wyzwalacz WHEN-NEW-FORMINSTANCE zapewniający automatyczne wyświetlenie danych.
-- Wykonanie zapytania po wywołaniu formularza go_block('marki'); 21.Na poziomie bloku MODELE dodaj wyzwalacz PRE-INSERT obsługujący numerację identyfikatora modelu: select modele_id_seq.nextval into :modele.id from dual; 22.Utwórz nowy formularz (File->New->Form). Zapisz go pod nazwą samochody.fmb.dodaj do niego za pomocą kreatora (Tools->Data Block Wizard) blok oparty na tabeli SAMOCHODY. 23.Dla elementu KOLOR zmień typ elementu (własność General-Item Type) na listę (wartość List Item) i ustaw jej styl (własność Functional-List Style) jako Poplist. Wpisz elementy dostępne na liście (własność Functional-Elements in List): Ustaw wartość początkową (własność Data-Initial Value) pola KOLOR na kolor Biały. 24.Dla pola Rok ustaw najmniejszą dozwoloną wartość (własność Data- Lowest Allowed Value) na rok 1950, zaś największą dozwoloną wartość (Data-Highest Allowed Value) na 2007. 25.Zmień nazwę okna (własność General-Name) na WINDOW_SAMOCHODY i ustaw tytuł okna (własność Functional-Title) na Samochody. 26.Dodaj do bloku SAMOCHODY niebazodanowe pole (własność Database -Database Item=No) o nazwie MARKA. Zmień jego typ (własność General-Item Type) na List Item i ustaw styl listy (Functional-List Style)
jako Combo Box. Dopisz wartości dostępne na liście (własność Functional-Elements in List): Ustaw wartość początkową (własność Initial Value) pola MARKA na TOY. 27.Dodaj na poziomie forumlarza wyzwalacz WHEN-NEW-FORM-INSTANCE, który zapewni dynamiczne wypełnienie listy MARKA wartościami dostępnych marek samochodów (tabela MARKI), oraz automatycznie wczyta dane. Wykorzystaj kod: -- Wypełnij pole marki declare rec_id RecordGroup; temp number; begin if not Id_Null(rec_id) then -- Grupa istnieje - trzeba ją usunąć delete_group(rec_id); end if; rec_id:=create_group_from_query('rg_marki', 'select nazwa, kod from marki order by nazwa'); temp := Populate_group(rec_id); populate_list('samochody.marka', rec_id); end; -- Wykonanie zapytania po wywołaniu formularza go_block('samochody'); 28.Dodaj do bloku SAMOCHODY niebazodanowe (Database-Database Item=No) pole tekstowe (własność General-Item Type=Text Item) o nazwie MODEL. Zapewnij, aby było ono wymagalne (własność Data- Required=Yes) i umożliwiało przechowywanie napisów (własność Data-
Data Type=Char) 30 znakowych (własność Data-Maximum Length=30). 29.Za pomocą kreatora list wartości (LOV Wizard) utwórz listę wartości o nazwie LOV_MODELE.Posłuż się zapytaniem: select nazwa, id from modele where marka_kod=:samochody.marka order by nazwa Dodaj do listy LOV_MODELE obydwie kolumny z grupy rekordów (NAZWA, ID). Dla kolumny ID ustaw szerokość na 0 i element zwracany na SAMOCHODY.MODEL_ID. Dla kolumny NAZWA ustaw element zwracany na SAMOCHODY.MODEL. Ustaw tytuł okna listy wartości na Modele.Powiąż tworzoną listę wartości z polem SAMOCHODY.MODEL. 30.Dodaj do bloku SAMOCHODY przycisk (własność General-Item Type=Push Button) o nazwie BTN_MODEL. Dla przycisku BTN_MODEL dodaj kod zapewniający wyświetlenie listy wartości skojarzonej z polem SAMOCHODY.MODEL. Kod ten umieść w wyzwalaczu WHEN-BUTTON- PRESSED. -- przejdź do elementu model i wywołaj skojarzoną -- z nim listę wartości go_item('samochody.model'); do_key('list_values'); 31.Dodaj do bloku SAMOCHODY niebazodanowe (Database-Database Item=No) pole tekstowe (własność General-Item Type=Text Item) o nazwie NADWOZIE. Zapewnij, aby było ono wymagalne (własność Data-Required=Yes) i umożliwiało przechowywanie napisów (własność Data-Data Type=Char) 10 znakowych (własność Data-Maximum Length=10). 32.Dodaj do bloku SAMOCHODY niebazodanowe (Database-Database Item=No) pole wyświetlania (własność General-Item Type=Display Item) o nazwie DRZWI. Zapewnij, aby umożliwiało ono przechowywanie liczb (własność Data-Data Type=Number). 33.Za pomocą kreatora list wartości (LOV Wizard) utwórz listę wartości o nazwie LOV_TYP.Posłuż się zapytaniem: select nazwa, kod, ilosc_drzwi from typy_nadwozi order by nazwa Dodaj do listy LOV_TYP obydwie kolumny z grupy rekordów (NAZWA, ID). Dla kolumny NAZWA ustaw element zwracany na
SAMOCHODY.NADWOZIE. Dla kolumny KOD ustaw element zwracany na SAMOCHODY.TYP_KOD. Dla kolumny ILOSC_DRZWI ustaw element zwracany na SAMOCHODY.DRZWI. Ustaw tytuł okna listy wartości na Typy nadwozia. Powiąż tworzoną listę wartości z polem SAMOCHODY.NADWOZIE. 34.Dodaj do bloku SAMOCHODY przycisk (własność General-Item Type=Push Button) o nazwie BTN_TYP. Dla przycisku BTN_TYP dodaj kod zapewniający wyświetlenie listy wartości skojarzonej z polem SAMOCHODY.NADWOZIE. Kod ten umieść w wyzwalaczu WHEN- BUTTON-PRESSED. -- przejdź do elementu nadwozie i wywołaj skojarzoną -- z nim listę wartości go_item('samochody.nadwozie'); do_key('list_values'); 35.Dla bloku SAMOCHODY zdefiniuj wyzwalacz POST-QUERY wypełniający niebazodanowe pola MARKI, MODEL, NADWOZIE, DRZWI: -- pobierz nazwę modelu i marki select mk.kod, md.nazwa into :samochody.marka, :samochody.model from marki mk, modele md where mk.kod=md.marka_kod and md.id=:samochody.model_id; -- pobierz typ nadwozia i ilość drzwi select nazwa, ilosc_drzwi into :samochody.nadwozie, :samochody.drzwi from typy_nadwozi where kod=:samochody.typ_kod; 36. Elementy formularza umieść na kanwie typy Content w następjącej kolejności : MARKA, MODEL, BTN_MODEL, NADWOZIE, BTN_TYP, DRZWI, ROK, KOLOR, OPIS. Zapewnij wyświetlanie 15 wierszy w formie tabularycznej, ustaw tytuł ramki na Samochody, dodaj pasek przewijania. Zapewnij aby było wyświetlane pojedyncze (własność Records-Number of Items Displayed=1) wielowierszowe (własność Functional-Multi- Line=Yes) pole OPIS.
37.Zmodyfikuj wcześniej stworzone menu, aby wyglądało w sposób następujący : 38.Dodaj do elementów menu kod zapewniający wywołanie odpowiednich formularzy. 39.Zdefiniuj parametr o nazwie P_MODEL_ID typu NUMBER(30) w formularzu samochody. 40. Dla bloku danych SAMOCHODY ustaw własność WHERE Clause na: MODEL_ID=NVL(:PARAMETER.P_MODEL_ID,MODEL_ID) 41.Otwórz formularz marki_modele i dodaj w bloku danych MODELE przycisk BTN_SAMOCHODY i umieść na nim etykietę Samochody. 42.Dodaj do formularza marki_modele procedurę WYWOLAJ_FORMULARZ (Moduły programu), która będzie odpowiadać za wywołanie formularza samochody, tak aby pokazywał on tylko samochody aktualnie wybranego
modelu. Wykorzystaj kod : PROCEDURE wywolaj_formularz(p_id_modelu number) IS pl_id ParamList; begin -- znajdź id listy pl_id := Get_Parameter_List('param'); -- jeśli znaleziono id to usuń listę if not Id_Null(pl_id) then Destroy_Parameter_List(pl_id); end if; -- jeśli podano id modelu, to utwórz listę -- i dodaj do niej parametr z id aktualnego -- modelu if p_id_modelu is not null then pl_id := Create_Parameter_List('param'); Add_Parameter(pl_id,'P_MODEL_ID', TEXT_PARAMETER, to_char(p_id_modelu)); end if; -- wywołaj formularz samochody CALL_FORM('samochody', no_hide, do_replace,no_query_only, pl_id); end; 43.Dla przycisku BTN_SAMOCHODY dodaj wyzwalacz WHENBUTTON- PRESSED wywołujący procedurę wywolaj_formularz z przekazanym jako parametr identyfikatorem aktualnie wybranego modelu: wywolaj_formularz(:modele.id);