Az DBase nyelv család

Típusok, típuskonstrukciók

Típusok

dBase:

Karakteres: max 254 hosszú tetszõleges szöveges adat karakterenként egy byte-on ASCII kódban helyigény szöveg hossza + 2 byte.
Numerikus: előjeles számok ábrázolására alkalmas. Az egyetlen, matamatikai műveletek végrehajtására alkalmas típus.
Dátum: a mérete állandó, mindig 8 karakter hosszú. (általában hónap/nap/év formában, ami változtatható) Tetszõleges dátumadat tárolására alkalmas. Értelmezettek rajta bizonyos alapműveletek pl. egészszám hozzáadása ill kivonása egy dátumból, vagy dátumok összegének, különbségének meghatározása)
Logikai a mérete állandó. Tetszõleges kétértékû adat tárolására. Mérete 1 byte.
Memo: mérete nem korlátozott. Tetszõleges karakteres szöveges adat tárolására alkalmas. A felső hatrát a használt szerkesztő határozza meg. Csak adatbázis-állományok mezője lehet ilyen típusú. Az adatbázisban mindig 10 karakternyi helyet foglal el. A tartalo maga külön .dbt kiterjesztésű fájlban tárolódik.

Clipper:

A Clipperben használhatók a DBase lehetõségei.
Lényeges újdonság, hogy a Clipperben definiálhatók tömbök is.
A kiterjesztett tömbkezelés jellemzõi a következõk:
Tömbhivatkozások: A tömbök könnyen kezelhetõk. Az általuk lefoglalt helyek automatikusan megszûnnek, amikor már nincs rájuk hivatkozás.
Egymásba ágyazott tömbök: A tömbelemek lehetnek egy másik tömb hivatkozásai; ily módon komplex adatszerkezetek hozhatók létre.
Többdimenziós tömbök: Az egymásba ágyazott tömbökkel mátrixmodell és komplex többdimenziós tömbök hozhatók létre. A többdimenziós tömb egy elemét a C vagy a Pascal szintaktikája szerint lehet címezni.
Dinamikus méretezés: A tömbök dinamikusan növelhetõk illetve csökkenthetõk.
A tömb, mint függvényérték: A felhasználó által definiált függvények visszaadott értékei tömbök is lehetnek, melyeket a változók sorozatánál sokkal könnyebb kezelni.
Konstansokat tartalmazó tömbök: A tömbök tartalmazhatnak konstans értékeket is.
A Clipper további új adattípusai:
Kódblokk: Egy lefordított forráskód, melyet a Clipper adatként kezel. Hasonló a makróhoz, de annál gyorsabb és hatékonyabb. Más értékekhez hasonlóan a kódblokk értéke átadható egy változónak, vagy paraméterként egy függvénynek, illetve onnan visszaadható. A kódblokk tartalma kiértékelhetõ, ami azt jelenti, hogy a blokkon belüli kódok kiértékelésre kerülnek, az eredmény pedig visszaadódik. A kódblokk blokkparaméterrel deklarálható, amely a függvények és az eljárások formális paramétereihez hasonló.
NIL: Ez az érték automatikusan átadódik minden olyan változónak (kivéve a public változókat), amelyek kezdeti értékadását nem hajtottuk végre. Ugyanígy, ha egy eljárásban vagy függvényhívás során elmulasztottuk a paraméterek definiálását, ezek helyén automatikusan NIL jelenik meg.

FoxPro:

