kategória | ||||||||||
|
||||||||||
|
||
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.
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 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.
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.
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: 5692