xBase alapú adat-kezelés

 

Áttekintés az xBase nyelvekrõl

 

Az elõzõekben ismertetett relációs adatmodell legelsõként a közép kategóriájú rendszereken futó DBMS-ekben valósult meg. Az RDBMS-ek kisebb gépeken, a személyi számítógépeken való elterjedését az RDBMS-ek által igényelt nagyobb erõforráskapacitás, az erõsebb hardver igény és a rendszerek magas árai is korlátozták. Az akkori átlagos vállalati információs rendszer konfigurációhoz igazodva, az RDBMS-t fejlesztõ cégek e középkategóriára koncentráltak. A nyolcvanas évek elején megjelenõ elsô sikeres mini és közép kategóriájú gépeken futó RDBMS rendszerek után azonban a személyi számítógépek világában is felbukkantak a relációs adatmodell bizonyos elemeit átvevô adatkezelô rendszerek. E rendszerek ugyan adatbáziskezelõknek hirdették magukat, de szolgáltatásaikat tekintve távol álltak még az igazi, középkategóriás RDBMS rendszerektõl.

 

E rendszerek a relációs modell általános sikerét és azt a tényt, hogy az RDBMS világ a szélesebb felhasználói rétegek számára elérhetetlen álom volt csupán, létrehoztak olyan rendszereket, melyek alapjaiban átveszik, megvalósítják a relációs modell egyszerûségét, megvalósítják annak egyszerûbb elemeit, viszont kihagynak számos olyan elemet, melyek egy igazi RDBMS-tõl elvárható lenne.

 

E termékcsalád egyik legsikeresebb képviselôje a dBase rendszer volt. A nyolcvanas évek második felétôl egyre több ilyen jellegû terméket fejlesztettek ki, melyek nemcsak nevükben hasonlítottak a nagy úttörô, a dBase rendszerre, hanem adattárolási filozófiájuk, parancsaik, mûködésük is nagyon sok közös vonást hordozott. Úgy is mondhatnánk, hogy ezen nyelvcsaládban a dBase, pontosabban dBaseIII, egy kvázi szabványnak tekinthetô, s az a programozó, aki megismerte a dBaseIII használatát, már ismerôsnek fogja találni a többi idetartozó rendszert is, mint pl. a Clipper, Superbase, FoxBase, FoxPro, RBase, Btrieve, CodeBase termékeket, hogy csak az ismertebbeket említsük.

 

Az xBase kifejezés alatt nem egy termék értendô, hanem egy adatkezelô nyelv család, hasonlóan mint ahogy az SQL sem egy rendszer azonosító neve, hanem egy adatkezelô nyelv szabvány. Az xBase nyelvcsaládhoz azonban nem tartozik olyan szigorú, egyértelmû szabvány mint amilyen az SQL volt, nincs lerögzítve, hogy milyen nyelvet, milyen parancsokat, szintaktikát kell támogatniuk az ebbe a körbe tartozó rendszereknek. Ezért azt mondhatjuk, hogy az xBase egy gyüjtôfogalom, mely alatt azon adatkezelô nyelveket értjük, melyek igen hasonlítanak a dBase rendszer adatkezelô nyelvére. Olyan mint xBase nyelv nem létezik, csak a konkrét rendszereknek van definiált nyelve. Így létezik dBase nyelv, FoxPro nyelv, Clipper nyelv stb., viszont mindegyikben nagyon sok közös vonás húzódik meg.

 

Az xBase adatbázis-kezelô rendszerek fô jellemzôje, hogy eredetileg egyszemélyes adatkezelési igények kielégítésére készültek, kisebb erôforrásokkal rendelkezô számítógépekre tervezték ôket. Emiatt a relációs adatmodellben lefektetett elveknek, a System R-ben megvalósított lehetôségeknek csak egy töredékét lelhetjük fel bennük. Emiatt azt is mondhatjuk, hogy ezek a rendszerek nem tekinthetôk adatbázis-kezelô rendszereknek, inkább a filekezelô rendszerek körébe sorolhatnánk ôket. Ebben az állításban nagyon sok igazság van, amirôl magunk is meggyôzôdhetünk, ha megismerjük az xBase rendszerek jellegzetességeit. Azonban azt sem szabad elfelejteni, hogy a hétköznapi életben, a szakma tágabb berkeiben ezen rendszerekre is már meghonosodott az adatbázis-kezelô fogalom, s ugyanúgy a relációs adatbázis-kezelôk képviselôinek tekintik, mint a tekintélyes Oracle, Sybase stb. rendszerek.

 

A ismertetés során mi is átvesszük ezt a terminológiát, természetesen mindig egy kicsit idézôjelbe téve az adatbázis-kezelô kifejezést, s szeretnénk egy kicsit arra is rávilágítani, hogy mennyiben is térnek el ezek rendszerek az általunk használt szigorúbb RDBMS kritériumoktól. Mindezzel azonban távolról sem az a célunk, hogy az xBase rendszerek létjogosultságát akárcsak vitassuk is, hiszen a gyakorlat mutatja, hogy a piac mennyire igényli az ilyen jellegû adatbázis-kezelôket is. Létezik ugyanis az adatkezelési feladatoknak egy tekintélyes csoportja, melyek megoldására ezek a termékek kiválóan alkalmasak, ha nem kívánunk az 'ágyúval lôni verébre' hibájába esni. A drágább, nagyobb erôforrást igénylô DBMS-eket nem célszerû az egyszerûbb, xBase rendszerrel is megoldható feladatokhoz felhasználni. Az xBase rendszer használata indokolt, ha

- egyfelhasználós rendszert kívánunk mûködtetni

- PC-s környezetben dolgozunk

- adatvédelem és adatintegritás nem jelent kritikus követelményt

- olcsó megoldást keresünk

- közepes tranzakció igénnyel lehet számolni

 

Napjainkban nagyon sok helyen, sok cégnél futnak xBase alapú alkalmazások, és a jövôben is számolni kell még jelenlétükkel, így nem maradhat ki a könyvbôl az xBase alapú rendszerek ismertetése sem. Az xBase rendszerek ismertetése során ki fogunk térni a fizikai megvalósítás egyes részleteire is, ugyanis az xBase rendszerek kevésbé támogatják a logikai és a fizikai szintek függetlenítését, s egyes fogalmaiban felhasználja az adatok fizikai tárolásának specifikumait, így mi is kénytelenek vagyunk a fizikai részleteket is megismerni, ha meg akarjuk érteni a rendszer mûködését.

 

E sok negatív értékelés után néhány szó arról, hogy miért is vesszük ilyen részletesen a dBase nyelvek ismertetését. A dBase rendszerek bevonását több oldalról is meg lehet indokolni. Egyik fõ érv, hogy a dBase rendszerek ma is élõ, sok helyen futó rendszerek. Sok vállalatnak nincs szüksége igazi RDBMS-re a feladat nagyságából következõen vagy esetleg nem engedhet meg magának nagyobb, komolyabb rendszert. Mivel a dBase rendszerek legközelebbi kapcsolatban mégiscsak a relációs adatbáziskezeléssel vannak, ezért e terület szakemberei vár a dBase rendszerek megismerése, programozása, karbantartása. Ez munkalehetõséget jelent az adatbázis szakemberek számára. E lehetõséget nem szabad elszalasztani, ezért érdemes e rendszer mûködését is megismerni.

A xBase világ emellett sok apróbb vagy nagyobb területre felhívta az RDBMS fejlesztõk figyelmét, amelyek az RDBMS világban is jelentõs változást hoztak. E területek között említhetõ például a rugalmas, hatékony alkalmazás fejlesztõ eszközök köre. Az xBase rendszerek jól összefogják a gyors fejlesztéshez szükséges eszközöket, nagyobb kényelmet kínálva a fejlesztõknek.

Az xBase világ egy fejlõdõ irány. Jelenleg is újabb és újabb xBase alapú fejlesztõ rendszer jelenik meg a PC-s környezetben, s e rendszerek egyre több funkciót integrálnak magukba a régebben hiányolt szolgáltatások közül. Ezt azt tette lehetõvé, hogy a hardver gyors fejlõdésével, a PC-s eszközök kapacitásai már elérték a régebbi középkategóriás gépek teljesítményét.

Ez azonban nemcsak lehetõség az xBase rendszerek számára, hanem kihívás is egyben. Az erõsebb erõforrások lehetõvé tették ugyanis a nagyobb, igazibb RDBMS rendszereknek a PC-s kategória felé történõ elmozdulását is. MA már nem ritkák a nagy RDBMS rendszerek Windows alatt futó változatai sem, igaz ezek legtöbbször egy nagyobb RDBMS rendszerhez kapcsolódnak.

 

Mivel xBase szabvány nem létezik, így csak konkrét adatkezelô rendszereket mutathatunk be. Elsôként az xBase nyelvek gyökerét, a dBase III+ rendszert tekintjük át, s utána térünk át a gyakorlati életben igen elterjedt másik népszerû képviselôjére is ennek a nyelvcsaládnak, a FoxPro nyelvre. E két nyelv megismerése elegendô alapot fog adni a többi, xBase tipusú rendszer megismeréséhez is.

 

 

A dBase III+ nyelv struktúrális része

 

A dBase (és vele együtt az xBase) rendszerek adatmodellje annyiban hasonlít a relációs adatmodellre, hogy az adatok itt is táblázatokban kerülnek elhelyezésre. A táblázatoknak itt is egyedi azonosító nevet adunk, s a táblázatok mezôit is rugalmasan definiálhatjuk. Ezen túl azonban nem sok azonosságot találhatunk a relációs adatmodellt megvalósító RDBMS-ek és a dBase adatmodellje között. A dBase és az RDBMS-ek közötti legfontosabb eltérések az alábbiakban foglalhatók össze:

 

Adatstruktúra

 

A dBase táblázatok külön állományokban helyezkednek el, minden táblázat egy külön állomány, sôt egyes esetekben két különbözô állomány tartalmazza egy táblázat adatait. E második állomány léte a következôkben rejlik. A dBase öt alapmezôtípust támogat:

 

- numerikus

- szöveges

- dátum

- logikai

- memo

 

A memo mezôtípus egy tetszôlegesen hosszú (pontosabban 5 ezer byte hosszú ) szöveget takar, ezzel szemben a normál szöveges adattípus csak 255 karakter hosszú lehet. A táblázatokhoz tartozó alapállományban csak a maximum hosszal korlátozott elsô négy mezôtípust lehet letárolni, a memo típusú mezôket nem lehet. A memo típusú mezôk tartalmát egy külön állomány tárolja, s ez az állomány csakis a memo mezôk értékeinek a tárolására szolgál. A táblázatokhoz tartozó alapállomány neve:

 

táblázatnév.DBF

 

azaz, az állománynév megegyezik a táblázat nevével. Az állomány szerkezete két fô részbôl áll, van egy fejrész, amely leírja a táblázat szerkezetét, s van egy törzsrész, mely a táblázat rekordjainak az értékét tárolja. Maga a fejrész is két komponensbôl áll fel, egy táblázatleíró és egy mezôleíró részbôl. A táblázat leíró rész a következô mezôket tartalmazza:

 

- 1 byte: dBase verziószám

- 3 byte: utolsó módosítás dátuma

- 32 bit: rekordok darabszáma a táblázatban

- 16 bit: a fejrész mérete (byte)

- 16 bit: a rekord mérete (byte)

- 20 byte: egyéb adatok

- n*32 byte: mezôleírók, ahol n a mezôk darabszáma

 

A mezô leírására szolgáló 32 byte a következô adatokat tartalmazza:

 

- 11 byte: mezônév ASCII-ban

- 1 byte: mezôtípus ASCII-ban (C,N,L,D,M)

- 4 byte: egyéb adatok

- 1 byte: mezô teljes hossza karakterben

- 1 byte: tizedesjegyek darabszáma

- 14 byte: egyéb adatok

 

