Az DBase nyelv család

Utasítások, vezérlési szerkezetek

Egyszerűbb parancs-szintaktika

Általános:

Egy utasítást egy sorba kell írni, ha egy utasítást folytatni akarunk a következõ sorban, akkor a sor végén pontosvesszõt kell tenni, egyébként az utasítások végére nem tehetünk pontosvesszõt.

dBase:

parancsok:
Azonosítók, kifejezések:
WHILE és FOR paraméterek:

Hasonló az érvényességi körhöz, ez a két paraméter is a parancsban résztvevő rekordok körét változtatja meg. Itt azonban nem a rekord állományon belül elfoglalt helye, hanem tartalmának tulajdonságai töltik be a döntő szerepet.

A WHILE paraméter a rekordmutató aktuális pozíciójától kezdi vizsgálni a rekordokat, magát a parancsot csak akkor hajtja végre, ha a feltétel igaznak bizonyul. Az első olyan rekordon, amelyre a feltétel nem teljesül, befejeződik a parancs végrehajtása.
Az ALL illetve REST érvényességi kör használata ilyenkor felesleges, azonban a NEXT érvényességi körrel lehetséges, hogy nem a feltétel hamissá válása, hanem az érvényességi kör vége állítja meg a parancs végrehajtását.

A FOR paraméter az érvényességi kör alapértelmezését átírja ALL értékre, tehát a végrehajtás a logikailag legelső rekordon kezdődik, és az adatbázis végéig tart. A parancsban előírt műveleteket a dBase mindazon rekordokon végrehajtja, amelyekre nézve a feltétel igaznak bizonyul. E paraméter mellett a REST és a NEXT érvényességi kör használata mindösszesen csak azt befolyásolja, hogy mely rekordokon értékelődjön ki a feltétel.

A parancsok érvényességi köre (scope):

Általánosan:

Sok parancs opcionális eleme. Az adatbázis azon részét határozza meg, amelyen a parancsot végre kell hajtani

Az alapértelmezés általában az aktuális rekord ,vagy néhány parancsnál ALL azaz a teljes adatbázis.
(a FOR és a WHIlE parancsparaméterek megváltoztatják az alapértelmezést)

Érvnyességi kör lehet:

RECORD n : az n. rekord
NEXT n : az aktuális rekordtól kezdve n darab rekord
REST : az aktuálistól az adatbázis végéig
ALL : az adatbázis összes elérhető rekordja

Értékadás:

dBase:

Fontos tudni, hogy a változók, deklaráció híján, az elsõ, rájuk vonatkozó értékadással jönnek létre. Mivel az értékadás jobb oldalán álló adat típusának megfelelõ típusú lesz a változó, ezért az elsõ értékadásra különösen ügyelni kell. Ajánlatos egyfajta áldeklarációt végezni, amikor is értékül adunk egy olyan adatot a leendõ változónknak, amelynek nincs tényleges jelentõssége, de biztosan a kívánt típusú és méretû változót hozza létre.

Memóriaváltozók létrehozása így kétféleképpen is történhet:

Store szintaxisa:
STORE < kifejezés > TO < memóriaváltozó [ lista ] >
Példák:
szoveg1=' ' szoveg1: egy hosszú karakterlánc
szoveg2='aa' szoveg2: kettõ hosszú karakterlánc
log1=.T. log: igaz értékû logikai változó
log1=.F. log: hamis értékû logikai változó
d1=01.03.11 d1 dátum típusú változó, értéke a megfelelõ környezeti paraméter beállításától függ
szoveg1=szoveg2 érvénytelen értékadás
store 0 to i,j,k,l i,j,k,l memóriavátozók is mind 0 értékkel jönnek létr
Néhány segítséget jelentõ beépített függvény:
SPACE(n) : a visszatérési értéke egy n hosszú karakterlánc, szóközökkel feltöltve
DATE() : az aktuális dátum

Clipper:

FoxPro:

Az =, := és a STORE használható értékadásra.

Szekvencia

Clipper

