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
Ú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.
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 .
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.
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.
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.
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
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.
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
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.
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
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
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
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
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
Ebben
a példában a hallgato.dbf
adatállományhoz létrehoztunk egy hallgato.ntx
indexállományt, melynek kulcsa a
USE hallgato
INDEX
ON STR(evf,1)+
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
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
Ebben a példában a rendezetlen hallgato állományban keressük a KEREK nevü hallgató adatait.
USE hallgato
LOCATE
FOR
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
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
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 |
|
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
DO WHILE !EOF()
sor=1
DO WHILE !EOF().and.sor<=23
?
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
DO WHILE !EOF()
sor=1
DO WHILE !EOF().and.sor<=23
?
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
sor=1
egyeter=0
egyetdb=0
DO WHILE !EOF()
sor=1
DO WHILE !EOF().and.sor<=23
?
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
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
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
?
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
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
?
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
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->
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,
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->
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->
@ 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
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
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->
' 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: 1671