Az DBF állományok törzsrészében kerülnek elhelyezésre az egyes rekordok nem memó mezôinek értékei. Az adatok tárolása ASCII formában történik, s minden mezôértéket a definiált hosszon tárol le, azaz egy mezô bármelyik rekordban ugyanannyi byte-ot foglal le, függetlenül a mezô aktuális értékétôl.

Mivel az állandó mezôszélesség miatt a mezôhatárok mindig ugyanarra a pozícióra esnek a rekordon belül, ezért nincs szükség külön mezôhatároló karakterekre vagy mezõhosszt tároló bytokra a rekordban. Ebbôl az is következik, hogy minden rekord azonos hosszúságú a törzsrészben. Ez viszont lehetõvé teszi a rekordok sorszám szerinti közvetlen elérését. Így a dBase az adatkezelõ minden rekordot közvetlenül el tud érni, ha adott a rekord táblán belüli poziciója. Az azonos rekordhosznak van azonban egy hátránya, hogy a helykihasználás így kisebb lesz, mintha csak az értékes adatok szerepelnének a rekordokban. Ez különösen a memó mezóknél lenne jelentõs veszteségi tényezõ.

 

A memó típusú mezôk tárolása, kezelése viszont lényegesen eltér a többi mezõ kezelésétõl. Egyrészt a memó mezõnél nem lehet hossz jelzõt megadni. A többi mezõtipushoz mindíg tartozik egy hosszérték is. A logikai és a dátum tipusoknéál a rendszer határozza meg ezt a hosszt egy és nyolc byte-ban. A memó mezôérték másik sajátsága, hogy az alaptáblában nem a benne tárolt szöveg, hanem egy sorszámot tárol, amely megadja, hogy az adott rekordhoz tartozó szöveg, a kiegészítô állománynak, melynek

 

táblázatnév.DBT

 

a specifikációja, hanyadik blokkjánál kezdôdik. A memó mezõben tárolt szövegek tehát mindíg blokk egységekben foglalnak helyet egy, aza laptáblától különbözõ memó állományban.

 

Adattáblák létrehozása

 

A táblázatok létrehozása a

 

CREATE táblázatnév

 

utasítással lehetséges. Mint látható az utasításnak ebben az alakjában semmilyen információ nem szerepel a táblázat szerkezetérôl. Az erre vonatkozó adatokat nem a parancssorban kell megadni. Az utasítás hatására ugyanis meghívódik egy segédprogram a dBase keretén belül, melyben táblázatszerûen kitölthetô, hogy a létrehozandó tábla milyen azonosítójú és típusú mezôkbôl épüljön fel. Az adattáblák szerkezetét tehát interaktívan lehet létrehozni.

Az alábbi példa az auto táblázat létrehozatalát mutatja be:

 

CREATE auto

 

parancs hatására megjelenô segédprogram kijelez egy üres szerkezet leíró képernyõt, melybe be kell vinni a létrehozandó tábla mezzõinek leíró paramétereit A szerkezet leíró rész felépítése.

 

Field Name Type Width Dec Field Name Type Width Dec =====================================================

1 RSZ Character 6 0

2 TIP Numeric 10 3

 

Az adattábla definiáló szerkezetben az egyes oszlopok jelentése a következõ:

 

Field Name: a mezõ azonosító neve, maximum 11 byte

Type: a mezõ tipusa, a lehetséges öt adattipus valamelyike

Width: mezõ teljes szélessége, azaz a mezõ értékeinek tárolásához szükséges byte-ok darabszáma. Minden rekordban ennyi byte fog letárolódni a mezõ számára.

Dec: numerikus mezõk esetén a tizedespont mögötti számjegyek darabszáma. A dBase a számokat is ASC számjegyekként tárolja.

 

A adattábla a fenti utasítás mellett létrehozható úgy is, hogy nem jelenik meg az interaktív szerkezet beolvasó ablak. Ennek elõfeltétele, hogy létezzen olyan speciális adattábla, mely a létrehozandó tábla szerkezetét írja le. Egy ilyen tábla létrehozható egy létezõ tábla szerkezetének tárolására a

 

COPY TO szerkezetleíró_tábla STRUCTURE EXTENDED

 

utasítással, ahol a szerkezetleíró_tábla jelenti a szerkezetet leíró adattáblát. Az utasításban az aktuális tábla szerkezetetét õrizzük meg. Az aktuális tábla meghatározásának módszerét késõbb fogjuk venni. A szerkezet leíró tábla felhasználásával a

 

CREATE táblázatnév FROM szerkezetleíró_tábla

 

utasítással közvetlenül is létrehozhatók új adattáblák. A DBF állományok mellé automatikusan létrejönnek a memó adatokat tároló DBT állományok is, ha a szerkezetet memó mezõket is tartalmaz. Ez utóbbi utasítást rendszerint nem egy sime tábla dupplikálásra alkalmazzák, mivel arra van egy egyszerûbb megoldás is. A CREATE FROM utasítást felhasználásának két fõ oka szokottt lenni: egyrészt egy módosított szerkezet leíró táblára alkalmazzák, másrészt programokban felhasználható dinamikus táblák létrehozására anélkül, hogy a képernyõn megjelenne a strktúra leíró ablak.

 

Az így létrehozott DBF állományok a DOS szintjérôl ugyanúgy kezelhetôk, mint bármely más állomány, tehát másolható, kilistázható és törölhetô is. A táblázat és bármely más állomány törlése a DOS DEL parancs mellett a dBase-bôl is végrehajtható, az

 

ERASE állományspecifikáció

 

utasítással, tehát pl. az auto táblázatot az

 

ERASE AUTO.DBF

 

parancs törli ki.

 

A táblázatok módosítására a létrehozása után a késôbbiekben bármikor lehetôség van. A táblázat szerkezetének módosításához a

 

MODIFY STRUCTURE táblázat

 

parancsot kell kiadni, mely hatására ugyanaz a segédprogram hívódik meg, mint a táblázatok létrehozásakor. Ebben módosíthatjuk a meglévô mezôk specifikációit, törölhetünk mezôket és új mezôket is vihetünk fel. A módosítás után a régi táblázatból az átvihetô adatok átkerülnek az új táblázatba, miközben a régi táblázat adatai is lementésre kerülnek.

 

Adattáblák megnyitása

 

A dBase rendszerben mielôtt egy táblázat adataihoz hozzáférhetnénk, meg kell nyitni a táblázatot, pontosabban annak DBF állományát. Csak a már megnyitott táblázatokhoz lehet hozzáférni. A megnyitás során válik a DBF állomány elérhetôvé a dBase számára. Mivel minden táblázat egy külön állomány megnyitását jelenti, s a rendszerben helyhiány miatt véges a megnyitható állományok száma, ezért csak meghatározott darabszámú táblázat lehet megnyitva egyidejûleg. A dBaseIII rendszerben 10 az egyidejûleg megnyitható táblázatok maximális száma.

A dBase terminológiában munkaterületnek nevezik a megnyitott táblázat tárolására szolgáló struktúrát, természetesen ez nem azt jelenti, hogy a teljes táblázat bekerül a memóriában elhelyezkedô kijelölt munkaterületre, ez csupán egy leíró struktúra, mely nyilvántartja többek között a DBF állomány legfontosabb paramétereit és az aktuális rekord mezôinek adatait is.

Ha betelt mind a 10 munkaterület, akkor egy újabb táblázathoz csak úgy férhetünk hozzá, ha elôbb kitörlünk egy táblázatot a munkaterületekrôl, ha átírjuk az egyik munkaterületen megadott adatokat az új táblázat adataira. Ezáltal a korábban ott tárolt táblázat kiesik, újra elérhetetlenné válik.

 

Az RDBMS környezetekben természetesnek tekintik, hogy egy felhasználó egy tranzakción belül több táblázathoz is hozzáforduljon, egy mûveleten, utasításon belül is több különbözô táblázatra is hivatkozzon. Ugyan a dBase modellben is használhatunk több táblázatot egyidejûleg, ha elôtte mindegyiket megnyitottuk már, viszont a használat módja egy egytáblázatos szemléletet sugall. A dBase szemléletében ugyanis a felhasználó egy rövidebb-hosszabb ideig folyamatosan egyazon táblázattal dolgozik, úgymond nem ugrándozik a táblázatok között utasításonként. Ez a feltevés érezhetôen megint csak a rekordorientált szemléletbôl jön, hiszen ebben az esetben rendszerint nem lehet egyetlenegy utasítással meghívni a táblázaton egyszerre végrehajtandó mûveletsort.

A dBase adattábla kezelése hasonlít a hagyományos filekezelésre, amikor is a felhasználó rendszerint ugyanabban a katalógusban elhelyezkedô állományokkal dolgozik egy valamilyen hosszú idôintervallumban. Ezért a dBase az OS filekezelés munkakatalógus analógiájára bevezette a munkatáblázat fogalmát, s az utasítások erre a munkatáblázathoz kötôdnek. Olyan szoros ez a kötôdés, hogy az utasítások zöme csak a munkatáblázaton végezhetô el, ugyanis az utasításokban nincs lehetôség a táblázat kijelölésére, a rendszer kötelezôen a munkatáblázatot veszi alapul. A dBase-ben is egyidejûleg csak egy munkatáblázat lehetséges.

 

Az állományokra, utasításokra történô hivatkozások rugalmasságának növelése érdekében az OS rendszerben lehetôség van úgynevezett álnevek használatára is. A dBase is biztosít egy hasonló szolgáltatást, itt azonban a helyettesítô név csak egy alkalmazás erejéig él. Ezért nem használható automatikusan az alkalmazásban az álnév, tudni kell az eredeti nevet is, tehát az álnév itt csak rövidítési céllal és a megnevezés szemantikai tartalmának a növelésére használható.

 

Az aktív munkaterület kiválasztása a lehetséges munkaterületek közül a

 

SELECT munkaterület|táblázatnév

 

utasítá ssal lehetséges. Ha a munkaterület üres, vagy nem tudjuk, mely táblázat található benne, akkor a munkaterületre hivatkozhatunk az azonosító sorszámával vagy azonosító betûjelével is. A sorszám 1-tôl 10-ig, a betûjel A-tól J-ig futhat. Ha viszont egy munkaterület már foglalt, akkor az ott tárolt táblázat azonosító, vagy alias nevével lehet kijelölni a munkaterületet. A munkaterületek közül egy mindig aktív, induláskor az 1-es sorszámú választódik ki.

 

Az aktív munkaterületre a táblázat betöltését a

 

USE táblázatállomány [ALIAS aliasnév]

paranccsal érhetjük el, ahol az ALIAS opció az ideiglenes álnevet jelöl ki.

 

A munkaterületen csak az utolsónak betöltött táblázat található meg. Ha egy munkaterületet fel kívánunk szabadítani, akkor azt a

 

USE

 

utasítással tehetjük meg.

 

Példaként vegyük azt a feladatot, amikor kéát táblát, a KÖNYV és az ÍRÓ táblákat kívánjuk betölteni. Feltesszük, hogy induláskor üres minden munkaterület. A betöltéshez szükséges utasítássor:

 

SELECT 1

USE KÖNYV

SELECT 2

USE ÍRÓ

 

A utasítások kiadása után mindkét tábla megnyitódott, a KÖNYV az 1-es, az ÍRÓ a 2-es munkaterületen. A két utasítás után az ÍRÓ lesz a munkatáblázat. Ha ezután kiadjuk a

 

USE BOLT

 

utasítást, akkor az ÍRÓ tábla lezárósik, s helyére a BOLT tábla kerül, mint munkatábla. Így a BOLT és KÖNYV táblák lesznek a nyitott táblák.

 

A táblázatok állományspecifikációjának kijelölésénél segítségünkre lehet a

 

DIR

 

parancs, mely egy DOS katalógustartalmat ad vissza képernyôre, melybôl már felismerhetô a rendelkezésre álló táblázatok állományspecifikációi. A megnyitott munkatáblázat szerkezetét a

 

DISPLAY STRUCTURE

 

utasítással kérdezhetjük le, így az elfelejtett mezônevek és mezôtípusok adatait újra megkaphatjuk.

 

Indexállományok

 

