online kép - Fájl  tube fájl feltöltés file feltöltés - adja hozzá a fájlokat online fedezze fel a legújabb online dokumentumok Kapcsolat
   
 

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

 

Online dokumentumok - kep
   
kategória
 

Biológia állatok Fizikai Földrajz Kémia Matematika Növénytan Számítógépes
Filozófia
Gazdaság
Gyógyszer
Irodalom
Menedzsment
Receptek
Vegyes

 
 
 
 













































 
 

A CLIPPER relaciós adatbaziskezelő nyelv

számítógépes

Fájl küldése e-mail Esszé Projekt


egyéb tételek

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

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

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

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


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

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

1.2     A DBU segédprogram használata

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

A DBU program főképernyője

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

F1        a HELP funkció

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

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

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

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

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

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

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

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

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

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

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

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

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

Browse képernyő

F6        file-kezelő műveletek

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

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

                        állományból

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

                        adatállományból

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

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

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

használható

F8        beállítások

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

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

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

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

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


1.3     A  CLIPPER  programozási  nyelv

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

Adattípusok

Numerikus adatok

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

Logikai érték

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

Karakter

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

Dátum

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

Konstansok

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

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

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

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

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

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

Változók

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

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

 

  Declare tömbnév[méret]

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

   tömbnév[index]

Műveletek

Előjelek

            +          pozitív előjel

            -           negatív előjel

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

Matematikai műveletek

            +                                  összeadás

            -                                   kivonás

            *                                  szorzás

            /                                   osztás

            **                                hatványozás

            %                                 maradékképzés

            ()                                  a műveletek csoportosítása

Relációs műveletek

            <                                  kisebb, mint

            >                                  nagyobb, mint

            =                                  egyenlő

            <> , != , #                    nem egyenlő

            <=                                kisebb, vagy egyenlő

            >=                                nagyobb, vagy egyenlő

            ==                                azonos  

            $                                  karakter előfordulása szövegben

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

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

A $ művelet értelmezése:

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

Példák:

"abc "="abc"                 igaz

"abc "=="abc"               hamis

a=890123456789.01234

b=890123456789.04321

a=b                                          hamis

a==b                                        igaz

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

Logikai műveletek

.AND.              és művelet

.OR.                 vagy művelet

.NOT., !           negálás

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

Karakteres műveletek

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

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

Példa:

a="ABC   "

b="DEF   "

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

c="GHI   "

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

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

A CLIPPER program írása

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

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

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

Példa:

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

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

A CLIPPER program tagolása

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

Fordítás szerkesztés

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

Fordítás

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

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

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

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

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

  A fordítóprogram opciói:

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

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

            nélkül

-l          sorszámozás kiiktatása

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

-s         csak szintaxis-vizsgálat

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

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

Szerkesztés

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

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

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

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

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

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

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

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

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

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

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

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

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

CLIPFOR.BAT

CLS

CLIPPER %1

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

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

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

CLIPFOR forrásprogramnév


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

Jelölések

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

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

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

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

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

Parancsok

Deklarációs utasítások

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

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

váltnév              a tömb neve

numkif              a tömbben levő elemek száma



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

Példa:

DECLARE  tömb[10]

tömb[3]=15

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

PRIVATE  <váltnév>

váltnév  a változó neve

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

PUBLIC  <váltnév>

váltnév  a változó neve

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

Ki- és beviteli utasítások

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

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

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

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

CLEAR

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

@<numkif1>,<numkif2>  [CLEAR]

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

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

numkif1            a bal felső sarok sorszáma

numkif2            a bal felső sarok oszlopszáma

numkif3            a jobb alsó sarok sorszáma

numkif4            a jobb alsó sarok oszlopszáma

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

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

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

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

váltnév  egy változó neve

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

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

váltnév  egy változó neve

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

Lapdobás

EJECT

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

Formázatlan adatbeviteli utasítások

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

strkif     karakteres kifejezés

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

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

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

kif                    karakteres kifejezés

váltnév  beviteli változó

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

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

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

?[<kif>]   vagy

??[<kif>]

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

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

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

numkif1            sor száma

numkif2            oszlop száma

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

strkif                 PICTURE-leírás

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

9          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.


1.4     Programozási  példák

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

HALLGATO

(HALLGATÓ)

  mező neve 

  típusa

 mérete

 tizedes

  tartalma 

  hkod      

    N   

    5  

        

 hallgató kódja

  nev       

    C   

   20  

        

 név       

  kar          

    C    

    3   

        

 kar azonosítója          

  szak      

    C   

   25  

        

 szak neve 

  evf       

    N   

    1  

        

 évfolyam  

  ered      

    N   

    4  

    2   

 eredmény  

           

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

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