Vannak olyan beépített típusok, amik adattáblákban és memóriában is tárolhatók:
Character: max 254 hosszú szöveg (1 byte/karakter)
Currency: pénzösszegek (8 byte, - 922337203685477.5807-tõl 922337203685477.5807-ig)
Date: dátum, dátumformázó segédfüggvények adottak (8 byte)
DateTime: dátum és idõ, formázó segédfüggvények adottak (8 byte)
Logical: boolean érték: .T., .F. (1 byte)
Numeric: egész vagy tört értékek, - .9999999999E+19-tõl .9999999999E+20-ig (8 byte memóriában, max 20 byte adattáblában)
Variant: bármilyen értéket tárolhat, a NULL értéket is (referencia)
Ezenkívül vannak típusok, amik csak adattáblákban fordulhatnak elõ:
Double: dupla pontosságú lebegõpontos érték, +/-4.94065645841247E-324-tõl +/-8.9884656743115E307-ig (8 byte)
Float: ugyanaz, mint a Numeric
General: referencia OLE objektumra (4 byte)
Integer: egész érték, -2147483647-tõl 2147483647-ig (4 byte)
Memo: referencia adatblokkra (4 byte)
A string és a dátumi ill. numerikus típusok közötti konvertálásra vannak beépített függvények.
Felsorolási és pointer típusok nincsenek a nyelvben, és altípusok képzését sem támogatja.
Memóriában tárolt rekord típusú objektumokat nem definiálhatunk, azonban az adattáblák sorai rekordok. Ezek szerkezetét a Table Designer segítségével adhatjuk meg. Unió típus definiálására nincs lehetõség.
A nyelv egy illetve két dimenziós tömbök létrehozását támogatja a DECLARE és DIMENSION parancsokkal (ugyanazt jelentik).
Attól függõen, hogy egy vagy két méretet adunk meg egy változónévnek kerek zárójelek között, egy vagy két dimenziós tömböt kapunk.
A tömbök tudják a méretüket, és dinamikusan változtathatók is. A tömbök kezelésére a nyelv számos beépített függvényt és parancsot nyújt, ezek egy része az adattáblák és a tömbök közötti adatátvitelt valósítja meg:
ALEN(), AINS(), ADEL(), ACOPY(), AFIELDS(), AELEMENT(), ASUBSCRIPT(), ASCAN(), ASORT(), GATHER(), SCATTER(), COPY TO ARRAY... stb.
A tömbök indexelése 1-tõl a méretéig lehetséges.
Mivel a nyelv nem típusos, a tömbelemek tetszõleges értékek lehetnek.

Pszeudofüggvények és konstansok

dBase:

Memóriaváltozók esetén, az egyes változókra való &memóriaváltozó_név formájú hivatkozás lényegében makróhívásként értékelődik ki.
Az & funkció működik karakterláncok belsejében - határolójelek között- is.
arucikk='toltotoll' ?"ezek &arucikk.ak"
Ha felhasználói kimenetet szeretnénk írni parancs hatására:
"ezek toltotollak"
jelenik meg a képernyőn.
Ilyen estben a '.' karakterrel tudjuk megadni a '&' funkció részére a memóriaváltozó nevének végét, utána újra normál karakterek következhetnek.

Clipper:

Felhasználó által definiált parancs- vagy fordítási direktíva specifikálása.
#command  < átírásrakerülõ rész >  => < átalakított alak > vagy #translate   <átírásra kerülõ rész >  => < átalakított alak >

A#command és a #translate között a különbség annyi, hogy a #command direktíva az illesztést csak teljes utasítás esetén végzi el, míg a #translate részutasítások esetében is.

A #command és a #translate hatóköre megegyezik a #define hatókörével: a definíció csak az aktuális program (.prg) állományban érvényes a megadás helyétõl az állomány végéig, kivéve, ha a definiálás az STD.CH-ban történt, vagy ha a fordítási parancshoz a /U paramétert is megadtuk. A #define-nal ellentétben, sem a #command sem a #translate definíciót nem lehet explicit módon definiálatlanul hagyni, és az #undef direktíva sincs hatással rájuk.

Konstanshozzárendelés vagy pszeudo-függvény definiálása.
#define < konstansazonosító> [ < helyettesítõ szöveg > ] vagy #define < függvényazonosító >( [ < argumentumlista > ] ) [ < kifejezés > ]

Megjegyzés: a#define különbséget tesz a kis- és nagybetûk között, ellentétben a #command és a #translate azonosítóival.

A #define direktíva alapvetõ felhasználási területei:
Fordítási hiba generálása és üzenet megjelenítése.
#error [<üzenet>]
Programrész fordítása definiált azonosító esetén.
#ifdef <azonosító> <utasítások> [#else] <utasítások> [#endif] Az #ifdef...#endif segítségével hajtható végre, az úgynevezett feltételes fordítás. Segítségével meghatározható, hogy a program melyik része legyen lefordítva. A vizsgált azonosítót vagy a #define direktívával, vagy a fordítóprogram /D paraméterével definiálhatjuk.
Programrész fordítása nem definiált azonosító esetén.
#ifndef < azonosító > < utasítások > [ #else ] < utasítások > [ #endif ]
Az aktuális állomány kiegészítése egy másik állománnyal.
#include " < kapcsolódó állomány neve > " Ha elérési útvonalat nem adunk meg, akkor az elõfordító a keresést a következõ helyeken és sorrendben végzi: Az #include direktívák 16 szint mélységig ágyazhatók egymásba.
A #define makródefiniálás megszüntetése.
#undef < azonosító >