BEGIN SEQUENCE
< utasítások > ...
[ BREAK [ < kifejezés > ] ]
< utasítások > ...
[ RECOVER [ USING < változó > ] ]
< utasítások > ...
END [ SEQUENCE ]
BEGIN SEQUENCE - END [SEQUENCE]: Utasításblokk kezdetének és végének definiálása. A lezárásnál a SEQUENCE-nek nincsen szerepe, a kiírása opcionális.
BREAK kifejezés: Kilépés az utasításblokkból. Amennyiben van definiálva RECOVER és a BREAK előtte van, akkor a RECOVER-re kerül a vezérlés (akár alprogramokból is). Amennyiben nincsen RECOVER definiálva vagy a RECOVER után található a BREAK, akkor az END SEQUENCE-re kerül a vezérlés. A BREAK mögött opcionálisan megadhatunk egy kifejezést paraméternek, ekkor a RECOVER résznél lehetőség van ezt a paramétert átvenni.
RECOVER [USING < változó >] Folytatási pont a BREAK után. Ha egy szekvenciában a RECOVER előtt BREAK utasítás történik, akkor a vezérlés a RECOVER-re kerül. Ha meg van adva az opcionális USING záradék, akkor a mögötte levő változóba belekerül az adott BREAK utasítás paramétere. Ha nem volt megadva paraméter, akkor a USING mögé írt változó a NIL értéket veszi fel. Amennyiben a szekvenciában a RECOVER utasításig nem történt BREAK, akkor a RECOVER előtt a vezérlés átkerül az END SEQUENCE-re kihagyva a RECOVER utáni utasításokat

Az utasításblokkok tetszőlegesen egymásba ágyazhatóak: szekvencián belül lehet szekvencia a RECOVER előtt és után is.

Megkötések

Szekvencián belül csak a RECOVER utáni részen lehet a LOOP, EXIT, RETURN parancsokat használni. A RECOVER előtt, vagy ha nincsen RECOVER, akkor nem lehet alkalmazni a LOOP, EXIT, RETURN parancsokat.
Ezek a megkötések egymásba ágyazott szekvenciáknál a szekvenciák között is érvényesülnek: ha egy szekvenciában a RECOVER előtt egy másik szekvencia található, abban sehol sem fordulhat elő a 3 tiltott utasítás.

Felhasználás

A szekvencia tipikus alkalmazása a hibakezelés, ahol a RECOVER elé lehet írni a futtatandó programrészt és a RECOVER után a hibakezelést. Amennyiben hiba lép fel, akkor a BREAK-nél meg lehet adni a hibakódot, amit a hibakezelő rész RECOVER USING-al átvehet és le tudja kezelni specifikusan az adott hibát.

FoxPro:

BEGIN SEQUENCE
< utasítások > ...
[ BREAK [ < kifejezés > ] ]
< utasítások > ...
[ RECOVER [ USING < változó > ] ]
< utasítások > ...
END [ SEQUENCE ]
BREAK kifejezés: kilépés az utasításblokkból.
RECOVER :(ha van) Vagy azEND után következõ utasítást hajtja végre, miközben a program számára visszaadott érték a kifejezés-nek megfelelõ lesz.

Ha a RECOVER-nél

USING <változó> 
paramétert megadtuk, akkor a változó értéke a BREAK utáni kifejezés értékét veszi fel.

Az utasításblokkok egymásba ágyazhatók!

Elágazások:

dBase:

Szimpla elágazás:
IF   < feltétel >
   < utasítások >
[ELSE
   < utasítások >]
ENDIF
Többirányú elágazás:
DO CASE
CASE  < feltétel >
      < utasítások >
