Co je skriptová proměnná
- Skriptová proměnná je dočasné úložiště hodnot používané během provádění skriptu.
- Proměnné se zapisují ve tvaru „#A#“, „#B#“, „#C#“ atd.
- Skriptové proměnné nejsou databázové sloupce – existují pouze po dobu běhu skriptu.
- Každá proměnná má vždy právě jeden datový typ.
Podporované datové typy proměnných:
- String – textový řetězec
- Integer – celé číslo
- Long – velké celé číslo
- Double – desetinné číslo
- Date – datum
Databázová hodnota null
- Skript používá databázovou hodnotu „null“.
- Hodnota „null“ znamená, že proměnná nemá definovanou hodnotu.
- Nově deklarovaná proměnná, které nebyla přiřazena hodnota, má vždy hodnotu „null“.
- Hodnotu „null“ je možné přiřadit explicitně pomocí proměnné „#null#“.
Deklarace proměnné
Proměnnou je nutné před použitím vždy deklarovat. Deklarací se určuje její datový typ.
Proměnnou lze deklarovat několika způsoby:
- Pomocí příkazu pro deklaraci proměnné ve skriptu.
- Načtením hodnoty z databázového dotazu – datový typ proměnné se automaticky převezme z typu databázového sloupce.
- Pomocí výrazů:
- String(text)
- Integer(číslo)
- Long(číslo)
- Double(číslo)
- Date(datum)
- Přiřazením jiné proměnné nebo databázového ovládacího prvku do proměnné, která ještě nemá datový typ – proměnná převezme typ zdroje.
Důležité chování deklarace:
- Nová deklarace nastaví hodnotu proměnné na „null“ vždy, i při stejném datovém typu, a zruší vazbu proměnné na databázový dotaz, kterým byla načtena.
- Proměnnou, podle které právě probíhá cyklus, nelze deklarovat.
- Nedeklarovaná proměnná použitá v podmínce, cyklu nebo výpočtu vyvolá chybu. Dosazená do textu jako „#A#“ chybu nevyvolá a nahradí se prázdným řetězcem.
Jedna hodnota vs. pole hodnot
- Proměnná načtená z databázového dotazu se automaticky stává polem hodnot.
- Každý řádek výsledku dotazu odpovídá jednomu prvku pole.
- Pokud databázový dotaz nevrátí žádný záznam, vznikne pole s nulovým počtem prvků.
Pole hodnot je možné vytvořit i ručně pomocí serverových funkcí:
- StringArray(hodnota1;hodnota2;...)
- IntegerArray(počet_prvků) – pole čísel 1 až počet_prvků
- LongArray(hodnota1;hodnota2;...)
- DoubleArray(hodnota1;hodnota2;...)
- DateArray(hodnota1;hodnota2;...)
- EmailArray(adresa1;adresa2;...) – pole textových hodnot, ve kterém je každý prvek jedna e-mailová adresa ze zadaného seznamu
Přiřazování hodnot
- Hodnotu proměnné lze přiřadit jiné proměnné nebo databázovému ovládacímu prvku.
- Přiřazení může být:
- jednoduché (jedna hodnota),
- nebo pomocí matematického výrazu (sčítání, odečítání, násobení, dělení).
- Pokud je proměnná polem hodnot, početní operace se provádějí nad všemi jejími prvky. Je-li polem i druhý operand, počítá se po prvcích jen při stejném počtu prvků; jinak se použije první prvek druhého operandu a prázdné pole výsledek nezmění.
- Při přiřazení hodnoty pole do databázového ovládacího prvku se použije pouze první hodnota pole.
- Pokud pole neobsahuje žádný prvek nebo je hodnota „null“, uloží se do ovládacího prvku databázová hodnota „null“.
Cyklus
- Cyklus slouží k postupnému zpracování prvků pole hodnot.
- Počet iterací cyklu odpovídá počtu prvků řídící proměnné.
- Pokud pole neobsahuje žádné prvky, cyklus se neprovede ani jednou.
Chování proměnných v cyklu:
- Během jedné iterace se proměnná chová jako jednoprvková.
- Po skončení cyklu se proměnná opět chová jako pole hodnot.
- Prvky s hodnotou „null“ jsou v cyklu automaticky přeskočeny.
- Pokud bylo více proměnných načteno jedním řádkem skriptu (typem řádku „Přiřadit více hodnot z dotazu“), jsou v cyklu procházeny synchronně. Proměnné načtené dvěma řádky se synchronně neprocházejí, ani když používají stejný dotaz. Obsahuje-li některá z nich méně prvků než řídící proměnná, cyklus skončí chybou.
- Jako řídící proměnná cyklu se doporučuje používat primární klíč „id“.
Porovnávání hodnot
- Ve skriptu je možné porovnávat hodnoty dvou proměnných.
- Pokud je některá z proměnných polem hodnot, porovnává se pouze její první hodnota.
Operátor „obsahuje“:
- U pole hodnot testuje, zda pole obsahuje konkrétní hodnotu.
- U textového řetězce testuje, zda řetězec obsahuje daný podřetězec.
Test na (ne)vyplněnou hodnotu
Prázdná (nevyplněná) hodnota existuje v databázi ve dvou podobách – jako databázová hodnota „null“ a u textových sloupců také jako textový řetězec nulové délky (prázdný string). Samotný operátor „není definováno“ zachytí pouze hodnotu „null“ – prázdný řetězec nezachytí. Podmínka testující (ne)vyplněnost hodnoty proto musí počítat s oběma variantami.
Podmínka „hodnota není vyplněna“ podle datového typu, resp. typu ovládacího prvku:
- String (TextBox, TextArea, RichTextBox, ComboBox, ListBox, MultiListBox, Radio, CheckBox) – složená podmínka: hodnota rovná se „“ nebo hodnota není definováno. V jazyce SQL: ng_tb = '' OR ng_tb IS NULL.
- ForeignKey, File, Image – složená podmínka: hodnota rovná se „0“ nebo hodnota není definováno. V jazyce SQL: ng_idfk = 0 OR ng_idfk IS NULL.
- Integer, Long, Double, Date – stačí operátor „není definováno“. Tyto datové typy nemohou obsahovat prázdný řetězec, nevyplněná hodnota je vždy „null“.
Ve skriptu se složená podmínka zapisuje typem řádku „Jestliže (složený výraz) ...“ se dvěma podmínkami spojenými logickým operátorem „nebo“. Příklad přerušení skriptu v situaci, kdy uživatel nemá vyplněný e-mail – proměnná „#A#“ typu String obsahuje e-mail uživatele načtený databázovým dotazem a řádek typu „14. Jestliže (složený výraz) vyvolat výjimku“ obsahuje dvě podmínky:
- První podmínka: „#A#“ | operátor „rovná se“ | pole hodnoty záměrně prázdné (porovnává se s prázdným řetězcem) | spojení „nebo“.
- Druhá podmínka: „#A#“ | operátor „není definováno“.
- Text výjimky: „Uživatel nemá vyplněný e-mail.“
Běžná podmínka („Jestliže (výraz) ...“) a složená podmínka („Jestliže (složený výraz) ...“) se k hodnotě „null“ chovají rozdílně:
- Běžná podmínka se vyhodnocuje přímo na serveru a s hodnotou „null“ počítá:
- Operátor „rovná se“ vyhodnotí dvě hodnoty „null“ jako shodné – test na „null“ lze zapsat porovnáním s proměnnou „#null#“.
- Operátor „nerovná se“ vyhodnotí hodnotu „null“ proti jakékoliv vyplněné hodnotě i proti prázdnému řetězci jako splněný.
- Složená podmínka se vyhodnocuje jako SQL podmínka s trojhodnotovou logikou:
- Hodnota „null“ nesplní operátor „rovná se“ ani „nerovná se“ – bez ohledu na porovnávanou hodnotu.
- Hodnotu „null“ zachytí operátor „není definováno“ nebo porovnání s proměnnou „#null#“ pomocí operátoru „rovná se“.
Z toho plyne praktický důsledek pro opačný test – „hodnota je vyplněna“ – u datového typu String:
- Ve složené podmínce stačí jediná podmínka „nerovná se“ s prázdným polem hodnoty – hodnotu „null“ podmínka v SQL logice nepropustí.
- V běžné podmínce „nerovná se“ s prázdným polem hodnoty hodnotu „null“ propustí (null podmínku splní) – test „je vyplněno“ proto nelze v běžné podmínce zapsat jedinou podmínkou.
Stejné pravidlo platí i pro omezující podmínky databázových dotazů. Detailní popis podmínek je uveden v samostatné příručce Návrhář databázových dotazů.
Konverze datových typů
- Přiřazení proměnné do proměnné s jiným datovým typem skončí chybou; výjimkou je dvojice Integer a Long a rozdíl dvou hodnot typu Date přiřazený do proměnné typu Integer.
- Konverzi provede zápis proměnné do pole hodnoty, například „#A#“ – hodnota se nejdřív dosadí jako text a teprve pak se převede na datový typ cílové proměnné. Totéž platí pro výrazy „String(#A#)“, „Integer(#A#)“ atd.
- Převod textu na číslo vyhodnocuje text jako aritmetický výraz: prázdný text dá 0, text za číslem se ignoruje a desetinná část se u typu Integer ořízne. Chybou skončí text začínající písmenem, text obsahující jen mezery a text, ve kterém za číslem následuje písmeno „e“ nebo „E“ (například „12eur“), protože se čte jako exponent.
- Převod čísla typu Long na Integer skončí chybou, pokud číslo leží mimo rozsah typu Integer (-2147483648 až 2147483647).
Příklad převodu čísla na text:
- do proměnné typu String se přiřadí hodnota „#A#“, kde „A“ je proměnná typu Integer
Příklad převodu textu na číslo:
- do proměnné typu Integer se přiřadí hodnota „#A#“, kde „A“ je proměnná typu String
Typické chyby při práci s proměnnými
- Proměnná nebyla deklarována před použitím.
- Autor skriptu očekává jednu hodnotu, ale proměnná je pole hodnot.
- Hodnota „null“ není ošetřena v následném zpracování.
- V cyklu je jako řídící proměnná použita proměnná, která obsahuje hodnoty „null“.