FoxPro:

Az alábbi direktívák a Clipperhez hasonlóan használhatók:

#DEFINE ... #UNDEF #IF ... #ENDIF #IFDEF | #IFNDEF ... #ENDIF #INCLUDE A fentieken kívül az alábbi két új lehetõség van a FoxProban: #INSERT < filename > -> Behelyez egy textfájlt egy generált menüfájlba #NAME   < name > -> Képernyõ- és menügeneráló direktíva

Változók

Általánosan:

Változók bárhol deklarálhatók a programban, egyszerűen azzal, hogy értéket adunk neki.
Egy változónak nincs fix típusa, ezért mindig olyan típusú, amilyen értéket utoljára kapott, tehát egy változó típusa változhat a program futása közben.

dBase:

A dBase kétféle változót különböztet meg:
  1. Nyitott adatbázis összes mezője (kivéve a memo típusúakat) Meződefiníció részei:

    Mezőnév:

    • legfeljebb 10 karakter hosszú
    • betűvel kezdődik
    • betűt, számjegyet és '_'-t tartalmazhat
    • nincs más konvenció, így foglalt szavak sincsenek!

    Mezőtípus: (a definiáláskor egyetlen betű)

    • C = karakteres
    • N = numerikus
    • D = datum
    • L = logikai
    • M = "memo"

    Mezőszélesség:

    Mezőben tárolni kívánt karakterek vagy számjegyek száma.
    Numerikus esetben a tizedespont és a tizedesjegyek is beleszámítandók, és külön meg kell adni, hogy ebből hány karaktert is szánunk a tizedesjegyeknek.
    A többi típus esetén a méret kötött, nem változtatható, így magadása sem kötelező.
  2. Memóriaváltozók:
    Ha egy vátozó neve megegyezik egy, az aktuális adatbázis-állomány egy mezőjének nevével, akkor e név beírása mindig a mezőre vonatkozik!
    pl.: datum nevű változó és megyegyező nevű mező eseténesetén:
    • datum: a mezőre hivatkozik
    • m-> datum: a változóra hivatkozik.
    Egyszerre legfeljebb 256 memóriaváltozó lehet, és ezek összes tárigénye nem haladhatja meg a 6000 byte-ot!
    Memóriaváltozók láthatósága:
    1. Lokális deklaráció:
      PRIVATE < mem. vált.-lista> a program lefutása után autómatikusan megszűnnek
    2. Globális deklaráció: PUBLIC < mem. vált.-lista > a program befejezése után is lekérdezhetőek!!
    Memória változó megszüntetése:
    • RELEASE
    • CLEAR MEMORY
    Finomság: PRIVATE ALL [LIKE |EXCEPT] < mem. vált nv >
    A parancs hatására a megfelelő nevű váltázók mind lokálisan jönnek létre. Ezáltal lokális tulajdonságúvá tehetünk egy felsőbb szinten már lérehozott változót is ;)

Clipper:

A nyelv sok standard szót definiál, ezek használhatók változónevekként is.
A változónevek nem kis-nagybetû érzékenyek.
Változót "deklarálhatok" a következõ utasításokkal:

FoxPro:

Használhatók a Clipper lehetõségei, valamint bevezettek egy új deklarációt:
REGIONAL: Olyan változót deklarál melynek élettartama az adott régió, tehát a régió végén megszûnik. (A régió egy eljárás egy része.)

Operátorok

dBase:

