A fõprogram fájlja csak és kizárólag a fõprogramból áll, nem szerepelhetnek benne alprogramok.
A strukturált programozás azomban megkívánja az alprogramok használatát. A dBase alapú nyelvekben ezt az
úgynevezett eljárásfájl használatával valósították meg.
Az eljárásfájl, mint ahogyan azt a neve is mutatja egy olyan önálló állomány, amelyben csak alprogramok találhatók.
Szintén eltérést jelent a ma megszokott programozási nyelvekhez képest, hogy az eljárásfájlnak nincsen prototípusa
(headerfile). Erre nincs is szükség, hiszen ez egy interpretált nyelv, így nincs linker, tehát prototípus sem kell a
számára.
Újabb különbség, hogy a felhasználó, azaz a programozó csak eljárásokat definiálhat, függvényeket nem. Ezzel szemben minden beépített alprogram függvény, egyetlen beépített eljárás sincs.
PROCEDURE < eljárásnév > ... RETURN [TO MASTER]
Mint látható a fõprogramhoz hasonlóan, az alprogramokra sincs kötött nyelvi szerkezet. A meghívott eljárások újabbakat hívhatnak meg.
A "beágyazásnak" elvi korlátai nincsenek csak "fizikazi" olyan szempontból, hogy minden elindított és még be nem fejezett önálló állomány nyitott állmánynak számít, és a dBase egyszerre csupán 15 nyitot állománnyal tud foglalkozni. Ezért a dBase-ben lehetőség van úgynevezett procedúra-állományok létrehozására, melyek már több eljárást (maximum 32) tartalmaznak. Az eljárásnévre ugyanazok a szabályok érvényesek, mint a változó és mezõnevekre, kivéve, hogy ez csupán nyolc karakter hosszú lehet. A PROCEDURE és RETURN közt ugyanazokat az utasításokat adhatjuk ki, mint a fõprogramban, és ugyanazok a megkötések érvényesek itt is. Ebbõl is jól látható, hogy a PROCEDURE és RETURN nem utasítások, csupán fenntartott szavak, amiket az egyes alprogramok egymástól való elhatárolására használ az interpreter.
DO < eljárásnév >vagy
DO < procedura-állomány >Előfordulhat,hogy egy mélyen begyázott programból azonnal a főprogramhoz szeretnénk visszatérni, ilyenkor a RETURN uatasítást ki kell egészíteni a következő formában:
RETURN TO MASTER
Procedura állomány megnyitásásra szolgál a :
SET PROCEDURE TO < állománynév >környezetei paramétert beállító parancs. Egyszerre csak egy proceduraállományt tarthatunk nyitva, a következő megnyitása lezárja az előzőleg megnyitottat. Ezt megtehetjük sajátkézzel is a következő módokon:
SET PROCEDURE TOvagy
CLOSE PROCEDURE
DO < eljárásnév > WITH < paraméterlista >A szubrutint elő kell készíteni a paraméterek fogadására a
PARAMETRS < memóriaváltozó lista >utaítássorral.(a változók száma és sorrendje lényeges!!) dBase III PLUS-ban már gépi kódú programok meghívására is van lehetőség. Elsőször a
LOAD < bin. áll. név >segítségével a programot be kell tölteni az operatív memóriába, majd a hívást a
CALL < modul_név > [WITH < kif._lista >]parancs végzi. A végén a gépi kódú modulokat rutinokat külön kell törölni a memóriából a
RELEASE MODUL < modulnév >parancs kiadásával. A meóriában egyszerre maximum 5 gépi kódú modul helyezkedhet el.
[ STATIC ] PROCEDURE < eljárásnév > [ ( < paraméterlista > ) ] [ FIELD < azonosító lista > [ IN < aliasnév > ] ] [ LOCAL < azonosító > [ [ := < kezdõérték > ] , ... ] ] [ MEMVAR < azonosító lista > ] [ STATIC < azonosító > [ [ := < kezdõérték > ] , ... ] ] < végrehajtandó utasítások > [ RETURN ]
eljárásnév: Az eljárás neve. Tetszõleges hosszú lehet, de csak az elsõ tíz karaktert veszi figyelembe. Betûket, számokat és az aláhúzásjelet tartalmazhatja, azonban az aláhúzásjel az elsõ karakter helyén más célra lett lefoglalva.
| paraméterlista: | Egy vagy több paraméterváltozó felsorolása. Az itt felsorolt változók local deklarációt kapnak. |
| STATIC PROCEDURE: | Egy olyan eljárást deklarál, mely csak abból a program állományból érhetõ el, amelyik azt tartalmazza. |
| LOCAL: | Az aktuális eljárásban érvényes változók és tömbök deklarálása és igény szerint kezdõértékkel ellátása. |
| STATIC: | Azoknak a változóknak és tömböknek a deklarálása, és igény szerint kezdõértékkel ellátása, amelyek az adott eljáráson kívül a program más részein is érvényesek. |
| FIELD: | A mezõnévként használt azonosítók listája. Az IN kulcsszó alkalmazásával megadható annak az adatbázisnak a neve, amely a deklarált mezõt tartalmazza. Egyébként mindig a hivatkozás helyén aktuális munkaterületen megnyitott adatbázis mezõneveként értelmezi. |
| MEMVAR: | A private vagy public memóriaváltozók vagy tömbök deklarálása. |
| RETURN: | Az eljárásból való kilépést jelzi, és a hívó programnak, vagy felhasználói függvénynek adja vissza a vezérlést. Ha nincs megadva, akkor a visszatérés az eljárásdefiníció végén történik. Az eljárásdefiníció végét jelenti egy másik PROCEDURE vagy egy FUNCTION utasítás, illetve egy állomány-vége jel. |
Az eljárás paramétereket tud átvenni a hívó eljárásból, felhasználói függvénybõl vagy a DOS-tól. Kétféleképpen adható meg: vagy a paraméterlistában, vagy a PARAMETERS utasítás után, de a kétféle megadási mód nem keverhetõ. Az eljárás a paraméterértékeket az argumentumlistában megadott sorrendben veszi figyelembe. A megadott értékek számának nem kell megegyezni: ha több argumentumérték lett megadva, akkor a feleslegesek figyelmen kívül maradnak, ha kevesebb, akkor a hiányzó paraméterek értéke NIL lesz. Az argumentumok kétféleképpen adhatók meg: érték vagy hivatkozás szerint. Az érték szerinti argumentum egy kifejezés vagy egy változónév megadása, amely esetben az eljárás a paraméterértéket tetszés szerint módosíthatja, a hívó eljárásba visszatérve az eredeti érték marad meg. A hivatkozás szerinti argumentum esetében (ekkor a változó neve elé egy @ jelet kell írni) a változó értéke a hívó eljárásba való visszatérés után az eljárás által módosított érték lesz. Mezõnév csak érték szerinti argumentumként adható meg. Mezõnév átadása esetén azt zárójelbe kell tenni, és elé a FIELD elõtagot kell illeszteni, ellenkezõ esetben hibajelzést kapunk.
[ STATIC ] FUNCTION < függvénynév > [ ( < paraméterlista > ) ] [ LOCAL < azonosító > [ [ := < kezdõérték > ] , ... ] ] [ STATIC < azonosító > [ [ := < kezdõérték > ] , ... ] ] [ FIELD < azonosító lista > [ IN < aliasnév > ] ] [ MEMVAR < azonosító lista > ] < végrehajtandó utasítások > RETURN < kifejezés >
függvénynév |
Felhasználói függvény neve. Tetszõleges hosszú lehet, de csak az elsõ 10 karaktert veszi figyelembe. Betûket, számokat és az aláhúzásjelet tartalmazhatja. |
paraméterlista: |
Egy vagy több paraméterváltozó felsorolása. Az itt felsorolt változók local deklarációt kapnak. |
STATIC FUNCTION: |
Egy olyan felhasználói függvényt deklarál, amely csak abból a program állományból érhetõ el, amelyik azt tartalmazza. |
LOCAL: |
Az aktuális függvényben érvényes változók és tömbök deklarálása igény szerint kezdõértékkel ellátása. |
STATIC: |
Azoknak a változóknak és tömböknek a deklarálása, és igény szerint kezdõértékkel ellátása, amelyek az adott függvényen kívül a program más részein is érvényesek. |
FIELD: |
A mezõnévként használt azonosítók listája. Az IN kulcsszó alkalmazásával megadható annak az adatbázisnak a neve, amely a deklarált mezõt tartalmazza. Egyébként mindig a hivatkozás helyén aktuális munkaterületen megnyitott adatbázis mezõneveként értelmezi. |
MEMVAR: |
A private vagy public memóriaváltozók vagy tömbök deklarálása. |
RETURN kifejezés: |
A felhasználói függvénybõl való kilépést jelzi, ahol a kifejezés a visszaadott érték. Minden függvény végén kötelezõen kell szerepelnie egy RETURN-nek., de a rutinon belül tetszõleges helyen több RETURN is elõfordulhat. |
A paraméterek átadása hasonló módon történik, mint az eljárások esetében.
< eljárásnév > ( [ < argumentumlista > ] ) DO < eljárásnév > [ WITH ] < aliasnév > -> ( < eljárásnév > ( [ < argumentumlista > ] ) )
Ha az argumentumok száma nem egyezik meg a hívott eljárás paramétereinek számával, akkor kevesebb argumentum megadása esetén a további paraméterek értéke NIL;
Több argumentumérték megadása esetén a felesleges értékek figyelmen kívül maradnak.
Paraméterek számának lekérdezése: PCOUNT()
< függvénynév > ( [ < argumentumlista > ] ) < aliasnév > -> ( < függvénynév > ( [ < argumentumlista > ] ) )
Függvényhívásnál az alapértelmezés szerinti értékeket nem kell átadni.
Az elõbbieken kívül a CALL utasítással hívhatók meg C vagy Assembly nyelvû eljárások. Szintaxisa:
CALL < eljárásnév > [ WITH < paraméterlista > ]
Továbbá a RUN paranccsal DOS parancs vagy felhasználói program indítható:
RUN | !* < parancs >
Alprogramokat külön forrásfájlokban definiálhatunk, amiket a
paranccsal tölthetünk be, egyébként ha nem betöltött alprogramra hivatkozunk futás idejû hiba lép fel.Eljárásokat és függvényeket is definiálhatunk a PROCEDURE illetve a FUNCTION kulcsszavakkal. A kulcsszó után csak az alprogram nevét adjuk meg, a paramétereit a következõ sorban a PARAMETERS kulcsszó után soroljuk fel (csak a neveket mivel, típusuk a kapott értéktõl függ).
Az aktuális paraméterek számának nem kell megegyeznie a formális paraméterek számával, ha több paramétert írunk, mint amennyit vár,akkor a “fölös” paramétereket figyelmen kívül hagyja, ha kevesebbet adunk meg, akkor a nem megadottak értéke .F. lesz. Annak a kezelésére, ha kevesebb paramétert kapott, az aktuális paraméterek számát lekérdezhetjük a PCOUNT vagy a PARAMETERS() függvénnyel. A PCOUNT() az adott alprogram paramétereinek számát adja meg, a PARAMETERS() pedig az utoljára meghívott alprogram paramétereinek számát.
Függvény visszatérõ értékét a RETURN utasítással adhatjuk meg, ha nem RETURN-nel fejezõdik be, akkor a visszaadott érték .T.
A RETURN utasítással nem csak közvetlenül a hívó programhoz térhetünk vissza, hanem egy általunk megadott programhoz is, vagy a fõprogramhoz is (RETURN TO proc_név, RETURN TO MASTER).Nem jelezzük explicit az alprogram végét, hanem egy újabb FUNCTION vagy PROCEDURE kulcsszó, illetve a fájl vége az alprogram végét jelzi. Ebbõl következik, hogy az alprogramok nem ágyazhatók egymásba.
A paraméterátadás módját a SET UDFPARMS TO VALUE | REFERENCE utasítással állíthatjuk be. Lehet érték szerinti vagy cím szerinti. Az alapbeállítások módosíthatók; ha egy paramétert (paraméter) formában adunk meg akkor érték szerint, ha @paraméter formában adunk meg, akkor referencia szerint adódik át. Ha egy tömböt érték szerint adunk át, akkor csak a tömb elsõ eleme adódik át, referencia szerint az egész tömb.
Függvény hívható a nevével és zárójelben a paramétereivel, vagy a DO függvény_név WITH paraméter_lista szintaxissal is.
Az alprogramok túlterhelésére nincs lehetõség.