TANTARGY

(TANTÁRGY)

  mező neve 

  típusa

 mérete

 tizedes

  tartalma 

  tkod      

    N   

    3  

        

 tantárgykód

  tnev      

    C   

   20  

        

 tantárgynév

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

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


VIZSGA

  mező neve 

  típusa

 mérete

 tizedes

  tartalma 

  hkod      

    N   

    5  

        

 hallgató kódja

  tkod      

    N   

    3  

        

 tantárgykód

  jegy      

    N   

    1  

        

 vizsgajegy

                                                                                               

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

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

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

1. feladat

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

Megoldás:

CLEAR

USE hallgato

INDEX ON nev TO wind

DO WHILE !EOF()

 sor=1

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

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

  sor=sor+1

  SKIP

 ENDDO

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

 CLEAR

ENDDO

ERASE wind.ntx

CLOSE

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

2. feladat

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

Megoldás:

CLEAR

USE hallgato

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

DO WHILE !EOF()

 sor=1

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

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

  sor=sor+1

  SKIP

 ENDDO

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

 CLEAR

ENDDO

CLEAR

ERASE wind.ntx

CLOSE

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

3. feladat

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

Megoldás:

CLEAR

USE hallgato

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

sor=1

egyeter=0

egyetdb=0

DO WHILE !EOF()

 sor=1

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

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

  egyeter=egyeter+ered

  egyetdb=egyetdb+1

  sor=sor+1

  SKIP

 ENDDO

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

 CLEAR

ENDDO

? 'Egyetem átlaga:', egyeter/egyetdb

ERASE wind.ntx

CLOSE

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

4. feladat

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

Megoldás:

CLEAR

USE hallgato

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

sor=1

egyeter=0

egyetdb=0

DO WHILE !EOF()

 aktkar=kar

 karer=0

 kardb=0

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

  aktevf=evf

  evfer=0

  evfdb=0

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

   IF sor>23

    sor=1

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

    CLEAR

   ENDIF

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

   evfer=evfer+ered

   evfdb=evfdb+1

   sor=sor+1

   SKIP

  ENDDO

  sor=sor+1

  IF sor>23

   sor=1

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

   CLEAR

  ENDIF

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

  ?

  sor=sor+2

  karer=karer+evfer

  kardb=kardb+evfdb

 ENDDO

 sor=sor+1

 IF sor>23

  sor=3

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

  CLEAR

 ENDIF

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

 ?

 sor=sor+2

 egyeter=egyeter+karer

 egyetdb=egyetdb+kardb

ENDDO

sor=sor+1

IF sor>23

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

 CLEAR

ENDIF

IF egyetdb>0

 ? 'Egyetem átlaga:', egyeter/egyetdb

ENDIF

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

CLEAR

ERASE wind.ntx

CLOSE

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

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

Keresés egy adatállományban

4. feladat

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

Megoldás:

CLEAR

USE hallgato

INPUT 'Név:' TO kertnev

van=.F.

LOCATE FOR nev=kertnev

DO WHILE !EOF()

 van=.T.

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

 CONTINUE

ENDDO

IF !van

 ? 'Nincs ilyen nevű hallgató!'

ENDIF

CLOSE

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

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

CLEAR

USE hallgato

INPUT 'Név:' TO kertnev

van=.F.

LOCATE FOR nev=RTRIM(kertnev)

DO WHILE !EOF()

 van=.T.

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

 CONTINUE

ENDDO

IF !van

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

ENDIF

CLOSE

5. feladat

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

Megoldás:

CLEAR

USE hallgato INDEX hallgato

INPUT 'KOD:' TO kertkod

SEEK kertkod

IF !FOUND()

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

ELSE

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

ENDIF

CLOSE

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

Adatállományok karbantartása

6. feladat

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

Megoldás:

CLEAR

USE hallgato INDEX hallgato

INPUT 'KOD:' TO kertkod

SEEK kertkod

IF EOF()

 ? 'Uj hallgató felvitele!'

 ?

 APPEND BLANK

 REPLACE hkod WITH kertkod

ELSE

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

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

 ?

ENDIF

INPUT 'NÉV:' TO unev

INPUT 'KAR:' TO ukar

INPUT 'ÉVFOLYAM:' TO uevf

INPUT 'EREDMÉNY:' TO uered

REPLACE nev WITH unev

REPLACE kar WITH ukar