Karakteres típusokra:
'+' 
konkatenáció
'-' 
konkatenáció, a két karakterlánc közti szóközök a lánc végére kerülnek
'$' 
részkarakterlánc keresése
AT ( Kkif1 , Kkif2 ) 
visszaadja azt a pozíciót, ahonnan kezdve kif1 eloször elofordul a kif2-ben
LOWER ( Kkif )
a karakterlánc kisbetussé alakítása
UPPER ( Kkif ) 
a karakterlánc nagybetussé alakítása
LEFT ( Kkif , Nkif ) 
a Kkif karakterlánc elejérol Nkif számú karakter kiemelése
RIGHT ( KKif1 , NKif ) 
a Kkif karakterlánc végérol Nkif számú karakter kiemelése
SPACE ( N ) 
N hosszúságú, szóközökkel feltöltött karakterlánc
LTRIM ( Kkif ) 
vezeto (a Kkif elején álló) szóközök levágása a karakterláncról
RTRIM ( Kkif ) 
követo (a Kkif végén álló) szóközök levágása a karakterláncról
STUFF ( Kkif2 , poz , hossz , KKif2 ) 
a Kkif1 karakterlánc, poz helyen kezdodo, hossz hosszúságú részkarakterláncának kicserélése a Kkif2 karakterláncra
SUBSTR ( Kkif , poz , [ hossz ] ) 
a Kkif karakterlánc poz helyen kezdodo, megadható hosszúságú ([hossz]) részkarakterláncának kiválasztása
TRANSFORM( kif , maszk )
adottformátumú mejelenítése a kif-nek
REPLICATE( Kkif , N )
adot KKif N-szer való ismétlése
Numerikus típus:
'=' 
értékadás és egyenloségvizsgálat, a környezettol függoen
'<' 
kisebb, mint
'>' 
nagyobb, mint
'<=' 
kisebb vagy egyenlo, mint
'>=' 
nagyobb vagy egyenlo, mint
'#' vagy '<>' 
nem egyenlo
'-' 
kivonás
'+' 
összeadás
'**' vagy '^' 
hatványozás
'*' 
szorzás
'/' 
osztás
'()'
csoportosítás
ABS (N ) 
abszolút érték
EXP ( N ) 
exponenciális (e^N)
INT ( N ) 
egészrész
LOG ( N ) 
e alapú logaritmus
MAX ( N1 , N2 ) 
a két kifejezés maximuma
MIN ( N1 , N2 ) 
a két kifejezés minimuma
MOD ( N1 ,N2 ) 
a két kifejezés osztási maradéka
ROUND ( Nkif ,n ) 
n darab tizedesjegyre kerekítés (n<0 esetén az egész helyiértékekre kerekít)
SQRT ( N ) 
négyzetgyökvonás
A műveletek eredményképzésére általános szabály nincs.
Dátum típus:

Minden, a numerikus típusnál felsorolt összehasonlító muvelet és az értékadás használható.

DATE() 
az aktuális dátum, a DATE környezeti paraméter által meghatározott formátumban
CDOW ( < Dkif > ) 
a hét napjának megnevezése
CMONTH ( < Dkif > ) 
a naptári hónap megnevezése
DAY () 
a hónap napja számmal
DOW ( < Dkif > ) 
a hét napja számmal
MONTH ( < Dkif > ) 
az év hónapja számmal
TIME () 
az eperációs rendszer ideje
YEAR ( < Dkif > ) 
a < Dkif > évszáma évszázaddal

Logikai típus:
'.NOT.' 
negáció
'.AND.' 
logikai ÉS
'.OR.' 
logikai VAGY
'.XOR.' 
logikai KIZÁRÓ VAGY (csak FoxPro, Clipper, illetve a dBase IV. és késõbbi verziók)

Clipper:

A fentieken kívül a Clipperben a következõ új és kibõvített funkciójú operátorok jelentek meg:

Karakteres típus:

A fix hosszúságú értékek tárolására a karakteres változókat alkalmazzuk.
A változók egyes karakterei a CHR(32)-CHR(126), valamint CHR(128)-CHR(255), illetve a CHR(0) értékeket tartalmazhatják.

A karakteres változók értékét aposztrófok, idézõjelek vagy szögletes zárójelek között kell megadni.
A karakteres változó nulla értéke a két határolójel egymás utáni megadása jelenti.

= :
összehasonlítás egyezõség szerint
= = :
összehasonlítás a teljes azonosság szerint
!= , <> vagy #:
összehasonlítás a nem egyezés szerint
< :
összehasonlítás a kisebb érték szerint
<= :
a kisebb vagy egyenlõ érték
> :
összehasonlítás a nagyobb érték szerint
>= :
a nagyobb vagy egyenlõ érték
= vagy STORE :
értékadás
:=  :
azonnali (in-line) értékadás
+= :
azonnali összekapcsolás (+) és értékadás
-= :
azonnali összekapcsolás (-) és értékadás
$ :
részkaraktersorozat keresése (mi miben)
REPLACE:
mezõérték átírása
ALLTRIM:
szóközök levágása elölrõl és hátulról
ASC:
az ASCII kód meghatározása
CTOD:
dátumtípusra konvertálás
EMPTY:
üres érték vizsgálata
LEN:
a karaktersorozat hossza
PADC:
középre igazítás
PADL:
jobbra igazítás (feltöltés balról)
PADR:
balra igazítás (feltöltés jobbról)
SPACE:
üres karaktersorozat létrehozása
VAL:
numerikus típusra konvertálás
Numerikus típus:

