online kép - Fájl  tubefájl feltöltés file feltöltés - adja hozzá a fájlokat onlinefedezze fel a legújabb online dokumentumokKapcsolat
  
 

Letöltheto dokumentumok, programok, törvények, tervezetek, javaslatok, egyéb hasznos információk, receptek - Fájl kiterjesztések - fajltube.com

Online dokumentumok - kep
  

A CLIPPER relaciós adatbaziskezelő nyelv

számítógépes



felso sarok

egyéb tételek

jobb felso sarok
 
Fajltípusok
Egyenaramú halózatok
Formalis nyelvek a gyakorlatban
AZ IRÁNYÍTÓRENDSZEREK FEJLŐDÉSE
Egy kis elmélet
A Word eszközei I
Internetes keresőrendszerek hasznalata (kulcs szavas, tematikus keresés)
Web-programozas
BGP - Border Gateway Protokol
 
bal also sarok   jobb also sarok

A CLIPPER relációs adatbáziskezelő nyelv



A dBASE III gyorsan népszerűvé vált, számos alkalmazás készült ezen a nyelven, azonban ez a nyelv alapvetően felhasználó-orientált. Ezért a Nantucket Corporation kifejlesztette a dBASE III adatbáziskezelő rendszeren alapuló CLIPPER programozási nyelvet, amely alapvetően fejlesztőorientált nyelv. A CLIPPER tartalmazza a dBASE III utasításainak nagy részét, de néhány fontos fejlesztői eszközzel bővült, többek között a függvénydefiniálási lehetőséggel és az alacsony szintű nyelveken - C, assembly - készíthető eljárások lehetőségével. A CLIPPER 87 SUMMER változat gyorsan népszerűvé vált a programozók körében. Későbbiekben újabb verziói jelentek meg a CLIPPER nyelvnek, a legújabb a CLIPPER 5.3 -as változat.


Adatállományok leírása, létrehozása


Egy adatállomány leírásán struktúrájának a definiálását értjük. Ennek során meg kell adni a táblázat mezőinek nevét, típusát és méretét. Magát az adatállományt a mezők leírását tartalmazó struktúraállományból lehet létrehozni.

Bár a CLIPPER nyelv lehetőséget biztosít arra, hogy program segítségével hozzunk létre egy adatállományt, sokkal kényelmesebben tehetjük ezt meg a DBU program segítségével. Ezért ezeket a CLIPPER utasításokat nem is tárgyaljuk könyvünkben.



A DBU segédprogram használata


A DBU egy CLIPPER segédprogram, melynek segítségével közvetlenül végezhetünk műveleteket az adatállományokkal, illetve a bennük található adatokkal. Ezt a programot szoktuk használni adatállományok létrehozására, továbbá az adatállományok tartalmának közvetlen tanulmányozására, módosítására.



A DBU program főképernyője


A DBU program funkcióit az F1-F8 billentyűkhöz rendelt legördülő menük tartalmazzák. Az egyes menüpontokat az ENTER billentyű segítségével választhatjuk ki.


F1 a HELP funkció


F2 az adatállományok, indexállományok vagy egy beállítás megnyitása

Csak azon adatállományok adataihoz tudunk hozzáférni, melyeket előzőleg megnyitottunk. A megnyitott adatállományok neve a képernyőn a Files kulcsszó alatt jelenik meg, az indexállományoké pedig az Indexes szó alatt. Az egyes adatállományok mezőinek felsorolása pedig a Fields szó alatt látható. Az aktuális adatállomány neve téglalapba van foglalva. Az aktuális adatállomány a nyílbillentyűk segítségével megváltoztatható. Az aktuális állományt lezárni a DELETE billentyű leütésével lehet.

Egyidőben legfeljebb hat munkaterület lehet aktív.


F3 adatállomány struktúrájának létrehozása, illetve módosítása, indexállományok létrehozása

Ha egy új adatstruktúrát szeretnénk létrehozni, akkor a DBU program indítása után ne nyissunk meg semmilyen állományt, hanem nyomjuk le az F3 billentyűt és válasszuk a Database menüpontot. Ekkor a képernyőn megjelenik egy Fields feliratú táblázat, melynek minden sora az adatstruktúra egy-egy mezőjének leírását fogja tartalmazni. A 414c21e z első oszlopba az adatmező nevét kell beírni, a másodikba a típusát, a harmadikba a mező hosszát, a negyedikbe pedig a tizedesjegyek számát - ha van. Az így létrehozott struktúrát az F4 billentyű leütésére megjelenő menü Structure menüpontjának kiválasztásával lehet elmenteni. Itt kell megadni, hogy milyen néven szeretnénk létrehozni az új adatállományt.

Új adatstruktúrát létrehozhatunk egy régi adatstruktúrából is. Ekkor nyissuk meg azt az adatállományt, amelynek struktúráját szeretnénk felhasználni. Ezután nyomjuk le az F3 billentyűt és válasszuk a Database menüpontot. Ekkor a képernyőn megjelenik a Fields feliratú táblázat, amely az aktuális adatállomány struktúrájának leírását tartalmazza. Most lehetőségünk van a struktúra módosítására. Az új struktúrát mentsük el az előbbiekben ismertetett módon, a kívánt névvel, melyet a felkínált név helyére kell beírni.

Ha egy adatállomány struktúráját módosítani kívánjuk, akkor ugyanígy járunk el, csak a mentésnél ugyanazzal a névvel mentjük el az új struktúrát, ami a kiinduló adatállomány neve volt. Az adatállományban már bentlevő adatok az új struktúrának megfelelően lesznek tárolva.


F4 egy új, vagy módosított adatstruktúra mentése, beállítás mentése

Az adatstruktúrák mentését már az előbbiekben ismertettük. A DBU program aktuális beállításai a megnyitott állományok, definiált szűrők, relációk, stb. Ennek mentésére akkor lehet szükség, ha egy későbbi időpontban ugyanabban a környezetben szeretnénk adatainkat vizsgálni. Ekkor csak a megfelelő beállítást kell megnyitnunk.


F5 az aktuális adatállomány adatainak kezelése (browse)

Az F5 billentyű leütése után válasszuk a Database menüpontot. Ekkor megjelenik az aktuális adatállomány táblázatos formában. Az oszlopok az egyes mezőket, a sorok az egyes rekordokat jelentik. Ha nincs nyitott indexállomány, akkor a rekordok a fizikai sorrendben jelennek meg, egyébként pedig az elsődleges indexállománynak megfelelően. A táblázatban való mozgásra használhatjuk a nyíl-billentyűket, valamint a Page Up, Page Down billentyűket. A táblázatban található adatokat módosíthatjuk is. Álljunk a kívánt mezőre a kurzorral és üssük le az ENTER billentyűt. Ezután lehetőségünk van a mező tartalmának módosítására.


Ha az F5 billentyűhöz tartozó menüpontok közül a View-t választjuk, akkor egy előzőleg elmentett beállításban szereplő adatállományokat tudunk kezelni.

Az adatállomány szerkesztése során az F7 billentyű leütésére megjelenő menü segítségével lehetőségünk van valamely konkrét adatrekordra ugrani (GOTO, SKIP), vagy egy adott rekordot megkeresni (LOCATE, SEEK).



Browse képernyő


F6 file-kezelő műveletek


Copy az aktuális adatállományt, vagy annak egy részét egy új file-ba másolja

Append rekordokat fűz az aktuális adatállományhoz egy másik

állományból

Pack a törlésre jelölt rekordok eltávolítása az aktuális

adatállományból

Zap az összes adatrekord törlése az aktuális adatállományból

Run DOS parancs kiadása a DBU elhagyása nélkül


F7 egy adatállományon belüli mozgásra szolgál, ezért csak az adatállomány szerkesztése során

használható


F8        beállítások


Relation két nyitott adatállomány relációba kapcsolására szolgál

Filter szűrőfeltétel megadása az aktuális adatállományra

Fields mezők hozzáadása az aktuális beállításhoz


A DBU használata során, ha a képernyőn valamely mező tartalmát szerkeszteni szeretnénk (például file-név, vagy feltétel), akkor az ENTER billentyű leütése után nyílik erre lehetőségünk. Egy kiválasztott művelet végrehajtása előtt a DBU megkérdezi, hogy a műveletet végre kívánjuk-e hajtani. Ekkor az Ok kiválasztására a művelet végrehajtódik, a Cancel hatására pedig törlődik.

A browse módból és a DBU-ból való kilépésre egyaránt az ESC billentyű szolgál.


A CLIPPER programozási nyelv



Először tekintsük át a CLIPPER nyelvben használható legfontosabb adat- és művelettípusokat.




Adattípusok



Numerikus adatok


A numerikus adatok különböző típusú számértékek.



Logikai érték


A logikai adattípus értéke igaz, vagy hamis lehet. Tárolására egy byte-ot tartanak fenn. A logikai értékekkel logikai műveleteket lehet végrehajtani.



Karakter


A karaktereket kódolt formában tárolják, a személyi számítógépeken általában ASCII kódban, nagygépeken előfordul az EBCDIC kód is. Egy karaktert egy byte-on ábrázolnak. A karakteres adatokon a leggyakrabban végzett művelet a láncolás és a szövegrész kiemelése.



Dátum


A dátum típusú adatokkal speciális műveleteket lehet végezni, például két dátum különbsége a két időpont között eltelt napok száma. Egy dátum 8 byte-ot foglal le.




Konstansok


A CLIPPER-ben többféle konstans lehet.