REPLACE evf  WITH uevf

REPLACE ered WITH uered

CLOSE

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

7. feladat

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

Megoldás:

CLEAR

USE hallgato INDEX hallgato

INPUT 'Kňd:' TO kertkod

SEEK kertkod

IF !FOUND()

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

ELSE

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

 IF DELETED()

  ?

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

 ELSE

  DELETE

  ?

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

 ENDIF

ENDIF

CLOSE

8. feladat

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

Megoldás:

CLEAR

USE vizsga INDEX vizsga

INPUT 'KňD:' TO kertkod

SEEK kertkod

IF !FOUND()

 ?

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

ELSE

   DELETE WHILE hkod=kertkod

 ?

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

ENDIF

CLOSE

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

9. feladat

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

Megoldás:

USE vizsga INDEX vizsga

SELECT 2

USE hallgato INDEX hallgato

SET RELATION TO hkod INTO vizsga

GO TOP

DO WHILE !EOF()

 SELECT vizsga

 atlag=0

 jegydb=0

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

  atlag=atlag+VIZSGA->jegy

  jegydb=jegydb+1

  SKIP

 ENDDO

 IF jegydb>0

  atlag=atlag/jegydb

 ENDIF

 SELECT hallgato

 REPLACE ered WITH atlag

 SKIP

ENDDO

CLOSE ALL

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

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

10. feladat

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

Megoldás:

CLEAR

USE hallgato INDEX hallgato

SELECT 2

USE tantargy INDEX tantargy

SELECT 3

USE vizsga INDEX vizstan

SET FILTER TO VIZSGA->jegy=5

SET RELATION TO hkod INTO hallgato,;

                 TO tkod INTO tantargy

GO TOP

DO WHILE !EOF()

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

 akttant=VIZSGA->tkod

 sor=1

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

  ? HALLGATO->nev

  sor=sor+1

  SKIP

 ENDDO

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

 CLEAR

ENDDO

CLOSE ALL

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

11. feladat

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

Megoldás:

USE tantargy INDEX tantargy

SELECT 2

USE vizsga INDEX vizsga

SET RELATION TO tkod INTO tantargy

SELECT 3

USE hallgato

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

SET RELATION TO hkod INTO vizsga

GO TOP

sor=1

DO WHILE !EOF()

 ujhallg=.t.

 SELECT vizsga

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

  IF sor>22

   ujhallg=.t.

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

   sor=1

  ENDIF

  IF ujhallg

   ?

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

   ujhallg=.f.

   sor=sor+2

  ENDIF

  ? TANTARGY->tnev,VIZSGA->jegy

  sor=sor+1

  SKIP

 ENDDO

 SELECT hallgato

 SKIP

ENDDO

CLOSE DATABASES

ERASE wind.ntx

CLOSE ALL

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

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

12. feladat

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

1. Hallgatói adatok karbantartása

2. Hallgatók törlése

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

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

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

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

Megoldás:

SET EXCLUSIVE OFF

tev=1

DO WHILE tev>0

 CLEAR

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

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

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

                 + ' eltávolítása'

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

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

                   'listázása'

 MENU TO tev

 DO CASE

* Karbantartás

  CASE tev=1

   CLEAR

   USE hallgato INDEX hallgato

   IF NETERR()

    @ 23,0 SAY ''

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

   ELSE

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

 + '   Kar  Évfolyam Eredmény'

    DO WHILE .t.

     @ 3,0

     kertkod=0

     @ 3,32 GET kertkod PICTURE '99999'

     READ

     IF LASTKEY()=27

      EXIT

     ENDIF

     SEEK kertkod

     IF EOF()

      unev =SPACE(20)

      ukar =SPACE(3)

      uevf =0

      uered=0

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

     ELSE

      unev =HALLGATO->nev

      ukar =HALLGATO->kar

      uevf =HALLGATO->evf

      uered=HALLGATO->ered

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

     ENDIF

     DO WHILE .t.

      @ 3, 6 GET unev

      @ 3,43 GET ukar

      @ 3,52 GET uevf PICTURE '9' ;

                      VALID uevf>0.and.uevf<=5

      @ 3,59 GET uered PICTURE '9.99'

      READ

      IF LASTKEY()#27

       ik=' '

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

       READ

       IF ik$'iI'

        IF EOF()

         DO WHILE .t.

          APPEND BLANK

          IF NETERR()

           INKEY(.5)

          ELSE

           EXIT

          ENDIF

         ENDDO

         REPLACE hkod WITH kertkod

        ENDIF

        DO WHILE .t.

         IF LOCK()

          EXIT

         ELSE

          INKEY(.5)

         ENDIF

        ENDDO

        REPLACE nev  WITH unev

        REPLACE kar  WITH ukar

        REPLACE evf  WITH uevf

        REPLACE ered WITH uered

        UNLOCK ALL

        @ 24,0

        EXIT

       ENDIF

       @ 24,0

      ELSE

       EXIT

      ENDIF

     ENDDO

     @ 5,0

    ENDDO

   ENDIF

   USE