Numerikus típusúnak azokat az adatokat definiáljuk, melyekkel matematikai mûveleteket kívánunk végezni.

A Clipper a numerikus adattípusban a számjegyeket, a tizedes pontot, valamint a plusz és a mínusz elõjelet engedi meg.
A Clipper a numerikus értékeket az IEEE szabvány szerinti duplapontosságú lebegõpontos formátumban tárolja a megengedett 10^(-308) és 10^(308) közötti tartományban. A pontosság 16 értékes tizedesjegy, a numerikus értékek képernyõn történõ megjelenítése 32 jegyig lehetséges.
A 32-nél több jegybõl álló számok megjelenítése explicit módon történik: a 16 értékes tizedesjegy és a 10 megfelelõ hatványkitevõjének megadásával.

Fontos: A karakteres változókkal ellentétben a numerikus típusú változókat nem kell határolójelek közé tenni. Ha mégis így teszünk, akkor karakteres típusként veszi figyelembe.

% :
modulo
++ :
növelés
-- :
csökkentés
= vagy = = :
egyenlõség vizsgálata
!= :
nem egyenlõ
STORE :
értékadás
:= :
azonnali (in-line) értékadás
+= :
azonnali összeadás és értékadás
-= :
azonnali kivonás és értékadás
*= :
azonnali szorzás és értékadás
/= :
azonnali osztás és értékadás
**= vagy ^= :
azonnali hatványozás és értékadás
%= :
azonnali moduloképzés és értékadás
REPLACE :
a mezõérték módosítása
CHR :
az ASCII érték karakteresre konvertálása
EMPTY :
a nulla érték ellenõrzése
STR :
karakteresre konvertálás
Dátum típus:

A dátum típusú változókkal egy naptári dátum azonosítható. Az alapértelmezés az amerikai dátumforma: hh/nn/[cc]ee. A dátumbeli elválasztójelek a SET DATE paranccsal állíthatók be, illetve változtathatók. A Clipper minden helyes dátumot elfogad 0100.01.01. és 2999.12.31. között, illetve értelmezi az üres dátumkifejezést is. A rendezés kronologikus a dátumformától függetlenül. A dátumtípusú változókkal történõ számolásokhoz a dátumkifejezést numerikus formára kell konvertálni a CTOD() függvénnyel. A zárójelen belüli dátumot idézõjelek, aposztrófok vagy szögletes zárójelek közé kell tenni.

EMPTY():
üres érték vizsgálata
DAY():
a nap sorszámának meghatározása
MONTH():
a hónap sorszámának meghatározása
YEAR():
az év meghatározása (beleértve az évszázadot is)
DOW():
a nap sorszáma a héten belül
CDOW():
a hét napjának szöveges meghatározása (angolul)
CMONTH():
a hónap szöveges meghatározása (angolul)
Logikai típus:

Logikai típusú az az adat, amely a Boole-algebra szerinti értéket hordoz, ami lehet: igaz, hamis; igen, nem vagy on, off.
Ezeknek megfelelõen az értékek valamelyike lehet: igaz - y, Y, t, T; vagy hamis - n, N, f, F.

Rendezéskor a hamis érték mindig kisebb mint az igaz érték.

= vagy = =:
egyenlõség vizsgálata
!=, <> vagy # :
nem egyenlõség vizsgálata.
Memo típus:

A memo változók lényegében változó hosszúságú karakteres adatok.

A memo mezõk az adatbázishoz kapcsolódnak, abból 10 karaktert foglalnak el. Ezt pointerként használják az aktuális adat eléréséhez, amely egy .dbt állományban helyezkedik el.
Mivel a memo mezõk lényegében karakteres mezõk, így rájuk a karakteres mezõkre vonatkozó elõírások érvényesek, például hosszuk 65535 karakter lehet, két memo mezõ összehasonlítása is a karakteres típusnál ismertetett módon megy végbe, illetve alkalmazható az összes karakteres mûvelet.