Az adattárolásnál még mindenképpen meg kell azt is említeni, hogy az adatokhoz fûzôdô minden más információ is külön-külön állományokban helyezkednek el. Ezek között kiemelt fontosságú az indexállományok szerepe. Az ind exállományokban a rekordok kulcsai és pozíciói szerepelnek a kulcs értékei szerint rendezetten.

Egy indexállomány egy táblázathoz és egy azonosító kifejezéshez rendelôdik. Ugyanahhoz a táblázathoz több indexállomány is képezhetô, ahol a kiválasztott azonosító kifejezés tetszôleges, a táblázaton értelmezett kifejezés lehet, függetlenül attól, hogy az a rekordra nézve egyedi, vagy nem egyedi értékeket szolgáltat. Az indexállomány specifikációja:

 

indexnév.NDX

 

ahol az indexnév tetszôleges, a felhasználó által adott megnevezés. Az indexek használata révén jelentôsen meggyorsítható a rekordok megkeresése. Az indexszerkezetet azonban nemcsak hatékonysági szempontból használjuk, ugyanis bizonyos, táblázatokra vonatkozó mûveletek csak akkor végezhetôk el, ha létezik a megkívánt indexállomány, tehát bizonyos körülmények között kötelezô jellegûek.

Az indexek használatánál igen körültekintôen kell eljárnunk, ugyanis a dBase modell igen izoláltan kezeli az adatállományt és a hozzá tartozó indexállományokat, ez alatt azt értjük, hogy a rendszernek fogalma sincs arról, hogy egy táblázathoz milyen indexállományok tartoznak, így minden egyes alkalommal a felhasználónak (a felhasználói programnak) kell kijelölnie a használandó indexeket. Mivel a be nem vont, de a táblázathoz tartozó indexállományok nem láthatók a rendszer számára, így a táblázatban bekövetkezô változások sem érvényesülhetnek ezen indexállományokban, azaz a táblázat és az indexállomány tartalma inkonzisztens, ellentmondásos lesz, ami igen komoly hiba forrássává válhat, ha nem korrigáljuk a hibát az indexállomány következô használata elôtt.

Emiatt a dBase indexkezelésnél nagyon oda kell figyelni, hogy mikor milyen indexállományokat nyitunk meg. Az táblázathoz kapcsolódó indexállományokat is meg kell nyitni, ha használni, aktualizálni kívánjuk az indexállományt is. Ebben az esetben a munkaterületre úgymond bekerül az indexállomány is. Mivel csak a megnyitott indexállományok aktualizálódnak a táblázat módosítása során, ezért lényeges, hogy minden szükséges indexállományt megnyissunk. A dBase rendszerben egyidejûleg több indexállomány is lehet nyitott egy táblázatra vonatkozóan (maximum 7 a dBase III+ esetén), de ebbôl csak egy az aktív index, amely meghatározza a rekordok logikai sorrendjét.

 

Az indexállományok létrehozása az

 

INDEX ON kifejezés TO indexállomány [UNIQUE]

 

utasítással lehetséges. A kifejezés a táblázat mezõin értelmezett kifejezést takar. Az utasítás hatására létrejön egy új indexállomány, melyben a munkatáblázat rekordjai a megadott kifejezés szerinti sorrendje kerül letárolásra. A parancs szerkezetébôl látható, hogy táblázatnév nem is adható meg, hiszen a dBase mûveletek szinte kivétel nélkül a munkatáblázatra értelmezettek.

Az utasításban opcionálisan szereplõ UNIQUE tag megadásával elérhetõ, hogy az indexben minden lehetséges indexérték csak egyszer forduljon elõ. Ha a tábla tehát több olyan rekordot is tartlamazna, melyben az indexeléskor megadott kifejezés ugyanazon értéket veszi fel, akkor ebbõl az indexállomány csak az elsõ rekordelõfordulást fogja tartalmazni. A többi rekodelõfordulás láthatatlan az index számára.

 

A megadott kifejezés tartalmazhat több mezôre történô hivatkozást is, viszont a hivatkozott mezôk adattípusa nem lehet sem logikai sem memó típusú. Az indexelés, mint bizonyára jól ismert, nem változtatja meg a DBF állomány fizikai sorrendjét. Ha pl. az auto táblázatot szeretnék a rsz mezô szerint indexelni, akkor az alábbi utasítássort használhatjuk:

 

SELECT 1

USE auto

INDEX ON rsz TO autor

 

Az elkészült indexállomány az autor.ndx állományban foglal helyet.

 

Az INDEX utasítás létrehoz tehát egy index állományt, amely ezután egészen a megszüntetéséig élni fog az adattábla mellett. Mivel egy táblázathoz több indexállomány is létrehozható, de egyidejûleg csak egy index élhet, ezért szükséges, hogy ki tudjuk jelölni, melyik indexet kívánjuk éppen használni. Ahhoz egy egy indexállomány értesüljön az adattáblában történõ változásokról, meg kell nyitni az indexállományt. Azt is említettük, hogy a meg nem nyitott indexállományok nem aktualizálódnak a táblázatbeli módosításoknak megfelelõen, ami kényelmetlen helyzetek forrása is lehet. Mivel rendszerint több index is létezik egy táblázathoz, ezért a dBase megengedi, hogy egyszerre több indexállomány is meg legyen nyitva, azonban ebbôl mindig maximum csak egy lehet az aktuális index. Az aktuális index az, amely meghatározza a rekordok feldolgozási sorrendjét. A megnyitható indexállományok számára a rendszerben létezik egy felsô korlát (esetünkben 7). Az indexállományok megnyitása kétféle módon is megtörténhet.

 

Megadhatjuk a megnyitandó indexeket a táblázat megnyitásakor is, a

 

USE táblázatállomány [ALIAS aliasnév] INDEX indexlista

 

utasítással, ahol az indexlista az indexállományok neveit tartalmazhatja egymástól vesszôvel elválasztva. Emellett menetközben is módosíthatjuk a munkatáblázathoz megnyitott indexek listáját a

 

SET INDEX TO indexlista

 

paranccsal. Mindkét esetben a listában elôl elhelyezkedô indexállomány válik az aktuális indexszé.

Ha az indexlista másik elemét szeretnénk aktualizálni a munkatáblázatra vonatkozóan, akkor a

 

SET ORDER TO sorszám

 

utasítással a megadott sorszámú indexlistaelem válik az aktuális index állománnyá. Ha a SET ORDER TO parancsot sorszám nélkül adjuk ki, akkor a táblázatnak nem lesz aktuális indexe, azaz a rekordok feldolgozása a fizikai sorrend alapján fog végrehajtódni.

 

Ha egy indexállományt valamilyen ok folytán nem nyitottunk volna meg, miközben a táblázatban lényegi változások történtek, akkor ellentmondásossá válik a táblázat és az indexállomány. Ezt az ellentmondást úgy is helyre lehet hozni, hogy újra létrehozzuk az indexállományt, de ez igen idôigényes eljárás. Szerencsére a dBase-ben lehetôség van az indexállományok aktualizálására is. A

 

REINDEX

 

utasítással a munkatáblázathoz kapcsolódó összes megnyitott indexállomány aktualizálódik, s ez a mûvelete sokkal gyorsabban végrehajtható, mint a indexállományok esetleges újbóli létrehozása.

 

Integritási, konzisztencia feltételek:

 

A dBase esetén igen egyszerûen elintézhetjük az integritási feltételek tárgyalását, hiszen a dBaseIII adatállományokhoz nem köthetô semmilyen integritási feltétel, még az SQL86-ban szereplô UNIQUE vagy NOT NULL feltételeknek megfelelô megkötések sem tehetôk meg az adattáblára vonatkozólag . Ebbôl következôen a DBF állományokban, minden adatot, amit a mezôtípus és mezôhossz megenged, letárolhatunk, a dBase rendszer nem végez semmilyen extra értékvizsgálatot. Ez viszont annyit jelent, hogy jóval nagyobb az alkalmazói programok és programozók felelôsége, hiszen az integritási feltételeket nem az adatkezelônek, hanem az alkalmazói programnak kell betarttatnia. Ez természetesen a többletmunka mellett azzal a veszéllyel is jár, hogy bizonyos alkalmazások nem tartják be a megállapított integritási feltételek, s ezáltal a tárolt adatrendszer inkonzisztenssé válik.

A kalózkodó alkalmazások lehetôségét növeli az a tény, hogy az egyes DBF állományok is a DOS által nyújtott védelmi lehetôségeket használják, azaz akik hozzáférnek a géphez, szabadon használhatják az állományokat. Mivel a dBaseIII rendszerekben az állományok tûszerkezete ismert, tartalma viszonylag egyszerûen visszafejthetõ, ezért az adatok védelme igen gyengének mondható, kritikus információkat nem szabad dBase rendszerekben tárolni..

 

Az adatbázis-kezelés egy másik lényeges kérdése az adatkonzisztencia, a tranzakció kezelés kérdésköre. Mint emlékszünk az DBMS-ek esetében minden mûvelet tranzakciókba szervezetten hajtódott végre, aminek a lényege, fô elônye a felhasználó szempontjából abban rejlik, hogy ha egy mûveletsor nem hajtható végre, a végrehajtás alatt bármikor el nem hárítható hiba lépne fel, akkor nem marad az adatbázis inkonzisztens állapotban, hanem visszaállítja az adatbázist az utolsó konzisztens állapotába. Így az adatok integritása, konzisztenciája is megmarad. Ehhez természetesen naplózni kell az elvégzett változtatásokat, hogy szükség esetén vissza lehessen görgetni a lépéseket.

 

A dBase esetében sajnos nem találkozhatunk ezzel a szolgáltatással, azaz az elvégzett mûveletek nem ôrzôdnek meg, s ennek következtében egy mûveletsor félbeszakadása esetén az adatrendszer inkonzisztens állapotban marad, amikor is csak a manuális ellenôrzés, és visszaállítás idôt rabló folyamata hozhatja helyre az adatbázis helyességét. Ezért a dBase rendszerek esetén különösen rémálom az operációs rendszer összeomlása, áramkimaradás, hiszen ebben az esetekben ellentmondásos marad az adatrendszer. Mindennek tehát a fô oka, hogy a dBase rendszer nem tartalmaz tranzakció-kezelést. Az ebbôl eredô veszélyekre is elsôsorban az alkalmazói programok jobb megszervezésével, az állományok gyakoribb mentésével lehet védekezni.

 

Adatok felvitele

 

A relációs adatmodell a mûveletek terén még kevesebb rokonságot mutat föl a dBase modellel, mint az adatstruktúra terén tette. A két modell között van ugyanis egy lényeges elvi különbség:

 

- az RDBMS-ek halmazorientált módon kezelik a táblázatokat

- a dBase rekordorientáltan kezeli a táblázatokat

 

A relációs algebra mûvelei táblázatokon értelmezettek és táblázatot adnak vissza eredményként. A dBase mûveletek ezzel szemben a táblázat rekordjain értelmezettek. A mûveletek mindíg a rekordok szintjén hajtódnak végre. A dBase-ben minden táblázathoz kapcsolódik egy rekordmutató, mely kijelöli a táblázat aktuális rekordját. A dBase-ben tehát mindíg létezik egy munkatáblázat és azon belül pedig létezik egy aktuális rekord is. A feldolgozás során mind a munkatáblázat, mind az aktuális rekord közvetve vagy közvetlenül megváltoztatható.

 

A kiadott mûveletek elsôdlegesen az aktuális rekordra vonatkoznak. Aki már ismeri a dBase nyelvet, talán tiltakozhat, hogy azért nem ilyen egyértelmû a helyzet, hiszen vannak olyan mûveletek, melyek a táblázat minden rekordjára hatással vannak. Valóban vannak ilyen mûveletek, de ezek is magjukban rekordorientáltan gondolkoznak, s ahogy haladnak elôre a táblázatban a rekordok feldolgozásában, úgy változtatják meg a rekordmutató értékét is. Tehát az ilyen, egész táblázatra vonatkozó mûveletek egy ciklust reprezentálnak, s e ciklusban hajtják végre a rekordok feldolgozását.

 