* Törlésre jelölés

  CASE tev=2

   CLEAR

   USE hallgato INDEX hallgato

   IF NETERR()

    @ 23,0 SAY ''

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

   ELSE

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

 + '   Kar  Évfolyam Eredmény'

    DO WHILE .t.

     @ 3,0

     kertkod=0

     @ 3,32 GET kertkod PICTURE '99999'

     READ

     IF LASTKEY()=27

      EXIT

     ENDIF

     SEEK kertkod

     IF EOF()

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

     ELSE

      @ 3, 6 SAY HALLGATO->nev

      @ 3,43 SAY HALLGATO->kar

      @ 3,52 SAY HALLGATO->evf

      @ 3,59 SAY HALLGATO->ered

      IF DELETED()

       DO WHILE .t.

        IF LOCK()

         EXIT

        ELSE

         INKEY(.5)

        ENDIF

       ENDDO

       RECALL

       UNLOCK ALL

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

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

      ELSE

       DO WHILE .t.

        IF LOCK()

         EXIT

        ELSE

         INKEY(.5)

        ENDIF

       ENDDO

       DELETE

       UNLOCK ALL

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

      ENDIF

     ENDIF

     @ 23,0 SAY ''

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

     @ 3,0

     @ 5,0

     @ 24,0

    ENDDO

   ENDIF

   USE

* Végleges törlés

  CASE tev=3

   USE hallgato INDEX hallgato EXCLUSIVE

   IF NETERR()

    @ 23,0 SAY ''

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

   ELSE

    PACK

   ENDIF

   USE

* Újraindexelés

  CASE tev=4

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

   USE hallgato INDEX hallgato EXCLUSIVE

   IF NETERR()

    @ 23,0 SAY ''

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

    @ 24,0

   ELSE

    INDEX ON hkod TO hallgato

   ENDIF

   USE vizsga INDEX vizsga,vizstan EXCLUSIVE

   IF NETERR()

    @ 23,0 SAY ''

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

    @ 24,0

   ELSE

    INDEX ON hkod TO vizsga

    INDEX ON tkod TO vizstan

   ENDIF

   USE tantargy INDEX tantargy EXCLUSIVE

   IF NETERR()

    @ 23,0 SAY ''

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

   ELSE

    INDEX ON tkod TO tantargy

   ENDIF

   USE

* Listázás

  CASE tev=5

   SET DATE ANSI

   SET CENTURY ON

   SET DEVICE TO PRINT

   SET DELETED ON

   SET PRINTER TO a.lst

   USE tantargy INDEX tantargy

   IF NETERR()

    @ 23,0 SAY ''

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

   ELSE

    SELECT 2

    USE vizsga INDEX vizsga

    IF NETERR()

     @ 23,0 SAY ''

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

    ELSE

     SET RELATION TO tkod INTO tantargy

     SELECT 3

     USE hallgato

     IF NETERR()

      @ 23,0 SAY ''

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

     ELSE

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

      SET RELATION TO hkod INTO vizsga

      GO TOP

      lapsor=66

      lap=0

      DO WHILE !EOF()

       ujhallg=.t.

       SELECT vizsga

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

        IF lapsor>65

         ujhallg=.t.

         IF lap>0

          EJECT

         ENDIF

         lap=lap+1

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

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

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

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

         @ PROW()+4, 0 SAY ''

         lapsor=8

        ENDIF

        IF ujhallg

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

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

         ' vizsgaeredményei:'

         ujhallg=.f.

         lapsor=lapsor+2

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

        ELSE

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

                        STR(VIZSGA->jegy,5)

         lapsor=lapsor+1

        ENDIF

        SKIP

       ENDDO

       SELECT hallgato

       SKIP

      ENDDO

      EJECT

      SET DEVICE TO SCREEN

      SET DELETED OFF

      CLOSE DATABASES

      ERASE wind.ntx

     ENDIF

    ENDIF

   ENDIF

   USE

 ENDCASE

ENDDO

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

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

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

Találat: 4128