Mivel memo típusú csak mezõ lehet, ezért karaktersorozatos megfelelõje nincs.
Ugyanakkor karaktersorozat, mint érték megadható egy REPLACE paranccsal a memo mezõ számára.

HARDCR :
a lágy kocsivissza jel (CR) keményre cserélése
MEMOEDIT :
tartalom szerkesztése
MEMOLINE :
a szöveg egy sorának kiemelése
MEMOREAD :
olvasás egy lemezállományból
MEMOTRAN :
a CR-jelek kihagyása
MEMOWRIT :
lemezre írás
MLCOUNT :
sorok számlálása
MLPOS :
sorpozíció meghatározása
NIL adattípus:

A NIL az 5.0 verzióban bevezetett új típus.

Szükségességét az indokolta, hogy a nem deklarált adatok ne vezessenek hibajelzéshez.

Tetszõleges adattípus esetén alkalmazható, formája: NIL. Változó deklarálásakor automatikusan megkapja ezt az értéket.

= vagy == :
egyezõség vizsgálata
!= , <> vagy # :
nem-egyezõség vizsgálata
< :
összehasonlítás kisebb érték szerint
<= :
a kisebb vagy egyenlõ érték
> :
összehasonlítás nagyobb érték szerint
>= :
a nagyobb vagy egyenlõ érték
= vagy STORE :
értékadás
:= :
azonnali (in-line) értékadás egy nem mezõ változónak
EMPTY:
a NIL érték vizsgálata
A kódblokk:

A Clipper 5.0 egy teljesen új - adattípusok közé sorolható - eleme.

Lényegében a futtatható program egy részének áthelyezése egy másik helyre.
Felfogható úgy is, mint egy név nélküli függvényértékadás, mivel a Clipper a kódblokkot értékként kezeli.

A kódblokkok nagyon hasonlóak a makrókhoz, de lényeges különbség van köztük. A makrók olyan karaktersorozatok, melyek futás ideje alatt jönnek létre, míg a kódblokkok a fordítás ideje alatt.

A kódblokkok jóval rugalmasabbak, és hatékonyabbak, hiszen például makróval nem lehet static vagy local változó értékét illetve paraméterértéket továbbítani.
Definiálása:
{ | [ < argumentumlista > ] | < kifejezéslista > }
ahol az argumentumlista használata és szabályai megegyeznek a függvények és eljárások argumentumlistájánál írtakka,
a kifejezéseknek helyes Clipper kifejezéseknek kell lenniük, és nem tartalmazhatnak deklarációs vagy ciklus utasításokat.

A kódblokkot közrezáró függõleges vonalból mindig egy párnak kell lennie, ellenkezõ esetben a Clipper a kapcsos zárójelek között megadottakat tömbnek adott értékadásnak tekinti.

= :
értékadás
= :
azonnali (in-line) értékadás
AEVAL :
tömbelemek blokkba másolása
DBEVAL :
munkaterület rekordjainak blokkba másolása
EVAL :
értékmeghatározás kódblokk segítségével

A kódblokkok lényegében egysoros függvénynek is felfoghatók.
Használatuk az EVAL() függvénnyel lehetséges, ebben két paramétert kell megadni: az elsõ a blokk neve, a második a bemeneti érték.
A visszaadott érték a kódblokk szerinti érték.
Például:

kodblokk := { |ertek| ertek + 17 } ? EVAL(kodblokk, 13) //Eredmény: 30

A kódblokkok hatóköre arra a függvényre vagy eljárásra terjed ki, amelyben azt létrehozták.

A kódblokk olyan speciális adattípus, amely végrehajtható programkódot tartalmaz. Kiválóan alkalmazható olyan "fekete doboz" függvények esetében, amelyeknél nem tudjuk a visszaadott érték típusát meghatározni.

A kódblokkok nem írhatók át direkt módon adatbázisba.
Ha egy kódblokkot adatbázisba kívánunk helyezni, hogy késõbb fel tudjuk használni az értékét, akkor a következõ módon járhatunk el:

 USE Sue NEW 
/* Egy karakteres mezõ feltöltése a kódblokkot hordozó karaktersorozattal */
APPEND BLANK
REPLACE blokkmezo WITH "{|| Ertek()}"
...
// A blokk felhasználása egy késõbbi alkalommal
sajatblokk := &(blokkmezo)
EVAL(sajatblokk)