A dBase adatkezelô utasításokban ebbôl következôen mindig ki kell jelölni, hogy mely rekordra vagy rekordokra vonatkozik az elvégzendô mûveletet. Az eddigiekben megismert szelekciós feltételek mind a mezôértékekre vonatkozó feltételekkel lettek megadva, hiszen egyedül a mezôértékeken keresztül lehetett egy rekordot azonosítani a relációs modellben. A dBase esetében viszont a táblázatokat nem halmazként értelmezik, hanem listaként, ebbôl eredôen a rekordok nemcsak tulajdonságaikkal hanem a táblázatban (illetve a listában) elfoglalt pozíciójukkal is jellemezhetôk. Így a rekordszelekciós feltételek a pozíció megadási komponensekkel is bôvülnek a dBase modellben.

 

A pozíciók fizikai pozíciókat jelentenek, melyek igen hosszú ideig megtartják értéküket, mivel csak ritkán rendezôdnek át a rekordok a táblázathoz tartozó DBF állományban. Mint láttuk a DBF állományon belül a rekordokat alapvetõen sorosan, a felvitel sorrendjében tárolja a rendszer. A dBase lehetõséget nyújt azonban arra is, hogy a rekordokat valamely hozzáférési mûvelet hatékonyságának fokozására fizikalilag is átrendezzük. Az átrendezés utasítása

 

SORT hatáskör TO ujtábla ON mezõlista

 

Az átrendezés során egy új táblázat jön létre, melyben a rekordok a kijelölt mezõk értékei alapján meghatározott sorrendben helyezkednek el. A rendezés során le lehet szûkíteni az átvivendõ rekordokkörét egy hatáskör opcióval, melynek részletes ismeretetését egy késõbbi pontban fogjuk tárgyalni. A rendezés csak mezõértékek alapján történhet, s a mezõlistában több mezõt is meg lehet adni. Az elsõként megadott mezõ lesz az elsõdleges mezõ, s ez dönti el elsõdlegesen a sorrendet. A többi mezõ értéke csak akkor kerül figyelmbe vételre a rendezésnél, ha az aelsõdleges mezõ tartalma ugyanazt az értéket adja két rekord esetén. A rekordokat mezõk értékeinek növekvõ és csökkenõ sorrendjében is megadhatjuk.

 

A rendezés igen nagy mennyiségû rekordolvasással és rekordírással járhat, emiatt igen idôigényes, költséges a rekordok fizikai átrendezése is. Ezek a költségek nemcsak a rendezésnél, hanem egy új rekord beszúrásánál is lényeges szerepet játszanak. Emiatt egy új rekordnak egy tetszôleges helyre történô beszúrása nagyobb költséget jelent, mint a rekordnak a táblázat végére történõ fûzése, hiszen beszúrásnál a beszúrási helytôl hátrébb elhelyezkedô összes rekordot eggyel hátrébb kell áthelyezni. Ezért az új rekordokat a dBase alkalmazások rendszerint a DBF állomány végére helyezik el.

 

Az új rekordok felvitelének parancsszavai is a hagyományos fileszemléletet tükrözi, hiszen a parancs tükrözi, hogy úgymond beszúrjuk-e a rekordot a táblázatba, vagy hozzáfûzzük-e a táblázathoz. A rekord felviteli utasítások különböznek egymástól abban is, hogy hogyan adjuk meg az új rekord mezõinek értékeit. Az egyik változatban egy interaktív segédprogrammal, egy táblázat kitöltésével lehet megadni az értékeket. A másik esetben, amit az alkalamzások is gyakrabban használnak, a felvitel egy üres mezõértékû rekordot visz fel, melyet egy másik utasítás segítségével lehet értékes mezõadatokkal feltölteni.

 

A rekord felvitel mûveletéhez az alábbi utasítások állnak rendelkezésre:

 

APPEND: új rekord felvitele teljes képernyôs segédprogram segítségével, a rekord a táblázat végére kerül

INSERT: új rekord felvitele teljes képernyôs segédprogram segítségével, a rekord az aktuális rekord mögé kerül

APPEND BLANK: új üres rekord felvitele a táblázat végére (ezután lehet majd a mezôértékeket módosítani, azaz nem lehet egyetlen egy utasítással feltöltött rekordot felvinni) A rekordmutató a parancs hatására az utolsó rekordra fog mutatni.

INSERT BLANK: új üres rekord felvitele a táblázat aktuális rekord mögé . (ezután lehet majd a mezôértékeket módosítani, azaz nem lehet egyetlen egy utasítással feltöltött rekordot felvinni). A rekordmutató a parancs hatására a beszúrt rekordra fog mutatni.

 

A rekord felvételéhez, de tõle függetlenül is szükség lehet az adatáblában letárolt rekordok mezõértékeinek a módosítására. A módosítás során egy utasítással több rekordot is érintõ módosítást is végrehajthatunk. A beszúráshoz hasonlóan a módosítást vagy interakív segédprogrammal, vagy utasításokon keresztül hajthatjuk végre. A módosítási utasításban szerepelhet olyan opció, mely kijelöli az utasítás hatáskörét, mint ezt már a SORT utasításban is láthattuk. A hatáskör olyan kifejezés, amely megadja, hogy a táblázat mely rekordjait kell bevonni a mûveletbe. A módosítási utasások elõtt áttekintjük a hatáskör kifejtését, megadási módjait.

 

Hatáskörök

 

A hatáskör megadásának két komponse van, az egyik egy összefüggõ tartomány kijelölés, míg a másik a tartományon belüli rekordok kijelölésére szolgál. A tartomány adja meg az adattábla azon szeletetét, amelybeli rekordok egyáltalán szóba jöhetnek mûvelete során. A másik komponens egy szelekciós feltételként értelmezhetõ, amely kiértékelõdik a tartomány rekordjain, s a kiértékelés eredményétõl függõen vonja be vagy veszi ki a rekordokat a végrehajtásból.

 

Tartományként az alábbi értékek adhatók meg:

 

ALL : minden rekord a táblázatban

REST : a táblázat aktuális rekordjától hátrébb elhelyezkedô rekordok

NEXT n : a táblázat aktuális rekordjától hátrébb elhelyezkedô n darab rekord

RECORD n : a fizikailag n. rekord

 

A kijelölt tartományon belül a szelekciós feltétellel lehet szûkíteni azon rekordok körét, melyre elvégezzük a mûveleteket. Kétféle szelekciós feltétel adható meg:

 

- FOR feltétel: ekkor a tartomány minden olyan rekordján elvégezzük a mûveletet, melyeknél a megadott feltétel igaz értéket ad

- WHILE feltétel: ekkor a tartományon belül csak addig végezzük el a mûveleteket, amíg a feltétel a rekordokra igaz értéket ad. Azaz ebben az esetben elôbb vesszük a tartomány elsô rekordját, ha ez hamis értéket ad, akkor befejezzük a végrehajtást, egyetlen egy rekordon sem végezve el a mûveletet. Ha igaz a feltétel az elsô rekordra, akkor ott elvégezzük a mûveletet és vesszük a következô rekordot. Ha ott hamis a feltétel, akkor befejezzük a végrehajtást, ha viszont igaz, akkor a rekordon elvégezzük a mûveletet és tovább folyatjuk a végrehajtást az elôzôek szerint.

 

Vegyünk példaként egy UTAZÁS táblát, amely utazó, célhely, dátum, idõtartam mezõkbõl épül fel, s az alábbi adatokat tartalmazza:

 

UTAZÁS

 

utazó

célhely

dátum

idõtartam

1

Nagy Péter

Miskolc

97.08.27

23

+2

Orosz Tamás

Pécs

97.05.06

13

3

Kettõ István

Gyula

97.04.21

34

4

Kék László

Hatvan

97.05.14

16

5

Kovács Sándor

Körmend

97.03.07

42

 

A tábla elsõ oszlopában a rekordok sorszámait, pozicióit tüntetteük fel. Feltesszük, hogy az aktuális tábla az UTAZÁS tábla, és az aktuális rekord a 2-es sorszámú rekord. A példában felhasználjuk, hogy a táblabeli rekordok képernyõre való kilistázásának utasítása a

 

LIST hatáskör

 

utasítás. Egy

LIST ALL

utasítás a teljes táblát visszadja, hiszen tartományként a teljes tábla lett kijelölve és nincs szelekciós feltétel megadva. A

LIST REST

utasításnál viszont csak az aktuális rekordtól kezdõdõ, s a tábla végéig tartó rekordokat adja vissza:

 

utazó

célhely

dátum

idõtartam

2

Orosz Tamás

Pécs

97.05.06

13

3

Kettõ István

Gyula

97.04.21

34

4

Kék László

Hatvan

97.05.14

16

5

Kovács Sándor

Körmend

97.03.07

42

A szelekciós feltételt is tartalmazó

LIST ALL FOR idõtartam < 30

lekérdezésnél a teljes tábla minden olyan rekordja kilistázásra kerül, amelyben az idõtaetam értéke kisebb 30-nál:

 

utazó

célhely

dátum

idõtartam

1

Nagy Péter

Miskolc

97.08.27

23

2

Orosz Tamás

Pécs

97.05.06

13

4

Kék László

Hatvan

97.05.14

16

Ha viszont a másik szelekciós elemet alkalmazzuk, vagyis a

LIST ALL WHILE idõtartam < 30

utasítást adjuk ki, akkor a tábla elejétõl addig írja ki a rekordokat, amíg a feltétel igaz marad. Ha a feltétel hamosá válik akkor leáll a kiírás. Igy az eredménylista:

 

utazó

célhely

dátum

idõtartam

1

Nagy Péter

Miskolc

97.08.27

23

2

Orosz Tamás

Pécs

97.05.06

13

 

A mûveletek elvégzése után a rekordpointer az utólsó feldolgozott rekord mögé kerül, így ha a teljes tábla kilistázásra került, akkor az utólsó rekord után áll be a pointer.

 

A szelekciós feltétel tartalmazhat mezôhivatkozásokat, logikai, relációs és matematikai, sztringkezelési operátorokat, valamint konstansokat is. A sztringkonstansok megadása történhet idézôjellel és aposztróffal is. A dBase-ben megengedett operátorok, a precedencia kvázi sorrendjében:

 

() : csoportosítás

+ : sztringek összefûzése

- : sztringek összefûzése a bevezetô szóközök hátra helyezésével

+, - : elôjelek

^ : hatványozás (2^3 értéke 8)

*, / : szorzás, osztás

+, - : összeadás, kivonás

<, >, <>, <=, >= : relációjelek

$ : sztring tartalmazás, a baloldali sztring benne van a jobboldaliban ("al" $ "almafa" igaz)

.NOT. : logikai tagadás

.AND. : logikai és

.OR. : logikai vagy

 

Adatok módosítása

 

A rekordok módosítása is történhet interaktív módon, egy segédképernyõ segítségével és utasítással. Az alábbi utasítások az interaktív mód esetén ajánlhatóak:

 

EDIT: rekordok módosítása teljes képernyôs segédprogramok segítségével

CHANGE: rekordok módosítása teljes képernyôs segédprogramok segítségével

BROWSE :rekordok módosítása teljes képernyôs segédprogramok segítségével

 

E segédprogramok saját képernyõ felülettel rendelkeznek, s emellett a táblázat több rekordját is elérhetõvé teszik. Ez a megoldás nem alkalmazható programokban, ott tehát egy utasítást célszerû alkalmazni. Az adatmódosításra vonatkozó utasítás alakja:

REPLACE [tartomány] mezô1 WITH érték1 [...,mezôi WITH értéki][szelekciós feltétel]

 

Alapesetben, a tartomány és az szelekciós feltétel megadása nélkül, az utasítás hatására az aktuális rekordban (ahová a munkatáblázat rekordmutatója mutat) a mezô1 mezô felveszi az érték1 értéket, az i. mezô pedig felveszi az i. értéket. A tartomány és a szeleciós feltétel explicit megadásával megváltoztatható a mûveletbe bevont rekordok köre.

 