A karakteres konstans egy karaktersorozat, amely idézőjelek (" vagy ') közé van téve. Két, egymásnak megfelelő határoló jel között használható a másik határoló is. Például:

" Feri bá', hány óra van? "

Az üres karakterlánc egy 0 hosszúságú lánc, jelölése: "" .

A numerikus konstansok pozitív,vagy negatív egész számok, vagy lebegőpontos számok. Ezeket nem kell határolókkal ellátni.

A logikai konstansok az igaz - jelölése .T. - és a hamis - jelölése .F. - értékek.



Változók


Egy változó neve legfejjebb 10 karakter hosszú lehet, betűkből, számokból és az aláhúzás-jelből állhat. Betűvel kell kezdődnie. A változókat nem kell deklarálni, automatikusan létrejönnek amikor értéket kapnak. A változók típusa numerikus, karakteres, logikai, vagy dátum lehet. A dátum formája alapértelmezés szerint hónap/nap/év alakú. Az évnél az évszázad nem jelenik meg. A SET DATE ANSI utasítással a dátum formátuma megváltoztatható a nálunk megszokottabb év.hó.nap alakúra. Az évnél az évszázad itt sem jelenik meg. Amennyiben a négyjegyű évszámot szeretnénk megjeleníteni, a SET CENTURY ON utasítással állíthatjuk ezt be. A változók típusa olyan lesz, amilyen értéket éppen tárolunk bennük. Ez bármikor megváltoztatható.

A CLIPPER 87-es változatban csak egydimenziós tömbök használata megengedett. Ezeket deklarálni kell, nevük és méretük megadásával:


Declare tömbnév[méret]


Egy-egy tömbelemre a név és az index megadásával hivatkozhatunk:


tömbnév[index]




Műveletek



Előjelek


+ pozitív előjel

- negatív előjel


A pozitív előjelet nem kötelező kiírni.





Matematikai műveletek


+ összeadás

- kivonás

* szorzás

/ osztás

** hatványozás

% maradékképzés

() a műveletek csoportosítása



Relációs műveletek


< kisebb, mint

> nagyobb, mint

= egyenlő

<> , != , # nem egyenlő

<= kisebb, vagy egyenlő

>= nagyobb, vagy egyenlő

== azonos

$ karakter előfordulása szövegben

() a műveletek sorrendjének megváltoztatása


Az azonosság a karakter típusú kifejezéseket azonos karakterekre és azonos hosszúságra vizsgálja meg, ha a kifejezés numerikus, akkor az összehasonlításnál csak a 12 legnagyobb helyiértékű jegyet vizsgálja meg.

A $ művelet értelmezése:

a$b igaz, ha az a változóban levő karaktersorozat megtalálható a b változóban levő karaktersorozatban.

Példák:


"abc "="abc"                 igaz

"abc "=="abc"               hamis


a=890123456789.01234

b=890123456789.04321

a=b        hamis

a==b      igaz


"K"$b értéke igaz, ha a b változóban levő karaktersorozatban van K betű.



Logikai műveletek


.AND.              és művelet

.OR.                 vagy művelet

.NOT., ! negálás

a műveletek sorrendjének megváltoztatása



Karakteres műveletek


két, vagy több karaktersorozat összeláncolása

két, vagy több karaktersorozat összeláncolása úgy, hogy a - jel előtti
karaktersorozat végéről a szóközök a - jel utáni karaktersorozat végére
kerülnek.


Példa:


a="ABC "

b="DEF "

a-b értéke "ABCDEF       " lesz.


c="GHI "

a-b-c értéke "ABCDEFGHI         " lesz.


A műveletek végrehajtási sorrendjére azok a szabályok vonatkoznak, melyeket a Programozási alapismeretek című fejezetben ismertettünk.


A CLIPPER program írása


A CLIPPER program szövegét valamilyen szövegszerkesztővel készíthetjük el. (Például a Norton Editorral.) A CLIPPER forrásprogram-file-ok kiterjesztése .PRG . Minden utasítást külön sorba kell írni. Amennyiben egy utasítás nem fér ki egy sorba, a sor végén pontosvesszővel kell jelezni, hogy az utasítás a következő sorban folytatódik.

Bárhová írhatók üres sorok. Ezek a program szövegét áttekinthetőbbé teszik. A programsoron belül bármely elem közé tetszőleges számú szóközt írhatunk.

A programba tehetünk megjegyzéseket. A megjegyzés sor * karakterrel kezdődik. Ha egy utasítás végén szeretnénk megjegyzést elhelyezni, akkor ennek kezdetét a && karakterek jelzik.


Példa:


* Két szám átlagának kiszámítása

c=(a+b)/2 && a-ban van az egyik, b-ben a másik szám



A CLIPPER program tagolása


A nagyobb programokat célszerű részekre bontani. A feladat végrehajtása a főprogrammal indul, majd ez különböző alprogramokat, eljárásokat hív meg. Az eljárás végrehajtása után visszatérünk a főprogramba, ahonnan újabb eljárások hívhatók meg. Egy-egy eljárás is hívhat meg másik eljárásokat. A CLIPPER-ben az eljárásokat írhatjuk külön-külön .PRG állományokba, de bármelyik programállományban is elhelyezhetünk eljárás-definíciót. A CLIPPER-ben speciális eljárástípus a függvény-eljárás.


Fordítás szerkesztés


A programot modulokra bonthatjuk, az egyes modulok külön programfile-ba kerülhetnek. Az egyes modulokat külön fordíthatjuk le, majd egy szerkesztőprogrammal szerkesztjük futtatható programmá.



Fordítás


A CLIPPER fordítóprogramot az operációs rendszerből a


CLIPPER [<állománynév> ł @<CLP-állománynév> [opciók]]


paranccsal hívható meg. Ha nem adunk meg állománynevet, akkor csak a szerzőkre vonatkozó információ, valamint a különböző meghívási lehetőségek rövid ismertetése jelenik meg.


Az állomány-név a lefordítandó forrásprogram neve a kiterjesztés nélkül. Szükség esetén megadható a meghajtó és az útvonal is. A tárgymodulok mindig az aktuális meghajtó aktuális könyvtárába kerülnek. Ha a fordítót így hívjuk meg, akkor automatikusan lefordítja az állományból hívott modulokat is.


A CLIPPER @<vezérlőállomány> alakban történő hívás esetén csak a vezérlőállományban felsorolt modulok fordítása történik meg. A vezérlőállomány egy .CLP kiterjesztésű szöveg-file, melyet szövegszerkesztővel hozhatunk létre. Minden sora egy-egy modul nevét tartalmazza a kiterjesztés nélkül. Ekkor a létrejövő tárgymodul a CLP állomány nevét kapja.


A fordítóprogram opciói:


Az opciókat egy kötőjellel és egy kisbetűvel kell megadni.


-m        egyetlen programmodul fordítása, a hívott modulok

nélkül


-l          sorszámozás kiiktatása

Ha nem adjuk meg, akkor a CLIPPER információkat tárol a forrásprogram soraira
vonatkozóan mind a tárgymodulban, mind a végrehajtható programban. Ez
hasznos a programok tesztelése során, mert így a futás közbeni hibaüzenetekben
megjelenik a hibás sor száma. Azonban a kész programoknak csak fölöslegesen
növelné a méretét.


-s         csak szintaxis-vizsgálat

Ebben az esetben nem készül tárgymodul.


Egyidejűleg több opciót is megadhatunk.



Szerkesztés


A CLIPPER szerkesztőprogramja a PLINK86, ez azonban nagyon lassú, használatát csak overlay-ezett programok esetén javasoljuk, mert az overlay-t a többi szerkesztőprogram nem támogatja. Egyébként a DOS LINK programját használjuk.

A LINK programot a DOS-ból a következő módon indíthatjuk:


LINK [tárgymodulok],[futtatható program],[map-file],[könyvtár-file-ok]


A tárgymodulok nevét + jellel kell összekapcsolni.

Ha nem adjuk meg a futtatható program nevét, akkor automatikusan az első tárgymodul nevét kapja.

A map-file a program térképe, csak információs szerepe van. Tartalmazza az egyes szegmensek relatív címeit, méretét, a változók táblázatát.

A könyvtár-file-t akkor kell megadni, ha a programunkhoz hozzá szeretnénk szerkeszteni valamely programkönyvtárban tárolt programmodult. Több könyvtár is megadható, ezeket vesszővel, vagy szóközzel kell elválasztani. A CLIPPER nyelv függvényei külön könyvtárakban vannak elhelyezve, a CLIPPER.LIB, valamint az EXTEND.LIB-ben. Ezért, ha a programunk tartalmaz CLIPPER-függvényhívást, akkor ezeket a könyvtárneveket a szerkesztéskor meg kell adni.

A LINK parancsban a file-ok kiterjesztését nem szükséges kiírni.

Ha a szerkesztőt csak a LINK kulcsszóval hívjuk meg, akkor párbeszédes módban kéri be a file-neveket.

A file-neveket elhelyezhetjük egy vezérlőállományban is, ezt szövegszerkesztővel hozhatjuk létre. Minden file-típust külön sorba kell írni. Ha valamelyik típusú file-t nem akarunk megadni, akkor a megfelelő sort üresen kell hagyni. A LINK indítása vezérlőállomány használatával:


LINK @<vezérlőállomány-név>


Fordítás és szerkesztés parancs-file segítségével


Ismertetünk egy parancs-file-t, amely tartalmazza a CLIPPER-fordító és a LINK szerkesztőprogram hívását, paraméterként a fordítandó forrásprogram nevét várja, kiterjesztés nélkül. A létrejövő végrehajtható program neve megegyezik a forrásprograméval. A szerkesztéshez a CLIPPER.LIB és az EXTEND.LIB könyvtárak nevei meg vannak adva. A szerkesztést csak akkor hajtja végre, ha a fordítási menet hibátlan volt.


CLIPFOR.BAT


CLS

CLIPPER %1

IF NOT ERRORLEVEL 1 LINK %1,,,CLIPPER+EXTEND


Konkrét parancs-file készítésekor a CLIPPER és EXTEND könyvtárak nevét az elérési útvonallal együtt kell beírni a LINK paraméterei közé.


A parancs-file-t a DOS-ból a következő módon indíthatjuk:

CLIPFOR forrásprogramnév


A CLIPPER programozási nyelv szűkített parancskészlete



Jelölések


A parancsok ismertetésénél a kulcsszavakat nagybetűvel írjuk. Ezeket betűről betűre pontosan le kell írni. A számítógépen tetszőlegesen írhatjuk őket kis-, vagy nagybetűkkel. A kulcsszavakat négy karakter hosszúságúra rövidíthetjük, de ha kiírjuk őket, akkor a negyedik karakter utáni részben sem lehet hiba.

A csúcsos zárójelek < > közötti szöveg szimbólum. Ide változóneveket, vagy állandókat lehet írni.

A szögletes zárójelek [ ] közötti paraméterek megadása nem kötelező.

A kapcsos zárójel azt jelenti, hogy a kifejezés tetszés szerint ismételhető.

A csúcsos, szögletes és kapcsos zárójeleket a program szövegébe nem szabad beírni. Minden egyéb jelölt vesszőt, pontot és kerek zárójelet kötelezően le kell írni.



Parancsok


Deklarációs utasítások


A CLIPPER-ben csak a tömböket és a változók alapértelmezéstől eltérő hatáskörét kell deklarálni.


DECLARE <váltnév>[<numkif>]


váltnév              a tömb neve

numkif              a tömbben levő elemek száma


A fenti utasítás segítségével PRIVATE tömböket deklarálhatunk. Az elemszám megadásakor a szögletes zárójeleket [] ki kell tenni! Az egyes tömbelemekre a tömb nevével és a szögletes zárójelek közé tett elemszámmal hivatkozhatunk. Ha értéket adunk egy olyan változónak, melynek a neve megegyezik egy tömb nevével, akkor a tömbben szereplő összes elem értékét elrontjuk.


Példa:


DECLARE tömb[10]

tömb[3]=15


Ezekkel az utasításokkal létrehoztunk egy 10 elemű tömböt és a harmadik elem értékét 15-re állítottuk.



PRIVATE <váltnév>


váltnév  a változó neve


Ezzel az utasítással a felsorolt változók érvényességi körét az aktuális és az alacsonyabb szintekre korlátozzuk. Ha egy felsőbb szinten szerepel ugyanilyen nevű változó, arra ez a programrész nem gyakorolhat hatást.



PUBLIC <váltnév>


váltnév  a változó neve


Ezzel az utasítással a felsorolt változók érvényességi körét kiterjesztjük az egész programra. ěgy ezek a közönséges változóktól eltérően egyik programszinten sem veszítik el az értéküket. Egy újonnan létrehozott változó érvényes az aktuális és az alatta levő programszinteken, ha csak ebben a körben akarjuk használni, nem kell PUBLIC-nak deklarálni.




Ki- és beviteli utasítások


Beviteli eszközként a billentyűzetet, kiviteli eszközként a képernyőt és a nyomtatót fogjuk használni. A be- illetve kivitel lehet formázott, vagy formázatlan. Formázás esetén rendelkezhetünk arról, hogy a képernyő, vagy a papír mely pozíciójára történjen az írás és milyen legyen a megjelenő adatok formátuma. Formázatlan be- illetve kivitel esetén az adatok a képernyőn az aktuális kurzorpozíciótól kezdve, vagy a következő sorban jelennek meg, szabványos alakban. Ezeket az utasításokat csak saját használatú programokban, vagy programteszteléshez szoktuk alkalmazni.

Egy 25x80 karakteres képernyő esetén a sorkoordináta 0 és 24, az oszlopkoordináta 0 és 79 között lehet. A képernyő bal felső sarkának koordinátái: 0,0 .

A kiíró utasítások alapértelmezés szerint a képernyőre írnak, azonban a SET DEVICE TO PRINTER utasítás segítségével az outputot át lehet irányítani a nyomtatóra az írás parancsok kiadása előtt. Ha újra képernyőre szeretnénk írni, akkor a SET DEVICE TO SCREEN utasítással lehet az outputot visszarendelni a képernyőre.



Képernyő törlés és keretrajzolás a képernyőre


CLEAR


Ez az utasítás a teljes képernyőt törli.



<numkif1>,<numkif2> [CLEAR]


Ezzel a paranccsal a képernyő egy téglalap alakú része törölhető. A törlendő terület bal felső sarkának koordinátáit a numkif1 és numkif2 adják meg. Ha a CLEAR kulcsszót megadjuk, akkor a képernyő jobb alsó sarkáig törlődik a terület, egyébként csak a numkif1, numkif2-től a sor végéig.


<numkif1>,<numkif2> [CLEAR] TO <numkif3>,<numkif4> [DOUBLE]


numkif1            a bal felső sarok sorszáma

numkif2            a bal felső sarok oszlopszáma

numkif3            a jobb alsó sarok sorszáma

numkif4            a jobb alsó sarok oszlopszáma


Ha az utasítást a CLEAR kulcsszóval adjuk meg, akkor hatására a megadott téglalap alakú terület törlődik a képernyőn. Ha a CLEAR kulcsszót nem adjuk meg, akkor megadott koordinátájú keretet rajzol a program a képernyőre. Ha DOUBLE kulcsszót megadjuk, akkor a keretet dupla vonallal rajzolja meg a program. Ha a numkif1 és a numkif3, illetve ha a numkif2 és a numkif4 azonos, akkor egy vizszintes illetve egy függőleges vonal rajzolódik ki a képernyőn.



A képernyő tartalmának elmentése és visszaállítása


Szükségünk lehet rá, például egymásba ágyazott menük esetén, hogy a képernyő tartalmát elmentsük, hogy egy későbbi időpontban vissza tudjuk állítani. Erre szolgálnak a következő parancsok.


SAVE SCREEN [TO <váltnév>]


váltnév  egy változó neve


Ezzel a paranccsal el tudjuk menteni a képernyő tartalmát egy változóba. Ha nem adunk meg változót, akkor a képernyőtartalom egy meghatározott helyre kerül elmentésre, azonban ezt egy következő SAVE SCREEN utasítás felülírja. ěgy, ha több képernyőtartalmat akarunk tárolni egyszerre, akkor célszerű külön-külön változóba menteni őket.



RESTORE SCREEN [FROM <váltnév>]


váltnév  egy változó neve

Ezzel az utasítással visszaállíthatunk egy elmentett képernyőtartalmat. Amennyiben a képernyőt egy adott változóba mentettük el, akkor a visszaállításnál is meg kell adni ennek a változónak a nevét.



Lapdobás


EJECT


Ennek a parancsnak a hatására lapdobás történik a nyomtatón, a nyomtatás az új lap tetején folytatódik.



Formázatlan adatbeviteli utasítások


ACCEPT [<strkif>] TO <váltnév>


strkif     karakteres kifejezés

váltnév  egy karakteres változó neve


Ezzel az utasítással formázás nélkül írhatunk be egy karakteres változóba. A megadott szöveges kifejezés értéke megjelenik a képernyőn, majd a program várja a beírást. A bevitelt az <ENTER> billentyűvel kell lezárni.



INPUT [<kif>] TO <váltnév>


kif karakteres kifejezés

váltnév  beviteli változó


Az INPUT parancs a felhasználót egy adat bevitelére szólítja fel. Beírható numerikus, logikai, vagy határoló jelek közé helyezve karakter típusú adat. Szöveg bekéréséhez célszerűbb az ACCEPT parancs használata, mert itt a szöveget nem kell határoló jelek közé tenni.

A szöveges kifejezés a parancs végrehajtásakor megjelenik a képernyőn.

Formázatlan adatkiírást a következő utasítással lehet megvalósítani.


[<kif>] vagy

[<kif>]


Hatására a felsorolt kifejezések értéke kiíródik a képernyőre, vagy a nyomtatóra. (Lsd. SET DEVICE parancs) Ha a ? karaktert nem követi kifejezés, akkor üres sort ír ki. A ?? forma esetén a kiírást nem előzi meg soremelés. A vesszővel elválasztott kifejezések értéke szóközzel elválasztva fog megjelenni.



Formázott ki- és beviteli utasítások



<numkif1>,<numkif2> SAY <kif> [PICTURE<strkif>]


numkif1            sor száma

numkif2            oszlop száma

kif a kiírandó szöveg, vagy változó

strkif                 PICTURE-leírás


A SAY utasítás segítségével formázottan írhatunk a képernyőre. A PICTURE opcióval megadható, hogy az adat milyen formátumban kerüljön kiírásra. A legfontosabb PICTURE szimbólumok a következők:


számjegyek és előjel

csak nagybetűk (automatikus)

tizedespont helye


A formátum megadásánál a kiírandó adat minden pozíciójáról rendelkezni kell. Ha a teljes mezőre ugyanazt a formátumot akarjuk megadni, akkor elég a szimbólumot egy @ jel után egyszer leírni. A szimbólumokat idézőjelek közé kell tenni.




Példa:


@5,1 SAY "Jó reggelt kívánok!"

név="Kiss Anna"

@7,1 SAY név PICTURE"@!"

Ezen utasítás hatására a képernyőn a név csupa nagybetűvel fog megjelenni.


Amennyiben a kiírandó számokat tagolni szeretnénk vesszővel, szóközzel, vagy kötőjellel, ezeket is a PICTURE szimbólumok között kell feltüntetni.


Példa:


@5,1 SAY szam PICTURE"9 999 999"


Az így megjelenített szám szóközökkel lesz tagolva.


A kiviteli eszközt a nyomtatóhoz rendelhetjük, ekkor a SAY utasítás a nyomtatóra fog írni.


Példa:


SET DEVICE TO PRINTER

@1,1 SAY "Ez a szöveg a nyomtatón fog megjelenni."

SET DEVICE TO SCREEN

CLEAR

@1,1 SAY "Ez a szöveg a képernyőn jelenik meg."



<numkif1>,<numkif2> [SAY<kif1> [PICTURE<strkif>]]

GET <váltnév>

[PICTURE <strkif>]

[RANGE <kif2>,<kif3>]

[VALID <logkif>ł<függvnév>([<param>])]

numkif1            sorszám

numkif2            oszlopszám

kif1                  szöveg, ami után a bevitel következik

strkif                 PICTURE-leírás

váltnév              változó neve, amibe a bevitel történik

kif2                  tartomány alsó határa (numerikus, vagy dátum

típusú bevitelnél)

kif3                  tartomány felső határa (numerikus, vagy dátum

típusú bevitelnél)

logkif                logikai kifejezés

függvnév           függvény-név

param               paraméter


A GET parancs az adatok bevitelére és módosítására szolgál. A numkif1, numkif2-ben megadott sor és oszlopkoordinátáktól megjelenik a SAY után megadott kifejezés, ezután pedig a változó értéke. Ha nem adtunk meg SAY kulcsszót, akkor a változó értéke a numkif1, numkif2 ponttól kezdődően jelenik meg. Mivel a változó értékét a GET megjeleníti, ezért a GET kiadásakor a változónak értékkel kell rendelkeznie. Az adatok beolvasása illetve módosítása csak egy READ parancs segítségével lehetséges. Egy READ paranccsal az összes addig kiadott és READ-del még be nem olvasott GET utasítás végrehajtásra kerül.

A RANGE opcióval numerikus, vagy dátum típusú változókra megadhatók a megengedett legkisebb és legnagyobb értékek. Az adott tartományon kívüli értékeket a program nem fogadja el.

A VALID opcióval a változókra érvényességi kritériumok adhatók meg. A kritérium lehet egy logikai kifejezés, vagy egy függvény. Az illető GET-mezőből csak akkor lehet kilépni, ha a megadott feltétel teljesül, vagy a függvény értéke igaz. A VALID opció segítségével az adatok bevitelénél széleskörű ellenőrzést lehet megvalósítani.

A GET utasítás hibaüzenetei a képernyő 0. sorában a jobboldalon jelennek meg.

A PICTURE opcióban megadható legfontosabb szimbólumok megegyeznek a @...SAY utasításnál felsoroltakkal, továbbá:


A         csak betű

L          csak logikai érték

N         betűk és karakterek

X         bármely karakter



Példák:


@20,1 SAY "NÉV:" GET név

READ


Az utasítás hatására a 20. sor 1. oszlopában megjelenik a NÉV: kiírás és a név nevű változó tartalma. A READ hatására a kurzor a mező elejére áll és várja a bevitelt.



@20,1 SAY "NÉV:" GET név PICTURE "@!"

READ


Ha az utasítást ebben a formában adjuk meg, akkor a név karakterei automatikusan nagybetűk lesznek.



@10,5 GET szám PICTURE "9999.99"

A szám nevű változó maximum négy egészjegyből állhat, a tizedesjegyek száma pedig kettő.



n=0

@1,1 SAY "N=" GET n VALID n>0

READ


Az n változó értéke csak pozitív szám lehet.



n=0

@1,1 GET n RANGE 10,20

READ


Itt az n változó értékének a 10_n_20 feltételt kell teljesítenie.



READ


A READ parancs az utoljára kiadott READ, CLEAR vagy CLEAR GET parancsok után kiadott összes aktív @...GET parancsot beolvassa. Ez a parancs az adatok képernyőorientált gyüjtésére és szerkesztésére szolgál. Az egy READ paranccsal kezelt GET mezők között a kurzormozgató billentyűkkel közlekedhetünk, akár vissza is léphetünk az előző mezőre. A READ parancs a szerkesztés befejezése után az összes GET-et törli.


Példa:


CLEAR

@5,5 SAY "Név :" GET név

@7,5 SAY "Lakcím :" GET cím

@9,5 SAY "Munkahely :" GET mhely

@11,5 SAY "Foglalkozás:" GET fogl

READ


A fenti utasítások hatására a képernyőn megjelennek a mezők megnevezései és tartalma. Ezek után a mezők tartalmát módosíthatjuk.


CLEAR GETS


Ez az utasítás törli az összes aktív @...GET parancsot.

Menü-szervezés



<numkif1>,<numkif2> PROMPT <strkif>


numkif1            sor száma

numkif2            oszlop száma

strkif                 menüsor


Ez az utasítás egy menü felépítésére szolgál. Az egyes menüsorokat a PROMPT parancs segítségével lehet elhelyezni a képernyőn. A menüpont kiválasztása a MENU TO utasítással történik.


MENU TO <váltnév>


váltnév  a menüváltozó neve


Ez az utasítás lehetővé teszi, hogy a kiválasztott menüpont száma bekerüljön a menüváltozóba.

A kurzor mozgatásával rápozícionálhatunk a megfelelő menüsorra, majd az <ENTER> billentyű leütésével kiválasztjuk azt. Az a menüsor, ahol a kurzor áll, más színnel jelenik meg a képernyőn. A pozícionáláshoz használhatjuk a <HOME> - első menüsor - és az <END> - utolsó menüsor - billentyűket is. A kiválasztás a megfelelő menüpont első karakterének leütésével is elvégezhető.

Több menü egymásba ágyazható, de mindegyik almenühöz más és más menüváltozót kell választani.


Példa:


vált=0

@5,1 PROMPT "1. menüpont"

@7,1 PROMPT "2. menüpont"

@9,1 PROMPT "3. menüpont"

@11,1 PROMPT "4. menüpont"

MENU TO vált

Az utasítások hatására a képernyőn megjelenik a menü és a vált nevű változóba fog kerülni a kiválasztott menüpont sorszáma.



Feltételes utasítások


A feltételes utasítások két, vagy többirányú elágazást tesznek lehetővé a programban.


IF <logkif>

<parancsok>

[ELSE

<parancsok>]

ENDIF


logkif                feltétel

parancsok        CLIPPER-utasítások


Ez az utasítás egy feltételtől függő programelágazást hoz létre. Ha a feltétel teljesül, akkor a program a feltétel utáni utasításokat hajtja végre, majd az ENDIF utáni utasítás következik. Ha nem teljesül, akkor amennyiben van ELSE ág, akkor ennek az utasításai kerülnek végrehajtásra, ha nincs, akkor a program az ENDIF utáni utasítással folytatódik. Az IF utasítások egymásba ágyazhatók.



DO CASE

CASE <logkif>

<parancsok>


[OTHERWISE

<parancsok>]

ENDCASE



logkif                feltétel

parancsok        CLIPPER-parancsok


Ez az utasítás többirányú programelágazást tesz lehetővé. Az első sorban csak a DO CASE kulcsszavak állhatnak. A CLIPPER sorra vizsgálja a CASE kulcsszavak után megadott feltételeket mindaddig, amíg nem talál olyat, amelyik teljesül. Ekkor végrehajtja az itt következő parancsokat, majd a program az ENDCASE utáni utasításon folytatódik. Ha egyik feltétel sem teljesül, akkor az OTHERWISE utáni parancsok kerülnek végrehajtásra. Ha ez a kulcsszó nincs megadva, akkor a program az ENDCASE utáni utasítással folytatódik.


Példa:


DO CASE

CASE menüvált=1

DO elsőpont

CASE menüvált=2

DO másodikpont

CASE menüvált=3

DO harmadikpont

ENDCASE


A menüvált értékétől függően az elsőpont, másodikpont, vagy a harmadikpont nevű eljárások valamelyike kerül végrehajtásra.



Ciklusszervezés


A CLIPPER-ben kétféle ciklus szervezhető, feltételtől függő lefutású és számlálásos ciklus.



DO WHILE <logkif>

<parancsok>

ENDDO

logkif                feltétel

parancsok        CLIPPER utasítások


Ezzel az utasítással egy feltételtől függő lefutású ciklust lehet szervezni. A ciklus magját alkotó parancsok addig kerülnek végrehajtásra, míg a ciklus-feltétel igaz. Ha a feltétel hamis, akkor a program az ENDDO utáni utasítással folytatódik. A ciklusok egymásba ágyazhatók. A ciklusmagban elhelyezhetünk LOOP és EXIT utasításokat, melyek a ciklus lefutásának menetét befolyásolják.



LOOP


Ezen utasítást hatására a vezérlés visszakerül a közvetlenül megelőző DO WHILE utasításra és a feltétel újra kiértékelődik. Ettől függően a program vagy ismét végrehajtja a ciklust, vagy az ENDDO utáni utasításra lép.




EXIT


Ez az utasítás a DO WHILE ciklusból történő kilépésre szolgál. A program a következő ENDDO utáni utasítással folytatódik.



FOR <váltnév>=<numkif1> TO <numkif2> [STEP <numkif3>]

<parancsok>

NEXT


váltnév              a ciklusváltozó neve

numkif1                        kezdőérték

numkif2                        végérték

numkif3                        lépésköz

parancsok Clipper utasítások


Ezzel az utasítással egy számlálásos ciklus szervezhető. A parancsok alkotják a ciklus magját. A ciklus addig fut le, míg a ciklusváltozó értéke a kezdő értéktől indulva, lépésközzel növelve a végértéket el nem éri. A lépésköz negatív is lehet, ha nincs megadva, akkor alapértelmezés szerint 1.




Eljárások definiálása, hívása


PROCEDURE <procnév>


procnév            az eljárás neve


Közös állományban levő, egymástól független eljárások elé egy, az eljárás nevét tartalmazó PROCEDURE sort kell írni, hogy az egyes eljárásokat meg lehessen különböztetni egymástól. Az eljárásokat a DO utasítás segítségével lehet aktivizálni. Ha az eljárásban paramétereket akarunk átvenni a hívó programból, akkor ezeket a paramétereket a PARAMETERS parancsban definiálni kell. Egy eljárás az utolsó végrehajtható utasítással fejeződik be, de az eljárásban elhelyezhetünk RETURN utasítást, melynek hatására befejeződik az eljárás végrehajtása és a vezérlés visszakerül a hívó programba.



DO <prgnév>ł<procnév> [WITH<param> ]


prgnév              egy .PRG állomány neve

procnév            egy eljárás neve

param               paraméter


A DO utasítással egy CLIPPER programot, vagy eljárást lehet meghívni. Az eljárás lehet egy másik .PRG állományban is, de lehet ugyanazon a .PRG állományon belül is. Egy program önmagát nem hívhatja meg. A WITH kulcsszó segítségével paramétereket adhatunk át a hívott eljárásnak. Az eljárás befejeződése után a program a DO utasítás után folytatódik.



Az eljárások egy speciális típusa a függvényeljárás. Ezek definiálására a FUNCTION utasítás szolgál.


FUNCTION <függnév>

[PARAMETERS <váltnév>]

<parancsok>

RETURN(<kif>)


függnév             a függvény neve

váltnév                          paraméter

parancsok CLIPPER-utasítások

kif                                a függvény eredménye


A FUNCTION paranccsal egy felhasználó által definiált függvényt lehet létrehozni. Ennek a függvénynek paramétereket lehet átadni, a RETURN utasításban szereplő kifejezés pedig a függvény értéke. Egy függvényben több RETURN utasítás is lehet. A függvények bármely megfelelő típusú kifejezésben szerepelhetnek. Egy függvényeljárás önmagát is meghívhatja (rekurzió).



PARAMETERS <váltnév>


váltnév  a változó neve


Ez az utasítás azokat a változókat határozza meg, amelyek értéküket egy DO...WITH parancsból, vagy egy függvény-hívásból paraméterként kapják. A parancsban annyi, egymástól vesszővel elválasztott változót kell felsorolni, ahány paraméter átadásra kerül. Ezeknek a változóknak a neve a meghívástól független. A paraméterek sorrendben veszik át a hívási értékeket.

Ha az átadandó paraméterek konstansok, akkor ezek az eljárás végrehajtása után nem kerülnek visszaadásra, ha pedig változók, akkor az eljárás végén a PARAMETERS-ben felsorolt változók értéke átkerül a meghívó változókba. Az eljárás befejeződésekor a paraméterváltozók törlődnek.

Egy eljárásban, vagy függvényben csak egy PARAMETERS utasítás állhat.


RETURN [<kif>]


kif        a függvény eredménye


Ez a parancs befejez egy programot, eljárást, vagy függvényt. A további végrehajtás ahhoz a programhoz kerül vissza, amelyik a most befejezett programot, eljárást, vagy függvényt hívta. A legmagasabb szintről a vezérlés az operációs rendszerhez kerül. Egy program, eljárás, vagy függvény több RETURN utasítást is tartalmazhat. Egy függvénynek befejeződésekor vissza kell adnia egy értéket, míg egy program, vagy eljárás nem adhat vissza értéket.


Példa:


FUNCTION min

PARAMETERS v1,v2

IF v1<=v2

RETURN(v1)

ELSE

RETURN(v2)

ENDIF


A fenti függvény hívása:


a=a+min(b,c)


Az a változó értékéhez a b és c változók közül a kisebbiket adja hozzá.



A program futásának felfüggesztése és befejezése


WAIT [<strkif>] [TO <váltnév>]


strkif                 szöveg

váltnév  változónév


Enek az utasításnak a hatására a kurzor a következő sor elejére áll és megjelenik az utasításban megadott szöveg. Ha nem adtunk meg szöveget, akkor a "Press any key to continue..." üzenet jelenik meg. Majd megszakad a program futása és addig vár, míg le nem ütünk egy billentyűt. Ha megadunk egy változót az utasításban, akkor a leütött karakter beíródik ebbe a változóba.


Példa:


WAIT "M)egszakítás T)örlés B)efejezés " TO válasz


Az utasítás kiírja a "M)egszakítás T)örlés B)efejezés " üzenetet és vár egy billentyű leütésére. A leütött karakter továbbfeldolgozás céljára a válasz nevű változóba kerül.



QUIT


Ez az utasítás befejezi a program végrehajtását és a vezérlést visszaadja az operációs rendszernek. Használata nem kötelező, hiszen a program az utolsó végrehajtható utasítással úgyis befejeződik. A QUIT helyett írhatjuk a RETURN utasítást is.


CLIPPER-függvények



A CLIPPER-hez tartozó CLIPPER.LIB és EXTEND.LIB könyvtárakban számos függvény található. Ezek közül néhányat ismertetünk a következőkben.



Matematikai függvények



ABS(<numkif>)


numkif  numerikus kifejezés


Az ABS függvény a numerikus kifejezés abszolut értékét képzi.



INT(<numkif>)


numkif  numerikus kifejezés


Az INT függvény a numerikus kifejezés egész részét képzi.



LOG(<numkif>)


numkif  numerikus kifejezés


A LOG függvény a numerikus kifejezés természetes logaritmusát képzi.



MAX(<numkif1>,<numkif2>)


numkif1            numerikus kifejezés

numkif2            numerikus kifejezés



A MAX függvény két numerikus kifejezés közül a nagyobbik értékét adja vissza.


MIN(<numkif1>,<numkif2>)


numkif1            numerikus kifejezés

numkif2            numerikus kifejezés



A MIN függvény két numerikus kifejezés közül a kisebbik értékét adja vissza.



SQRT(<numkif>)


numkif  numerikus kifejezés


Az SQRT függvény a numerikus kifejezés négyzetgyökét számítja ki.



Karakterműveleteklet végző függvények



ALLTRIM(<strkif>)


strkif                 karakteres kifejezés


A függvény eltávolítja a karakteres kifejezés vezető és követő szóközeit.



LEN(<strkif>)


strkif                 karakteres kifejezés


Ez a függvény a karakteres kifejezés hosszát adja meg, vagyis megszámolja hány darab karakterből áll a kifejezés és ezt a számot adja vissza eredményként.



LEFT(<strkif>,<numkif>)


strkif                 karakteres kifejezés

numkif  hossz


A függvény a karakteres kifejezés a hosszban megadott számú baloldali karakterét adja eredményül. A hosszba a szóközök is beleszámítanak.



LTRIM(<strkif>)


strkif                 karakteres kifejezés


A függvény levágja a karakteres kifejezés vezető szóközeit.



RIGHT(<strkif>,<numkif>)


strkif                 karakteres kifejezés

numkif  hossz


A függvény a karakteres kifejezés a hosszban megadott számú jobbboldali karakterét adja eredményül.




RTRIM(<strkif>)


strkif                 karakteres kifejezés


A függvény levágja a karakteres kifejezés követő szóközeit.



SPACE(<numkif>)


numkif  numerikus kifejezés


A függvény a numerikus kifejezésben megadott számú szóközt állít elő.



SUBSTR(<strkif>,<numkif1>,<numkif2>)


strkif                 karakteres kifejezés

numkif1            kezdő pozíció

numkif2            a karakterek száma

Ez a függvény egy karakterláncból egy részkarakterláncot képez. A numkif1 adja meg, hogy a részlánc az eredeti karakterlánc hányadik karakterétől kezdődik, a numkif2 pedig, hogy hány karakterből fog állni. Ha a numkif2-t nem adjuk meg, akkor a részkarakterláncot a megadott pozíciótól a karakterlánc végéig képzi a függvény. Ez történik akkor is, ha numkif2 értéke nagyobb, mint a kezdő pozíciótól hátralevő karakterek száma. Ha a kezdő pozíció nagyobb, mint a kiinduló karakterlánc hossza, akkor az eredmény egy üres karakterlánc lesz.



Konverziós függvények


A konverziós függvényekkel az adatokat egyik típusról egy másikra alakíthatjuk át.



CTOD(<strkif>)


strkif                 karakteres kifejezés


Ez a függvény egy karakteres kifejezést dátummá alakít át. A karakteres kifejezésnek a megfelelő dátum formátumban kell lennie és érvényes dátumot kell tartalmaznia. A dátum formája alapértelmezés szerint: hónap/nap/év , az év az évszázadot nem tartalmazza.



DTOC(<datkif>)


datkif                dátum kifejezés


Ez a függvény egy dátum típusú adatot karakterlánccá alakít. ěgy már karakteres műveleteket tudunk végezni a dátummal, például összeláncolhatjuk egy szöveggel.



STR(<numkif1>[,<numkif2>[,<numkif3>]])


numkif1            numerikus kifejezés

numkif2            hossz

numkif3            tizedes jegyek száma


A függvény egy numerikus kifejezést karakterlánccá alakít át. A hossz paraméter azt adja meg, hogy a karakterlánc hány karakter hosszú legyen, ebbe a tizedespontot is bele kell számítani. Ha a szám ennnél rövidebb, akkor szóközök fogják megelőzni. Ha a hosszra és a tizedes jegyekre nem adunk meg értéket, akkor 10 karakter hosszúságú lesz az eredmény. Ha a numerikus kifejezésben több tizedes jegy van a megadottnál, akkor kerekít a függvény az átalakításkor, ha pedig a szám túl nagy és nem fér el a megadott hosszon, akkor az eredmény a megadott hosszúságú * sorozat lesz.



VAL(<strkif>)


strkif                 karakteres kifejezés


A függvény egy karaktersorozatot számmá alakít át. A karaktersorozatot addig értelmezi, amíg számnak tekinthető. A vezető szóközöket figyelmen kívül hagyja.




Egyéb függvények



COL


A függvény eredménye a kurzor aktuális oszloppozíciója.



ROW


A függvény eredménye a kurzor aktuális sorpozíciója.



PCOL


A függvény eredménye a nyomtató aktuális oszloppozíciója.



PROW


A függvény eredménye a nyomtató aktuális sorpozíciója.



DATE


A függvény a rendszerdátumot adja meg, eredménye dátum típusú. Alapértelmezés szerint a dátum hónap/nap/év alakú, de a SET DATE ANSI utasítással a megszokottabb év.hó.nap alakra változtatható. Alapértelmezés szerint az évszázad nem jelenik meg.



TIME


A függvény a rendszeridőt adja meg óó:pp:ss formában. Az eredmény típusa karakteres.



EMPTY(<kif>)


kif        karakteres kifejezés

numerikus kifejezés

dátumkifejezés

logikai kifejezés


A függvény egy adott kifejezésről eldönti, hogy üres-e. A függvény eredménye a kifejezés típusától függően logikai igaz (.T.), ha

- egy karakteres változó üres (hossza=0), vagy ha csak szóközöket tartalmaz

- egy numerikus kifejezés értéke 0

- egy dátumkifejezés üres dátumot tartalmaz

- egy logikai kifejezés értéke hamis (.F.)



Adatbáziskezelő utasítások



Adatbázisok megnyitása, lezárása


Ha egy adatbázissal dolgozni szeretnénk, akkor ezt előzőleg meg kell nyitnunk, ezáltal válnak hozzáférhetővé az adatbázisban tárolt adatok a programjaink számára. Ha befejeztük az adatbázis feldolgozását, akkor az adatbázist le kell zárni. A lezárás hatására íródik ki az adatbázisba a memóriában található pufferterületek tartalma is. (Megjegyezzük, hogy a CLIPPER-ben van egy COMMIT utasítás, melynek hatására az összes munkaterület tartalma visszaíródik a lemezre. Ez a programban bármikor kiadható.)

Egy adatbázist egy munkaterületen lehet megnyitni. A munkaterület kiválasztására szolgál a SELECT utasítás.


SELECT <numkif> | <aliasnév> | <munkaterület száma>


numkif  numerikus kifejezés, melynek értéke 0 és 254 között van

aliasnév                                  egy létező munkaterület neve, ha ott már van nyitott

adatállomány (lásd USE parancs). Az első tíz munka-

területre az A és J közötti betűkkel is hivatkozhatunk.


munkaterület száma                0 és 254 közötti szám


A munkaterületet számmal, vagy az ABC nagybetűivel, vagy az ott megnyitott állomány alias-nevével azonosíthatjuk. Minden munkaterületen megnyitható egy adatállomány a hozzá tartozó indexállományokkal együtt. Egyszerre csak egy munkaterület lehet aktív, mégpedig az, amelyiket a legutolsó SELECT utasítással kiválasztottunk. Minden munkaterületnek megvan a saját aktuális rekordja. Az aktuális rekord tartalmát megváltoztathatjuk akkor is, ha a munkaterület nem aktív.


Példák egy munkaterület kiválasztására:


SELECT 1

SELECT B

SELECT <alias-név>


A SELECT 0 parancs a következő szabad munkaterületre kapcsol.



USE [<file-név1>] [INDEX <file-név2>

[EXCLUSIVE] [ALIAS <alias-név>]


file-név1                       adatállomány

file-név2                       indexállományok

alias-név                       alias-név



A USE paranccsal egy munkaterületen megnyitható egy adatállomány. Az adatállomány alapértelmezés szerint .DBF kiterjesztésű. Ha a munkaterületen már van aktív állomány, akkor a USE parancs hatására először lezárásra kerül ez az állomány a hozzá tartozó indexállományokkal együtt és csak ezután kerül sor az új állomány megnyitására.

Egy munkaterületen legfeljebb 15 indexállomány nyitható meg egyszerre. Ezeknek létezniük kell, kiterjesztésüknek .NTX-nek kell lennie. Amennyiben másként nem rendelkezünk (lásd SET ORDER utasítás) az első indexállomány lesz az elsődleges index.

Az alias-név legfeljebb 10 karakter hosszúságú lehet, tartalmazhat betűket, számjegyeket és a "_" karaktert. Betűvel kell kezdődnie. Az alias-név segítségével lehet más munkaterületről az állományhoz fordulni. Amennyiben az alias-név nincs külön megadva, akkor az alias-név az adatállomány neve lesz. Két munkaterületen nem lehet azonos alias-név.

Egy másik munkaterület aktuális rekordjának egy mezőjére hivatkozni a következőképpen lehet:


<alias-név> -> mezőnév


Nem indexelt állományok megnyitása után az aktuális rekord az első rekord lesz, indexelt állományok esetén pedig az a rekord, amelyik az indexállomány szerint az első.

Az EXCLUSIVE opció hatására az állomány kizárólagos hozzáférésre kerül megnyitásra. Ekkor a hálózatba kapcsolt többi felhasználó nem férhet hozzá. (Csak SET EXCLUSIVE OFF esetén van jelentősége.)


Az önmagában kiadott USE parancs lezárja az aktuális munkaterületen megnyitott állományokat.

Példák


USE raktar INDEX cikksz


A fenti utasítás az aktuális munkaterületen megnyitja a raktar.dbf állományt és a cikksz.ntx indexállományt. Az alias-név raktar lesz.


SELECT 3

USE raktar62 ALIAS R62


Ez az utasítás a hármas munkaterületen megnyitja a raktar62.dbf állományt R62 alias-névvel.



SELECT 5

USE


Ez az utasítás lezárja az ötös munkaterületen található nyitott állományokat.



Az állományok lezárása a CLOSE utasítással is történhet:


CLOSE [ INDEX | DATABASES ]


A kulcsszó nélküli CLOSE utasítás az aktuális munkaterületen megnyitott állományokat zárja le.

A CLOSE INDEX az aktuális munkaterületen megnyitott indexállományokat zárja le.

A CLOSE DATABASES hatására valamennyi állomány lezárásra kerül az összes munkaterületen.



Adatbázisok karbantartása


Rekord tartalmának módosítása


REPLACE [ALL | NEXT <numkif> | RECORD <numkif>]

[<alias-név> ->] <mező-név> WITH <kif>


[FOR <logkif>]

[WHILE <logkif>]


numkif              numerikus kifejezés

alias-név           alias-név

kif megfelelő kifejezés

logkif                feltétel


A REPLACE utasítás kicseréli egy, vagy több mező tartalmát a WITH után megadott kifejezéssel. Az alias-név megadása esetén a módosítás nem az aktuális munkaterületen levő adatállomány mezőire vonatkozik. Ha sem ALL, NEXT, RECORD sem FOR/WHILE feltétel nincs megadva, akkor a csere csak az aktuális rekordra vonatkozik.

Egy mezőbe csak megfelelő típusú kifejezés kerülhet. Numerikus mezők esetén, ha az új érték nagyobb, mint a mezőhossz, akkor a mezőbe csillagok kerülnek.

Az ALL kulcsszó hatására a cserére az állomány minden rekordjában sor kerül. A NEXT kulcsszó hatására a következő a kifejezésben megadott darab rekordban történik meg a csere, míg a RECORD kulcsszó hatására a kifejezésben megadott sorszámú rekordban.

Ha megadjuk a FOR kulcsszót, akkor mindazokban a rekordokban megtörténik a csere, amelyekre az adott feltétel igaz. A WHILE kulcsszó esetén addig történik a csere a soronkövetkező rekordokban, amíg a feltétel igaz.


Példák


REPLACE cikksz WITH "54321"


Ezen utasítás hatására az aktuális munkaterület aktuális rekordjában a cikkszám mezőbe az "54321" érték kerül.


REPLACE ALL ar WITH ar*1.1


A fenti utasítás hatására az állomány minden rekordjában az ar mező értéke 10%-kal nagyobb lesz.


REPLACE raktar -> menny WITH 998.6


Hatására a raktar alias-nevű munkaterületen az aktuális rekordban a menny mező értéke 998.6 lesz.


REPLACE NEXT 60 ar WITH ar*1.05 FOR term_csop="4"


Ezen utasítás hatására a következő 60 rekord közül azokban emelkedik az ár, amelyekben a termékcsoport értéke 4.


SELECT 1

USE raktar INDEX cikk

REPLACE menny WITH 2*menny WHILE cikksz="8787"

Hatására a raktár adatállományban a mennyiség értéke a kétszeresére változik a következő rekordokban addig, míg a cikkszám értéke 8787. Az adatállomány a cikkszám szerint van indexelve.


Rekord törlésre jelölése, törlése


A CLIPPER-ben a rekordokat nem lehet közvetlenül törölni az adatállományokból. Először a törölni kivánt rekordokat törlésre jelöljük. Ez a jelölés lekérdezhető, így ezen rekordok a további feldolgozásból kihagyhatók. A törlésre jelölést meg is lehet szüntetni. A törlésre jelölt rekordokat egy külön utasítással lehet eltávolítani az adatállományból.



DELETE [ALL | NEXT <numkif> | RECORD <numkif>]

[FOR <logkif>]

[WHILE <logkif>]


numkif              numerikus kifejezés

logkif                feltétel



Ez az utasítás az adatrekordok törlésre jelölésére szolgál. A DELETE további adatok megadása nélkül az aktuális rekordot jelöli törlésre. A kulcsszavak jelentése és használata megegyezik a REPLACE utasításnál leírtakkal.


Példák


DELETE


Az aktuális rekordot jelöli törlésre.



DELETE RECORD 32


A 32-es sorszámú rekordot jelöli törlésre.



RECALL [ALL | NEXT <numkif> | RECORD <numkif>]

[FOR <logkif>]

[WHILE <logkif>]


numkif              numerikus kifejezés

logkif                feltétel



Ezen utasítás megszünteti a rekordok törlésre jelölését. A RECALL utasítás egyéb kulcsszavak nélkül az aktuális rekordra vonatkozik. A kulcsszavak használata megegyezik a REPLACE utasításnál leírtakkal.



PACK


A PACK utasítás hatására az aktuális munkaterületen levő állományból véglegesen törlődnek a törlésre jelölt rekordok. Ekkor az állomány fizikailag is átszerveződik, ezért a fizikai rekordszámok megváltozhatnak. A PACK utasítás végrehajtása során az aktív indexállományok is újraszerveződnek. A nem aktív indexállományokat célszerű a REINDEX utasítással újraszervezni.



ZAP


Ha az állomány minden rekordját törölni kívánjuk, akkor a ZAP utasítást kell kiadni. Hatására az aktuális munkaterületen levő adatállomány minden adatrekordja visszavonhatatlanul törlődik. Csak a mezőleírásokat tartalmazó rekord marad meg.



ERASE <file-név>


Ezzel az utasítással egy teljes állományt törölhetünk. A file-névnek tartalmaznia kell a kiterjesztést is. Ha az állomány nem az aktuális meghajtón található, akkor a meghajtóegységet is meg kell adni. Nyitott állományt nem lehet törölni.



SET DELETED ON | OFF


Amennyiben ez a kapcsoló ON-ra van állítva, a törlésre jelölt rekordok kimaradnak a feldolgozásból. A kapcsoló alapértelmezése OFF.



Rekord hozzáfűzése egy adatállományhoz


APPEND BLANK


Ez az utasítás egy üres rekordot fűz az állomány végére. Ezután a rekord mezőit a REPLACE utasítás segítségével tölthetjük fel a kívánt értékekkel.



Indexállományok létrehozása, használata



INDEX ON <kif> TO <file-név>


kif kulcskifejezés

file-név az index-file neve kiterjesztés nélkül


Az INDEX ON utasítás az aktuális munkaterületen található adatállományhoz létrehoz egy indexállományt a megadott névvel és a kulcskifejezésben megadott kulcs szerinti rendezettségben. A kulcskifejezés a kulcsmezőket tartalmazza. A kulcskifejezés hossza legfeljebb 250 karakter lehet.

Az index-file létrhozása során az adatállomány minden rekordjára kiértékelésre kerül a kulcskifejezés és ez az érték kerül tárolásra az index-file-ban. A kulcskifejezés értékének minden rekord esetén azonos típusúnak kell lennie, karakteres típusú érték esetén pedig fontos, hogy minden rekordban azonos hosszúságú karaktersorozat legyen a kulcskifejezés értéke. Egy adott rekord esetén - amennyiben a rekord nem változik - a kulcskifejezés értékének mindig azonosnak kell lennie.

Ha valamely mező szerint csökkenő sorrendben szeretnénk indexelni, akkor a kulcskifejezésben erre a mezőre alkalmazzuk a DESCEND() függvényt. Ekkor a SEEK utasításban (lásd később) a kulcskifejezés megfelelő részére szintén alkalmazni kell a DESCEND() függvényt.

Az INDEX ON utasítással létrejövő indexállomány nyitva van.


Példák


USE hallgato

INDEX ON nev TO hallgato


Ebben a példában a hallgato.dbf adatállományhoz létrehoztunk egy hallgato.ntx indexállományt, melynek kulcsa a nev mező, így ennek segítségével a hallgato adatállományt névsor szerinti rendezettségben tudjuk feldolgozni.


USE hallgato

INDEX ON STR(evf,1)+nev TO evfolyam


Ezen INDEX utasítás hatására létrejön az evfolyam.ntx indexállomány, melynek segítségével a hallgato adatállományt évfolyam, ezen belül pedig névsor szerinti rendezettségben tudjuk feldolgozni. Mivel az evf numerikus mező, a nev viszont karakteres, ezért volt szükség az STR függvény segítségével végrehajtott konverzióra.

USE hallgato

INDEX ON DESCEND(ered) TO eredmeny


Ezen INDEX utasítás hatására létrejön az eredmeny.ntx indexállomány, melynek segítségével a hallgatók adatait a tanulmányi eredmény szerint csökkenő sorrendben tudjuk feldolgozni.



REINDEX


A REINDEX utasítás újraszervezi az aktuális munkaterületen az aktív indexállományokat. Használatára akkor lehet szükség, ha az indexállományok megsérültek, vagy az indexállományok az adatállomány módosításakor nem voltak megnyitva.



SET INDEX TO <file-név>


file-név indexállomány neve


A SET INDEX utasítás az aktív munkaterületen megnyitja a felsorolt indexállományokat. Az adatállomány rekordjainak elérése az első indexállomány szerint fog történni.

A SET INDEX TO önmagában való megadása lezárja a munkaterületen megnyitott index-file-okat.



SET ORDER TO <numkif>


numkif              indexállomány sorszáma


Ezen utasítás megváltoztatja a megnyitott indexállományok sorrendjét. Az elsődleges index az az állomány lesz, amelyik az indexek felsorolásában - USE utasítás, vagy SET INDEX - a numkif sorszámú.

A SET ORDER TO 0 paranccsal az elsődleges indexet ki lehet kapcsolni úgy, hogy az adatállomány módosítása továbbra is átvezetődik az indexállományokba.



Példa


USE hallgato INDEX hallgato,eredmeny,evfolyam


* A feldolgozás névsor szerit történik


SET ORDER TO 3

GO TOP


* A feldolgozás az evfolyam indexállomány szerint történik




SET UNIQUE ON | OFF


Amennyiben ezen kapcsoló értéke ON-ra van állítva, akkor a végrehajtott indexelés során az azonos kulcsok közül csak az első kerül bele az indexállományba. A kapcsoló alapértelmezése OFF.



Adatállományok relációba kapcsolása



SET RELATION TO [<kif> | RECNO() | <numkif> INTO <aliasnév>

]


kif kulcskifejezés

numkif              numerikus kifejezés

aliasnév            alias-név


Ez az utasítás az aktuális munkaterületen levő állományt összekapcsolja egy vagy több más munkaterületen megnyitott állománnyal. A kapcsolat létrehozásához vagy egy kulcskifejezést, vagy egy numerikus kifejezést használhatunk.

Kulcskifejezés alkalmazása esetén a második állománynak a kifejezés szerint indexeltnek kell lennie. Ha az első állományban mozgunk, akkor a második és az esetleges további állományokban végbemegy egy keresés. Ha ez sikeres, akkor a többi állományban az lesz az aktuális rekord, amely elsőként felel meg az első állomány szerinti kulcskifejezésnek. Ha valamelyik állományban nincs ilyen rekord, akkor ott a rekordmutató a file végére áll.

Ha a kapcsolat létrehozásához numerikus kifejezést használunk, akkor a második állományban az aktuális rekord mindig az a rekord, amelynek a fizikai rekordsorszáma megegyezik a kifejezés értékével. Ekkor a második állománynak nem kell indexeltnek lennie.

A RECNO() használatakor a rekordmutató párhuzamosan mozog az összekapcsolt állományokban.

A SET RELATION TO utasítás megszünteti az összekapcsolást.


Példák


SELECT 2

USE raktar INDEX cikksz

SELECT 3

USE vevo INDEX vevsz

SELECT 1

USE eladas

SET RELATION TO cikksz INTO raktar, TO vevsz INTO vevo


Példánkban az eladas adatállományt relációba kapcsoltuk a raktar adatállománnyal, amely cikkszám szerint indexelt, és a vevo adatállománnyal, amely vevőszám szerint indexelt. Az összekapcsolás eredményeként a raktar adatállományban mindig az lesz az aktuális rekord, amelynek cikkszáma megegyezik az eladas adatállomány aktuális rekordjában levő cikkszámmal, a vevo adatállományban pedig az a rekord lesz az aktuális, amelynek vevőszáma megegyezik az eladas adatállomány aktuális rekordjában található vevőszámmal. Így az eladas adatállomány feldolgozása során automatikusan - külön keresések nélkül - rendelkezésünkre áll a megfelelő cikkszámú raktar-rekord és a megfelelő vevőszámú vevo-rekord.


SELECT 2

USE dupla

SELECT 1

USE raktar

SET RELATION TO RECNO()*2 INTO dupla


Ebben a példában a raktar és a dupla adatállományokat rekordszámuk szerint kapcsoltuk össze. Ha a raktar állományban az 5. rekord az aktuális rekord, akkor a dupla állományban a 10. rekord az aktuális rekord.



Pozícionálás, keresés egy adatbázisban



GO BOTTOM | TOP | <numkif>


numkif              a rekord fizikai sorszáma


Ezen utasítás segítségével az aktuális munkaterületen megnyitott adatállományban egy megadott sorszámú rekordra ugorhatunk, vagyis az adott rekord lesz ezen a munkaterületen az aktuális rekord.


GO BOTTOM az utolsó rekordra ugrik

GO TOP az első rekordra ugrik

GO <numkif> a megadott sorszámú rekordra ugrik


A meghatározott rekordszámra történő közvetlen ugrás mindig végrehajtódik, még akkor is, ha a SET FILTER TO , vagy a SET DELETED ON parancs következtében a rekord a feldolgozásból ki lenne zárva.

A GO TOP és a GO BOTTOM utasítás indexelt állományok esetén a logikailag első, illetve utolsó rekordra ugrik.


Példa


GO 245


Ezen utasítás hatására az aktuális rekord a 245. rekord lesz.


SKIP [<numkif>] [ALIAS <alias-név>]


numkif              numerikus kifejezés

alias-név           alias-név


A SKIP utasítás segítségével egy állományon belül az aktuális rekordról egy másik rekordra léphetünk. Az alias-név megadásával az ugrást egy nem aktuális állományban is elvégezhetjük. Ha a numerikus kifejezés értéke pozitív, akkor előre ugrunk az állományban a megadott számmal, ha negatív, akkor visszafelé. A SKIP - paraméterek nélkül - a következő rekordra lép. Indexelt állományok esetén az ugrás az indexkifejezés szerinti rendezettségnek megfelelően történik.


Példa


USE hallgato

SKIP 10

* A 10. rekord lesz az aktuális

SKIP -3

* A 7. rekord lesz az aktuális



LOCATE [NEXT <numkif>]

FOR <logkif> [WHILE <logkif>]


logkif                feltétel

numkif              tartományadat


Ezzel az utasítással az aktuális állomány elejéről indulva megkereshető az első olyan rekord, amely a FOR feltételnek eleget tesz. A feltételben legalább egy mezőnévnek szerepelnie kell. A feltételnek megfelelő további rekordok keresésére a CONTINUE utasítás szolgál. Ha nincs a feltételnek megfelelő rekord az állományban, akkor a rekordmutató a file végére áll és teljesül az EOF() feltétel. A WHILE feltétellel a keresést leszűkíthetjük az állomány egy részére.


Példák


USE hallgato

LOCATE FOR nev="KEREK"


Ebben a példában a rendezetlen hallgato állományban keressük a KEREK nevű hallgató adatait.


USE hallgato

INDEX ON evf TO evfoly

LOCATE FOR nev="KEREK" WHILE evf=1


Ebben a példában az évfolyam szerinti rendezettségben feldolgozott hallgato állományban csak az 1. évfolyamon keressük a KEREK nevű hallgatót.



SEEK <kif>


kif tetszőleges kifejezés


A SEEK utasítás indexelt állományban kulcskifejezés konkrét értéke alapján történő keresésre szolgál. A parancs mindig a keresési kifejezésnek megfelelő első rekordot találja meg. Ugyanezzel az indexkifejezéssel további rekordok nem kereshetők meg.

A keresés eredményessége a FOUND() függvénnyel lekérdezhető. Ha a keresett kulcsú rekord nincs az állományban, akkor a FOUND() függvény értéke hamis, a rekordmutató a file végére áll és teljesül az EOF() feltétel.

Amennyiben a SOFTSEEK kapcsoló be van kapcsolva (SET SOFTSEEK ON), akkor a rekordmutató sikertelen keresés esetén az első a keresett kulcsértéknél nagyobb kulcsú rekordra mutat. A FOUND() függvény csak pontos Találat esetén ad igaz értéket.


Példák


USE hallgato INDEX nevsor

SEEK "KEREK"


Ebben a példában a névsor szerinti rendezettségű hallgato állományban keressük a KEREK nevű hallgatót.


USE hallgato INDEX nevsor

neve="KEREK"

SEEK neve


Ez a példa megegyezik az előzővel, csak itt a SEEK utasítás paramétereként változót használunk.



Megjegyzés:


Az indexelt állományban történő kulcs szerinti keresés nagy állományok esetén lényegesen gyorsabb, mint a szekvenciális keresés (LOCATE FOR).



SET FILTER TO [<logkif>]


logkif                feltétel


Ez az utasítás egy adatállomány szűrésére szolgál. Hatására az aktuális munkaterületen megnyitott adatállományból a feldolgozásban csak a feltételnek megfelelő rekordok vesznek részt, úgy tűnik, mintha az adatállomány csak azokból a rekordokból állna, amelyek a feltételnek megfelelnek. Egy szűrőfeltétel bekapcsolását követően az adatállományban valamerre el kell mozdulni (pl. GO BOTTOM), hogy az aktuális rekord a feltételnek megfelelő valamely rekord legyen. A szűrőt a SET FILTER TO utasítással lehet kikapcsolni.


Példa


USE hallgato

SET FILTER TO evf=2

GO TOP


A SET FILTER utasítás hatására a további feldolgozásban csak a 2. évfolyam hallgatóinak rekordjai vesznek részt.




Az adatbázisbeli aktuális pozícióról, illetve a keresés eredményességéről informáló függvények



BOF


Ez a függvény annak lekérdezésére szolgál, hogy történt-e kisérlet az aktuális állomány kezdetének átlépésére. Eredménye .T. , ha az utolsó pozícionáló parancs az állomány első logikai rekordja elé kivánt lépni, egyébként pedig .F. . Ha az állományban nincs adatrekord, a BOF függvény értéke .T. .



EOF


Ez a függvény annak lekérdezésére szolgál, hogy történt-e kisérlet az aktuális állomány végének átlépésére. Eredménye .T. ,ha az utolsó pozícionáló parancs az állomány utolsó logikai rekordja mögé kivánt lépni, egyébként pedig .F. . Ha az állományban nincs adatrekord, az EOF függvény értéke .T. .

LASTREC


Ez a függvény az aktuális adatállomány fizikai rekordjainak számát adja meg.



recno


Ez a függvény az aktuális adatállomány aktuális rekordjának fizikai sorszámát adja eredményül.



DELETED


Ez a függvény az aktuális rekordról megadja, hogy törlésre jelölt-e, vagy sem. Eredménye .T. amennyiben a rekord törlésre jelölt, egyébként pedig .F. .



FOUND


Ez a függvény egy keresési művelet (SEEK, LOCATE, CONTINUE) eredményének lekérdezésére szolgál. Eredménye .T. amennyiben sikerült a feltételnek megfelelő rekordot találni, egyébként pedig .F. .



Egyéb függvények


A teljesképernyős adatbevitel megvalósításához szükségünk lehet az alábbi két függvényre:


LASTKEY


Ez a függvény az utoljára lenyomott billentyű - beleértve a vezérlőbillentyűket is - ASCII kódját adja eredményül.


INKEY(<numkif>)


numkif              várakozási idő másodpercekben


Ez a függvény paraméter nélkül az éppen lenyomott billentyű - beleértve a vezérlőbillentyűket is - ASCII kódját adja eredményül.

A függvényt egy numerikus kifejezéssel hívva a program annyi ideig várakozik, amennyit a numerikus kifejezésben megadtunk. Ezt a várakozási időt egy billentyű lenyomásával félbe lehet szakítani. Ekkor a függvény értéke a lenyomott billentyű ASCII kódja. Ha nem szakítottuk meg a várakozást, akkor a függvény értéke 0.

Ha paraméternek 0-t adunk, akkor a program korlátlan ideig várakozik, vagyis addig, míg egy billentyűt le nem ütünk.



Osztott adatkezelés, rekordok és állományok zárolása (lockolása)


Ha egy adatbázisban tárolt adatokhoz egyszerre több felhasználó szeretne hozzáférni - általában közös hálózatba kapcsolt munkahelyekről - , szükség van a megfelelő adatvédelem biztosítására, melyről a Konkurens műveletek című fejezetben már szó esett. A CLIPPER programozási nyelv a hálózati adatkezelés biztosítására a következő lehetőségeket kínálja:


- Az alkalmazásban felhasznált állományokhoz való hozzáférés általános érvényű meghatározása, mely lehet osztott, vagy kizárólagos.


- Egy teljes adatállomány zárolása (lock).


- Egy állomány egy rekordjának zárolása (lock).


- Lekérdezési lehetőség arra vonatkozóan, hogy a hálózati parancsok sikeresen végrehajtódtak-e.



A fenti funkciókat a következő parancsok segítségével lehet megvalósítani:



SET EXCLUSIVE ON | OFF


Kizárólagos, vagy közös állományhozzáférés lehetővé tétele.


A kapcsoló ON állása esetén az adatállományokhoz a feldolgozás ideje alatt csak egyetlen felhasználó férhet hozzá, OFF állás esetén pedig több felhasználó is hozzáférhet (osztott módú feldolgozás). A kapcsoló alapértelmezés szerint ON állásban van.



NETERR


Ez a függvény a hálózati parancsok (APPEND BLANK, USE EXCLUSIVE) sikeres végrehajtásának lekérdezésére szolgál. Eredménye .T. ha a végrehajtás során hiba lépett fel, sikeres végrehajtás esetén pedig .F. .



LOCK


Ez a függvény az aktuális adatállományban megkisérli zárolni az aktuális rekordot. Ha ezt a rekordot, vagy a teljes állományt egy másik felhasználó már zárolta, akkor a zárolás nem sikerült és a függvény .F. értéket ad eredményül. Sikeres zárolás esetén a függvény értéke .T. . Ha ugyanaz a felhasználó ebben az állományban korábban zárolt egy rekordot, akkor ez a zárolás most érvényét veszti.



FLOCK


Ez a függvény megkisérli az aktuális adatterületen megnyitott adatállomány zárolását. Ha sikerült, akkor a függvény eredménye .T. , ha nem, akkor .F. . A zárolás nemcsak akkor sikertelen, ha egy másik felhasználó zárolta az állományt, hanem akkor is, ha csak az állomány valamely rekordja van zárolva.



UNLOCK [ALL]


Az UNLOCK utasítás megszünteti az aktuális munkaterületen az állomány, vagy a rekord zárolását.

Az UNLOCK ALL minden munkaterületen megszünteti a zárolásokat.



Most tekintsük át, hogy melyek azok a műveletek, amelyek az állomány teljes zárolását igénylik, s melyek azok, amelyek végrehajtásához a rekordot kell zárolni.


Csak kizárólagos hozzáférésre megnyitott állományokon használhatók a következő utasítások:


- PACK

- REINDEX

- ZAP



Állományzárolást igényelnek az alábbi utasítások, amennyiben az állomány osztott módra van megnyitva:


- DELETE <tartomány>

- RECALL <tartomány>

- REPLACE <tartomány>


A fenti utasítások esetén azért szükséges a teljes állomány zárolása, mert az állomány több rekordjára vonatkoznak.



Rekordzárolást igényelnek az alábbi utasítások, amennyiben az állomány osztott módra van megnyitva:


- DELETE

- RECALL

- REPLACE

A fenti utasítások csak egyetlen rekordra vonatkoznak, ezért elegendő a rekord szintű zárolás.


A hálózati utasítások használatára a Programozási példák című fejezetben találhatók példaprogramok.




Programozási példák



A következő példákban az alábbi adatállományokat fogjuk használni:


HALLGATO

(HALLGATÓ)


mező neve

típusa

mérete

tizedes

tartalma


hkod


N


5



hallgató kódja


nev


C


20



név


kar


C


3



kar azonosítója


szak


C


25



szak neve


evf


N


1



évfolyam


ered


N


4


2


eredmény


A tábla kulcsa a hallgatókód.


A HALLGATO tábla a HALLGATO.DBF állományban található. Hozzátartozik a HALLGATO.NTX indexállomány, melynek kulcsmezője a hkod.



TANTARGY

(TANTÁRGY)


mező neve

típusa

mérete

tizedes

tartalma


tkod


N


3



tantárgykód


tnev


C


20



tantárgynév


A tábla kulcsa a tantárgykód.


A TANTARGY tábla a TANTARGY.DBF állományban található. Az állományhoz tartozik a TANTARGY.NTX indexállomány, melynek kulcsmezője a tkod.



VIZSGA


mező neve

típusa

mérete

tizedes

tartalma


hkod


N


5



hallgató kódja


tkod


N


3



tantárgykód


jegy


N


1



vizsgajegy


A tábla kulcsa a hallgatókód és a tantárgykód.


A VIZSGA tábla a VIZSGA.DBF állományban található. Az állományhoz tartozik a VIZSGA.NTX indexállomány, melynek kulcsmezője a hkod, és a VIZSTAN.NTX, melynek kulcsmezője a tkod.



Adatbázisok listázása, indexelés



1. feladat


Készítsünk programot, amely kilistázza a hallgatók adatait a képrnyőre a hallgato adatállományból névsor szerinti rendezettségben.


Megoldás


CLEAR

USE hallgato

INDEX ON nev TO wind

DO WHILE !EOF()

sor=1

DO WHILE !EOF().and.sor<=23

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

sor=sor+1

SKIP

ENDDO

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDDO

ERASE wind.ntx

CLOSE



Mivel a hallgato adatállománynak nincs név szerinti indexállománya, ezért először készítenünk kellett egyet, melyet a program végén ki is törlünk. A listázás során az indexállománynak megfelelő sorrendben haladunk végig az adatokon, míg az állomány végére nem érünk, melyet a file-vége feltétel (EOF) teljesülése jelez. Ezt biztosítja a külső ciklus. A belső ciklus pedig arra szolgál, hogy egy képernyőnyi adatot kiírjunk a képernyőre. Ha a képernyő betelt, akkor a WAIT utasítás segítségével várakozik a program addig, míg a felhasználó le nem üt egy billentyűt. Csak ezután kerül sor az újabb adatok kiírására. Erre azért van szükség, hogy a felhasználó tetszőleges ideig tanulmányozhassa a megjelenő adatokat. A belső ciklus feltételében is szerepel a file-vége feltétel, hiszen a listázást akkor is abba kell hagyni, ha elfogytak az adatok, pedig a képernyő még nem telt meg.



2. feladat


Készítsünk programot, amely kilistázza a hallgatók adatait a képrnyőre a hallgato adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben.


Megoldás


CLEAR

USE hallgato

INDEX ON kar+STR(evf)+nev TO wind

DO WHILE !EOF()

sor=1

DO WHILE !EOF().and.sor<=23

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

sor=sor+1

SKIP

ENDDO

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDDO

CLEAR

ERASE wind.ntx

CLOSE



A program menete megegyezik az előzőével, különbség csak az index kulcsmezőjében van. Mivel most több mező szerint szeretnénk rendezni az adatokat, a kulcsokat a + jellel kell összekapcsolni az INDEX ON utasításban. Az evf mező numerikus tipusú, ezért az STR függvény segítségével karakteressé kell konvertálni, hogy a másik két karakteres mezővel összekapcsolhassuk a kulcskifejezésben.


3. feladat


Készítsünk programot, amely kilistázza a hallgatók adatait a képernyőre a hallgato adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben. A lista végén pedig kiírja az egyetem tanulmányi átlagát.


Megoldás


CLEAR

USE hallgato

INDEX ON kar+STR(evf)+nev TO wind

sor=1

egyeter=0

egyetdb=0


DO WHILE !EOF()

sor=1

DO WHILE !EOF().and.sor<=23

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

egyeter=egyeter+ered

egyetdb=egyetdb+1

sor=sor+1

SKIP

ENDDO

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDDO

? 'Egyetem átlaga:', egyeter/egyetdb

ERASE wind.ntx

CLOSE


Ez a program az előző programon alapul, azt egészítettük ki az átlagszámítással. Ehhez bevezettünk két gyűjtőváltozót. Az egyeter változóban az eredményeket összegezzük, az egyetdb változóban pedig a hallgatókat számoljuk.



4. feladat


Készítsünk programot, amely kilistázza a hallgatók adatait a képernyőre a hallgato adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben. Egy-egy évfolyam, illetve kar utolsó hallgatója után kiírja az évfolyam, illetve a kar tanulmányi átlagát. A lista végén pedig kiírja az egyetem tanulmányi átlagát.


Megoldás


CLEAR

USE hallgato

INDEX ON kar+STR(evf)+nev TO wind

sor=1

egyeter=0

egyetdb=0

DO WHILE !EOF()

aktkar=kar

karer=0

kardb=0

DO WHILE !EOF().and.aktkar=kar

aktevf=evf

evfer=0

evfdb=0

DO WHILE !EOF().and.aktkar=kar .and. aktevf=evf

IF sor>23

sor=1

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDIF

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

evfer=evfer+ered

evfdb=evfdb+1

sor=sor+1

SKIP

ENDDO

sor=sor+1

IF sor>23

sor=1

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDIF

? aktevf, '. évfolyam átlaga:', evfer/evfdb

?

sor=sor+2

karer=karer+evfer

kardb=kardb+evfdb

ENDDO

sor=sor+1

IF sor>23

sor=3

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDIF

? aktkar, ' kar átlaga:', karer/kardb

?

sor=sor+2

egyeter=egyeter+karer

egyetdb=egyetdb+kardb

ENDDO

sor=sor+1

IF sor>23

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDIF

IF egyetdb>0

? 'Egyetem átlaga:', egyeter/egyetdb

ENDIF

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ERASE wind.ntx

CLOSE



Ez a program az előző program továbbfejlesztése. A különböző szintű átlagszámítást egymásba ágyazott ciklusok segítségével valósítottuk meg. A legbelső ciklus gondoskodik a tételsorok kiírásáról és az évfolyam szintű átlagszámításhoz az eredmények és a hallgatók számának gyűjtéséről. A következő ciklus a kari szintű gyűjtést valósítja meg, ami az évfolyam-átlagok kiírásából és az évfolyamgyűjtőknek a kari gyűjtőkhöz való hozzáadásából áll. Az évfolyamgyűjtőket minden újabb évfolyam előtt nullázni kell. A legkülső ciklus biztosítja az egyetemi szintű gyűjtést.

Figyeljük meg, hogy a belső ciklusok feltételében a külső ciklusok feltételeit is be kellett írnunk. Hiszen a legbelső ciklust akkor is be kell fejezni, ha elfogytak a tételek, vagy ha másik kar tételei következnek, bár az évfolyam azonos. Ugyanígy a középső ciklusban is figyelni kell, hogy nem értünk-e már az állomány végére.



Keresés egy adatállományban



4. feladat


Készítsünk programot, amely a billentyűzetről bekér egy nevet, majd megkeresi a hallgato adatállományban az adott nevű hallgató adatait. Ha megtalálta, írja ki a képernyőre az adatokat és folytassa a keresést további ilyen nevű hallgató után. Ha nem talált ilyen nevű hallgatót, akkor pedig azt írja ki, hogy "Nincs ilyen nevű hallgató!".


Megoldás


CLEAR

USE hallgato

INPUT 'Név:' TO kertnev

van=.F.

LOCATE FOR nev=kertnev

DO WHILE !EOF()

van=.T.

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

CONTINUE

ENDDO

IF !van

? 'Nincs ilyen nevű hallgató!'

ENDIF

CLOSE



Mivel rendezetlen adatállományban keresünk, ezért a LOCATE FOR utasítással keressük meg az első megfelelő hallgatót. A többi azonos nevű hallgató rekordjának megkeresésére a CONTINUE utasítást használjuk, melyet addig ismétlünk, amig a file-vége feltétel (EOF) nem teljesül. A van logikai változó segítségével jelezzük, hogy van-e ilyen nevű hallgató. A van változó értéke csak akkor lesz igaz, ha a LOCATE FOR utasítás eredményesen végrehajtódott és a program belépett a ciklusba. Ha a keresés eredménytelen volt, akkor a ciklusba be sem lép a program, az IF utasításban a van változó értéke hamis lesz.



Ha a LOCATE FOR utasítás feltételében az RTRIM függvényt alkalmazzuk, ennek segítségével az egyezőséget csak olyan hosszan vizsgálja a program, amilyen hosszan a nevet beütöttük. Például, ha csak az első három karakterét ütjük le a névnek, akkor mindazon hallgatókat megtalálja a program, akiknek a neve ezzel a három karakterrel kezdődik.:


CLEAR

USE hallgato

INPUT 'Név:' TO kertnev

van=.F.

LOCATE FOR nev=RTRIM(kertnev)

DO WHILE !EOF()

van=.T.

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

CONTINUE

ENDDO

IF !van

@ 9,0 SAY 'Nincs ilyen nevü hallgató!'

ENDIF

CLOSE



5. feladat


Készítsünk programot, amely megnyitja a hallgato adatállományt a hallgato indexállománnyal együtt, majd a billentyűzetről bekér egy hallgatókódot és az indexállomány segítségével megkeresi az adott kódú hallgató adatait és kiírja a képernyőre. Ha nem talál ilyen kódú hallgatót, akkor azt írja ki, hogy "Nincs ilyen kódú hallgató!".


Megoldás


CLEAR

USE hallgato INDEX hallgato

INPUT 'KOD:' TO kertkod

SEEK kertkod

IF !FOUND()

? 'Nincs ilyen kódú hallgató!'

ELSE

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

ENDIF

CLOSE



Ebben a programban az adatállományunkhoz megnyitottuk a hallgato indexállományt is, melynek kulcsa a hallgatókód. Ezért most a SEEK utasítás segítségével tudjuk megkeresni a megadott kódú hallgató adatait.



Adatállományok karbantartása


6. feladat


Készítsünk programot a hallgato adatállomány karbantartására. A program az adatállománnyal együtt nyissa meg a hallgato indexállománnyt is. A billentyűzetről kérjen be egy hallgatókódot és az indexállomány segítségével keresse meg az adott kódú hallgató adatait és írja ki a képernyőre. Ha nem talál ilyen kódú hallgatót, akkor új hallgatóról van szó, fűzzön hozzá egy rekordot az adatállományhoz, majd töltse fel a mezőket a megfelelő értékekkel.


Megoldás


CLEAR

USE hallgato INDEX hallgato

INPUT 'KOD:' TO kertkod

SEEK kertkod

IF EOF()

? 'Uj hallgató felvitele!'

?

APPEND BLANK

REPLACE hkod WITH kertkod

ELSE

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

? 'Hallgató módosítása!'

?

ENDIF

INPUT 'NÉV:' TO unev

INPUT 'KAR:' TO ukar

INPUT 'ÉVFOLYAM:' TO uevf

INPUT 'EREDMÉNY:' TO uered

REPLACE nev WITH unev

REPLACE kar WITH ukar

REPLACE evf  WITH uevf

REPLACE ered WITH uered

CLOSE



Az állomány karbantartásához megnyitottuk a hallgato indexállományt is. Ez egyrészt biztosítja a kód szerinti keresést, másrészt a karbantartás során az indexállomány párhuzamosan módosul az adatállománnyal.



7. feladat


Készítsünk programot amely a hallgato adatállományban törlésre jelöli egy adott hallgató adatait. A hallgató kódját billentyűzetről kérje be a program.


Megoldás


CLEAR

USE hallgato INDEX hallgato

INPUT 'Kňd:' TO kertkod

SEEK kertkod

IF !FOUND()

? 'Ilyen kódú hallgató nincs!'

ELSE

? nev,' ',hkod,' ',kar,' ',evf,' 'ered

IF DELETED()

?

? 'Ez a hallgató már töröl!'

ELSE

DELETE

?

? 'A hallgató törlése megtörtént!'

ENDIF

ENDIF

CLOSE



8. feladat


Készítsünk programot amely a vizsga adatállományban törlésre jelöli egy adott hallgató rekordjait. A hallgató kódját billentyűzetről kérje be a program.


Megoldás


CLEAR

USE vizsga INDEX vizsga

INPUT 'KňD:' TO kertkod

SEEK kertkod

IF !FOUND()

?

? 'Ilyen kódú hallgatónak nincsenek vizsgái!'

ELSE

DELETE WHILE hkod=kertkod

?

? 'A törlés megtörtént!'

ENDIF

CLOSE



Adatállományok relációba kapcsolása


9. feladat


Készítsünk programot amely minden hallgatónak kiszámítja a féléves eredményét a vizsgajegyekből, és ezt beírja az ered adatmezőbe. A vizsga állományban a hallgatóknak minden tantárgyból csak az utolsó vizsgajegye szerepel.


Megoldás


USE vizsga INDEX vizsga

SELECT 2

USE hallgato INDEX hallgato

SET RELATION TO hkod INTO vizsga

GO TOP

DO WHILE !EOF()

SELECT vizsga

atlag=0

jegydb=0

DO WHILE !EOF().and.HALLGATO->hkod=VIZSGA->hkod

atlag=atlag+VIZSGA->jegy

jegydb=jegydb+1

SKIP

ENDDO

IF jegydb>0

atlag=atlag/jegydb

ENDIF

SELECT hallgato

REPLACE ered WITH atlag

SKIP

ENDDO

CLOSE ALL


A programban a hallgato-állományt relációba kapcsoltuk a vizsga-állománnyal, így ha egy új hallgató rekordra állunk, a vizsga-állományban az adott hallgató első rekordja lesz az aktuális rekord. Mivel a hallgatókód szerint kapcsoltuk relációba a két állományt, ezért a vizsga-állománynak a hallgatókód szerinti indexállományát kell használnunk. A relációba kapcsolás után ki kell adni egy GO TOP utasítást, hogy a vizsga-állomány aktuális rekordja a relációnak megfelelő legyen.

Az átlagszámításnál az egyszerűség kedvéért az elégtelen vizsgajegyeket nem különböztettük meg.



10. feladat


Készítsünk programot amely kilistázza a képernyőre minden tantárgyból a jelesre vizsgázók nevét.


Megoldás


CLEAR

USE hallgato INDEX hallgato

SELECT 2

USE tantargy INDEX tantargy

SELECT 3

USE vizsga INDEX vizstan

SET FILTER TO VIZSGA->jegy=5

SET RELATION TO hkod INTO hallgato,;

TO tkod INTO tantargy

GO TOP

DO WHILE !EOF()

? TANTARGY->tnev,' tantárgyból 5-ösre vizsgáztak:'

akttant=VIZSGA->tkod

sor=1

DO WHILE !EOF().and.akttant=VIZSGA->tkod.and.sor<=21

? HALLGATO->nev

sor=sor+1

SKIP

ENDDO

WAIT 'A továbblépéshez üss le egy billentyűt...'

CLEAR

ENDDO

CLOSE ALL


A vizsga-állományt relációba kapcsoltuk a hallgató adatállománnyal a hallgatókódon keresztül, a tantargy adatállománnyal pedig a tantárgykódon keresztül. Beállítottunk egy szűrőt is, amely azt biztosítja, hogy a feldolgozásban csak a jeles vizsgajegyeket tartalmazó rekordok vegyenek részt. Ezek után a vizsga-állományt sorban olvasva listázhatjuk a rekordokat. A relációba kapcsolás biztosítja, hogy a hallgato-állományban mindig a megfelelő kódú hallgató rekordja az aktuális, így a nevet kereső utasítás kiadása nélkül vehetjük innen, a tantargy-állományban pedig mindig a megfelelő tantárgykódú rekord az aktuális, így a tantárgy nevét is megkapjuk.



11. feladat


Készítsünk programot amely kilistázza minden hallgatónak az egyes tantárgyakból elért vizsgajegyeit a tantárgyak megnevezésével együtt. A lista kar, évfolyam, ezen belül pedig névsor szerinti rendezettségben készüljön.


Megoldás


USE tantargy INDEX tantargy

SELECT 2

USE vizsga INDEX vizsga

SET RELATION TO tkod INTO tantargy

SELECT 3

USE hallgato

INDEX ON kar+STR(evf)+nev TO wind

SET RELATION TO hkod INTO vizsga

GO TOP

sor=1

DO WHILE !EOF()

ujhallg=.t.

SELECT vizsga

DO WHILE !EOF().and.HALLGATO->hkod=VIZSGA->hkod

IF sor>22

ujhallg=.t.

WAIT 'A továbblépéshez üss le egy billentyűt...'

sor=1

ENDIF

IF ujhallg

?

? kar, evf, nev, ' vizsgaeredményei:'

ujhallg=.f.

sor=sor+2

ENDIF

? TANTARGY->tnev,VIZSGA->jegy

sor=sor+1

SKIP

ENDDO

SELECT hallgato

SKIP

ENDDO

CLOSE DATABASES

ERASE wind.ntx

CLOSE ALL


A programban a hallgato-állományt a hallgatókódon keresztül relációba kapcsoltuk a vizsga-állománnyal, a vizsga-állományt pedig a tantárgykódon keresztül relációba kapcsoltuk a tantargy-állománnyal. Így amikor egy újabb hallgatórekord kerül listázásra, a vizsga-állomány aktuális rekordja a hallgató első vizsga-rekordja, a tantargy-állomány aktuális rekordja pedig az adott vizsgarekordban található tantárgykódhoz tartozó rekord lesz.



Adatbáziskezelés hálózati környezetben


12. feladat


Készítsünk menüvezérelt programot a hallgatók adatainak kezelésére. A menüpontok a következők legyenek:


1. Hallgatói adatok karbantartása

2. Hallgatók törlése

3. A törlésre jelölt rekordok végleges eltávolítása

4. Az adatállományok újraindexelése

5. A hallgatók vizsgajegyeinek listázása


A program hálózati környezetben működjön és a képernyőt sor, oszlop szinten kezelje.


Megoldás


SET EXCLUSIVE OFF


tev=1

DO WHILE tev>0

CLEAR

@ 4,15 PROMPT '1. Hallgatói adatok karbantartása '

@ 6,15 PROMPT '2. Hallgatók törlése '

@ 8,15 PROMPT '3. A törlésre jelölt rekordok végleges';

+ ' eltávolítása'

@ 10,15 PROMPT '4. Az adatállományok újraindexelése '

@ 12,15 PROMPT '5. A hallgatók vizsgajegyeinek '+;

'listázása'

MENU TO tev

DO CASE


* Karbantartás


CASE tev=1

CLEAR

USE hallgato INDEX hallgato

IF NETERR()

@ 23,0 SAY ''

WAIT 'A HALLGATO állomány megnyitása nem sikerült!'

ELSE

@ 1,0 SAY ' N é v Kód ';

+ ' Kar Évfolyam Eredmény'

DO WHILE .t.

@ 3,0

kertkod=0

@ 3,32 GET kertkod PICTURE '99999'

READ

IF LASTKEY()=27

EXIT

ENDIF

SEEK kertkod

IF EOF()

unev =SPACE(20)

ukar =SPACE(3)

uevf =0

uered=0

@ 5,0 SAY 'Uj hallgató felvitele!'

ELSE

unev =HALLGATO->nev

ukar =HALLGATO->kar

uevf =HALLGATO->evf

uered=HALLGATO->ered

@ 5,0 SAY 'Hallgató módosítása!'

ENDIF

DO WHILE .t.

@ 3, 6 GET unev

@ 3,43 GET ukar

@ 3,52 GET uevf PICTURE '9' ;

VALID uevf>0.and.uevf<=5

@ 3,59 GET uered PICTURE '9.99'

READ

IF LASTKEY()#27

ik=' '

@ 24,0 SAY 'Helyes a kitöltés (I/N)?' GET ik

READ

IF ik$'iI'

IF EOF()

DO WHILE .t.

APPEND BLANK

IF NETERR()

INKEY(.5)

ELSE

EXIT

ENDIF

ENDDO

REPLACE hkod WITH kertkod

ENDIF

DO WHILE .t.

IF LOCK()

EXIT

ELSE

INKEY(.5)

ENDIF

ENDDO

REPLACE nev WITH unev

REPLACE kar WITH ukar

REPLACE evf WITH uevf

REPLACE ered WITH uered

UNLOCK ALL

@ 24,0

EXIT

ENDIF

@ 24,0

ELSE

EXIT

ENDIF

ENDDO

@ 5,0

ENDDO

ENDIF

USE


* Törlésre jelölés


CASE tev=2

CLEAR

USE hallgato INDEX hallgato

IF NETERR()

@ 23,0 SAY ''

WAIT 'A HALLGATO állomány megnyitása nem sikerült!'

ELSE

@ 1,0 SAY ' N é v Kód ';

+ ' Kar Évfolyam Eredmény'

DO WHILE .t.

@ 3,0

kertkod=0

@ 3,32 GET kertkod PICTURE '99999'

READ

IF LASTKEY()=27

EXIT

ENDIF

SEEK kertkod

IF EOF()

@ 5,0 SAY 'Ilyen kódú hallgató nincs!'

ELSE

@ 3, 6 SAY HALLGATO->nev

@ 3,43 SAY HALLGATO->kar

@ 3,52 SAY HALLGATO->evf

@ 3,59 SAY HALLGATO->ered

IF DELETED()

DO WHILE .t.

IF LOCK()

EXIT

ELSE

INKEY(.5)

ENDIF

ENDDO

RECALL

UNLOCK ALL

@ 5,0 SAY 'A hallgató törlésének ' + ;

'megszüntetése megtörtént!'

ELSE

DO WHILE .t.

IF LOCK()

EXIT

ELSE

INKEY(.5)

ENDIF

ENDDO

DELETE

UNLOCK ALL

@ 5,0 SAY 'A hallgató törlése megtörtént!'

ENDIF

ENDIF

@ 23,0 SAY ''

WAIT 'A továbblépéshez üss le egy billentyűt...'

@ 3,0

@ 5,0

@ 24,0

ENDDO

ENDIF

USE


* Végleges törlés


CASE tev=3

USE hallgato INDEX hallgato EXCLUSIVE

IF NETERR()

@ 23,0 SAY ''

WAIT 'A HALLGATO állomány megnyitása nem sikerült!'

ELSE

PACK

ENDIF

USE


* Újraindexelés


CASE tev=4

@ 22,0 SAY 'Az állományok indexelése megkezdődött!'

USE hallgato INDEX hallgato EXCLUSIVE

IF NETERR()

@ 23,0 SAY ''

WAIT 'A HALLGATO állomány megnyitása nem sikerült!'

@ 24,0

ELSE

INDEX ON hkod TO hallgato

ENDIF

USE vizsga INDEX vizsga,vizstan EXCLUSIVE

IF NETERR()

@ 23,0 SAY ''

WAIT 'A VIZSGA állomány megnyitása nem sikerült!'

@ 24,0

ELSE

INDEX ON hkod TO vizsga

INDEX ON tkod TO vizstan

ENDIF

USE tantargy INDEX tantargy EXCLUSIVE

IF NETERR()

@ 23,0 SAY ''

WAIT 'A TANTARGY állomány megnyitása nem sikerült!'

ELSE

INDEX ON tkod TO tantargy

ENDIF

USE


* Listázás


CASE tev=5

SET DATE ANSI

SET CENTURY ON

SET DEVICE TO PRINT

SET DELETED ON


SET PRINTER TO a.lst


USE tantargy INDEX tantargy

IF NETERR()

@ 23,0 SAY ''

WAIT 'A TANTARGY állomány megnyitása nem sikerült!'

ELSE

SELECT 2

USE vizsga INDEX vizsga

IF NETERR()

@ 23,0 SAY ''

WAIT 'A VIZSGA állomány megnyitása nem sikerült!'

ELSE

SET RELATION TO tkod INTO tantargy

SELECT 3

USE hallgato

IF NETERR()

@ 23,0 SAY ''

WAIT 'A HALLGATO állomány megnyitása nem sikerült!'

ELSE

INDEX ON kar+STR(evf)+nev TO wind

SET RELATION TO hkod INTO vizsga

GO TOP

lapsor=66

lap=0

DO WHILE !EOF()

ujhallg=.t.

SELECT vizsga

DO WHILE !EOF().and.HALLGATO->hkod=VIZSGA->hkod

IF lapsor>65

ujhallg=.t.

IF lap>0

EJECT

ENDIF

lap=lap+1

@ PROW(),35 SAY '-'+STR(lap,4)+' - '

@ PROW()+2,11 SAY 'Vizsga eredmények kar,'+;

' évfolyam és hallgató név sorrendben'

@ PROW()+2,24 SAY 'A listázás időpontja: ' +DTOC(DATE())

@ PROW()+4, 0 SAY ''

lapsor=8

ENDIF

IF ujhallg

@ PROW()+2,0 SAY HALLGATO->kar+;

STR(HALLGATO->evf,2)+' '+RTRIM(HALLGATO->nev)+;

' vizsgaeredményei:'

ujhallg=.f.

lapsor=lapsor+2

@ PROW(),50 SAY TANTARGY->tnev+STR(VIZSGA->jegy,5)

ELSE

@ PROW()+1,50 SAY TANTARGY->tnev+;

STR(VIZSGA->jegy,5)

lapsor=lapsor+1

ENDIF

SKIP

ENDDO

SELECT hallgato

SKIP

ENDDO

EJECT

SET DEVICE TO SCREEN

SET DELETED OFF

CLOSE DATABASES

ERASE wind.ntx

ENDIF

ENDIF

ENDIF

USE

ENDCASE

ENDDO



Programunkat az előző feladatok megoldása során készített programok felhasználásával írtuk meg. Kiegészítettük a hálózati környezetben való működéshez szükséges zárolásokkal és hálózati hibavizsgálatokkal.

A "Hallgatók törlése" menüpontban lehetővé tettük, hogy a törlésre jelölést megszüntethesse a felhasználó úgy, hogy a törlésre jelölt rekord kódját adja meg. A program ennek megfelelően tájékoztat arról, hogy törlésre jelölés, vagy a jelölés megszüntetése történt-e.

Az újraindexelésnél használhattuk volna a REINDEX utasítást is, azért választottuk mégis az INDEX ON utasítást, mert a program így akkor is fel tudja építeni az indexállományt ha az annyira megsérül, hogy a kulcsok sem azonosíthatók.




Találat: 5577


Felhasználási feltételek