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
 
Az ACCESS adattípusai
Böngészők (browser-ek)
Navigalas 3D-s térben
Informaciós tarsadalom
A Windows95, az OSR2 valtozat, és a Windows98 telepítése, üzemeltetése
BGP - Border Gateway Protokol
A szamítógépek felépítése
Az ORACLE adatbaziskezelő rendszer
Nagyítas, nézetek, navigalas
 
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. Az 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 252d38c 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: 1564







Felhasználási feltételek