A rekordok módosítására vegyük azt a példát, amikor az auto táblázatban a FIATxxx típusú autók árát megnöveljük 12%-kal:

SELECT 1

USE auto

REPLACE ALL ar WITH ar*1.12 FOR "FIAT" $ tip

A REPLACE utasítás segítségével már az interaktív segédprogram nélkül, programban is vihetünk fel egy új rekordot a táblázatba. Ennek menete, hogy elõbb beszúrjuk az üres rekordot, ekkor a pointer az új rekordra áll, majd a módosítással átírjuk az üres mezõket értékes adatokkal. Példaként vegyünk fel egy új utazást, melyben az utazó Jó Béla, célhely Sopron, dátum 97.06.04, idõtartam 12 nap:

SELET 1

USE utazás

APPEND BLANK

REPLACE utazó WITH "Jó Béla", célhely WITH "Sopron", ;

dátum WITH CTOD("97.06.04"), idõtartam WITH 12

 

A példához megjegyzésként annyit fûzhetünk hozzá, hogy a fenti megoldás csak akkor jó, ha az UTAZÁS tábla még nem lenne megnyitva. Ha már nyitott, akkor a

SELET utazás

APPEND BLANK

REPLACE utazó WITH "Jó Béla", célhely WITH "Sopron", ;

dátum WITH CTOD("97.06.04"), idõtartam WITH 12

utasítássor a helyes megoldás. Egyszerûség végett a további példákban a táblák megnyitásánál ez utóbbi változatot fogjuk csak megadni.

 

A minta REPLACE utasításában szereplõ pontosvesszõ arra utal, hogy az utasítás több soronkeresztül folytatódik. A pontosvesszõ tehát a folytatósor jele. Ez az utasítás még egy új elemet tartalmaz, a CTOD() függvényt. Ez a függvény arra szolgál, hogy egy karakteres adatból dátum tipusú értéket konvertáljon. A dBase nem lehet tehát közvetlenül dátum konstans megadni, csak szövegkonstanst, amit konvertálni lehet dátum tipusra. A dBase fontos elemei a küülönbözõ gyári függvények, melyekrõl a késõbbiekben még részletsebben beszélni fogunk.

 

Adatok törlése

 

A dBase-ben lehetôség van egyidejûleg több rekord törlésére is, a tartomány és a szelekciós feltételek megadásával. Mezõ önmagában sohasem törölhetõ, az adatfelvitel és adattörlés legkisebb egységei a rekordok. A rekordtörlés utasításának alakja:

 

DELETE [tartomány] [szelekciós feltétel]

 

A tartomány és a szelekciós feltétel megadása és értelmezése megegyezik a REPLACE utasításnál megismerttel, azaz ha elhagyjuk õket, akkor az aktuális rekord fog kitörlõdni. Példaként a nyolc napnál rövidebb idõtartamú utazások kitörlését vesszük, ahol a rekordnak az aktuális rekordnál nem helyezkedhet el elõrébb:

DELETE REST FOR idõtartam < 8

 

A dBase-ben a rekordok törlése, hatékonysági és védelmi okokból két lépésben történik. Az elsô lépésben, a DELETE utasítás hatására a rekordok csak törlésre jelöltté válik, de fizikailag benne marad a DBF állományban. Ekkor az utasítások továbbra is létezônek tekintik a rekordot, esetleg külön jelölik, hogy az törlésre kijelölt. A

 

SET DELETED ON

 

kiadása után viszont a legtöbb parancs már nem veszi figyelembe, úgymond nem látja a törlésre kijelölt rekordokat. Egyes mûveletek, mint pl. az indexelés vagy a rekordmutató fizikai pozíció szerinti mozgatása mindig figyelembe veszik a törlésre kijelölt rekordokat is. A második lépésben történik a törlésre kijelölt rekordok fizikai kitörlése, mely a

 

PACK

 

paranccsal érhetô el. Ha viszont meggondolnánk magunkat, akkor a

 

RECALL

 

utasítással megszüntethetjük a törlésre vonatkozó kijelölést. A DELETE parancs mellékhatásként mozgatja is rekordpointert, mely a végrehajtás után az utolsóként vizsgált rekordjához kerül.

 

Adatok lekérdezése

 

Az interaktív felületen több lehetõsg is rendelkezésre áll az adatok egy önálló listában történõ megjelenítésére. E listák alapesetben a képernyõn jellenek meg. Az alábbi listázó utasítások állnak rendelkezésre:

 

- BROWSE:

rekordok (nemcsak az aktuális) tartalmának kijelzése és módosítása egy teljes képernyôs segédprogram keretében

- LIST [tartomány] [kifejezéslista] [szelekciós feltételek]

A tábla rekordjainak kijelzése a képernyôre standard lista formában. A tartomány és szelekciós feltételek jelentése és használata az elmondottakkal egyezik meg. A kifejezéslista a rekordonként kiírandó adatokat adja meg. Ha nem adunk meg kifejezéslistát, akkor a rekord összes mezôje kilistázásra kerül.

- DISPLAY [tartomány] [kifejezéslista] [szelekciós feltételek]

Az aktuális rekord kijelzése a képernyôre standard lista formában. A tartomány és szelekciós feltételek jelentése és használata az elmondottakkal egyezik meg. A kifejezéslista a rekordonként kiírandó adatokat adja meg. Ha nem adunk meg kifejezéslistát, akkor a rekord összes mezôje kilistázásra kerül.

 

A LIST és DISPLAY utasítások azonos célt szolgálnak, mûködésük is szinte ugyanaz, azzal a kivételle, hogy a LIST alapértelmezésben a tábla összes rekordját kilistázza, míg a DISPLAY csak az aktuális rekordra vonatkozik. A tartomány és szelekciós feltétel explicit megadása esetén ugyanaz a két utasítás mûködése.

 

Programban a fenti utasítások nem alkalmazhatók a táblázat adatainak lekérdezésére, hiszen a visszakapott adatok nem érhetõk el a programból, másrészt a lista elrontja a program felépített képernyõ formátumát is. Ezért programokban a mezõnévre történõ hivatkozás szolgál az adatok kiolvasására az adatbázisból:

 

mezônév: az aktuális rekord megadott mezôjének a tartalmát adja vissza

 

Egy kifejezés értékét a képernyõre a

 

? kifejezés

 

utasítással lehet kiíratni. Így például a

? 3+4

a 7 értéket árja vissza, míg a

SELECT utazás

? célhely

az aktuális rekord célhely mezõinek

 

Rekordmutató közvetlen mozgatása

 

Az adattáblát érintõ feldolgozások során az aktuális rekord folytonosan változik. Ahogy a feldolgozás sorba veszi a tartomány rekordjait, úgy mozog az aktuális rekord jelzõ is, hiszen a mûveletek mindíg éppen az aktuális rekordon hajtódnak végre. Ezt talán pontosabb lenne úgy fogalmazni, hogy az lesz az aktuális rekord, amit a feldolgozás utóljára érintett.

 

Az aktuális rekordnak az adatkezelõ mûveleteken keresztüli implicit mozgatása mellett lehetõség van az aktuális rekordnak explicit beállításra is. Ezt azt jelenti, hogy megadhatjuk egy utasításban, hogy melyik rekord legyen eettõl kezdve az aktuális rekord.

A rekordpointer mozgatására az alábbi utasítások állnak rendelkezésre a dBase nyelvben:

 

GOTO n : a rekordmutató rááll a fizikai sorrendben vett n. rekordra

GOTO TOP : ugrás a táblázat fizikailag elsô rekordjára, ha a táblázat nem indexelt, és ugrás a táblázat index szerint elsô rekordjára, ha indexelt a táblázat

GOTO BOTTOM : ugrás a táblázat fizikailag utolsó rekordjára, ha a táblázat nem indexelt, és ugrás a táblázat index szerint utolsó rekordjára, ha indexelt a táblázat

SKIP n : relatív rekordváltoztatás, mozgás n rekorddal elôre, ha n pozitív, illetve n rekorddal hátra, ha n negatív. A mozgás a rekordok fizikai sorrendje alapján megy végbe, ha a táblázat nem indexelt, és a rekordok logikai, index szerinti sorrendjében megy végbe, ha a táblázat indexelt

 

Példaként vegyünk egy Auto táblázatot az alábbi adatokkal:

 

AUTO

 

rsz

tip

ar

tulaj

1

gfu814

Lada

657983

3

2

agf846

Fiat

898188

7

3

mft135

Mazda

1738561

2

4

cgp521

Lada

736635

9

5

buy645

Skoda

1468684

2

6

utr213

Suzuki

1265726

6

 

Tekintsük az alábbi utasítássorozatot:

 

USE auto

GOTO TOP

? rsz

GOTO 3

? rsz

SKIP 1

? rsz

 

A képernyôn megjelenô kimeneti lista az alábbi rendszámokat tartalmazza a kiíratás sorrendjében:

 

gfu814

mft135

cgp521

 

hiszen ekkor minden mozgás a fizikai sorrend alapján ment végbe. Ha viszont az utasítás elejére még elsô helyre egy

 

SET INDEX TO autorsz

 

utasítást is beteszünk, ahol az indexelés a rsz mezô szerint történt, akkor az eredménylista a következô lesz:

 

agf846

mft135

utr213

 

Ekkor ugyanis a GOTO 3 a fizikai sorrendet vette alapul, a másik két ugró utasítás pedig az index szerinti sorrendet használta fel.

 

Rekordok közötti keresésék, közvetett mozgás

 

Ha a rekordokat nem fizikai pozíciójuk alapján kívánom elérni, hanem a bennük letárolt mezôértékek alapján válogatok, akkor kell használni rekordkeresési utasításokat. Ennek egyik változata, amikor a munkatáblázatot szekvenciálisan átnézem a keresési feltételre illeszkedô rekordok után kutatva. Ezen utasítás alakja:

 

LOCATE [tartomány] [szelekciós feltételek]

 

A parancs hatására a rendszer megkeresi az elsô olyan rekordot, mely teljesíti a feltételt, s a rekordmutatót ráállítja a megtalált rekordra. Ezután a felhasználó tetszõleges utasításokat adhat ki az aktuális rekordra vonatkozólag. E mûveletek között lehet például a rekordokban tárolt adatértékeket lekérdezni, az adatokat módosítására. Mivel a táblázatban több rekord is lehet, melyek kielégítik a feltételt, ezért a dBase tartalmaz olyan utasításokat is, melyek révén ezen, most még elrejtett rekordok is elérhetôk. A

 

CONTINUE

 

utasítás hatására a rekordmutató az aktuális helyérõl továbblép a következô, feltételt teljesítô rekordra, lehetôvé téve az ott tárolt adatok feldolgozását is. Így az összes, feltételnek megfelelô rekordot a CONTINUE utasítások egymás utáni meghívásával érhetjük el.

 

Mivel az eredményrekordok darabszáma tetszôleges lehet, nem lehet tudni elôre, hogy hányszor kell végrehajtani a CONTINUE utasítást. A dBase-ben a keresés végét egy logikai értékkel visszatérô függvénnyel lehet lekérdezni, a

 

FOUND()

 

függvény ugyanis igaz éréket ad vissza, ha a keresési mûvelet, mint pl. a LOCATE vagy a CONTINUE sikeres volt, azaz talált a feltételeknek megfelelô rekordot. Ezzel szemben a FOUND() függvény hamis értéket ad vissza, ha nem sikerült találni újabb rekordot. Mindezek alapján elérhetô a feltételeknek megfelelô összes rekord a táblázatból a LOCATE, CONTINUE és FOUND() segítségével felépített utasítás szerkezetek segítségével.

 

A példához vegyük ujra az elõzõ AUTO táblázatot. A

LOCATE ALL FOR tulaj > 5

utasításnál a keresés a teljes táblára vonatkozik, így az elsõ rekordtól kezdve indul az ellenõrzés elõre. Az elsõ feltételnek eleget tévõ rekord a 2-es sorszámú lesz, így az utasítás után ez lesz az aktuális rekord. Ennek megfelelõen a

