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

? ATN2(0,8)

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.