Programfejlesztés SQLForms-ban

A következő részben bemutatjuk néhány mintafeladaton keresztül, hogy hogyan használjuk az ismeretett SQLForms lehetőségeket az Oracle adatbázishoz kapcsolódó alkalmazások fejlesztésénél. Előbb az egyszerűbb alaplépéseket vesszük sorra, majd a végén néhány összetettebb feladatot is szemléltetünk. Egy táblát kezelő alapértelmezési képernyőprogam elkészítése A feladatban egy megadott adattáblához, az autok adattáblához kell kezelő programot létrehozni SQLForms segítségével. A tábla szerkezete a következő: autok (rsz char(6), tipus char(20), ar number(8)) A táblának már léteznie kell az adatbázisban mielőtt a kezelő programot létrehoznánk. Az SQLForms ugyanis az adatbázis tartalmából veszi ki az objektumokra vonatkozó információkat. Ezért a fejlesztés első lépéseként hozzunk létre a táblát és vigyünk fel néhány rekordot a táblába. A tábla létrehozása és feltöltése az ismert SQLPlus rendszerben történik, ezért elsőként hívjuk meg az SQLPLus rendszert, jelentkezzünk be az Oracle nevünket és jelszavunkat megadva, majd adjuk ki a megfelelő CREATE TABLE és INSERT utasításokat a tábla létrehozására. Ismétlésként álljon itt e két utasítás is: CREATE TABLE autok (rsz char(6) primary key, tip varchar(20),ar number(8)); INSERT INTO autok VALUES ('rsz1', 'lada', 23485); Ha az adattábla már létezik, meghívhatjuk az SQLForms rendszert is. Feltéve, hogy irisansu termináltipust használunk, a következő utasítással indíthatjuk el a tervező programot, kijelölve a megfelelő billentyűzet leképzési állományt is: sqlforms30 -c irisansu:utd Az induló képernyőn ismét meg kell adni az Oracle nevünket és jelszavunkat, igazolva, hogy jogosultak vagyunk az adatbázis elérésére. Sikeres bejelentkezés után a megjelenő főablakon keresztül érhetők el a különböző szerkesztők. Új alkalmazás létrehozásának legegyszerűbb módja, ha előbb egy alapértelmezési képernyőt hozzunk létre. Később ez módosítható, de most ezzel a szinttel megelégszünk. Elsőként hozzuk létre az új képernyő programot. Ez az Action főmenüpont New menüpontjával lehetséges. A program most még üres, a form semmilyen más objektumot nem tartalmaz. A furó programhoz szükség van blokk, mező, űrlap (page) objektumokra, s melyek később trigger és eljárás elemekkel is kibővülhetnek. Az alapértelmezéi felépítés a Block menüpont Default menüpontján keresztül adható meg. A Default menüpont több azonban mint egyeszerű blokk létrehozás (talán külön menüpontot is megérdemelt volna), mivel nemcsak blokkot generál, hanem a futó programhoz minimálisan szükséges mező és űrlap elemeket is. Természtesen minden mező attributum és az űrlap felépítés is egy egyenmintát követ, hasonlóan a FoxProban megismert Wizard funkcióhoz. A megjelenő Default blokk ablakban elegendő csak a blokk nevet és az altábla nevét megadni. A többi paraméter maradhat a felkínált értéken. A block neve legyen b1 [Block name:b1]. Az alaptábla, aminek az adatait kijelzi az autok [base table: autok]. Ez lesz a program első blokkja, ami inditás után rögtön megjelenik [Sequence..:1]. Minden mezőt kijelzünk [nem szűkitünk a Select Columns-ban]. Egyszerre egy rekordot jelez ki a blokk [Records Displayed:1]. Az első űrlapon helyezkednek el a blokk mezői [Page Number:1], és a lap első sorától kezdődően rajzolódnak ki a mezők[Base Line:1]. Nincs a blokkhoz főblokk kapcsolódás, amivel az 1:N kapcsolatban állna [Master Block es Join Condition üres]. A következő ábra mutatja az ablak felépítését: ======================================================== Action foRm Block Field Trigger Procedure Image Help Options ------------------------------ Default Block ---------------------- | Block Name: b1 | Base Table: autok |-------------------------------------------------------------------------- | Sequence Number: 1 ( Select Columns ) [ ] Use Constraints | Records Displayed: 1 Page Number: 1 Base Line: 1 |---------------------------------------------------------------------------- | Master Block: [ ] Delete Details |---------------------------------------------------------------------------- | ----------------------------- Join Condition -------------------------- | | Az attributumok kitöltésénél a TAB (előre) illetve a SHIFT TAB (hátra) billintyűvel mozoghatunk a adatbevitelő mezők között. Az űrlapot az Accept funkcióval (^X A) lehet elfogadtattni, míg az Exit funkció (^X E) kiválasztásakor elvetjük az elvégzett módosításokat. Ne feledjük, hogy az aktuális billentyűzet leképzés a ^K billentyűvel kérdezhető le. Az űrlapok tervezése során felhasznált legfontosabb billentyű funkciók: Accept: elfogadás, OK Exit: kilépés, elvetés Change Display Type: áttérés lista és űrlap formátum között az SQLForms tervezőben (űrlap esetén csak egy objektumot láthatunk, míg a lista formátumban több objektum is elérhető, de a tulajdonságoknak csak egy része érhető el egyidejűleg). Insert Record: új objektum felvitele Delete Record: objektum törlése Select: objektum kijelölése, kiválasztása List: értéklista kinyitása Insert/Replace: áttérés beszúró és felülíró üzemmód között Ha kitöltöttük a Default Block paramétereket, akkor ezzel minden szükséges adatot megadtunk egy alapértelemzési Form elkészítéséhez. Az SQLForms a megadott adatokból elkészíti a blokkot, a mezőket, és a grafikus lapot is. A mezők a képernyőlapra a defíníciós sorrend alapján kerülnek fel. A program generálásához előbb mentsük le az űrlapot. Ehhez az Action menüpont - majd Save almenüpont kiválasztása kell, s ezután a adhatjuk meg az űrlap nevét. A mentés hatására az elkészített leírás bekerül az adatbázisba a megfelelő Forms adattáblákba. A program generálása is az Action menüpontból történik: Action menüpont - Generate A generálás során egy INP és egy FRM állomány fog létrejönni. Az FRM tipusú bineráis kódot tartalmazó állomány futtatása a Action - Execute menüpontokon keresztül lehetséges. A kapott, futó program működésének szemléltetésére bemutatjuk a megjelenő képernyőt. A megjelenési formátum a Windows-os környezethez szokott programozóknak igen szegényesnek tűnik, hiszen csak az van rajta, ami feltétlenül szükséges. A fejlesztőn múlik, hogy mennyire hozza majd ezt az alapértelmezési formátumot a későbbiekben elfogadhatóbbá és szemléletesebbé. ===================================================== ======== B1 ======== RSZ XXXXXX TIP XXXXXXXXXXXXXXXXXXX AR XXXXXXXXXX ===================================================== Az ábrában az 'XXX...' szimbólumok az adatmezőket jelölik. A legfeltűnőbb eltérés a Windows környezetben generált programokhoz viszonyítva az, hogy a képernyő semmilyen nyomógombot nem tartalmaz, s nem is tartalmazhat, a felhasznált karakterese terminél jellegből következően. Ez azonban nem jelenti azt, hogy funkcionálisan szegényebb lenne az így kapott program, mint például egy FoxPro program. Itt is számtalan adatkezelési funkció él, csak ezek természetesen csak a billentyűk segitségével aktivizálhatók. A funkciók és a fizikai billentyűk összerendelési rendszerfüggő, ezért az a legjobb, ha a fenti tipusú generált programmal találkozunk, hogy legelősször lekérjük az aktuális billentyűzet leképzést a CTRL-K segítségével. A program használatához az előbb említett alapfunkciók mellett két másik funkcióra is felvívjuk a figyelmet (megadva az irisansu fizikai megfeleltetést is): Enter Query: ^X 3 Execute Query: ^X 4 A Query funkciók fontossága abban rejlik, hogy általa jelölhetjük ki az elérendő rekordok körét. A lekérdezés QBE formátumban végezhető el, amelynek első lépése, hogy kiadunk egy Enter Query parancsot a billentyűzet segítségével. Ennek hatására az űrlap képernyője egy QBE bevitelé lappá változik, a korábban kijelzett rekordok eltűnnek. Az indulásként üres QBE lapra lehet felvinni a szelekciós feltételeket az ismert SQL operátorok felhasználsával. Minden mezőbe beírhatjuk az adott mezőre vonatkozó megszorítást. A QBE lap kitöltése után az Execute Query funkcióval elindítható a lekérdezés. Hatására csak azon rekordok lesznek elérhetők ezután, melyek eleget tesznek a feltételnek, a kurzor nyilakkal nem tudunk kilépni a rekordok ezen köréből. Ez a megkötés addig él, amíg egy újabb lekérdezést el nem indítunk. Ha a QBE ablakban minden mezőt üresen hagyunk, akkor üres szelekciós feltételt adun, meg, ezáltal a megfelelő táblák minden rekordja elérhető lesz. Ha a programozó egy mindíg élő, ki nem kerülhető szelekciós feltételt kíván bevinni a programba, akkor azt, mint már korábban említettük a Block paraméterablak Default Where/Order by paramérénél kell megadni. Az alkalmazás kezelésénél a legfontosabb tevékenységek tartozó logikai funkciókat mutatja be a következő felsorolás: lekérdezés a tárolt rekordok megjelenítésére: Enter Query, majd Execute Query új rekord felvitele: Insert Record rekord lementése: Accept rekord törlese: Delete Record rekord váltás, mozgás a rekordok között: Up, Down mező váltás: Tab, Enter kilépés: Exit A kapott prototipus programot a fejlesztés során kiinduló változatnak tekinthetjük,melyet a későbbiekben az egyedi igényeknek megfelelően fogjuk módosítani, bővíteni. A következő feladat két egyszerűbb módosítást mutat be az előző űrlapon. Módosítsuk az előző űrlapot úgy, hogy az adatok listában (browse) jelenjenek meg a képernyőn, s a listában az autó rekordok az rsz mező szerint rendezetten helyezkedjenek el. További megkötés, hogy az rsz mezőt csak olvasni lehet, az rsz mező tartama nem módosítható. Ezenkívül előírjuk, hogy az ar mezőbe csak 500000 és 9999999 közötti érték vihető fel. A módosítások elvégézéhez előbb töltsük be a korábbi űrlapot az Action - Open menüpontokon keresztül. A betöltésnél az űrlap azonosító névhez kapcsolódó értéklista kinyitásával lehetőség van a megfelelő őrlap kiválasztására. A többrekordos. listás kijelzésnél a mezőhöz megadott képernyő pozició az első rekordbeli érték kiírásának a helyet fogja megadni. A többi rekordoz tartozó értékek ezen pozició alatt fogak listaként megjelenni. Ha például a megjelenítési rekordszám 1, akkor a képernyőn csak egy érték fog látszani: mező_érték_rekord_1 Ha azonban a megjelenítési rekordszám 4, akkor a mező_érték_rekord_1 mező_érték_rekord_2 mező_érték_rekord_3 mező_érték_rekord_4 íródik ki a képernyőre. Az űrlap áttervezésekor ezért képernyő lapot is át kell alakítani, hogy ne kerüljenek fedésbe az egy egyes mezőértékek. A képernyő lap átalakítására szolgáló szerkesztőt a Image - Painter menüpontokon keresztül érhetjük el. A megjelenő szerkesztővel lehetőség van a mezők áthelyezésére és felvitelére, valamint konstans szövegek és keretek lehelyezésre. A mezők átrendezése a következő funkciókon keresztül végezhető el: mező kijelölése (mozgás a mezőre és Select funkció) mező kivágása (Cut funkció) mozgás az új pozicióra mező lehelyezés (Paste funkció) Felirat elhelyezése a lapra egyszerűbben megoldható: mozgás a szöveg kezdőpoziciójára szöveg bevitetele a billentyűzetről (közben használható a törlés billentyű és szükség esetén az Insert/Replace üzemmód váltás is) A keretek rajzolásához is pár lépésben elvégezhető: a keret poziciójának kijelölése: az áttellenes sarokpontok megadása a Select funkcióval a keret megrajzolása a Draw funkcióval. A következő ábra az új formátumot mutatja be, melyben a felhasználó dolgát megkönyítendő, a legfontosabb funkciók fizikai billyentűkódját is megadtunk a lap alján: ======================================================== +---------------------------AUTOK-ADATAI--------------------------------+ RSZ AR TIP XXXXXX XXXXXX XXXXXXXXXXXXXXXXX Kilepes:^X E Uj rekord:^Z I Rekord torles:^Z D Commit:^X A ======================================================== Mentsük le az elkészült képernyő lapot az Accept funkcióval. Az elvégzett módosítások önmagukban még nem elegendőek a listás megjelenítéshez, hiszen eddig csak helyet készítettünk a listának. A listaszerű adatmegjelenítést a blokk paraméter ablakában kell előírni. A blokk paraméterablakot azonban most már nem a Default Block menüponton keresztül lehet elérni, mivel ez egy újabb alapértelmezési blokkot hozna létre. Ehelyett a Block - Modify menüpontok szolgálnak a paraméter beállításra. A megjelenő paraméterablak és a korábbi Default Block ablak közötti fő funkcionális különbség abban áll, hogy itt nincs lehetőség master-detail kapcsolat kialakítására, viszont csak itt van mód a blokkra vonatkozó szelekciós feltételek és kijelzési sorrend megadására. A blokk paraméterablak űrlap-szerű formátumát mutatja be a következő ábra: ==================================================== Action foRm Block Field Trigger Procedure Image Help Options ----------------------------- Block Definition ----------------------------- +-----------------------------------------------------------------------------------+ Block: b1 | -- Records -- | Array Size: Table: autok | Displayed: 1 | [ ] Prim Key Sequence Number: 1 | Buffered: | [ X ] In Menu | Lines per: | [ ] Column Sec --------------------------------------+----------------+-------------------------- Description: b1 ------------------------------------------------------------------------------------ ------------------------- Default Where/Order By ------------------------- --------------------------------- Comment ------------------------------- ==================================================== A listás megjelenítéshez itt kell a megjelenítendő rekordok darabszámát beállítani egynél nagyobb értékre, a példánkban 5-re. Displayed: 5 Ebben az ablakban van lehetőség az egy rekord által igényelt képernyő sorok számának beállitására is. Ez az érték maradhat az alapértelmezés: Lines per: 1 A kiíratási sorrendet is a paraméterablak lehet előírni. A kiiratási sorrend megadásának lépései: mozgás a Default Where/Order By paraméterre ebbe a rublikába lehet beírni a rekordokra vonatkozó szűrő és rendezési feltételt az SQL SELECT hasonló elemeinek megfelelő szintaktikával. Példánkban a rendezési feltétel megadására az ORDER BY rsz utasítást kell beírni. Eztkövetően lementhetjük a blokk paraméterablakot az Accept funkcióval, s áttérhetünk az rsz mező módosítására. A mezőre vonatkozó paraméterablak a Fields - Modify menüpontok kiválasztásával jön be. A megjelenő táblázat az összes mező paramétereit tartalmazza, de egyszerre csak bizonyos paraméterek láthatók, hasonlóan a blokk leiró listához. Egy mező összes paraméterének a megtekintéséhez a Change Display Type funkciót kell meghívni. Így elsőként kiválasztjuk az RSZ mezőt majd aktivizáljuk a Change Display Type funkciót. Ezután megkapjuk az RSZ mező paramétereit tartalmazó ablakot. ---------------------------- Field Definition -------------------------- Field Name: RSZ Sequence Number: 1 Data Type: CHAR ( Select Attributes) Field Length: 6 Query Length: 6 Display Length: 6 Screen Position: X: 14 Y: 9 Page: 1 ( Editor Attributes ) Format Mask: Default Value: Hint: Enter value for : RSZ Valid Range: Low: High: Enforce Key: List of Values: Title: Pos: X: Y: ------------------------ List of Values SQL Text ----------------------- A mezők számos attributummal rendelkeznek, amelyek megjelenésüket, a velük végezhető műveleteket szabályozzák. Ezek az attributumok a Select Attributes menüpont alatt érhetők el. Ezen paraméter kiválasztásakor (kurzorral odalépünk, majd Select funkció), megjelenik a mező viselkedését leíró korábban már ismertett paramétercsoport. [ ] Primary Key [ X ] Displayed [ X ] Required [ X ] Input Allowed [ X ] Update Allowed [ ] Update if Null [ X ] Query Allowed [ ] Uppercase [ X ] Echo Input [ ] Fixed Length [ ] Automatic Skip [ ] Automatic Hint A felsorolt attributumok közül az Update Allowed szabályozza, hogy módositható-e a mező. Ha ott X jel áll, akkor igen, ha nincs ott, akkor nem. A beállitás a space billentyű segitségével változtható meg. A módositást az Accept funkcióval véglegesítjük, majd elhagyjuk az rsz mezőt. Eztkövetően áttérünk az ar mezőre, ahol értékhatárt kell beállítani. A rsz mezőhöz tartozó paraméterablak megjelenése után a felkínált paraméterekből a Valid Range szolgál az érték tartományok megadására. A Valid Range-hez tartozó Low paraméter a felvehető értékek alsó korlátját, míg High a felső korlátját határozzák meg. Így az lábbi értékeket kell felvinni: Low: 500000 High:9999999 A mezőn végzett módosításokat mentsük le, majd az egész űrlapot is le kell menteni. Az elkészített alkalamzás az előzőekben megadott módon fordítható és futtaható. A futtatás során próbáljuk ki, hogy hogyan reagál a program a feltételeket sértő értékek, tevékenységek esetén. A következőkben egy összetettebb példát veszünk, amelyben több adattábla, több blokk is szerepel. Hozzunk létre két táblát, egy telefon előfizetők (elofiz) és egy hivások táblázatot, az alábbi szerkezettel: elofiz (id, nev, lakcim, tartozas) hivas (hivoid, hivottszam, datum, hossz, ar) A sémában egy előfizetőhöz több hivás is tartozik, mig egy hivás egyetlen egy előfizetőhöz kapcsolódik. Igy egy 1:N kapcsolat áll fenn a két tábla között. A hivás táblában a hivoid a kapcsólokulcs az előfizetőhöz. Készitsünk egy SQLForms programot, amelyben egy képernyőn egy előfizető és a hozzá tartozó hivások láthatók egyidejűleg. Mindkét táblában lehet szabadon mozogni és módositást végezni. Az előfizetőt űrlap-szerűen, míg a hivásokat táblázat (browse) szerűen jelenítsük meg. Indulásként itt is előbb létre kell hozni a kezelendő adattáblákat. Ehhez az SQLPlus rendszert használhatjuk fel. A megfelelő táblák az alábbi SQL utasításokkal építhetők fel. Táblák létrehozása: CREATE TABLE ELOFIZ (ID NUMBER(3) PRIMARY KEY, NEV VARCHAR(30), LAKCIM VARCHAR(30), TARTOZAS NUMBER(6)); CREATE TABLE HIVASOK (HIVOID NUMBER(3) REFERENCES ELOFIZ, HIVOTTSZAM NUMBER(10), DATUM DATE, HOSSZ NUMBER(5), AR NUMBER(6), PRIMARY KEY(HIVOID, DATUM)); Néhány összetartozó rekord felvitele a táblákba: INSERT INTO ELOFIZ VALUES (1,'Kiss Peter','Eger, Dob u 23',0); INSERT INTO HIVASOK VALUES (1,345567,sysdate,20, 200); INSERT INTO HIVASOK VALUES (1,354771,TO_DATE('96-02-15','YY-MM-DD'),5,50); A táblák megalkotása után visszetérhetünk az SQLForms-hoz. A bejelentkezés után hozzunk létre egy új űrlapot, melynek példákban a telefon azonosító nevet adjuk. Mivel egy blokk elsődlegesen egyetlen egy tábla kijelzésére szolgál, és esetünkben két adattábla is van, melyeket egymástól igen eltérően kell kezelni, ezért célszerű két blokkot is létrehozni. A két blokk között egy master-detail kapcsolat áll fenn, mivel a hivások blokkjában csak azon rekordokat kell megjeleniteni, amelyek az elofizeto blokkban kijelzett rekordhoz tartoznak. A master-detail tipusú blokkok esetén előbb a fő, vagyis a master blokkot kell létrehozni. Mindkét blokk létrehozásánál támaszkodhatunk a Default Block lehetőségre. Előbb tehát a fő blokk létrehozása: Block - Default menüpontok aktivizálásával. A fő blokk paraméterei: =================================================== ------------------------------ Default Block ------------------------------- Block Name: elofiz Base Table: elofiz ----------------------------------------------------------------------------| Sequence Number: 1 ( Select Columns ) [ ] Use Constraints Records Displayed: 1 Page Number: 1 Base Line: 1 --------------------------------------------------------------------------- Master Block: [ ] Delete Details --------------------------------------------------------------------------- ----------------------------- Join Condition ----------------------------- =================================================== Mivel mindkét blokk adatainak egyidejűleg láthatónak kell lenni a képernyőn, ezért egyetlen egy laphoz rendeljük mindkét blokkot. Ehhez azonban helyet kell készíteni a második blokk számára, nem hagyva, hogy az első blokk kitöltse a teljes lapot. A képernyő lapot az előzőekben megismert módon rendezhetjük át: Image - Painter A képernyőlap szerkesztőben jelöljük ki és mozgassuk el a mezőket, feliratokat, s keretezzük be a terültet (Select, Cut, Paste és Draw funkciók). A mezők mozgatásánál arra ügyeljünk, hogy a lap alja szabadon maradjon a következő blokk számára. A képernyő lap lemnetése után hozzuk létre a a hivasok (hivas) blokkját. Ez a blokk lesz a detail blokk, melynek az elofiz a master blokkja. A két blokk közötti kapcsolat alapja az, hogy az elofiz blokk id mezőjének értéke megegyezik a hivás blokk hivoid mezőjével. A master-detail kapcsolat most blokkok közötti és nem táblák közötti kapcsolatot jelent. Ennek megfelelően a kapcsolatban nem adatbázis objektumokra, hanem SQLForms objektumokra kell hivatkozni. A kapcsolat megadásánál egy mezőre a blokknev.mezonev szimbolummal lehet hivatkozni. A kapcsolódás a megadott mezők azonos értékén alapul. A kapcsolódási feltétel formálisan lehet elemi feltétel: - egy mezőnév, amely mindkét blokkban előfordul - két mezőnév egyenlőségjellel összekötve, ahol az egyik mezőnév a master, a másik a detail táblából származik. összetett feltétel: - elemi feltételek AND és OR logikai operátorokkal összekötve A master-detail kapcsolatatot a detail blokkban kell megadni. A fo blokk zonosítót a default blokkot generálo űrlap Master Block paraméterénél, mig a kapcsolódás feltételt a Join Condition pereméterében kell megadni. A hivas blokkban egyidejűleg 5 rekord lesz látható, ezért egy listás megjelenítést kell alklamazni. A hivas blokk rekordjai ugyanazon képernyőn (pagen) kerülnek kijelzésre, mint az előfizetők adatai. A hivas blokk paraméterezését mutatja az alábbi ábra: ================================================== --------------------------- Default Block ------------------------------- Block Name: hivas Base Table: hivasok ---------------------------------------------------------------------------- Sequence Number: 2 ( Select Columns ) [ ] Use Constraints Records Displayed: 5 Page Number: 1 Base Line: 10 --------------------------------------------------------------------------- Master Block: elofiz [ ] Delete Details --------------------------------------------------------------------------- ----------------------------- Join Condition ---------------------------- elofiz.id = hivas.hivoid --------------------------------------------------------------------------- ================================================== A hivasok blokk lementése után a képernyő lapot is ki kell igazítani a kívánt formátumra. Ehhez megint a Image - Painter menüpontokkon keresztül indítsuk el a képernyő lap szerkesztőt. Mivel most már a blokk létrehozásakor megadtuk, hogy listás megjelenítést szeretnénk megvalósítani, ezért a mezők már eleve a listás formátumnak megfelelően helyezedtek el a képernyőn. Az átrendezés most a poziiók kiigazítását, a keretek kirajzolását és a tájékoztató szövegek felvitelére szolgál. A képernyőn a szerkesztés során csak az aktuális blokk mezői módosíthatók. A kívánt megjelenítési formátumot mutatja a következő ábra. ======================================================== +-------------------------- ELOFIZETOK-ADATAI -------------------------+ | | ID XXXXX NEV XXXXXXXXXXXXXXXXXX | | TARTOZAS LAKCIM XXXXXXXXXXXXXXXXX | +------------------------------------------------------------------------------------ +------------------------------- HIVASOK ------------------------------+ | | HIVOTTSZAM DATUM HOSSZ AR | XXXXXXXX XXXX XXX XXXXX | XXXXXXXX XXXX XXX XXXXX | XXXXXXXX XXXX XXX XXXXX | ...... ...... ..... ..... +----------------------------------------------------------------------+ ======================================================== Az elkészült képernyőt mentsük le, majd az egész űrlapot tegyük le az adatbázisba. Eztkövetően generáljuk a futtatható kódot, s indítsuk is az elkészült alkalmazást. A próbálkozások során feltünhet, hogy a kurzor csak az elofiz blokkban mozog. Az egyik blokkból egy másikba töténő átlépéshez külön logikai billentyű funkció létezik, melyet meg kell hívni a felhasználónak (vagy egy triggernek), ha a kurzort másik blokkba kívánjuk átléptetni. A blokkváltás funkciója: Next Block (irisansu: [^X B]) Previous Block (irisansu: [^Z ^X B]) A tesztelés során mozogjunk a blokkok és a rekordok, illetve a mezok között is. Majd vigyunk fel uj hivás rekordokat. A hivas rekordok felvitelekor a hivoid mező automatikusan kap érteket! Ez a master-default blokk-kapcsolat eredményeként felállított integritási feltétel következménye. Nézzük meg, mi történik akkor, ha két azonos dátumu értéket viszünk fel? Azt tapasztaljuk,hogy a rendszer nem engedi meg amásodik rekord felvitelét, s a következő hibaüzenetet kapjuk: FRM-40508: ORACLE error -- unable to INSERT record. vagyis az SQLForms nem tudja lehelyezni a rekordot az adatbázisba. Ennek pedi az oka, hogy a hivasok táblában, a definiált integritási feltételekből következően, nem fordulhat elő két azonos (hivoid, datum) értékpáros. Tehát nem lehet két azonos dátumu hivást felvinni a rendszerbe egy hivóhoz. A futtatás során feltünhet az is, hogy a HIVOID mező nem jelenik meg, a blokkban, habar a blokkhoz tartozó adattábla mezője, s mi nem tiltottuk le a kijelzését. Sőt a lapok tervezésekor még a lapon láthattuk a mezőt. E jelenség oka, hogy a generátor a master-detail kapcsolatban kapcsoló mezőként szolgáló mezőt az alblokkban feleslegesnek tekinti, mivel az nem hordoz uj informaciót. Ezért az SQLForms ezt a mezőt alapértelemzésként láthatatlanná teszi. Vagyis a mező DISPLAYED ECHO INPUT attributumai ki vannak kapcsolva. Az elkészült programra alapozva újabb elemeket vonunk be a tervezésbe következő feladatként. Bővitsük a hivasok táblát egy új mezővel, amely a tarifa nevet viseli. A tarifa értéke lehet 'NAPPALI','ESTI',...,ahol a lehetséges értékeket egy TARIFAK táblában tároljuk. A tarfia mező is jelenjen meg a képernyőn. Az új programban az előfizetők adatait viszont már ne lehessen módositani. Egy uj hivás felvitelénél legyen lehetőség a tarifa megadásánál egy értéktáblából történő választásra. Mindenekelőtt az adatbázisban kell elvégezni a szükséges adattábla módosításokat az SQLPlus segítségével. A megfelelő SQL utasítás az új adatmező felviteléhez: ALTER TABLE HIVASOK ADD (TARIFA CHAR(10)); Eztkövetően hozzuk létre a tarifa táblát és vigyünk fel pár rekordot: CREATE TABLE TARIFA (MEGN CHAR(10)); INSERT INTO TARIFA VALUES ('HETVEGI'); Ha az adatbázisbanm egtörténtek a szükséges módosítások, térjünk át az SQLForms rendszerre. Hozzuk be a módosítandó, előzőleg elkészített űrlap programot az Action - Open menüpontokon keresztül. Első lépésként módositsuk az elofiz blokk mezőit úgy, hogy az ott tárolt értékek csak olvashatók legyenek. Ehhez egyenként be kell hívni a mezők paraméter beállító ablakait. A mezők módosítása előtt válasszuk ki a elofiz blokkot, mivel ezen blokk mezőit kívánjuk elérni. Az aktuális blokk azonosítóját az alsó státuszsorban olvashatjuk le. Nézzük meg milyen érték áll a státussorban a Blk mezőben: ====================================================== Frm: TELEFON Blk: elofiz Fld: Trg: ====================================================== A mezőlistánál a kijelölt blokk mezői lesznek láthatók. Ha nem az elofiz blokk lenne kijelölve, akkor a kijelölését az alábbi úton érhetjük el: Block menüpont - Modify kurzorral ráálunk az elofiz blokkra Select funkcio [^X S] A blokk kijelölése után a mezőlistát hívjuk meg: Field - Modify Menjünk rá a Select Attributes oszlopra (itt érhetők el a mező szerkesztési parameterek). A blokk mind a négy mezőjénél kapcsoljuk ki az Update Allowed attributumot, így cvsak olvashatók lesznek a mezők. Eztkövetően mentsuk le a változtatást. Térjük most át a hivasok bblokkra. Nézzuk meg milyen mezői vannak a blokknak. Ehhez válasszuk ki a hivas blokkot: Block - Modify - mozgás a hivas blokkra - Select funkcio Tekintsük meg a blokkhoz tartozó mezőlistát: Field - Modify Eredményül az alábbi litát kell kapnunk: ========================================================- ---------------------------- Field Definition ------------------------------------ | | | Seq | Data | Sel. | Fld. | Qry. | Dis | + Field Name | Num |Type | Attr. | Len | Len | Len | X |... | |---------------------------------------------------------------------------------- | | HIVOTTSZAM | 1 | Num. | ( * ) | 12 | 12 | 12 | 16 |... | | DATUM | 2 | Date | ( * ) | 9 | 9 | 9 | 31 |... | | HOSSZ | 3 | Num. | ( * ) | 7 | 7 | 7 | 43 |... | | AR | 4 | Num. | ( * ) | 8 | 8 | 8 | 53 |... | | HIVOID | 5 | Num. | ( * ) | 5 | 5 | 5 | 64 |... | | | | | | | ======================================================== Mint látható, az új tábla mező (TARIFA) nem került be a blokkba, annak ellenére, hogy módositottuk a bázistábla szerkezetet. Az SQLForms nem követi automatikusan a változásokat (hová is helyezné például az új mezőt?), ezért a programozónak kell kézzel módosítania a blokk szerkezetet, vagyis egy új mezőt kell felvinnie a blokkba. Vigyük fel tehát a TARIFA mezőt a hivas blokkba. Ehhez előbb tervezzük meg, hogy hová fog kerülni az új mező a képernyőn, mivel a létrehozáskor már elhelyezési pozicióit is meg kell adni. Tudva, hogy a már foglalt helyekre nem helyezhető le az új mező, előbb készítsünk szabad helyet a mezőnek a képernyő megjelenítési lapon az Image - Painter funkcióval. Tegyük a TARIFA mezőt a HOSSZ es az AR mező közé. Ehhez első lépésben el kell tolni jobbra az AR és a HIVOID mezőket. Ezt megtehetjük közvetlenül a Fields- Modify mezőlista segítségével is, ha módositjuk az X oszlop érteket az érintett mezőknél. Növeljuk meg tehát mindkét mezőnél X-et 12-vel (a TARIFA mező ugyanis 10 karakter hosszú). Ha előkészítettük a képernyő lapot, jöhet a mező tényleges felvitele a blokkba. Elsőként menjünk a kurzorral a HOSSZ mezőre, ami mögé betesszük az új mezőt, s vigyünk fel egy új mezőt az Insert Record funkcióval (irisansu megfelelője: ^Z I). Eztkövetően töltsük ki a mező paramétereit: Name = TARIFA (innen tudja, hogy az alaptábla mely mezőjéhez kapcsolódik Data Type = CHAR Fld Len = Qry Len = Dis Len = 10 X = 53 Y = 14 Page = 1 (ugyanott van mint a többi mező) A bevitt adatok ellenőrzéséhez térjünk át űrlapos kijelzésre és ellenőrizzük a beállitott paramétereket. A kapott pareméterablak képét mutatja a következő ábra. ========================================================- ---------------------------- Field Definition ---------------------------------- +------------------------------------------------------------------------------------- | Field Name: TARIFA | Sequence Number: 4 Data Type: CHAR ( Select Attributes ) | Field Length: 10 Query Length: 10 Display Length: 10 | Screen Position: X: 53 Y: 14 Page: 1 ( Editor Attributes ) | Format Mask: | Default Value: | Hint: | Valid Range: Low: High: | Enforce Key: | List of Values: Title: Pos: X: Y: |---------------------------------------------------------------------------- | ------------------------ List of Values SQL Text ------------------------ | A módosítás soronkövetkező lépésáben a TARFIA mezőhöz érték listát hozzunk létre. Az elkészítendő listába a TARIFA adatbázis táblázat értékei kerülnek bele és a kiválasztott érték a TARIFA SQLForms mezőbe iródik be. Mivel a listában nemcsak a letároltható értékek jelenhetnek meg, hanem egyéb segédinformaciók is, és nemcsak egy mezőbe lehet értéket ilymódon bevinni, ezért külön ki kell jelölni, mely érték és hova kerül majd bevitelre. A kijelölés a SELECT ... INTO . ismert szerkezettel tortenik a List of Values SQL Text paraméterben. A definíciónál meg kell adni az ablak pozicióját és feliratát is a Title, illetvePos X, Pos Y paramétereknél. ========================================================- ---------------------------- Field Definition ----------------------------- +------------------------------------------------------------------------------- | Field Name: TARIFA | Sequence Number: 4 Data Type: CHAR ( Select Attributes ) | Field Length: 10 Query Length: 10 Display Length: 10 | Screen Position: X: 53 Y: 14 Page: 1 ( Editor Attributes ) | Format Mask: | Default Value: | Hint: | Valid Range: Low: High: | Enforce Key: | List of Values: Title: TARIFA Pos: X: 30 Y: 10 |---------------------------------------------------------------------------- | ------------------------ List of Values SQL Text ------------------------- | SELECT * INTO :HIVAS.TARIFA FROM TARIFA | ======================================================== Az elkészített mezőleírást mentsük le az Accept funkcióval, s igazitsuk ki a megjelenítő lapot a módositásoknak megfelelően. Ehhez hozzuk be a lapot az ismert Image - Painter menüpontok révén. Mivel a HIVOID mező láthatóan túlságosan jobbra került, hozzuk át a bal oldalra. Ehhez válasszuk ki a mezőt, vágjuk ki, majd tegyük le az új helyre. A szükséges lépések egyenként: kurzort rávinni a mezőre Select funkcio (irisansu esetén: ^X S) kurzorral mozgás az új pozicióra Cut funkció (irisansu esetén: ^Z C) Lehelyezés a Paste funkcióval (irisansu esetén: ^Z P) Legvégül igazítsuk ki a feliratokat is, hiszen az AR felirat rossz helyen maradt a mező elmozgatása után. A képernyő lap lementése után az teljes űrlapot is mentsük el az adatbázisba, s majd generáljuk és futtasuk az űrlap programot. Az elkészült alkalmazás kipróblásánánál mozogjunk a rekordok között, próbáljuk módositani az előfizetők adatait, majd menjünk át a hivasok blokkba, ott menjünk rá a TARIFA mezőre, s vigyünk fel értéket az értéklista segítségével. A feladat lezárásaként bemutatunk egy minta futási képernyőt is, melyben az értéklista is ki van már nyitva. ======================================================== +------------------------------ ELOFIZ --------------------------+ | | | ID 1 NEV Kiss Peter | | | | TARTOZAS 0 LAKCIM Eger, Dob u 23 | | | +-------------------------------------------------------------------+ +-------------+ +--------------------------- | TARIFA |-----------------------+ | | | | | HIVOTTSZAM | Find: |TARIFA AR | | 354771 +-+ +ESTI 40 | | 354771 | NAPPALI | 50 | | 345567 | ESTI | 200 | | 546546 | HETVEGI | 120 | | 747473 | | 120 | | +--------------+ | +-------------------------------------------------------------------+ ===================================================== A következő feladatban rátérünk a triggerek alkalmazására. Hozzunk létre egy kutya nyilvántartást, melyben minden kutyáról nyilvántartjuk a kódszámát, a nemét, a korát, a fajtáját, a nevét és a szinét. Az adat táblázat neve legyen eb. Készitsünk egy SQLForms programot, amelyben induláskor automatikusan elindul a lekérdezés és le van tiltva a rekordok felvitele és törlése is. Ha a felhasználó megpróbál új rekordot felvinni, vagy egy létezőt törölni, akkor az alábbi tájékoztató üzenetet iródjon ki: 'A funkcio most nem el'. Indulsáként itt is hozzuk létre az adattáblát az SqlPlus segitségével. A megfelelő SQL utasítások: CREATE TABLE EB (ID NUMBER(3) PRIMARY KEY, NEV CHAR(20), NEM CHAR(1), FAJTA CHAR(20), KOR NUMBER(2), SZIN CHAR(15)); Még az SQlPlus-on belül maradva, vigyünk fel néhány adatrekordot: INSERT INTO EB VALUES (1,'KORMOS','F','PULI',2,'FEKETE'); Ezután lépjünk be az SQLForms-ba és hozzunk létre egy új Forms programot EBEK néven. Mivel az alkalmazásunk most csak egy adattáblát és egyféle módon kezel, ezért egy blokk elegendő lesz. A blokkot a Block - Default menüpontokon keresztül, alapértelmezési felépítésben hozhatjuk létre. A blokkot az EB adattáblához kell kötni. Mivel a blokk alapértelmezési mezőlistája és képernyő megjelenítési lapja megfelel a feladat igényeinek, ezért a blokk definíció lemetése után rátérhetünk azon probléma megoldására, hogy induláskor automatikusan hajtódjon végre a lekérdezés, amely minden lehetséges rekordot elérhető tewsz, azaz a QBE ablakban nem adunk meg semmilyen szelekciós feltételt. Az SQLForms programokhoz kapcsolódó nem default eseményeket a trigger mechanizmuson keresztül kódolhatjuk. A triggerek kijelölt SQLForms eseményekre adandó választevékenysegeket definiálnak. A triggerek vonatkozhatnak billentyű lenyomásokra és belső navigációs, adatkezelési műveletekre is. A választevékenységek egy PLSQL blokk formájában adhatók meg, amelyek tartalmazhatnak a szokásos vezérlési, és SQL utasitásokon kivül SQLForms tárolt eljárás- és függvényhivásokat is. Az eljárásoknak két tipusa van, lehet korlátozott felhasználású (restricted) és korlátlan felhasználású (unrestricted). A restricted, korlátozott felhasználsú eljárások csak a billentyű lenyomásokhoz kapcsolódó (illetve a ON_NEW_FIELD_INSTANCE) triggereknél használható. A billentyűzet triggerek között van egy, a KEY-STARTUP, amely a program elején, az elso blokk bejelentkezése után hajtódik végre. Ez használható az indulási tevékenységek megadására. Mivel a lekérdezésnek rögtön a programelején, mielőtt a felhasználó bármilyen utasítást is kiadhatna, el kell indulnia, ezért ennél a triggernél kell a lekérdezés elinditását is kijelölni. A lekérdezés végrehajtása (mint sok más SQLForms tevékenység) a tárolt eljárások meghivásával inditható el. Ezen eljárás azonosító neve: Execute_query. A feladatunkban tehát létre kell hozni egy KEY-STARTUP triggert, melyben meghivjuk az Execute_query eljárást. A trigger definiáláshoz a trigger szerkesztőt a Trigger főmenüponton keresztül érhetjük el. Az induló listás elrendezésben előbb létrehozunk egy új triggert. Egy új triggert az Insert Record funkcióval lehet létrehozni. Ha üres a trigger lista, akkor a rendszer automatikusan felvisz egy új triggert. A trigger nevet (KEY-STARTUP) vagy fejből tudjuk, vagy lekérdezzük a List funkció (^X L) segitségével. A választevékenység megadásához célszerű áttérni a lista formátum helyett az - űrlap formátumra. A PLSQL blokkot a Trigger Text mezőbe adhatjuk meg. Ha a PLSQL blokk nem tartalmaz lokális változó deklaraciót, akkor elmaradhat a bevezető BEGIN kulcsszó. A PLSQL blokk végére sem kötelező kiirni a záró END utasitást. A trigger definíciós ablakját adja meg a következő ábra. ======================================================= Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- +----------------------------------------------------------------------------+ | Trigger: KEY-STARTUP | ---- For Key Triggers Only -- | Block: b1 | [ X ] Show Keys | Field: | Descrip: | Trigger Style: V3 | |-----------------------------------------+-------------------------------- | ------------------------------- Trigger Text --------------------------- | execute_query; | | ======================================================== Mentsük le a trigger definíciót és nézzók meg, hogy lehetne a Create-Record és a Delete-Record funkciókat letiltani, pontosabban üzenetkiírással helyettesíteni. A megoldáshoz szintén a triggereket kell segítségül hívni, melyek a megadott funkciókhoz kötődnek és választevékenységükegy egyszerű üzenetkiírás tevékenységből áll. Az üzenetek kiírását szintén tárolt eljáráshíváson keresztül oldhatjuk meg, ahol az eljárás azonosítója a message. Újra lépjünk be a trigger listába, majd hozzunk létre az új triggert. Most két új triggere is szükség van, hiszen a rekord létrehozást, mind a rekor törlést figyelni kell. A két új triggertipus: KEY-CREREC és KEY-DELREC A triggerek megalkotásának az lesz a következménye, hogy ha a blokkban a felhasználó aktivizálja a Create Record (irisansu: ^Z I) vagy a Delete Record (irisansu: ^Z D) funkciókat, akkor ezután nem a default műveletsor hajtódik végre, hanem a triggerekhez tartozó műveletsor és csak ez hajtódik végre. A példánkban egy üzenetet kell kiirni választevékenységként. A következő ábrában a KEY-CREREC trigger definiciós ablaka látható: ======================================================== Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- +------------------------------------------------------------------------------- | Trigger: KEY-CREREC | ---- For Key Triggers Only ---- | Block: b1 | [ X ] Show Keys | Field: | Descrip: | Trigger Style: V3 | |-----------------------------------------+-------------------------------- | ------------------------------- Trigger Text ---------------------------- | message ('A funkcio most nem el'); | | ====================================================== A KEY-CREREC triggerhez hasonlóan hozhatjuk létre a KEY-DELREC triggert is. Az elkészült programot mentsük le,majd futassuk, s próbáljuk ki a triggerek működését. Utólsó feladatként egy összetettebb, több különböző triggertipust igénylő módosítását kérjük az előző feladatnak. Módositsuk az előző programot úgy, hogy - ne lehessen az utólsó rekord után az adatbeviteli mezőre lépni - a NEM mezőbe módositáskor csak F vagy N betűket lehessen bevinni - hozzunk létre egy SZULEV (születési év) mezőt, melyet az életkor alapján töltünk ki - hozzunk létre a fajták tárolására külön táblát, amely a FAJTA mezőnél automatikusan kinyilik, ha a kurzor a mezőre lép - módositsuk az eb táblázatot egy leirás mezővel, mely long tipusú (tehát hosszabb szövegek tárolására alkalmas). Módositsuk a programot is úgy, hogy a mezőre lépve a List funkció meghivasa nyissa ki a mezőhöz tartozó szerkesztő ablakot - az emlitett és az UP, EXIT, NEXT FIELD funkciók kivételével tiltsuk le a többi billentyű funkciót A feladatban egy új mező, a SZULEV mező létrehozása szerepel. Ez a mező azonban nem egy új adattábla mezőt jelent, hanem egy új SQLForms mezőt. Ezért az EB adattáblánk definícióját nem kell módosítanunk, s rögtön meghívhatjuk az SQLForms programot. Töltsük be az előző feladatban elkészült programot, s lássunk neki a szükséges triggerek létrehozásához. Ahhoz, hogy ne lehessen az utólsó rekordnál tovább lépni, figyelni kell a továbblépés funkciót. Mivel a továbblépés a következő rekordra a DOWN funkcióhoz kötődik, ezért ennek letiltására kell triggert irni. Így a trigger esemény a KEY-DOWN lesz. A választevékenység attól függ, hogy hányadik rekordnál vagyunk. Ha az utólsónál, akkor irjon ki üzenetet, de ne történjen rekordváltas, mig a többi rekordnál ne legyen üzenet, de legyen rekordváltás a következő rekordra. A PLSQL blokkban az aktuális rekordpoziciót, pontosabban azt, hogy az utólsó rekordnál járunk-e, egy beépitett rendszerváltozó segitségével ellenőrizhetjük. A SYSTEM.LAST_RECORD 'TRUE' értéket ad vissza, ha az utólsó rekordnál vagyunk. Mivel ez a PLSQL blokk számára külső változóként jelenik meg, ezeért neve elé egy kettőspontot kell tenni. Mivel a trigger megadása után nekünk kell gondoskodni a normális rekordváltásról is, ezért szükségünk lesz a DOWN beépitett eljárás meghivására is. Az elkészített trigger paraméterablakát láthatjuk a következő ábrán: ====================================================== Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- | Trigger: KEY-DOWN | ---- For Key Triggers Only ---- | Block: b1 | [ X ] Show Keys | Field: | Descrip: | Trigger Style: V3 | | ------------------------------- Trigger Text ----------------------------- | IF :SYSTEM.LAST_RECORD = 'TRUE' THEN | MESSAGE ('UTOLSO REKORD NINCS TOVABB'); | ELSE | DOWN; | END IF; | ====================================================== A következő lépésben a NEM mező értékének ellenőrzését végezzük el. Ehhez egy oolyan triggert kell létrehozni, amely az érték bevitele után hívódik meg, s meg nem engedett érték esetén SQLForms hibát generál. A mezők új értékének ellenőrzése (validation) a navigációhoz kötődik, és ennek során ellenőrzi, hogy van-e a mezőhöz egy bizonyos ON-VALIDATE-FIELD trigger definiálva. Ha igen, akkor ez is meghivódik az ellenőrzes során, és ennek sikerességétől is függ, hogy elfogadja-e az SQLForms a bevitt értéket vagy sem. Példánkban az ellenőrzési triggert a b1 blokk NEM mezőjéhez kell kötni. A triggerekben a sikertelenséget a PLSQL blokkok szabályai szerint hibaként kell kezelni. A PLSQL blokkokban egy hibát a RAISE utasitással lehet közvetlenül generálni. A SQLForms triggerekhez kapcsolódóan létezezik egy speciális hibatipus, amely arra szolgál, hogy jelezze a trigger sikerességét illetve sikertelenségét. Ez a hibaesemény a Form_Trigger_Failure. A példában is ennek segitségével közölhetjük az SQLForms-szal, hogy elfogadható-e a bevitt értek vagy sem. Az elkészítendő triggerdefiníciót mutatja be az alábbi ábra: ======================================================== Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- +---------------------------------------------------------------------------- | Trigger: ON-VALIDATE-FIELD | ---- For Key Triggers Only --- | Block: b1 | [ X ] Show Keys | Field: NEM | Descrip: | Trigger Style: V3 | |-----------------------------------------+--------------------------------- | ------------------------------- Trigger Text ----------------------------- | IF :B1.NEM <> 'N' AND :B1.NEM <> 'F' THEN | MESSAGE ('ROSSZ ADAT'); | RAISE FORM_TRIGGER_FAILURE; | END IF; | | ======================================================== Mentsük le a triggert, és nézzük meg, hogyan lehet egy új mezőt, a SZULEV mezőt létrehozni. E mező érdekessége, hogy nem az alaptáblából jön, értéke más blokk mezőkből származtatható. Mivel a dinamikus értékszármaztatást is csak a triggereken keresztül oldhatjuk meg, itt is szükség lesz új triggerek definiálására. Mindenekelőtt azonban magát az új blokk mezőt kell létrehozni. Ehhez szbadítsunk fel helyet a képernyő lapon, ahol a szerkesztőt az Image - Painter menüpontokon keresztül érhetjük el. Nézzük meg, mely az képernyőlap pozició, ahová lehelyezhető az új mező, s jegyezzük fel ezt apoziciót, mivel a mező létrehozásdakor szükség van ezen adat megadására is. Hozzuk létre az új mezőt a korábbiakban ismertett módon, s töltsük ki a peremétereit a feladtnak megfelelően. A SZULEV mezőnél a Select Attributumok közül csak a DISPLAYED és az ECHO INPUT legyen engedélyezve. Ezzel a beállításal jelezzük többek között, hogy a mező nem a bázistáblából jön, értéke nem módosítható, s a lekérdezésnél sem lehet rá szelekciós feltételt kijelölni. A fenti két attributumnak viszont igaz értéken kell állnia, hogy a mezőben tárolt érték kijelézsre kerüljön a képernyőn. A SZULEV mező egy származtatott mező, melynek értéke a KOR mezőből jön. Igy akkor kell neki új értéket kapnia, ha a KOR mező megváltozik. A KOR mező megváltozása viszont a POST-CHANGE triggerhez kapcsolódik. Ez a trigger akkor hivódik meg, amikor a kapcsolódó mezőbe új érték kerül. A létrehozandó trigger definicioját foglalja össze az alábbi ábra: ==================================================== -------------------------- Trigger Definition ---------------------------- +--------------------------------------------------------------------------- | Trigger: POST-CHANGE | ---- For Key Triggers Only | Block: b1 | [ X ] Show Keys | Field: KOR | Descrip: | Trigger Style: V3 | |-----------------------------------------+--------------------------------- | ------------------------------- Trigger Text ----------------------------- | :b1.szulev := 1997 - :b1.kor; | | ==================================================== A létrehozott triggerben az aktuális évet, mint konstanst adtuk meg. Sokkal rugalmasabb rendszert kapunk, ha az évszámot nem konstansként adjuk meg, hanem a rendszer időből kérdezzük le, így a program nemcsak az 1997-es esztendőben fog jól működni. Ez azonban már egy kicsit körülményesebb eljarast igenyel. Ugyanis a korábban ismertett $$date$$ változó csak default érték megadására szolgál. Itt nem elérhető ez a rendszerváltozó, ezért más módon, mégpedig az SQL-en keresztül érhetjük el a rendszeridőt a triggereken belül. Ehhez a már ismert sysdate oszlopnevet kell felhasználni, előbb egy PL/SQL változóba mentjük le a rendszeridőt, majd e változó használjuk fel a SZULEV érték meghatározására. A módosított trigger szövege a következő lesz: ================================================== | ------------------------------- Trigger Text ----------------------------- | declare | ev char(8); | begin | select to_char(sysdate,'YYYY') into ev from dual; | :b1.szulev := to_number(ev) - :b1.kor; | end; |---------------------------------------------------------------------------- ================================================== A műveletsor meg jobban is tömöríthető, egyetlen utasitassá is összevonható, ha a SELECT utasításban közvetlenül hivatkozunk mindkét blokk mezőre. ====================================================== | ------------------------------- Trigger Text ----------------------------- | select to_number(to_char(sysdate,'YYYY'))- :b1.kor into | :b1.szulev from dual; | ====================================================== Mentsük le a triggert, és térjünk át a következő részfeladatra, amely egy FAJTA értékek lehetséges értékeinek megadására szolgál. Hozzuk létre indulásként a FAJOK adat táblát az adatbázisban az SQLPlus segitségével, s töltsük fel az új táblát néhány rekorddal. A megfelelő SQL utasítások: CREATE TABLE FAJOK (NEV CHAR(20)); INSERT INTO FAJOK VALUES ('PULI'); Ezután térjünk vissza az SQLForms-hoz, s hozzunk létre értéklistát a FAJTA mezőhöz. A FAJTA mező új paramétereit adja meg az alábbi ábra: | List of Values: Title: FAJOK Pos: X: 30 Y: 9 |---------------------------------------------------------------------------- | ------------------------ List of Values SQL Text ----------------------- | select nev into :b1.fajta from fajok | | --------------------------------- Comment -------------------------------- ================================================ A feladatban a lista megnyitását automatikussá kell tenni. A listának akkor kell kinyilnia, ha a felhasználo belép a mezőbe. A mezőbe való belépés az ON-NEW-FIELD-INSTANCE triggerhez kapcsolódik. A lista kinyitása pedig a LIST_VALUES tárolt eljárás meghivásával történik. Így trigger definíciója: =================================================== Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- +---------------------------------------------------------------------------- | Trigger: ON-NEW-FIELD-INSTANCE | -- For Key Triggers Only -- | Block: b1 | [ X ] Show Keys | Field: FAJTA | Descrip: | Trigger Style: V3 | |-----------------------------------------+--------------------------------- | ------------------------------- Trigger Text ----------------------------- | LIST_VALUES; | ==================================================== A trigger lementése után hozzákezdhetünk a LEIRAS mező létrehozásához és a megfefelő szerkesztő ablak előállításához. Mivel a új mező, a LEIRAS az adat táblából jön, ezért elsőként az adatbázst kell módosítani, hozzáadva egy új mezőt az EB adattáblához. Ehhez ismét az SQLPlus rendszert kell meghívni,melyben kiadható az alábbi utasítás: ALTER TABLE EB ADD (LEIRAS LONG); Eztkövetően térjünk vissza az SQLForms-ba. Az új mezőnek előbb készitsük helyet a képernyő lap szerkesztőjével, s jegyezzük meg a kiválasztott elhelyezési poziciót. Majd hozzuk létre a mezőt a blokkban is, úgy ahogy azt az előző példábn is tettük. A következő feladat a LEIRAS mezőhöz tartozó szerkesztő ablak meghivása. A szerkesztő ablak megnyitása az EDIT_FIELD tárolt eljárással lehetséges a triggreken belül. Az eljárásnak négy paramétere van, melyek a szerkeszto ablak megjelenését szabályozzák: Xbalfelső, Ybalfelső, Xjobbalsó, Yjobbalsó A feladatunkban a szerkesztő ablaknak az értéklista megnyitás funkcióhoz kell kötődnie, vagyis akkor nyílódik ki, amiikor a felhasználó aktivizálja a LIST funkciót. Alapesetben ez az értéklistát jeleníti meg, ha van értéklista. Ha nincs értéklista a funkció hatástalan. Ahhoz, hogy a szerkesztő ablak nyíljon meg, egy triggert kell készíteni ehhez a funkcióhoz. A LIST billentyűzet funkció a KEY-LISTVAL triggerhez kapcsolódik. Ügyeljünk arra, hogy a trigger csak a LEIRAS mezőhöz kötődjön. A trigger definícióját mutatja a következő ábra: =================================================== Action foRm Block Field Trigger Procedure Image Help Options ---------------------------- Trigger Definition ---------------------------- +---------------------------------------------------------------------------- | Trigger: KEY-LISTVAL | -- For Key Triggers Only ---- | Block: b1 | [ X ] Show Keys | Field: LEIRAS | Descrip: | Trigger Style: V3 | |-----------------------------------------+-------------------------------- | ------------------------------- Trigger Text ----------------------------- | EDIT_FIELD (25,7,50,8); | =================================================== A trigger lementése után az utólsó lépés következik, melyben az összes, nem igényelt funkciót letiltjuk. Több funkció együttes kezlésére a KEY_OTHERS triggertipus szolgál, mely az expilicte nem kezelt (vagyis amikhez nem készítettünk saját triggert) funkciót összefogja. Így azon funkciókhoz, melyeket nem akarunk ide belevenni, készítenünk kell saját triggereket. Így most az UP, EXIT es NEXT FIELD funkciokhoz kell elsőként kezelő triggert készíteni. Mivel e funckiók eredeti jelentése megfelel, ezért e triggerek ugyanazt fogják tenni, mint az alapértelemzési funkciók. Így az alábbi eljárásokat kell meghívni az egyes triggerekben: trigger eljárás KEY-UP --> UP KEY-EXIT --> EXIT_FORM KEY-NXTFLD --> NEXT_FIELD Mindhárom triggernek az egész blokkra kell vonatkoznia. A következő lépésben letiltjuk a többi funkciót (billentyűt). Ehhez a KEY-OTHERS triggerben egy üres utasítást (NULL;) vagy esetleg egy üzenetkírást tehetünk. Példánkban minden nem értelmezett funkciónal egy 'Nem ertelmezett funkcio' üzenet kerul kiirasra. A KEY-OTHERS is legyen blokkra értelmezett. A trigger választevékenységet leíró része: | ------------------------------- Trigger Text ----------------------------- | message ('Nem ertelmezett funkcio'); | | =============================================== Ezzel megvalósítottuk az utólsó igényt is. Az elkészitett triggerek listáját mutatja a következő ábra: ==================================================== ---------------------------- Trigger Definition ---------------------------- +-+----------------------------------------------------------------------------+ | | | | | Trig | Show +-+ Trigger Name | Block Nam | Field Nam | Styl | Keys | |------------------+------------------+------------------+---------+-------+-| | | KEY-CREREC | b1 | | V3 | [ X ] | | | | KEY-DELREC | b1 | | V3 | [ X ] | | | | KEY-DOWN | b1 | | V3 | [ X ] | | | | KEY-EXIT | b1 | | V3 | [ X ] | | | | KEY-NXTFLD | b1 | | V3 | [ X ] | | | | KEY-OTHERS | b1 | | V3 | [ X ] | | | | KEY-STARTUP | b1 | | V3 | [ X ] | | | | KEY-UP | b1 | | V3 | [ X ] | | | | ON-VALIDATE- | b1 | NEM | V3 | [ X ] | | | | ON-NEW-FIELD | b1 | FAJTA | V3 | [ X ] | | | | POST-CHANGE | b1 | KOR | V3 | [ X ] | | +-+ KEY-LISTVAL | b1 | LEIRAS | V3 | [ X ] | | ==================================================== Az elkészített alkalmazást futtassuk le a különböző triggerek hatásainak kipróbálásra. A példákban megadott feladatokkal összefoglaltuk az SQLForms programok fejlesztésének alapjait, betekintést adva a fejlesztés logikájába, az SQLForms programok fejlesztési módszertanába. E mintaprogramok természtesen csak az alapok megadására szolgáltak, későbbi egyéni feladatok esetén az SQLForms kézikönyvei nyujthatnak majd segítséget a részletek kiderítésének izgalmas feladatában, melyben bizonyára egy-két meglepetés is fogja majd érni a fejlesztő kollégát.