? rsz

utasítás az

agf846

értéket adja vissza, s a

? FOUND()

pedig a

.t.

azaz igaz értéket adja meg. A igaz logikai érték jelei a dBase-ben a .t. , .T., .y., .Y., míg a hamis logikai érték jelei az .f., .F., .n., .N. szimbólumok.

Az ezután kiadott

CONTINUE

utasítás hatására tovább folyik a keresés, s a legközelebbi megfelelõ rekord a 4-es sorszámú rekord lesz, így a

? rsz

lekérezés az

cgp521

értéket fogja visszaadni.

A keresés rekordorientált jellegét mutatja, hogy kiadható eközben egy

GOTO 1

utasítás is, mely hatására az elsõ rekord lesz az aktuális, s így újból kiadott

CONTINUE

utasítás nem a 6., hanem újra 2. rekordot fogja megtalálni, hiszen a rekord pointer visszaállítottuk a tábla elejére, s aCONTINUE onnan folytatja a keresést.

 

Ha a táblázat a keresési feltétel szerint indexelt, akkor a soros keresés helyett alkalmazható a sokkal gyorsabb indexelt keresés, amikor is elôbb az indexállományban keressük meg a kulcsértéket, majd onnan megkaphatjuk a rekord fizikai pozícióját is. Az indexelt munkatáblák esetén a

 

SEEK kifejezés

 

megkeresi azt az elsõ rekordot az indextábla alapján, melynél az indexkifejezés értéke a SEEK paranccsal megadott kifejezés értékét veszi fel. A SEEK utasítással csak pontos egyezésre kereshetük, tehát a kifejezésben nem szerepelhetnek relációs operátorok, csak értékek. A parancs hatására a rekordmutató is rááll a megtalált rekordra. Az egymásután kiadott ugyanazon SEEK utasítások mindíg ugyanarra a rekordra pozicionálnak. Ha több rekord is található a táblázatban a keresett indexértékkel, akkor azokat csak a

 

SKIP 1

 

utasítások egymás utáni kiadásával érhetjük el, mivel a SEEK az indexállomány elsô megfelelô rekordját adja vissza, és a SKIP az indexállomány alapján az értékben közvetlenül utána álló rekordra mozog. Természetesen ilyenkor figyelni kell, hogy a soron következô érték megfelel-e még a kívánalmaknak.

A FOUND() függvény a SEEK esetében is használható, a keresés sikerességnek eldöntésére. Ha a keresés sikertelen, akkor a rekordmutató a táblázat végére áll.

 

Az auto táblában az agf846-os rendszámú autót a

SEEK 'agf846'

utasítással lehet a leggyorsabban megkeresni. Ennek természetesen elõfeltétele, hogy a táblához legyen index a rsz mezõ szerint. Ez az alábbi utasításokkal érhetõ el:

SELECT auto

INDEX ON rsz TO rszind

 

Táblák összekapcsolása

 

A relációs adatmodell tervezése során a normalizálás igényeiknek megfelelõen az adatokat, sokszor a logikailag összetartozó adatokat is, több táblázatra szétosztva tároljuk le az adatbázisban. A több táblázatból összeállítható jelentések, view-k esetében az adatok egy része szükségszerûen egy nem-munkatáblázatból származik, hiszen egyidejûleg csak egy táblázat lehet munkatáblázat a dBase rendszerekben. A nem-munkatáblázatokban elhelyezkedô adatok olvasásánál, kezelésénél viszont igencsak megkötött a kezünk.

A megnyitott, de nem munkatáblázatok ugyanis befagyott, hibernálódott állapotban vannak. Ez azt jelenti, hogy míg a munkatáblázat rekordmutatója szabadon mozgatható, azaz tetszôlegesen mozoghatunk a munkatáblázat rekordjai között, addig a nem-munkatáblázatokban nem mozgathatjuk a rekordmutatót. A rekordmutató úgymond befagy arra a rekordra mutatva, amit a táblázat elhagyásakor kijelölt. Ezért a nem-munkatáblázatokból csak egyetlen egy rekord érhetô el, csak ennek a rekordnak a mezôi olvashatók le.

Vajon azt jelenti, hogy egy join mûveletet nem tudunk végrehajtani? Hiszen ott az illeszkedô rekordokat a kapcsolódó táblázatokból kellett kikeresni. Szerencsére amit mi közvetlenül nem tehetünk meg, vagyis nem mozgathatjuk a nem-munkatáblázat rekordmutatóját, azt a dBase rendszer megteheti, így adva lehetôséget a táblázatok összekapcsolására.

 

Táblák összekapcsolásánál a munkatáblázat minden rekordja összeköthetô a nem-munkatáblázat egy rekordjával, ahol az illeszkedési feltétel tartalmazhat mezôértékekre és rekordpozíciókra vonatkozó elemeket is. Mivel a munkatáblázatban történô mozgás során minden rekordváltásnál újra meg kell keresni az illeszkedô rekordot a másik táblából, és ez igen idôigényes folyamat, ezért a dBase megköveteli, hogy a kapcsolódó táblázat indexelt legyen a kapcsoló mezô szerint. Így a dBase-ben is megvalósítható egy kapcsolókulcs-kulcs viszony, melyben a kapcsolókulcsot tartalmazó táblázatnak kell a munkatáblázatnak lennie.

 

Az adattáblázatok összekapcsolására vonatkozó parancs a SET RELATION, melynek formátuma a következô:

 

SET RELATION TO kifejezés INTO aliasnév

 

A parancsban megadott kifejezés a munkatáblázat rekordjain értelmezett, minden rekordra egy értéket szolgáltatva. Az aliasnév egy másik, nem aktív munkaterületre mutat, melyben a kapcsolódó táblázatnak kell elhelyezkednie. Ennek a táblázatnak a saját kapcsoló kifejezése szerint indexelve kell lennie.

 

A kapcsolat úgy mûködik, hogyha módosul a rekordmutató a munkatáblázatban, akkor módosul a megadott kapcsolódó táblázatból elérhetô rekord pozíciója is, mégpedig úgy, hogy a munkatáblázat azon rekordjához, melyben a kifejezés értéke

 

kifejezés_r

 

értéket ad, a kapcsolódó táblázatnak a

 

SEEK kifejezés_r

 

kereséssel meghatározott rekordja fog kapcsolódni. Példaként tekintsük azt a kis utasítássort, mely kilistázza az autók és tulajdonosaik adatait. Ehhez azt kell még tudni, hogy a nem munkatáblázat kiválasztott rekordjának mezôire a

 

aliasnév->mezônév

 

szerkezettel tudunk hivatkozni. A példához még feltesszük, hogy az ember táblázatnak a kapcsoló mezô, azaz az id mezô szerinti indexét az embkod.NDX állomány tartalmazza. Ez alapján a végrehajtandó parancsok a következôek:

 

SELECT 2

USE ember INDEX embkod

SELECT 1

USE auto

SET RELATION TO tulaj INTO ember

LIST rsz, típus, ar, ember->nev, ember->cim

 

Ha az autó és az ember táblák a következõ adatokat tartalmazzák:

AUTO

 

rsz

tip

ar

tulaj

1

gfu814

Lada

657983

3

2

agf846

Fiat

898188

7

3

mft135

Mazda

1738561

2

4

cgp521

Lada

736635

9

5

buy645

Skoda

1468684

2

6

utr213

Suzuki

1265726

6

 

EMBER

 

id

név

cím

1

1

Laci

Eger

2

2

Feri

Gyöngyös

3

3

Mária

Dorog

4

5

Lajos

Debrecen

5

6

Zoltán

Pécs

6

7

Gábor

Szeged

7

9

Tibor

Sopron

 

akkor az eredménylista a következõ lesz:

 

rsz

tip

ar

név

cím

gfu814

Lada

657983

Mária

Dorog

agf846

Fiat

898188

Gábor

Szeged

mft135

Mazda

1738561

Feri

Gyöngyös

cgp521

Lada

736635

Tibor

Sopron

buy645

Skoda

1468684

Feri

Gyöngyös

utr213

Suzuki

1265726

Zoltán

Pécs

 

A lista elõállításánál az auto tábla a munaktábla. A LIST utasítás végigfut az auto tábla minden rekordján az elsõ rekordtól kezdve. Minden újabb autó rekordra mozgáskor a SET RELATION kapcsolat miatt az ember tábla azon rekodja kerül kijelölésre, amelyben az id mezõ értéke megegyezik az auto rekord tulaj mezõjének az értékével.

 

A fentiek szemléltetik a táblák összekapcsolásának általános alkalmazási módját, amihez azonban még két megjegyzés kívánkozik. Az elsõ arra utal, hogy a dBase rendszerekben két tábla összekapcsolásához nem feltétlenül szükséges a céltáblának az indexelése. A SET RELATION utasítás ugyanis úgy mûködik, hogy abban az esetben, ha nincs indexelve a kapcsolódó tábla, akkor a kapcvsolódó rekord a poziciója alapján határozódik meg. Ebben az esetben a TO után álló kifejezést numerikus értékként kezeli, s azon rekordot választja ki a kapcsolódó táblából, amelynek poziciója, sorszáma megegyezik a kifejezés numerikus értékével. Amennyiben nem létezne ilyen sorszámú rekord, akkor egy üres rekord kapcsolódik az alaptáblabeli rekord mellé.

Ez a megoldás azonban nem illik igazán bele a relációs szemléletbe, hiszen ott a rekordok mellé nem kapcsolódik pozició, s igen furcsa relációs szemszögbõl az eset, amikor az értékek helyett a szemantika nélküli poziciók alapján történik az illesztés.

 

A másik megjegyzés a kapcsolat felépítésére irányul. Sokan nehezen tudják meghatározni,hogy a kapcsolatban, melyik tábla legyen a munkatábla, s melyik legyen a kapcsolódó tábla. Az eldöntéshez az ad támpontot, hogy a kapcsolat egy munkatáblabeli rekordhoz egyetlen egy kapcsolódó táblabeli rekordot tud hozzákötni. Így annak a táblának kell lennie a munkatáblának, amelyikbõl csak egy kapcsolat indul ki. Az auto és ember táblákat véve, mivel egy autónak csak egyetlen egy ember tulajdonosa lehet, így az autónak kell lennie a munaktáblának. Az ember azért nem lehet munkatábla, mivel egy emberhez több autó is kapscsolódhat, amit a SET RELATION kapcsolatrendszer viszont nem tud lekezelni.

 

A táblázatok összefûzésére még egy lehetôség van a dBase keretén belül, a JOIN utasítás révén. A JOIN alakja

 

JOIN WITH aliasnév TO újtáblázat FOR feltétel [FIELDS mezôlista]

Az utasítás segítségével két behívott táblázat rekordjai párosíthatók egy új, most létrejövô táblázatba. Az egyik induló táblázat a munkatáblázat, a másik a WITH után megadott táblázat. Ezután az összes lehetséges rekordpárosításból azok a rekordpárok kerülnek át az eredménytáblázatba, melyek kielégítik a FOR után megadott feltételt, melyben a nem munkatáblázat mezôire az ismertetet aliasnév->mezônév módon hivatkozhatunk.

Alapesetben az eredménytáblázat mindkét táblázat mezôit tartalmazza, amit leszûkíthetünk a FILEDS után álló mezôlistával. Így az elôbbi lekérdezés eredményét egy új táblázatba is letehetnénk a

 

SELECT 2

USE ember

SELECT 1

USE auto

JOIN WITH ember TO auemb FOR tulaj = ember->kod

 

A létrejövô eredménytáblázat az auemb.DBF állomány lesz. Mint a példából látható a kapcsolódó táblázatnak nem kellett indexelve lennie, ugyanis a feltételnek eleget tévô rekordok megkeresése nem használ indexet.

 

Adatok beolvasása szöveges állományból, kimentésük szöveges állományba

 