[CASE < feltétel >
      < utasítások >
   ...
[OTHERWISE
      < utasítások >]
ENDCASE

Az elsõ igaz feltételhez tartózó utasításokat hajtja végre, ha egyik sem igaz, az OTHERWISE-hoz tartozó utasításokat hajtja végre, ha OTHERWISE nincs, akkor ENDCASE után foytatja.

Finomság:

A dBase III PLUS rendelkezeik különleges fügyvénnyel, amely néhány egszerű feltételes szerkezetet tud kezelni:

IIF( < Lkif1 > , < kif1 > , < kif2 > )
Lkif1 logikai kifejezés igaz értéke esetén a kif1 egyébként a kif2 értékét adja vissza.

Clipper és Foxpro:

Szimpla elágazás:

Itt már a többirányú elágazás megvalósításához bevezették az elsif ágat is:

IF < feltétel1 > ...
[ ELSEIF < feltétel2 > 
         < utasítások > ] 
      ...
[ ELSE  
    < utasítások > ]
ENDIF

Clipperben és Foxproban is létezik az IIF szintaktika ua mint dBase-nél

Többirányú elágazás:
DO CASE 
CASE < feltétel1 > 
     < utasítások > 
[ CASE < feltétel2 > 
       < utasítások > … ] 
[ OTHERWISE 
       < utasítások > ] 
ENDCASE
Az elsõ igaz feltételhez tartózó utasításokat hajtja végre, ha egyik sem igaz, az OTHERWISE-hoz tartozó utasításokat hajtja végre, ha OTHERWISE nincs, akkor ENDCASE után foytatja.

Ciklusok:

dBase:

DO WHILE < feltétel >
         < utasítások > 
    [LOOP] 
    [EXIT] 
ENDDO
[LOOP] feltétel nélküli ugrás a legutóbb indított DO WHILE utasításra
[EXIT] feltétel nélküli kiugrás a ciklusból

Clipper:

A DBase-nél tárgyalt Do-While szerkezet és
FOR < számláló > = < kezdő érték > TO < végérték > [ STEP < lépésköz > ] 
    < utasítísok > 
ENDFOR | NEXT 

A számláló, ha korábban nem lett deklarálva, PRIVATE változóként definiálódik. Itt is használható a LOOP és az EXIT utasítás.

FoxPro:

A fentieken túl még egy új lehetőség:

SCAN [ < hatókör > ] [ FOR < kifL1 > ] [ WHILE < kifL2 > ] 
       < utasítások > 
ENDSCAN
Az adatbázis meghatározott rekordjain megy végig.. A hatókör az adatbázis azon része , amelyen belül az utasítások végrehajtásra kerülhetnek azokon a rekordokon, melyekre kifL1 igaz. Amennyiben kifL2 hamissá válik, a ciklus befejeződik. Itt is használható a LOOP és az EXIT utasítás.

I/O Utasítások:

dBase

A dBase bizonyos verzióiban (ilyen pl dBase III PLUS) már van lehetőség interkatív módon bekérni adatokat memóriaváltozókba.

Tetszőleges típusú adatbekérése:
INPUT [ < üzenet > ] TO < memóriaváltozó >
kifejezetten csak karakteres adatok bevitelére alkalmas:
ACCEPT [ < üzenet > ] TO < memóriaváltozó >
Mindkét parancs végrehajtásakor egy új memóriaváltozó jön létre illetve, - ha már létezett ilyen nevű változó, - akkor felülírja azt.
WAIT parancs

A parancs 2 funkciót is betölthet:

Formázott input utasítások:
@ < sor > , < oszlop > [ SAY < kar.kif. > [ PICTURE ' < formátum > ] ] 
GET < változó > [ PICTURE < formátum >  ] [RANGE < n1 > , < n2 > ] ]
...
READ

Az utasítás a képernyõ < sor > < oszlop > pozíciójára kirajzolja a megadott változó, és az esetlegesen megadott maszk és funkciókódok alapján az input mezõt, amit a felhasználó szabadon szerkeszthet, mert az önmagában kiadott GET utasítás nem végzi el a tényleges adatbevitelt.

SAY paraméter esetén kiírja a karakteres kifejezést (pl.:magyarázó szöveg), és az adatbemeneti mezõt csak e mögött jeleníti meg.

RANGE paraméterrel lehet megkötést adni a bejövő adat értékére.

Az adatok tényleges bevitelét a READ utasítás végzi.
Egyetlen READ utasítás tetszõleges számú GET utasításban szereplõ változónak ad értéket, tehát ezt az utasítást elegendõ egyszer kiadni.

Maszkkódok:

A maszkkódok mindig pontosan arra az egy karakterre érvényesek, amelynek megfelelõ pozíciót elfoglalják a PICTURE-ben.
Néhány példa:

'9'
ezen a pozíción csak számjegy vagy elõjel szerepelhet
'#' 
ezen a pozíción csak számjegy, elõjel vagy szóköz szerepelhet
'N'
ezen a pozíción csak számjegy szerepelhet
'A'
ezen a pozíción csak betû (a..z, A..Z) szerepelhet
'X'
ezen a pozíción tetszõleges karakter szerepelhet
'L'
ezen a pozíción csak logikai érték szerepelhet
'Y
ezen a pozíción csak 'Y', 'y', 'N', 'n' karakter szerepelhet
'.'
ezen a pozíción csak tizedespont szerepelhet
'!'
ezen a pozíción a betűt nagybetűre alakítja
','
számok tagoására alkalmas (csak akkr jelenik meg, ha szám kerül a bal oldalára)

Funkciókódok:

A funkciókódok mindig a teljes adatbemeneti mezõre vonatkoznak. A bevezetõ karaktere a '@'.

Néhány példa:

S( < num.kif. > )'
a beviteli mezõ pontosan < num.kif. > szélességû (lehet görgetni)
'B'
numerikus adat, amelyet balra igazítottan jeleníti meg
'Z'
bevezetõ nullák elnyomása
'D'
a dátumokat a SET DATE szerinti formában mutatja
'R'
a < formátum > -ban megadott nem-funkció és nem-maszk karaktereket a képernyõn megjeleníti, de a változó értékénél nem veszi figyelembe
'!'
az alfabetikus karaktereket nagybetûre konvertálja
'A'
csak alfabetikus karaktert fogad el
'('
a negatív számokat zárójelbe rakja
Pl.:
nev = SPACE ( 40 ) kor = 99 @ 5,5 SAY 'Kérem adja meg a nevét:' GET nev PICTURE '@S(40)' @ 6,5 SAY 'Kérem adja meg a korát:' GET kor PICTURE '99' READ
Formázott output utasítások
@ < sor > , < oszlop > SAY < kar.kif. > [ PICTURE ' < maszk és / vagy funkciókód > ' ] 

Ez az utasítás a < kar.kif. > karakterláncot jeleníti meg a képernyõ < sor >, < oszlop > pozícióján, az esetlegesen megadott maszk- illetve funkciókódoknak megfelelõen.

Egyéb Out utasítások:
'?'
soremelés
'?? < kar.kif >'
karakteres kifejezés kiíratása az aktuális pozícióra, a végén soremelés nélkül
'? < kar.kif. >'
karakteres kifejezés kiíratása a következõ sor elejétõl
'EJECT'
lapdobás
'PROW()'
az utolsó lapdobástól kinyomtatott sorok száma
'PCOL()'
az aktuális oszloppozíció
Keret rajzolása a képernyõre:
@ < felsõ sor > , < bal oszlop > , < alsó sor > , < jobb oszlop > BOX < keretezõk >

keretezõk:

karakteres kifejezés, a keretet alkotó jelek (9 darab) az óramutató járásával megegyezõ sorrendben a bal felsõ ponttól indulva. A 9. jel a keretet feltöltõ karakter.

Ha csak egyetlen karaktert adunk meg, akkor a teljes keretet ez az egy karakter alkotja.

Szimpla vagy duplavonalú keret rajzolása:

@ < felsõ sor > , < bal oszlop > TO < alsó sor > , < jobb oszlop > [ DOUBLE ]

Képernyõablak törlése:

@ < felsõ sor > , < bal oszlop > [ CLEAR [ TO < alsó sor > , < jobb oszlop > ] ]

felsõ sor, bal oszlop, alsó sor, jobb oszlop: a törlésre kijelölt ablak megadása, ha a jobb alsó sarkot nem adjuk meg, akkor MAXROW(), MAXCOL()-ig töröl.

A képernyõt az aktuális alapszínnel tölti fel.

Menüpont definiálása:
@ < sor >, < oszlop > PROMPT < menüpont > [ MESSAGE < üzenet > ]

Kiírja a menüpontot a sor, oszlop által meghatározott helyre.

Az üzenetet a SET MESSAGE által meghatározott sorban jeleníti meg, ha az aktuális menüpontra rámegyünk.

Minden menü maximálisan 32 menüpontot tartalmazhat.

A kiválasztott menüpont a MENU TO után megadott változóba kerül.

példa:

LOCAL valaszt := 1 SET WRAP ON //a menüben körkörösen is lehet majd mozogni SET MESSAGE TO 10 @ 1, 3 PROMPT 'Felvitel' MESSAGE 'Adatok felvitele' @ 2, 3 PROMPT 'Listázás' MESSAGE 'Adatok kilistázása' MENU TO valaszt
/* most lehet a menüpontok között a kurzormozgató billentyûkkel kiválasztani a kívánt menüpontot;
a program a menüpont kiválasztása után folytatódik, a kiválasztott menüpont a 'valaszt' változóba kerül */

Clipper

Formázott input utasítások
@ < sor >, < oszlop > [ SAY < kifejezés > [ PICTURE < formátum1 > ] [ COLOR < színkód > ] ]
GET < változónév > [ PICTURE < formátum2 > ] [ WHEN < feltétel > ]
[ RANGE < alsó >, < felsõ > ] | [ VALID < logikai kifejezés > ]

< sor >, < oszlop >: numerikus kifejezések, az adat bekérésének helye a képernyõn. Ha a SAY kulcsszóval szöveget is iratunk ki, akkor a szöveg kiírásának kezdõpozíciója, a GET szerinti adatbekérés a szöveg után kezdõdik.

SAY < kifejezés > : a kifejezés kiíratása a képernyõ meghatározott helyére Ha a hozzá tartozó PICTURE is meg van adva, akkor a kiíratás formázott lesz.

GET < változónév > : a bekért adat értékét felvevõ változó neve. Típusa karakteres, dátum, numerikus vagy logikai. Ha tömb számára kérünk belõle értéket, a megfelelõ tömbindexeket is meg kell adni. A megadott érték a képernyõ megfelelõ helyén is kiírásra kerül.

PICTURE < formátum2 >: a bekért adat kifejezésének formázása

COLOR < színkód > : karakteres kifejezés, amely egy vagy több színkódot tartalmaz. Az aktuális GET objektum színeinek megadása, a literálként definiált színeket idézõjelek közé kell tenni. Ha két színt adunk meg, akkor az elsõ a nem-kiválasztott-mezõ színe, a második a kiválasztott mezõ színe. Ha csak egyet, akkor mind a kiválasztott, mind a nem kiválasztott mezõnek ugyanaz lesz a színe. (A színmegadási lehetõség csak az 5.01-es verzióra érvényes!)

WHEN < feltétel > : logikai kifejezés, melynek teljesülése szükséges ahhoz,hogy a GET szerinti adatbekérés megtörténjen. Ha a feltétel nem teljesül, ezt a GET átugorja.

RANGE < alsó > , < felsõ > : dátum vagy numerikus kifejezés, a beírásra kerülõ érték lehetséges alsó és felsõ határa.

VALID < logikai kifejezés >: egy olyan logikai kifejezés, amelynek teljesülése szükséges ahhoz, hogy a beírásra kerülõ érték a READ számára elfogadható legyen.

A GET-ek által meghatározott értékek mindaddig érvényben maradnak, amíg egy READ, egy CLEAR, vagy egy CLEAR GETS parancs kiadásra nem kerül.

Ha a SET DELIMITER kapcsoló ON állásban van, a SAY utáni kifejezés és a GET utáni érték közé az aktuális DELIMITER (elválasztó) karakter kerül.

Egyéb, az inputtal kapcsolatos utasítások:

CLEAR GETS, READMODAL, READVAR, READEXIT, READ
Formázott output utasítások
@ < sor > , < oszlop > SAY < kifejezés > [ PICTURE < formátum > ] [ COLOR < színkód > ]

< sor > , < oszlop > : numerikus kifejezések, a megjelenítésre kerülõ szöveg kezdetének koordinátái a képernyõn, illetve nyomtatón.
A sor értéke a képernyõ esetén 0 és MAXROW, nyomtató esetén 0 és 32766 közé esik, az oszlop értéke képernyõ esetén 0 és MAXCOL, nyomtató esetén pedig 0 és 32766 közé eshet.

SAY < kifejezés > : egy karakteres, dátum, logikai vagy numerikus kifejezés kiértékelésének eredménye, és megjelenítése az aktuális eszközön.

PICTURE < formátum > : a formázó és a maszkkarakterek megjelenítése.

COLOR < színkód > : karakteres, a < kifejezés > színének meghatározása. Ha nincs megadva, akkor a SETCOLOR szerinti szabvány színkód az érvényes. Ha karakteres kifejezés helyett literálként akarjuk megadni, akkor idézõjelek közé kell tenni.

Foxpro

A Foxproban használhatók a DBase lehetõségei, használatukat azomban nem ajánlják. I/O mûveletekre inkább használjunk formokat!!

Lemezkezelõ utasítások:

dBase:

DIR: a lemeztartalom megjelenítése.
DIR *.*
DISKSPACE(): a lemez szabadkapacitásának lekérdezése
FILE : adott file létezik-e már a háttértárolón
FILE( < file_név > )
COPY FILE: tetszőleges típusú és tartalmú álományok másolása
COPY FILE < forrás > TO < cé l>
RENAME: tetszőleges, már létező file átnevezése
RENAME < régi_név > TO < újnév >
ERASE : tetszőleges állomány törlése
RUN vagy ! : tetszőleges parancs végtrehjtása

Clipper:

A Clipper lemezmûveleteibõl néhány:

DIR: a lemeztartalom megjelenítése.
DIR [ < útvonal > ] [ < maszk > ]
RENAME: az állomány nevének megváltoztatása.
RENAME < régi név > TO < új név >
COMMIT: az aktív munkaterületek lemezre mentése.
DBCOMMIT: azonnali lemezre írás a munkaterületrõl.
DBCOMMIT -> NIL
DBCOMMITALL: azonnali lemezre írás.
DELETE FILE: állomány törlése a lemezrõl.
DELETE FILE | ERASE < állománynév >
FILE: állomány létezésének ellenõrzése.
FILE( < állománynév > ) -> van-e