Systémové funkce
Význam systémových funkcí
V
mnoha programech existují postupy, které se často opakují. Definování těchto
postupů, jako zvláštních funkcí, redukuje rozměry a složitost programu.
Ve FoxPro navíc zvyšuje rychlost průběhu programu. Funkce se dělí na systémové
(předdefinované výrobcem systému) a uživatelské, definované programátorem.
Definování uživatelských funkcí překračuje rozsah těchto skript. Ze systémových
je zde uveden pouze výběr těch nejčastěji používaných funkcí.
Znakové funkce
LEN(<výrazC>)
Funkce vrátí délku zadaného
řetězce <výrazC>. Jestliže je <výrazC> prázdný řetězec, vrátí
funkce hodnotu nula. Pokud je jako <výrazC> zadáno jméno memo položky,
vrátí funkce její délku.
? LEN("VA BRNO")
7
a='
'
b=''
? LEN(a)
5
? LEN(b)
0
REPLICATE(<výrazC>, <výrazN>)
Funkce vrátí řetězec, ve
kterém se <výrazN>-krát opakuje posloupnost znaků <výrazC>. K
vytváření řetězců mezer byla vytvořena (vynecháním prvního parametru)
zjednodušená verze této funkce, nazvaná:
SPACE(<výrazN>)
Funkce vrací řetězec vytvořený
z <výrazN> mezer.
? REPLICATE('*',15)
***************
? REPLICATE("VA Brno ",3)
VA Brno VA Brno VA Brno
a=SPACE(15)
?len(a)
15
AT (<výrazC1>, <výrazC2> [,<výrazN>])
nebo
ATC(<výrazC1>, <výrazC2> [,<výrazN>])
Funkce hledají řetězec
<výrazC1> v řetězci <výrazC2> s tím rozdílem, že ATC() nebere
v úvahu rozdíly mezi velkými a malými písmeny. Vrací celé číslo, které
představuje pozici prvního výskytu ve <výrazC1> z levé strany. Když
<výrazC1> není nalezen, vrátí funkce nulu. Nepovinný parametr <výrazN>
určuje vyhledání <výrazN>-tého výskytu <výrazC1> ve <výrazC2>.
Pro diakritické znaky různé velikosti funkce ATC() pracuje zdánlivě
nelogicky. Problém se řeší pomocí funkce SYS(15). Analogickou k nim je
funkce:
RAT(<výrazC1>, <výrazC2> [,<výrazN>])
Funkce hledá řetězec <výrazC1>
v řetězci <výrazC2> počínaje zprava (odzadu). Vrací celé číslo,
které představuje pozici posledního výskytu <výrazC1>. Nepovinný
parametr <výrazN> určuje, že má být vyhledán <výrazN>-tý výskyt
<výrazC1> od konce. Pokud <výrazC1> není nalezen, vrátí funkce
nulu.
?AT('b','abcabc',2)
5
?ATC('b','abcěščé')
2
?ATC('B','abcdeé')
2
?ATC('á','abcěšáíé')
&& á patří do oblasti rozšířeného ASCII kódu
6
?ATC('Á',abcěšáíé')
&& Á patří do oblasti rozšířeného ASCII kódu
0
? RAT("Br","VA
Brno") &&
pozor, pozice se počítají vždy zleva
4
? RAT("br","brbr")
3
STUFF (<výrazC1>, <výrazN1>, <výrazN2>,
<výrazC2>)
Funkce nahradí část řetězce
<výrazC1> podřetězcem <výrazC2>. Parametr <výrazN1> určuje
počáteční pozici a <výrazN2> počet znaků nahrazovaného podřetězce.
Funkci lze použít také pro:
a)
mazání znaků z řetězce - v případě, že bude zadán <výrazC2>
jako prázdný řetězec
b)
vkládání znaků - v případě, že <výrazN2> bude nulový.
text = "Učební texty školy VA Brno"
? STUFF(text,1,7,"")
&& zkrácení zleva o 7 znaků
texty školy VA Brno
? STUFF(text,len(text)-7,7,"")
&& zkrácení zprava o 7 znaků
Učební texty školy
? STUFF(text,0,0,"*******")
&& prodloužení zleva o 7 znaků
*******Učební texty školy VA Brno
? STUFF(text,len(text),0,"*******")
&& prodloužení zprava o
7 znaků
Učební texty školy VA Brno*******
? STUFF(text,14,0,"a příručky ")
&& vložení znaků
Učební texty a příručky školy VA Brno
? STUFF(text,14,6,"")
&& vymazání znaků
Učební texty VA
Brno
? STUFF(text,1,12,"Příručky")
&& náhrada znaků
Příručky školy VA Brno
SUBSTR(<výrazC>, <výrazN1> [,<výrazN2>])
Funkce vrátí podřetězec
<výrazC>. Parametr <výrazN1> určuje počáteční pozici vybíraného
podřetězce, <výrazN2> znamená jeho délku. Pokud je nepovinný
parametr <výrazN2> vynechán, vrátí funkce celou zbývající část řetězce.
? SUBSTR("VA BRNO",4,1)
B
? SUBSTR("VA BRNO",4)
BRNO
Pravostranné a levostranné
mezery znakového řetězce se nazývají nadbytečné mezery. Nejčastěji
vznikají uložením řetězců do položek (s pevnou délkou). Odstranění
nadbytečných mezer je nezbytným předpokladem pro porovnávání řetězců i
vyhledávání podřetězců. Funkce uvedené v tomto odstavci odstraňují
pravostranné a levostranné mezery. Neruší mezery uvnitř řetězce.
Pravostrané mezery z řetězce
<výrazC> odstraňují funkce:
TRIM (<výrazC>)
RTRIM(<výrazC>)
Levostrané mezery z řetězce
<výrazC> odstraňuje funkce:
LTRIM (<výrazC>)
Pravostrané i levostranné
mezery z řetězce <výrazC> odstraňuje funkce:
ALLTRIM(<výrazC>)
skola = "VA "
misto = "Brno"
? skola + misto
VA Brno
? TRIM(skola)+" "+misto
VA Brno
a = 'VA Brno'
?LTRIM(a)
VA Brno
A = ALLTRIM(' AB CD ')
? LEN(A)
&& po odstranění okrajových mezer má řetězec délku:
5
&& znaků
Při porovnávání neúplných
řetězců se používá funkce:
LIKE(<výrazC1>, <výrazC2>)
Funkce porovnává <výrazC1>
a <výrazC2>, přičemž <výrazC1> může obsahovat znaky ? a *
( tak zvané wild cards), které zastupují libovolný znak (?), nebo
skupinu libovolných znaků (*). Pokud si výrazy odpovídají, funkce vrátí
hodnotu .T.
? LIKE( '?b?','abc')
.T.
? LIKE( '?b','abc')
.F.
? LIKE( '?b?','xby')
.T.
? LIKE( '?b?','bca')
.F.
? LIKE( '*b*','Abraham')
.T.
CHR(<výrazN>)
Funkce vrátí znak, jehož
číselný ASCII kód je roven hodnotě <výrazN>. Funkce může být např.
používána pro zobrazení neklávesnicových znaků na monitoru, případně
pro posílání řídících znaků na tiskárnu. Inverzní k ní je funkce:
ASC(<výrazC>)
Funkce vrátí numerickou
hodnotu ASCII kódu prvního (nejvíce levého) znaku řetězce <výrazC>.
? CHR(68)
D
? CHR(100)
d
? ASC("VA Brno")
86
Převod řetězce na číslo a čísla
na řetězec
Řetězec
na číslo lze převést pouze když obsahuje číselnou hodnotu. Jinak se převede
na číslo pouze po první nečíselný znak zleva. Číselné znaky jsou: číslice,
znaménka před první číslicí, desetinná tečka a písmeno E nebo e, pokud
řetězec má tvar konstanty typu Numeric nebo Float.
VAL(<výrazC>)
Funkce převede řetězec číslic
<výrazC> na odpovídající numerickou hodnotu.
Inverzní funkcí k VAL() je:
STR(<výrazN1> [,<výrazN2> [,<výrazN3>]])
Funkce převede <výrazN1>
na řetězec. Nepovinný parametr <výrazN2> určuje délku vystupujícího
řetězce. Dalším nepovinným parametrem <výrazN3> lze ovlivnit počet
desetinných míst. Pokud je zadán <výrazN2> větší než počet číslic
<výrazN1>, doplní funkce řetězec o nadbytečné mezery. Jestliže je
<výrazN2> tak malý, že nepostačí k zobrazení čísla, bude vrácený
řetězec obsahovat znaky * (tzv. přetečení - overflow).
t = "33.12"
? VAL(t) + 1
34.12
t = "-33.12E2"
? VAL(t)
-3312.00
? VAL('123e12')
.123E+15
? VAL('123f12')
123.00
cislo = 2245.32
? STR(cislo,9,4)
2245.3200
? STR(cislo,3,1)
***
Numerické funkce
ABS(<výrazN>)
Funkce vrátí absolutní
hodnotu numerického výrazu. Naopak, uchování znaménka se zajišťuje funkcí:
SIGN(<výrazN>)
Funkce vrátí celočíselnou
hodnotu 1, -1 nebo 0 v závislosti na hodnotě <výrazN>. Pokud je <výrazN>
kladné číslo, vrátí 1, pokud je záporné, vrátí -1. Jestliže je <výrazN>
nulový, vrátí funkce nulu.
? ABS(20 - 30)
10
? SIGN(10 - 30)
-1
? SIGN(30 - 10)
1
? SIGN(30 - 30)
0
SQRT(<výrazN>)
Funkce vypočte druhou
odmocninu z nezáporného <výrazN>.
SET
DECIMALS TO 3
&& příkaz nastaví zobrazování mezivýsledků na požadovaný počet desetinných míst
? SQRT(2)
1.414
INT(<výrazN>)
Funkce vrátí celočíselnou
část zadaného <výrazN>.
? INT(-12.6)
-12.00
MOD(<výrazN1>, <výrazN2>)
Funkce vrátí zbytek po dělení
<výrazN1>/<výrazN2>. Jestliže má <výrazN2> zápornou
hodnotu, vrátí funkce rovněž zápornou hodnotu.
? mod(4*9,90/9)
6.00
ROUND(<výrazN1>, <výrazN2>)
Funkce vrátí <výrazN1>
zaokrouhlený na <výrazN2> desetinných míst. Pokud je hodnota <výrazN2>
záporné číslo, bude <výrazN1> zaokrouhlen na desítky, stovky,
...atd., viz příklad. Zaokrouhlování a zobrazování desetinných míst jsou
dva různé pojmy!
? ROUND(4321.1234,0)
4321.0000
? ROUND(4321.6234,0)
4322.0000
? ROUND(4321.1234,2)
4321.1200
? ROUND(4321.1234,-2)
4300.0000
LOG(<výrazN>)
Funkce vrátí přirozený
logaritmus. ( Argument musí být větší než nula.) Inverzní k funkci
LOG() je funkce exponenciální:
EXP(<výrazN>)
Funkce vrátí hodnotu ex
pro x=<výrazN>.
? LOG(1)
0.00
? LOG(EXP(2))
2.00
? EXP(0)
1.00
? EXP(LOG(2))
2.00
PI()
Funkce vrátí ludolfovo číslo
s přesností na 15 platných cifer.
obvod = 2*PI()*R
DTOR(<výrazN>)
Funkce převede úhel <výrazN>
ze stupňů na radiány. Mnemotechnika: Degrees TO Radians. Inverzní funkcí
je:
RTOD(<výrazN>)
Funkce převede úhel <výrazN>
z radiánů na stupně. Mnemotechnika: Radians TO Degrees. Následující funkce
jsou trigonometrické. <VýrazN> je velikost úhlu v radiánech (libovolné
hodnoty).
SIN(<výrazN>) .. ASIN(<výrazN>)
COS(<výrazN>) .. ACOS(<výrazN>)
TAN(<výrazN>) .. ATAN(<výrazN>)
? DTOR(RTOD(45))
45.00
? SIN(ASIN(90))
90.00
? SIN(DTOR(90))
45.00
? ACOS(1)
0.00
? ATAN(1)
0.79
1.00
RAND([<výrazN>])
Funkce vrátí náhodné číslo
v rozmezí 0 až 1. Použitím nepovinného parametru lze určit výchozí
funkci pro pseudonáhodné generování. Zadání téhož parametru <výrazN>
způsobí generování stejných posloupností náhodných čísel. Jestliže je
<výrazN> zadán jako záporné číslo, bude výchozí bod stanoven ze
systémového času, výsledná hodnota tedy bude mít maximální míru náhodnosti.
? RAND ()
0.25
Funkce času
DATE()
Funkce vrátí aktuální
systémové datum.
DTOS(<výrazD>)
Funkce převede datum <výrazD>
na řetězec ve tvaru yyyymmdd. (Jako funkce DTOC s parametrem 1.) Používá se
pro indexování databáze s datumovým indexovým klíčem. Nastavení příkazů
SET DATE a SET CENTURY neovlivňuje formát řetězce.
DOW(<výrazD>)
Funkce vrátí numericky číslo
dne v týdnu, který odpovídá zadanému <výrazD>. 1 = neděle, 2 = pondělí
... 7 = sobota. Funkce umožní, podle seznamu názvů dnů, zobrazovat dny v národním
jazyku.
DAY(<výrazD>)
Funkce vrátí číslo dne
odpovídající datu <výrazD>. Obdobně funkce:
MONTH(<výrazD>)
Funkce vrátí číslo měsíce.
YEAR(<výrazD>)
Funkce vrátí numericky rok
odpovídající <výrazD>. Rok je uveden včetně století, bez ohledu na
nastavení SET CENTURY.
DTOC(<výrazD>)
Funkce vrátí datum převedený
na řetězec. Používá se na spojování data s textem.
SET DATE TO GERMAN
? DATE()
08.09.91
? DAY({15.9.91})
15
? YEAR(DATE())
1991
Příklad zobrazení českého
názvu měsíce pomocí funkce MONTH(). Z didaktických důvodů je původní
výraz rozepsán do více výrazů
m=",leden,únor,březen,duben,květen,červen,"+;
"červenec,srpen,září,říjen,listopad,prosinec"
d=month({23.09.91})
&& záměrně zvolená konstanta
od=at(',',m,d)+1
&& pozice čárky před názvem měsíce
po=at(',',m,d+1)
&& pozice čárky za názvem měsíce
delka=po-od
&& počet znaků názvu měsíce
? SUBSTR(M,od,delka)
&& extrakce podřetězce s názvem měsíce září
Napište výrazy, které
vždy zajistí výstup správného data pro zítřek a včerejšek:
SET DATE TO GERMAN
&& Nastavení obvyklého modu
zobrazení data.
DNES=DATE()
&& Zjištění dnešního data.
?'Dnes je '+DTOC(dnes)
&& Datum nutno změnit na řetězec kvůli připojení.
Dnes je 30.09.91
?'Včera bylo '+DTOC(dnes-1) &&
K datu lze připočítat (odpočítat) celé číslo.
Včera bylo 29.09.91
&& Výsledek je zase datum.
?'Zítra bude '+DTOC(dnes+1)
Zítra bude 01.10.91
V proměnné NAROZEN je datum
narození. Zobrazte ročník.
NAROZEN={12.7.45}
&& Konstantu typu D nutno zapisovat do složených závorek.
?'ROČNÍK
'+STR(YEAR(NAROZEN,4))
&& Funkce YEAR() vrací rok jako číselnou hodnotu
ROČNÍK
1945
&& Proto použito
pro převod funkce STR() a ne
DTOC().
Podmíněné vyhodnocení výrazů
IIF(<výrazL>, <výraz1>, <výraz2>)
Funkce vrátí <výraz1>,
pokud je <výrazL> pravdivý (.T.), nebo <výraz2> v případě, že
<výrazL> je nepravdivý (.F.).
a = -4
? IIF (a<0,"a je záporné","a je kladné
nebo nula")
a je záporné
Následující výraz
modeluje průběh pulsu
│ d
┼ ┌──────┐
1│ │ │
│ │ │ t
└────────┴──────┴────────────────────────────
t=x
t=x+d
řešení: IIF(t<x,0,IIF(t>x+d,0,1))
Test na výskyt v intervalu
BETWEEN(<výraz1>, <výraz2>, <výraz3>)
Funkce vrátí .T., pokud
<výraz1> leží mezi <výrazem2> a <výrazem3>, což znamená,
že <výraz1> je větší nebo roven <výraz2> a zároveň menší
nebo roven <výraz3>. V opačném případě Funkce vrátí .F. Všechny výrazy
musí být stejného typu. Přípustné typy jsou znakový, numerický a datumový.
? BETWEEN(14.35,0,100)
.T.
? BETWEEN("V","A","Z")
.T.
? BETWEEN({date(),{01/01/88},{12/31/99})
.T.
Kontrola na výskyt v seznamu
INLIST(<výraz1>, <výraz2> [,<výraz3>
...])
Funkce vrátí .T., pokud je
<výraz1> roven některému ze seznamu výrazů. Všechny zadané výrazy
musí být téhož typu.
? INLIST('Q','W','R','T','Q')
.T.