Megjegyzés: A fenti példában nem alkalmazhattuk egy lépésben az EVAL ( & ( blokkmezo ) ) formát, mivel a fordító egyszerre csak egy fordítási lépést hajt végre, ezért ez nem vezetne helyes eredményre.

A tömb:

Tömbnek nevezzük az azonos nevû változók együttesét, melynek elemeit indexeikkel érhetjük el.

Az egyes elemek tetszõleges adattípusúak lehetnek - a memo típus kivételével, amely egy különleges mezõtípusnak számít.

Az elemek egy tömbön belül eltérõ típusúak is lehetnek, elemként tartalmazhatnak másik tömböt, vagy kódblokkot is.

A tömbök egy azonosítóból és az ezt követõ szögletes zárójelek közé írt egy vagy több számból állnak.
A szögletes zárójel a tömbdefiníció része, kötelezõ megadni!

A tömbnek legalább egy dimenzióval kell rendelkeznie.

A többdimenziós tömbök kétféleképpen adhatók meg:

< azonosító > [ < elem1 > , < elem2 > , ... ]
< azonosító > [ < elem1 > ] [ < elem2 > ] ...

A dimenziók mérete dinamikusan deklarálható.

Egy tömb létrehozható az ARRAY, DBSTRUCT, DIRECTORY függvények segítségével is.

A tömbelemek címzése a tömb nevével és indexével történik, ugyanakkor mind a név, mind az index helyén állhat olyan kifejezés, amely a megfelelõ azonosítást biztosítja.

A tömbök elemei számára egyidejûleg értéket csak a deklaráláskor tudunk adni (egyidejûleg ekkor is csak NIL értéket), illetve ehhez a megfelelõ függvényeket kell alkalmazni.

A speciális tömbkezelõ függvények közül az ARRAY() a NIL értékkel, a DBSTRUCT() az adatbázis szerkezetével, a DIRECTORY() a lemezkönyvtár információival tölti fel (a létrehozással egyidejûleg) a tömbelemeket.

Az AFILL() függvény segítségével a teljes tömb, vagy annak megadott részei kaphatnak egyidejûleg értéket, például az elsõ tíz elem az 1, a második tíz elem a 2 értéket kapja:

AFILL(tomb, 1, 1, 10)
AFILL(tomb, 2, 11, 10)

A tömbök - nevükkel való hivatkozással - függvényargumentumként szerepeltethetõk, illetve azok visszaadott értékei lehetnek.

A tömbök mérete menet közben növelhetõ és csökkenthetõ az ASIZE() függvénnyel. A tömbméretének növelését eredményezi az AADD() függvény is, ezzel elem adható a tömb végéhez.

A tömbök mérete meghatározható a LEN() függvény segítségével.
Többdimenziós tömb esetén a függvény az elsõ index szerinti értéket adja vissza (ennek az a magyarázata, hogy a többdimenziós tömböket a Clipper "altömbökként" kezeli, ezért ha a következõ dimenzió méretére vagyunk kíváncsiak, akkor az elsõ elemre hivatkozással kérdezzük le a hosszt).

Két tömb összehasonlítása az == operátorral lehetséges.
Ugyanakkor ezzel a módszerrel két tömb csak akkor bizonyul azonosnak, ha a memóriában azonos címen találhatók.
(Az = operator nem alkalmazható tömbök összehasonlítására)

Tömbelem beszúrását az ADEL illetve az AINS függvényekkel végezhetjük el.
Az elõbbi úgy törli a megadott indexû elemet, hogy minden elemet egyel balra tol, az utolsó elem pedig a NIL értéket veszi fel.
Az AINS pedig a megadott helyre beszúr egy NIL értékû elemet, az utolsó elem pedig elvész.

Az elemek az ACOPY függvénnyel másolhatók illetve az ACLONE függvénnyel duplikálhatók. Az elõbbi a tömb elemeinek értékét másolja másik tömbbe, míg az utóbbi a meglévõ tömb egészérõl készít másolatot.

ASORT(): ezzel a függvénnyel a tömb összes eleme, vagy annak meghatározott része nagyság szerint sorbarendezhetõ. ASCAN(): tömbelemek értéke szerinti keresés. (kis és nagybetûk között különbséget tesz)

FoxPro:

A Foxproban használhatók a DBase lehetõségei.