Sok esetben az adatbázisba letárolandó adatok már korábban is felkerültek a számítógépre valamilyen segídprogram segítségéve. A leggyakoribb elektronikus adatforrások a szövegszerkesztõk és táblázatkezelõk a PC dBase környezetében. Ugyan a dBase-be nincs beépítve egy intelligens szövegelemzõ rendszer, de megfelelõ elõkészítés után megoldható, hogy az állományokban letárol adatok gyorsan, másolással bekerüljenek az adatbázisba, anélkül,, hogy kézzel újra be kellene õket vinni az adatbázisba.

Az átvitelhez az adatállományokat olyan szerkezetre kell hozni, melybõl automatikusan meghatározható, hogy mely adatelem hova is kerüljön letárolásra. A dBase-ben egy állományból csak egy adattáblába vihetünk fel adatokat. Az állomány tárolási formátumának tükröznie kell a tábla szerkezetét. A leggyakoribb eset, amikor az állományban minden sor egy önálló rekordtot jelöl, s a soron belül az egyes mezõk értékeit vesszõvel választjuk el egymástól. A felsorolásban minden rekordnál minden mezõnek szerepelnie kell.

 

A munkatáblába az

 

APPEND FROM állomány TYPE DELIMITED WITH határolójel

 

utasítással lehet a megadott állományból az értékeket beolvastatni. A határolójelként az a jelet, karaktert kell megadni, ami az állományban a mezõértékek egymástól való elszeparálására szolgál. Ha a szóköz karaktert alkalmaztuk, akkor határolójelként a BLANK kulcsszót kell megadni.

 

Az elõzõ auto táblát véve, egy au.txt szöveges állományban az alábbi tárolási formátumot vesszük fel:

 

rsz234, Fiat, 345474, 3

tyu615, Skoda, 562612, 6

 

Vagyis a szöveges állományban a vesszõ fogja határolni a mezõ értékeket. Mint látjuk, a szöveges mezõknél nem kell aposztróf jelet használni. Adatbázisba az adatokat az auto tábla megnyitása és kiválasztása után az

 

APPEND FROM au.txt TYPE DELIMITED WITH ,

 

paranccsal lehet beolvastatni. A parancs végén a szeparációs jelet sem kell aposztrófba tenni.

 

A dBase lehetéséget biztosít arra is, hogy a táblák tartalmát más formátumú, pl. szöveges állományba tegyük le. A munkatáblában tárolt adatok kimásolásának utasítása:

 

COPY TO állomány szürõfeltétel TYPE DELIMITED WITH határolójel

 

Az elkészült listába a munkatábla azon rekordjainak adatai kerülnek át, amelyek kielégítik a szúrõfeltételt. A listában minden rekord egy új sor lesz, s a mezõk között alapesetben vesszõ helyezkedik el. Ha a WITH BLANK opcót használjuk, akkor a szóköz karakterek állnak a mezõértékek között. Ha nem szóköz az elválasztójel, akkor a szöveges mezõk tartalmát még egy macskakörömpár közé illeszti a rendszer. Ekkor a WITH opció e macskakörmök helyettesítére szolgál, a mezõk közötti vesszõ továbbra is megmarad.

 

Statisztikai adatok lekérdezése

 

A táblákban tárolt adatok statisztikai eldolgozása az adatbáziskezelés egyik fontos elemi közé tartozik. E statisztikai feldolgozást segíti, könnyíti azon néhány utasítás, mellyel az aktuális tábla rekordjain összegzést, számlálást és átlagszámítást végezhetünk. Az egyes utasítások alakja a következõ:

 

SUM kifejezés szûrõfeltétel

 

A parancsban a kifejezés az összegezendõ kifejezést adja meg. Az összegzésben minden olyan rekord részt vesz, amely kielégíti a szûrõfeltételt. A szûrõfeltétel mind a tartomány, mind a FOR és WHILE elemeket magába foglalhatja. A tartomány kijelölést azonban az összegzési kifejezés elé kell beszúrni. Így például az auto táblázat kiválasztása után a

 

SUM ALL ar FOR 'Fiat' $ tipus

 

utasítással a Fiat tipusú autók árainak összegez kérdezhetõ le.

 

Az értékek átlagszámítását az

 

AVERAGE kifejezés szûrõfeltétel

 

A parancsban a kifejezés az átlagolandó kifejezést adja meg. Az átlagszámításban minden olyan rekord részt vesz, amely kielégíti a megadott feltételt. A szûrõfeltétel mind a tartomány, mind a FOR és WHILE elemeket magába foglalhatja. A tartomány kijelölést azonban az átlagolási kifejezés elé kell beszúrni. Így például az auto táblázat kiválasztása után az

 

AVERAGE ALL ar FOR 'Fiat' $ tipus

 

utasítással a Fiat tipusú autók árainak átlaga kérdezhetõ le.

 

A számlálás a

 

COUNT szûrõfeltétel

 

paranccsal végezhetõ el. A számlálásban minden olyan rekord részt vesz, amely kielégíti a szûrõfeltételt. A szûrõfeltétel mind a tartomány, mind a FOR és WHILE elemeket magába foglalhatja. Így például az auto táblázat kiválasztása után a

 

COUNT ALL FOR 'Fiat' $ tipus

 

utasítással a Fiat tipusú autók darabszáma kérdezhetõ le.

 

 

Mûködési paraméterek beállítása

 

A dBase-ben számos parancs mûködését, a program futását nemcsak az utasítás kiadásakor lehet behatárolni, hanem sok esetben azok az úgynevezett vezérlôparaméterek értékeitôl is függnek. A dBase-ben több tucat vezérlôparaméter létezik, melyeket a SET utasítással lehet beállítani. Ezen utasítások rendszerint a program elején helyezkednek el. Csak egykét fontosabb paraméterbeállító parancsot mutatunk be. A dBase alapesetben minden mûvelet eredményét kiírja a képernyôre, ami zavaró lehet egy program közben. Ezen visszajelzési opciót tilthatjuk le a

 

SET TALK OFF

 

utasítással. Mivel a különbözô országokban különféle dátumkijelzési formátumot használnak, a dBase is több kijelzést támogat, melybôl a

 

SET DATE formátum

 

utasítással a megfelelô kiválasztható. A magyar formátumnak legjobban az ANSI formátum felel meg, tehát a

 

SET DATE ANSI

 

utasítást célszerû kiadni. Az elvégzett parancsokat elsôsorban hibakeresés végett kiírathatjuk a képernyôre a

 

SET ECHO ON

 

utasítással. Ha meg szeretnénk szüntetni az utasítások kiíratását, akkor a

 

SET ECHO OFF

 

parancsot kell kiadni.

 

Az egyes beállítási parancsok rövid áttekintését adja a következõ táblázat.

 

Parancs

Leírás

SET BELL ON/OFF

A figyelmeztetõ csengõ hangjelzésének letiltása

SET COLOR TO színkódok

A színes monitorok esetén az alapszín, a kiemelési szín, a keretszín és a háttérszín beállításának parancsa

SET DEBUG ON/OFF

A SET ECHO által kiírt adatokat a nyomtatóra küldi, nyomkövetést tesz lehetõvé

SET DECIMALS TO n

tizedesjegyek darabszámát határozza meg

SET DEFAULT TO meghajtó

default lemezegység kijelölése

SET DELETED ON/OFF

a logikailag törölt rekordok figyelembe vételét szabályozza

SET DEVICE TO PRINT/SCREEN

kiíratás célhelyének meghatározása a SAY parancsok esetén

SET ESCAPE ON/OFF

Az ESC billentyû figyelését szabályozza

SET FIELDS TO mezõlista

A figyelembe veendõ mezõk listáját adja meg

SET FILTER TO feltétel

Egy default szûrõfeltétel megadásának lehetõsége

SET PATH TO path

Deafult directory kijelölése

SET PRINT ON/OFF

A nem formázott üzenetek hard-copy funkcióját szabályozza

SET STEP ON/OFF

Lépésenkénti végrehajtás be és kikapcsolása, nyomkövetés céljából

 

 

Rendszer függvények

 

A dBase programok egyik jellegzetessége, hogy sok funkció a gyári függvények segítségével végezhetô el. Az elôbb említett területek szinte mindegyikén találhatunk függvényeket a programozás megkönnyítésére. A függvényeket a funkcióik alapján csoportosíthatjuk, így léteznek

 

- adattípusokhoz kapcsolódó függvények, ezen belül

- matematikai,

ABS(x) : az x kifejezés abszolút értéke

EXP(n) : természetes alapú hatványozás

INT(x) : az x kifejezés egész része

LOG(x) : az x kifejezés természetes alapú logaritmusa

MAX(n1,n2) : n1 és n2 küzül a nagyobbik értéke

