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)

Důležité chování deklarace:

  • Pokud již proměnná existuje a je znovu deklarována s jiným typem, její hodnota se nastaví na „null“.

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ů)
  • LongArray(hodnota1;hodnota2;…)
  • DoubleArray(hodnota1;hodnota2;…)
  • DateArray(hodnota1;hodnota2;…)

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.
  • 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 databázovým dotazem, jsou v cyklu procházeny synchronně.
  • 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ů

  • Datový typ hodnoty lze změnit jejím přiřazením do proměnné s jiným datovým typem.
  • Zápis proměnné v poli cílového typu provede konverzi hodnoty.

Příklad převodu čísla na text:

  • proměnná typu Integer je přiřazena do proměnné typu String

Příklad převodu textu na číslo:

  • proměnná typu String je přiřazena do proměnné typu Integer

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“.