MIN((n1,n2) : n1 és n2 küzül a kisebbik értéke

MOD(n,m) : n -nek m-el történõ egészosztásakor keletkezõ maradék

ROUND(n,m) : Az n érték kerekítése m tizedesjegyre

SQRT(x) : az x kifejezés négyzetgyöke

- dátumkezelô,

CDOW(d) : megadja, hogy a d dátumhoz a hét melyik napja tartozik

CMONTH(d) : a d dátumhoz tartozó hónap megnevezése

DATE() : aktuális rendszerdátumot adja vissza

DAY(s) : a d dátumhoz tartozó nap hónapon belüli sorszáma

DOW(d) : a d dátumhoz megadja, hogy a hét hányadik napja

MONTH(s) : a d dátumhoz tartozó hónap sorszáma

TIME() : aktuális rendszeridôt adja vissza

YEAR(d) : a d dátumhoz tartozó évszám

- karakterkezelô,

AT(m,s) : az m szöveg elsô elôfordulási pozíciója az s karakterláncban

ISALPHA(s) : igaz értéket ad vissza, ha s elsõ karaktere betû

ISLOWER(s) : igaz értéket ad vissza, ha s elsõ karaktere kisbetû

ISUPPER(s) : igaz értéket ad vissza, ha s elsõ karaktere nagybetû

LEFT(s,l) : az s karakterlánc elsô l karaktere

LEN(s) : az s karakterlánc hossza

LOWER(s) : az s karakterlánc kisbetûre konvertálva

LTRIM(s) : az s karakterlánc elhagyva a kezdõ szóközöket

REPLICATE (s,n) : Az s string n-szeri megismétlése

RIGHT(s,l) : az s karakterlánc utolsó l karaktere

RTRIM(s) : az s karakterlánc elhagyva a záró szóközöket

SPACE(n) : n darab szóközbôl álló karakterlánc

STUFF (s1,p,n,s2) : az s2 p. poziciótól kezdõdõ n hosszúságú részét helyettesíti az s1 karakterlánccal

SUBSTR(s,p,l) : az s karakterlánc p. pozíciótól kezdôdô l hosszú részlete

UPPER(s) : az s karakterlánc nagybetûre konvertálva

- adatkonverziós,

ASC(s) : az s karakter ASCII kódja

CHR(n) : ASCII kódú karakter elôállítása

CTOD(s) : az a karaktersorozat tartalma dátum típusként

DTOC(d) : a d dátum karakteres alakja

STR(n) : az n kifejezés értéke szövegként

VAL(s) : az s karaktersorozat tartalma számként

- táblázatkezelô

BOF() : igaz, ha táblázat elején áll a rekordmutató

DBF() : a megnyitott tábla azonosító nevét adja vissza

DELETED() : a rekord törlésre jelölését jelzi

EOF() : igaz értéket ad vissza, ha elértük a táblázat végét

FIELD(n) : a munkatábla n. mezõjének nevét adja vissza

FOUND() : a keresés sikerességét adja vissza

LUPDATE() : tábla utólsó módosításának idõpontja

NDX(n) : az n. sorszámon megnyitott indexállomány neve

RECNO() : az rekordmutató értékét adja vissza

RECCOUNT() : a rekordok darabszámát adja vissza

RECSIZE() : Munkatábla rekordmérete

input-output kezelô

COL() : kurzor képernyô oszloppozíciója

INKEY() : benyomott billentyû kódját adja vissza

ROW() : kurzor képernyô sorpozíciója

- egyéb funkciók

DISKSPACE() : szabad lemezterület méretét adja vissza

FILE(f) : ellenõrzi, hogy létezik-e f azonosítójú állomány

IIF(f,k1,k2) : ha f feltétel igaz, akkor k1 értékét adja vissza, különben k2 értékét adja vissza

PCOL() : A kurzor oszlopa a nyomtatónál

PROW() : A kurzor sorszáma a nyomtatónál

TYPE (k) : Kifejezés tipusát adja vissza

 

 

A VIEW szerkezet

 

A táblázatoknál maradva, mint ismert az RDBMS rendszerekben többféle relációtípus is jelen van, melyek között a bázisrelációk mellett a view-k használatával foglalkoztunk részletesebben. A dBase esetében eddig a bázistáblázatokat említettük, tehát azon táblázatokat, melyek adatai egy DBF állományban megtalálhatók a lemezen. Emellett az dBase is lehetôséget kínál nézeti, view relációk használatára.

A view-hoz tartozó információk is egy külön állományban tárolódnak a lemezen, hasonlóan a bázistáblázatokhoz. A view állományok azonban nem a view-hoz tartozó rekordok adatait tartalmazzák, hanem a view elôállítására vonatkozó utasításokat. A view használata, lekérdezése esetén végrehajtódik az ott letárolt mûveletsor, s annak eredményét kapjuk meg mint a view tartalmát. A relációs modell szerint a view-nak a kezelés, a mûveletek tekintetében nem szabad különböznie a többi relációtípustól, azaz felhasználó ugyanazon utasításokkal kezelheti a bázis táblázatokat és a view táblázatokat is. Ez a követelmény az SQL-ben többé-kevésbé teljesül is, habár a DML utasításoknál vannak bizonyos korlátozások.

A dBase rendszerében is fennállnak ugyanezen korlátozások, sôt még egyéb zavaró momentumok is emlékeztetnek arra, hogy a view és a bázis táblázat azért mégsem ugyanaz. Az egyik ilyen jelenség, hogy a lekérdezéseknél a view mezôire csak úgy hivatkozhatunk, ha megadjuk, hogy honnan származott. Ez azt is jelenti hogy ismerni kell, hogyan állt elô a view, azaz a view célja itt elsôsorban nem az elrejtés, hanem az egyszerûsítés, jobb átláthatóság.

 

Egy másik, nem túl örömteli vonása a dBase view kezelésének, hogy a view a lekérdezési mûveleteknél sem mindegyikben használható. Vannak ugyanis olyan lekérdezéshez kapcsolódó mûveletek, melyek nem veszik figyelembe a view-t elôállító mûveletek mindegyikét, azaz úgy mûködnek, mintha egyes utasításokat ki sem adtunk volna, így azok nem azt a view-t látják, amit mi létrehoztunk. Hogy közérthetôbb legyen a felvázolt probléma, egy példával is illusztráljuk. A dBase-ben a view létrehozásakor rendszerint szelekciót is végzünk, s lekérdezési utasításoknál, pl. a LIST utasításnál van olyan tartománykijelölô opció, pl. a RECORD opció, mely nem veszi figyelembe a szûrési szelekciót, tehát a táblázat minden rekordját látja, viszont más tartománykijelölô opció, mint pl. az ALL opció csak a szûrési feltételnek megfelelô rekordokat adja vissza.

 

A view létrehozatala a dBase-ben a

 

CREATE VIEW viewnév

 

utasítással történik. Ez az utasítás a megadott DDL utasításokhoz hasonlóan egy teljes képernyôs segédprogramot hív meg, amelyben meg lehet adni mindazon mûveletek, melyek a nézeti táblázat elôállítására szolgálnak. Ezek a mûveletek mind kiadhatók parancsból is, nevezetesen az alábbi parancsokhoz kötôdnek a mûveletek:

 

SET FILTER

SET FIELDS

SET RELATION

SET INDEX

 

E mûveletek leírását a késôbbiekben ismertetni fogjuk, amit most lényegesnek tartunk még elmondani, az az, hogy a létrehozott view-t a

 

SET VIEW TO viewnév

 

utasítással tudjuk érvényesíteni. Most szándékosan nem mondjuk, hogy a view válik a munkatáblázattá, hiszen a dBase-ben a view kizárólag mint mûveletsor értelmezendô, amely kiválasztásakor, tehát a SET VIEW utasítás kiadásakor végrehajtja mindazon mûveleteket, melyeket tartalmaz, többek között a munkatáblázat kiválasztását, a szûrôfeltételek beállítását, stb. Ebbôl következôen már érthetônek találhatjuk, hogy a view-t nem lehet közvetlenül visszavonni, tehát csak úgy szüntethetjük meg a szûrôfeltételeket, kapcsolatokat, ha kézzel egyenként tesszük érvénytelenné azokat.

 

Megjegyezzük azonban, hogy ezzel nem a SET VIEW kiadása elôtti állapotba jutunk még vissza, csak egy alaphelyzetbe hozzunk az adatrendszert. Végezetül megemlítjük még, hogy a view leírások, definíciók is módosíthatók a

 

MODIFY VIEW viewnév

 

utasítással.

 

Kezelô felületek

 

A dBase három kezelô felülettel rendelkezik. Létezik interaktív felület és program felület is. Az interaktív felületet tovább lehet bontani két komponensre, míg a programfelületen csak egyféle megoldás jöhet szóba.

 

Az interaktív felület két komponense a kezelô felület alakjában, a megcélzott alkalmazói rétegben különbözik egymástól. Van ugyanis egy, a szakértôknek készült sororientált parancsfelület, mely az SQL parancsértelmezôkhöz hasonlóan egy prompttal jelzi, ha kész parancsaink fogadására, s elküldött parancsot rögtön végre is hajtja, az eredményt pedig a képernyôre listázza ki. Ez a megoldás, mint már említettük, a parancsok alaposabb ismeretét tételezi fel. A dBase rendszerben a parancsfelület egy karakteres terminál felületként jelenik meg, melyben egy pont jelzi a prompt-ot, vagyis a sor elején megjelenõ pont után lehet megadni a végrehajtandó dBase parancsot.

 

Az interaktív parancsok közül még az alábbi, a kezelõ felülethez kapcsolódó utasításokra célszerû kitérni. A dBase parancsfelület elindítása után a

 

QUIT

 

tasítással lehet kilépni a dBase rendszerbõl. Ha menetközben elakadunk és bizonytalanok vagyunk egyes parancsok szintaktikáját illetõen, akkor a

 

HELP

 

utasítással kérhetünk segítséget. A megjelenõ help rendszerben menüpontokon keresztül lehet kiválasztani a kérdéses utasítás vagy függvény leírást.

A dBase keretrendszerébõl lehetõség van a DOS parancsok közvetlen végrehjatására is, anélkül, hogy ki kellene lépni a dBase-bõl. A

 

!

 

karakter után egy DOS parancsot lehet megadni, amely eredményét kiírja a képernyõre, s utána újból a dBase prompt jelenik meg. Így például a

 

! RENAME A.DBF UJ.DBF

 

utasítás átnevezi az A.DBF állományt UJ.DBF állományra, anélkül hogy ki kellene lépni DOS szintre.

 

Egy másik hasznos utasítás a képernyõ törlésére szolgáló

 

CLEAR

 

parancs.

 

A másik interaktív felület egy menürendszeren keresztül vezérelhetõ. Mivel a dBase elsõsorban a nem szakember felhasználóknak készült, hiszen szinte bárkinek elérhetô az otthoni vagy munkahelyi PC-jén, ezért a dBase számára igen fontos egy felhasználóbarát kezelô felület létezése is. Természetesen most itt a mintegy 15 évvel ezelôtti fogalomkörben kell gondolkodni, amikor megítéljük a termék felhasználó-barátságát, s nem a mai igényekhez kell mérnünk. A könnyen kezelhetô felület kialakítására a dBase egy interaktív képernyôorientált és menüvezérelt segédprogramot fejlesztett ki, melyet Assistnak neveznek.

 

Az Assistban menüpontokon keresztül választhatók ki a mûveletek. A felhasználó számára segítséget jelent ebben a rendszerben az, hogy

 

- nem kell ismernie a parancsszavakat

- átfogó képet kap a lehetôségekrôl

- segítséget kap a paraméterek megadásánál

 

Természetesen egy gyakorlott felhasználó számára már felesleges lehet egy ilyen segédprogram használata, hiszen egyrészt hosszabb ideig tarthat a menüpontok közötti mozgás, mint az utasítás begépelése, másrészt az Assist a dBase utasításoknak, lehetôségeknek csak egy részét tartalmazza, s sok olyan parancs van, melyek nem érhetôk el az Assist-on keresztül. A követekezõ ábra az Assist egy induló épernyõjét mutatja.

 

--------------------------------------------------------------

Set Up Create Update Position Retrieve Organize Modify Tools

+---------------------+

| Database file |

+---------------------+

| Format for Screen |

| Query |

+---------------------+

| Catalog |

| View |

+---------------------+

| Quit |

+---------------------+

ASSIST |<E:>| |Opt: 1/6 | |

Move selection bar - . Select - ÄÙ. Leave menu - 

-------------------------------------------------------------

 

A programmódnál a dBase nyelvében kell elkészíteni az utasításokat, s mivel a dBase nyelve minden szükséges procedurális elemet tartalmaz, más nyelv ismeretére vagy használatára nincs szükség. Az elkészült forrásszöveg, melyet a dBase keretében is meg lehet írni a beépített szövegszerkesztô segítségével, közvetlenül futtatható, ugyanis a dBase programok nem compileres módon, hanem interpreteres módon mûködnek.

 

A forrásszöveg állományok specifikációja:

 

programnév.PRG

 

Az interpreteres végrehajtásnak természetesen az a hátránya, hogy

 

- az utasítások valamelyest lassabban futnak le

- a futáshoz szükséges a dBase interpreter jelenléte

- a szintaktikai hibák csak akkor derülnek ki, ha odaér a vezérlés.

 

Az interpreter okozta hiányosságok elkerülésére fejlôdött ki egy másik nevezetes xBase rendszer a Clipper, mely indulásként a dBase rendszer fordítójaként indult meg, de késôbb egészen sikeresen haladt egy önálló úton tovább.

 

Az elôzôekben már említettük, hogy a sororientált parancsmódban több utasítást is meghívhatunk, mint az Assistból, tehát e kétféle kezelôfelület a parancsok tekintetében sem egyenértékû egymással. Most megint hasonló kijelentést tehetünk, de most már a parancsmód és programmód vonatkozásában.

 

A részletezéshez egy kicsit visszakanyarodunk a parancsokhoz. Feltûnhetett az eddigiekbôl is már, hogy vannak olyan parancsok melyek egy segédprogramot hívnak meg, s vannak olyanok melyek egyetlen parancssorban kiadhatók. A segédprogramot meghívó, úgynevezett interaktív, teljes képernyôs parancsok közé tartoznak a következô utasítások:

 

CREATE : adattáblázat létrehozatala

APPEND : újrekord felvitele

EDIT : rekordok módosítása

BROWSE : rekordok nézegetése, módosítása

INSERT : új rekord felvitele

CHANGE : rekord módosítása

Vannak olyan utasítások is, melyek a mûvelet eredményét, s fôleg itt a lekérdezô utasításokra gondolunk, a képernyôre írják ki. Ilyen jellegû utasítás többek között pl. a

 

LIST : rekordok megjelenítése és a

DISPLAY : rekordok megjelenítése

 

utasítás is. Ez utóbbi két csoportba tartozó utasítások használata a programról igen korlátozott, ugyanis meghívásukkal a megtervezett felhasználói képernyô felülíródik a szabvány felülettel és szabvány mûveletsorral, ami csak ritkán felel meg a konkrét alkalmazási igényeknek. Emiatt tehát bizonyos, fennen sorolt utasítások ritkábban használatosak a programmódban.

 

A programmód és parancsmód utasításainak részletezését, a programozás technikáját a következõ fejezetben fogjuk tárgyalni.