Copyright: Software602 a.s (J. Š.)   Tuesday, March 14, 2000 11:33:51


Přístup k datům pomocí CGI
Přístup k datům pomocí Internet Klientů WinBase602

Součástí dodávky kompletu WinBase602 SQL server je i sada programů WinBase602 Internet klienti, pomocí kterých je možné vytvářet databázové aplikace napojené na Mail602 Internet Server (a teoreticky jakýkoliv jiný webserver).

Jednotliví Internet klienti se liší tím, v jakém prostředí běží (Windows, NetWare, Linux) a komunikačním protokolem, který používají ke spojení s webserverem. Jejich název je odvozen z názvu (zkratky) komunikačního protokolu v nich použitého. S WinBase602 SQL serverem se dodávají: CGI klient, ISAPI klient, FastCGI klient a LCGI klient. LCGI klienta je možné použít pouze na Novell NetWare, FastCGI klienta je možné používat na WindowsNT a UNIX, ISAPI klienta pouze na Windows NT, CGI klienta na WindowsNT, na Windows95/98 a na UNIX. Popis vytváření aplikací je shodný pro všechny tyto klienty - všichni klienti používají tytéž konektory a šablony, ty samé konektory a šablony mohou být bez problémů střídavě používány kterýmikoliv klienty (např. jednou bude šablona použita ISAPI klientem, poté CGI klientem a následně znovu ISAPI klientem). Autor se bude rozhodovat podle toho, co zvládne příslušný webserver (tj. které z komunikačních protokolů má webserver implementovány).

Uživatel aplikace (majitel připojení na Internet) vyplňováním údajů na stránce může (např. právě pomocí CGI klienta) generovat a odesílat SQL příkazy pro databázový server, příslušný webserver z odpovědi databázového serveru zhotoví podle zadané šablony odpověď ve formátu HTML a pošle ji zpět uživateli.

Podobným principem pracují internetové aplikace jako jízdní řád, vyhledávání jmen, elektronický obchodní dům apod.

Na tomto místě se nebudeme zabývat problematikou vytváření HTML dokumentů ani tvorby HTML formulářů, zaměříme se pouze na správné provázání formuláře s WBIK. Předpokladem zvládnutí následujícího textu je základní znalost HTML.


Sestavení dynamické stránky

Při vytváření dynamické HTML stránky spolupracuje několik aplikací:

1. www browser - s touto aplikací pracuje uživatel, browser odesílá požadavky webserveru a zobrazuje výslednou stránku

2. webserver - komunikuje s browserem, předává uživatelův požadavek WinBase602 Internet klientovi (WBIK), přebírá od něj sestavenou stránku a odesílá ji browseru

3. WinBase602 Internet klient

•	přebere od webserveru požadavek na sestavení dynamické HTML stránky

•	vyhledá a přečte WBC KONEKTOR (jeho název je obsažen v požadavku, který Internet klient obdržel od webserveru) a provede operace s databází, které jsou popsány v tomto konektoru (tj. typicky sestaví a provede SQL příkazy a v případě příkazu SELECT přečte ty údaje z databáze, které vyhovují podmínce v příkazu SELECT)

•	vyhledá a přečte HTW ŠABLONU a podle ní sestaví výslednou HTML stránku, přičemž podle příkazů v šabloně zformátuje přečtené údaje z databáze do výsledné stránky

•	výslednou stránku předá webserveru

4. WinBase602 SQL server - spravuje data, se kterými pracuje daná aplikace a provádí SQL příkazy, které sestavil Internet klient; uchovává WBC konektory a HTW šablony

Struktura požadavku, který vysílá www browser a který obdrží Internet klient, je následující:

Zároveň s požadavkem www browser vysílá také seznam tzv. formulářových proměnných a jejich hodnot. Jsou to údaje, které uživatel zadal v HTML formuláři (tag <FORM>), respektive v jednotlivých prvcích formuláře (tagy <INPUT>). Internet klient je volán typicky v okamžiku, kdy uživatel stiskne tlačítko SUBMIT (tj. <INPUT TYPE="SUBMIT" VALUE="Odeslat">) a Internet klient zpracuje zadané údaje (které dostane prostřednictvím formulářových proměnných) a vygeneruje HTML stránku, kterou následně browser zobrazí.

WinBase602 Internet klienti jsou realizováni formou skriptů, které rozšiřují možnosti webserveru. Z tohoto důvodu je nutno v požadavku uvést adresář se skripty webserveru a také název skriptu (tj. Internet klienta), který má vyřídit tento požadavek (protože samotný webserver neumí sestavovat dynamické HTML stránky s údaji z databáze WinBase602). Místo názvu konektoru lze uvést název HTW šablony, která však musí obsahovat tzv. WBC sekci, což je vlastně konektor ve zcela stejné podobě, v jaké by byl v samostatném souboru.


Novinky ve verzi 2.0
Novinky ve verzi klienta 2.0 (s verzí WinBase 5.1)

Upozornění: Aktuální verze Internet klientů je 6.1. Seznam změn je zde.

Od jara 1998 jsou k dispozici nové, vylepšené verze Internet klientů, označené jako verze 2.0. Při vývoji bylo přihlédnuto hlavně k praktickým zkušenostem vývojářů. Seznam novinek a změn je následující:

WBC konektory

•	Vývoj a správa aplikace se výrazně zjednoduší tím, že WBC konektory a HTW šablony mohou nyní tvořit jediný soubor (obsah WBC konektoru se vkládá přímo do šablony) - viz HTW šablona;

•	Nové parametry WBC sekce udávající IP adresy počítačů, z nichž je povolen / zakázán přístup - není zatím implementováno;

•	V hlavičce bloku #repeat přibyla možnost notemptyvar=jméno_proměnné. Daný #repeat blok bude generován pouze s neprázdnými hodnotami dané proměnné - viz blok #repeat.

•	Vstupní proměnné lze nyní uvést kdekoliv ve WBC konektoru (včetně např. sekce User a Password) - viz WBC konektor;

•	V příkazu SELECT v bloku SQLStatement může být upřesněno, kolik záznamů od kterého záznamu se má přečíst - viz blok SQLStatement;

•	Nový blok RunProgram umožní generovat ve vnitřním jazyce na speciální návěští šablony libovolný text - viz blok RunProgram;

HTW šablony

•	Přibyla možnost vyhodnocení složitějších výrazů - viz Výrazy;

•	Přibyla možnost určení způsobu zobrazení výsledku v HTML - viz Citace výrazu;

•	Probíhá automatická konverze typu vstupní proměnné z řetězce na Integer, je-li to třeba - viz Výraz-proměnná;

•	Je možno citovat počet hodnot a jednotlivé hodnoty multiatributu nebo počet a jednotlivé hodnoty proměnných přečtených z formuláře vícekrát - viz Výraz s # nebo Výraz s [ ];

•	Byly zavedeny nové proměnné select.TotalCount a select.Offset, které se využijí, je-li SELECT příkaz omezen pouze na některé záznamy (viz 5. novinka WBC konektorů) - viz Systémové proměnné;

•	Příkaz for byl rozšířen o možnost stanovení velikosti kroku (step) a směru vyhodnocování (to a downto) - viz příkaz for;

Přes značné množství nových rysů by aplikace napsané pro verzi 1.0 měly bez jakýchkoliv změn fungovat i ve verzi 2.0.

Změny ve verzi 2.0d:

•	Úpravy pro běh s WinBase602 5.1 - Internet klienti od této verze jsou použitelní pouze s WinBase602 5.1.

•	Pokud jsou ve webserveru asociovány selektory, konektory a šablony s některým z Internet klientů, pak tento Internet klient správně nastavuje hodnotu proměnné wb_client - viz proměnná wb_client


Novinky ve verzi 6.0
Novinky Internet klientů verze 6.0 (s verzí WinBase 6.0)

viz také novinky verze 2.0

•	Bylo sjednoceno číslování verzí WinBase602 a WB Internet Klienta (nyní 6.0).

•	Existují Internet Klienti pro LINUX a FreeBSD.

•	Konektory, šablony a selektory jsou uloženy přímo v databázi. Existuje nový typ objektů v aplikaci – WWW objekty, lze jim přidělovat práva, exportovat je a importovat spolu s aplikací.

•	WBIK se k databázi vždy přihlašuje jako uživatel __web (dvě podtržítka), tento uživatel musí být před prvním použitím WBIK vytvořen, přičemž mu lze nastavit libovolné heslo.

•	WWW objekty jsou v databázi pojmenovány bez přípon. Při jejich volání (v rámci URL) je třeba příponu uvést (konektor vstup se volá jako vstup.wbc). Tímto je možno asociovat tyto přípony s odpovídajícím WBIK – je využíváno hlavně s MS IIS.

•	URL, kterým bude proveden konektor vstup, je
http://www.server.cz/cgi-bin/wbcgi.exe/název_databáze/název_aplikace/vstup.wbc

•	WBIK nastavují tři nové systémové proměnné: wb_database, wb_application a wb_url. Jejich hodnoty jsou po řadě: název databáze, název aplikace a <%wb_client%>/<%wb_database%>/<%wb_application%>. Hodnoty těchto proměnných jsou připraveny pro vložení do URL, tzn. znaky, které nesmějí být v URL (např. mezera), jsou v hodnotách těchto proměnných nahrazeny tzv. escape sekvencí (v případě mezery je to %20).

•	V souvislosti s tímto se bude v šablonách jako akce formuláře, nebo link na další stránku (A HREF) uvádět:
<%wb_url%>/název_konektoru.wbc  resp.
<%wb_url%>/název_šablony.htw

•	Konektory dále už nesmějí obsahovat bloky Datasource, Username a Password (WWW objekty jsou součástí aplikace).

•	V konektorech lze uvést v blocích Template a ErrorTemplate pouze názvy šablon, které patří do stejné aplikace, ve které je daný konektor. V těchto blocích mohou (ale nemusí) být šablony uváděny s příponou (.htw).

•	V selektorech lze uvést pouze názvy WWW objektů ze stejné aplikace, do které patří daný selektor. Názvy WWW objektů mohou (ale nemusí) být uváděny včetně přípony.

•	Nastavování globálních parametrů WBIK se provádí v Konfiguraci WinBase602, na záložce WWW objekty. Nastavují se pouze parametry: adresář, do kterého se vytváří logfile; úroveň podrobnosti logfile; zda logfile mazat před každým spuštěním WBIK; a alias adresáře s CGI a ISAPI skripty. Pokud nejsou parametry nastaveny, nebo jsou nastaveny špatně, WBIK je správně nastaví a zapíše. Prakticky to znamená, že není nutno nastavovat tyto parametry před prvním spuštěním WBIK.

•	Parametry “úroveň podrobnosti logfile” a “mazat logfile před každým spuštěním WBIK” lze nastavovat odděleně pro každou aplikaci. Tyto parametry se nastavují v dialog Vlastnosti aplikace, na záložce WWW objekty.

•	Logfile je zapisován odděleně pro každou aplikaci do adresáře:
adresář_z_konfigurace\název-databáze\název-aplikace
V tomto adresáři je vytvořen soubor RRRRMMDD.log.
LCGI klient upraví názvy databáze a aplikace tak, aby tento adresář vyhovoval konvencím MS-DOSu o délce jména souboru (8 znaků + 3 znaky přípona).

•	Standardní chybová šablona:
Pokud je v konektoru předepsána DefaultErrorTemplate: XXX, použije se tato.
Pokud je v aplikaci WWW objekt jména deferr, použije se tento jako standardní chybová šablona.
Jinak se použije obecná chybová šablona, která je obsažena v každém WBIK (“Chyba při běhu WBIK …”)

•	Nově podporovaný typ sloupce a proměnné: timestamp. Sloupce tohoto typu lze mezi sebou porovnávat a lze je citovat v šabloně. Při citaci se uplatňuje také upřesnění citace (formát).

Změny ve verzi 6.0f:

•	Nová funkce SetUserError pro vyvolání uživatelské chyby za běhu procedury vnitřního jazyka

•	Zaveden nový operátor zbytek po celočíselném dělení modulo (operátor % - céčkový tvar - příklad (sudé záznamy): <%if CurrentRecord % 2 = 1%> ...)

Změny ve verzi 6.0h:

•	Nová chybové proměnné HTWErrorWWWobjectName a HTWErrorTimestamp.

Změny ve verzi 6.0j:

•	Zavedeno upřesnění citace textu (teoreticky i řetězce) - defaultní hodnota = 0, hodnota = 1 - konce řádků se v textu nahradí <BR>, aby se zachovalo rozlámání.

•	Nový operátor v HTW - celočíselné dělení DIV, zbytek po celočíselném dělení MOD

Změny ve verzi 6.0k:

•	Zavedeno upřesnění citace textu a řetězce - hodnota 2 (nebo ASCII) - převede text do 7 bitového ASCII (bez diakritiky)


Novinky ve verzi 6.1
Novinky Internet klientů verze 6.1 (s verzí WinBase 6.1)

viz také novinky verze 6.0

•	Implementováno ukládání a načítání COOKIES;

•	nový způsob citace timestampu a data - COOKIEEXPIRES;

•	nový operátor exists;

•	nové systémové proměnné šablon CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP;

•	nový příkaz WBC preprocesoru if;

•	nový blok ve WBC - DeclareVariable;

•	nový blok ve WBC - SetVariable;

•	nové nepovinné ukončení bloku SQLStatement - SQLEnd;


Vstupní formuláře

Když chceme, aby internetový uživatel mohl pomocí svého WWW browseru interaktivně pracovat s databází (vyhledávání, vkládání apod.), musíme pro něj vytvořit HTML stránku, ve které bude formulář (HTML tag <FORM>) s prvky, do kterých může uživatel údaje zapsat (editační řádky, přepínače a další), a kde bude tlačítko, kterým zadané údaje odešle programu WBIK. WBIK se už postará o uložení údajů do databáze a vytvoří nový HTML dokument (případně s FORM tagem a tlačítkem SUBMIT), který bude odeslán do uživatelova browseru a cyklus se opakuje.

V tomto manuálu se nebudeme zabývat problematikou vytváření HTML dokumentů ani tvorby HTML formulářů, zaměříme se pouze na správné provázání formuláře s WBIK.


Statický a dynamický formulář

Pro potřeby WBIK rozlišujme dva způsoby vytvoření HTML (HTW) dokumentů obsahujících formulář (HTML tag <FORM>).

Statický formulář – typicky se jedná o HTML dokument, který je neměnný; při každém otevření bude zobrazovat tentýž obsah - např. úvodní formulář pro zadání jména a hesla. Na statický formulář se lze dostat obvyklým HTML způsobem -

<P>Zde naleznete 1.příklad napojení se na WinBase server pomocí rozhraní <A HREF=vstup.htm>CGI.</A> Skok je na statický formulář. </P>

Ve statickém formuláři samozřejmě nejde použít nic nad rámec HTML, tedy rysy popisované v tomto manuálu. Proto se statický formulář samostatně používá pouze jako první (úvodní) stránka posloupnosti stránek aplikace.

Na této úvodní stránce je nutné specifikovat také použitého klienta (CGI, FastCGI nebo ISAPI), na ostatních je již možné využít systémové proměnné wb_XXX. Po přenesení do jiného prostředí se musí upravit pouze tedy tato úvodní stránka.

Dynamický formulář – HTW šablona, která zobrazuje údaje z databáze a jejíž vzhled se mění podle obsahu databáze; při každém otevření se obsah vygeneruje podle databáze - např. nabídka obchodního domu podle aktuálního ceníku.

Dynamický formulář nutně potřebuje, aby dříve, než začne být generován, proběhl příslušný WBC konektor, který připraví data pro šablonu. Je-li dynamický formulář otevírán z jiného formuláře (po stisku tlačítka SUBMIT), je WBC konektor definován v ACTION parametru tagu INPUT formuláře (v případě, že WBC je samostatný objekt):

<FORM METHOD=GET ACTION="/cgi-bin/wbcgi.exe/moje_db/Anketa/anketa.wbc">

nebo

<FORM METHOD=GET ACTION="/cgi-bin/wbcgi.exe/moje_db/Anketa/anketa.htw">

je-li WBC sekce součástí HTW šablony - doporučovaný způsob od verze klienta 2.0.

Všimněme si, že za jménem WBIK následuje nejdříve název databáze a název aplikace, ke které se má WBIK připojit, a teprve poté název WWW objektu, který má WBIK použít pro vygenerování výsledné HTML stránky.

Má-li být dynamický formulář otevřen z HTML dokumentu (ne z formuláře tlačítkem SUBMIT), je nutné zadat jméno konektoru (resp. šablony s konektorem) přímo v linku (platí rozlišení objektů WBC x HTW z předešlého příkladu podle verzí klienta):

<P>Zde naleznete 2.příklad napojení se na WinBase server pomocí rozhraní <A HREF="/cgi-bin/wbcgi.exe/moje_db/anketa/anketa1.htw">CGI</A> Skok je na dynamický formulář.<P>

Má-li v tomto případě dostat WBC konektor některé parametry, uvedou se za jménem konektoru za otazníkem:

<P>Zde naleznete 3.příklad napojení se na WinBase server pomocí rozhraní <A HREF="/cgi-bin/wbcgi.exe/moje_db/anketa/anketa2.htw?param1=100">CGI</A> Skok je na dynamický formulář s předáním parametru.<P>


Vstupní prvky formuláře

Vstupními prvky formuláře myslíme editační pole, označovací čtverce, přepínače, textová pole a další.

Při vytváření těchto prvků ve formuláři musíme pečlivě volit jejich jména, tzn. parametry NAME jednotlivých INPUT  nebo SELECT tagů (blíže viz popis HTML). Různé vstupní prvky musíme pojmenovat jednoznačnými jmény v rámci daného formuláře, nesmí tedy v jednom formuláři existovat dva vstupní prvky se stejným jménem (rozdílná jména prvků se netýkají samozřejmě skupiny označovacích čtverců (CheckBoxů) nebo přepínačů (RadioButtonů), kde se naopak shodnost jmen vyžaduje) .Tato jména vstupních prvků pak budeme používat při sestavování WBC konektorů.

Má-li být vstupní prvek formuláře naplněn daty (např. combo nebo listbox), musí v šabloně předcházet konektor s vhodným blokem SQLStatement: obsahující zdroj (viz příklad 2 a 3).

Příklad 1:

Ve (statickém) formuláři jsou tři editační pole (druhé a třetí má přednastavenou implicitní hodnotu):

<FORM METHOD=GET ACTION="/cgi-bin/wbcgi.exe/moje_db/anketa/vstup.htw">

<TABLE>

<TR><TD>jméno zákazníka:</TD><TD><INPUT TYPE="TEXT" NAME="jmeno" VALUE="" SIZE=10 MAXLENGTH=10></TD></TR>

<TR><TD>e-mail:</TD><TD><INPUT TYPE="TEXT" NAME="email" VALUE="@" SIZE=20 MAXLENGTH=100><BR></TD></TR>

<TR><TD>počet instalací:</TD><TD><INPUT TYPE="TEXT" NAME="pocet" VALUE="1" SIZE=6 MAXLENGTH=6><BR></TD></TR>

</TABLE>

<INPUT TYPE="SUBMIT" VALUE="Odeslat">

<INPUT TYPE="RESET" VALUE="Vymazat">

</FORM>

Po stisku tlačítka Odeslat WebServer spustí WinBase CGI klienta, který se připojí na databázový server “moje_db”, otevře aplikaci “anketa” a vykoná příkazy z konektoru, který je zadán ve WBC sekci šablony VSTUP.HTW (tzn. že ve výše uvedené aplikaci existuje WWW objekt “vstup”, který je typu šablona), použije přitom hodnoty zadané do editačních polí.

Příklad 2:

Formulář pro přihlášení (zadání jména a hesla), který je potřeba, má-li se zavést systém oprávnění na úrovni aplikace (na úrovni serveru nelze, všicni se přihlašují jako __WEB), obsahuje nepřekládané combo s nabídkou jmen uživatelů v aplikaci a editační pole pro heslo.

<%WBC%>

SQLStatement: LogNames

+ SELECT id, jmeno, heslo

+ FROM Logtable

+ ORDER BY jmeno

<%/WBC%>

<HTML>

<HEAD>

<TITLE>Přihlašte se:</TITLE>

</HEAD>

<BODY>

<H1>Přihlašte se:</H1>

<FORM ACTION="<%wb_url%>/next.htw" METHOD="POST">

<TABLE>

<TR>

    <TD>Vyberte jméno:</TD>

    <TD><SELECT NAME="name">

<%begindetail LogNames%>

    <OPTION VALUE="<%jmeno%>"><%jmeno%>

<%enddetail%>

    </SELECT></TD>

</TR>

<TR>

    <TD>Zadejte heslo:</TD>

    <TD><INPUT TYPE="Password" NAME="passw"></TD>

</TR>

</TABLE>

<INPUT TYPE="Submit" VALUE="Odeslat">

</FORM>

</BODY>

</HTML>

Příklad 3:

Část šablony obsahující listbox naplněný z číselníku:

<%WBC%>

SQLStatement: OkresList

+ SELECT nazevo, cisloo

+ FROM Okresy

+ ORDER BY nazevo

SQLStatement: Kolik

+ SELECT Count(*) AS kol

+ FROM Reality

<%/WBC%>

<BR><BR>

<B>Zadejte omezující podmínky na výběr:</B><BR>

<BR>

<HR WIDTH="60%" ALIGN="LEFT">

<FORM METHOD="POST" ACTION="<%wb_url%>/20.htw">

<TABLE WIDTH="70%">

<TR>

<TD VALIGN="TOP">Typ:</TD>

<TD><SELECT NAME="typ">

    <OPTION VALUE="1">prodej

    <OPTION VALUE="0">pronájem

    <OPTION VALUE="-1">oboje

    </SELECT></TD>

<TD>&nbsp;</TD>

<TD VALIGN="TOP">Okres:</TD>

<TD><SELECT NAME="okr" MULTIPLE SIZE="3">

    <%begindetail OkresList%>

    <OPTION VALUE=<%cisloo%>><%nazevo%>

    <%enddetail%>

    </SELECT></TD>

<TD>vyberte jeden nebo více okresů</TD></TR>

</TABLE>

<BR>

Dnes je v nabídce <%Kolik.kol%> nemovitostí.

<BR> <BR>

<HR WIDTH="60%" ALIGN="LEFT">

<TABLE BORDER="0" WIDTH="60%"><TR>

<TD WIDTH="50%" ALIGN="RIGHT"><INPUT TYPE="SUBMIT" VALUE="Vybrat podle zadání"></TD>

<TD WIDTH="50%" ALIGN="LEFT"><INPUT  TYPE="RESET"  VALUE="Reset zadání"></TD>

</TR></TABLE>

</FORM>


Akce formuláře

Akcí formuláře myslíme činnost, která se má provést, pokud uživatel v browseru stlačí tlačítko typu SUBMIT (tzn. <INPUT TYPE="SUBMIT" ...>). Tuto akci zapisujeme do parametru ACTION tagu FORM.

Jako akci formuláře uvedeme:

/cesta_k_WBCGI/WBCGI.EXE/název_databáze/název_aplikace/jméno_HTW_šablony.htw,

kde jméno_HTW_šablony je název databázového objektu kategorie WWW objekty, který existuje v dané databázi  v dané aplikaci. Tento WWW objekt má být použit pro zpracování údajů, které uživatel zadal pomocí tohoto formuláře. Dále, /cesta_k_WBCGI je adresář, ve kterém je uložen program WBCGI.EXE. Tento adresář musí být v podstromu, ve kterém má webserver uloženy CGI skripty (typicky bude tento adresář /cgi-bin).

Na parametru TYPE nezáleží, přesněji řečeno: WBIK při startu zjistí, kterou metodou mu webserver předává parametry (zda používá metodu GET, nebo POST) a údaje, které zadal uživatel pomocí formuláře, si WBIK zjistí momentálně použitou metodou.

Příklad

Výchozí adresář Mail602 Internet Serveru je C:\mail602\inetsrv, adresář s CGI skripty (v URL označovaný /cgi-bin) je C:\mail602\inetsrv\cgi-bin, v něm je program WBCGI.EXE. Kořenový adresář Internet serveru je C:\mail602\inetsrv\docs. Jméno a doména počítače s Mail602 Internet Serverem je www.firma.cz a z tohoto počítače je přístup na WinBase602 server.

Vytvoříme HTML dokument s URL http://www.firma.cz/test/vstupni.htm (tzn. tento dokument je v souboru C:\mail602\inetsrv\docs\test\vstupni.htm), který obsahuje formulář. Chceme, aby se údaje vložené do formuláře zpracovaly pomocí HTW šablony vstup, která se nachází v aplikaci anketa v databázi moje_db. Parametr ACTION tagu FORM musí mít tedy hodnotu

/cgi-bin/wbcgi.exe/moje_db/anketa/vstup.htw.

Konkrétně (uvedeme pouze hlavičku tagu FORM):

<FORM METHOD=POST ACTION="/cgi-bin/wbcgi.exe/moje_db/anketa/vstup.htw">

Po odeslání údajů tlačítkem SUBMIT WebServer pozná, že má spustit CGI skript WBCGI.EXE (ACTION odkazuje na soubor v podstromu /cgi-bin). WBCGI.EXE si zjistí název databáze, aplikace a WWW objektu, Připojí se k databázi jako uživatel __web (dvě podtržítka na začátku) a přečte obsah WBC sekce šablony vstup a začne pracovat podle údajů v ní uvedených.

Kromě HTW šablony lze také uvést název WBC konektoru, či WBS selektoru, který se nachází ve výše uvedené aplikaci.

Způsob zápisu akce formuláře se může lišit podle typu Webserveru - při použití MS IIS a protokolu ISAPI je nutné např. asociovat přípony WBC, HTW a WBS s konkrétní ISAPI komponentou (knihovna WBISAPI.DLL), takže v tomto případě se cesta k ISAPI klientovi vůbec neuvádí, protože MS IIS ji zdá díky asociaci. Podrobný popis asociace je obsažen v manuálu.


WBC konektory

WBC konektory jsou buď samostatné databázové objekty (kategorie WWW objekt), nebo sekce v HTW šabloně ohraničená tagy <%WBC%>  a <%/WBC%> s údaji, jaké příkazy má WBIK s databází provést, případně dále jakou šablonu použít pro vytvoření výstupního HTML dokumentu při úspěšném průběhu všech operací a jakou šablonu použít při výskytu chyby atd.

V textu WBC konektoru může být na libovolném místě citace vstupní proměnné z formuláře. K tomuto stačí napsat na dané místo jméno vstupní proměnné a bezprostředně před a bezprostředně za toto jméno napsat znak procenta (%).Při zpracování konektoru bude tato citace nahrazena aktuální hodnotou proměnné.

Konektor lze větvit pomocí příkazu #if.

Řádky konektoru musí začínat již od prvního sloupce, jinak bude při zpracování generována chyba č. 9.

Příklad: Uživatel v browseru v HTML formuláři zadá pomocí editačního pole hodnotu určitého čísla a provedl SUBMIT. Formulář do konektoru předal jedinou vstupní formulářovou proměnnou (a sadu systémových proměnných). Tyto proměnné (a případné další proměnné vytvořené za běhu konektoru) se použijí k sestavení SQL příkazů, které má konektor vykonat.

Blok SQLStatement (příkaz SELECT) v konektoru vybere záznamy vyhovující zadanému číslu (v části WHERE dosadí za jméno formulářové proměnné v procentech její hodnotu). Konektor dále do nové proměnné cis_OK přiřadí TRUE nebo FALSE podle toho, existuje-li alespoň jeden vyhovující záznam.

<%WBC%>

DeclareVariable: cis_OK := FALSE

SQLStatement: Num

+ SELECT cislo

+ FROM INP_TAB

+ WHERE (cislo="%cisloform%")

+ ORDER BY datum;

EndSQL

#if exists licnum[0].cislo

SetVariable: cis_OK :=TRUE

#endif

<%/WBC%>

V šabloně, která má tento konektor jako zdroj dat, pak lze pracovat

•	s daty odpovědi na dotaz z SQLStatement; viz detail sekce šablony

•	s proměnnou vytvořenou v konektoru pomocí GetVariable, DeclareVariable

•	s formulářovými proměnnými (v příkladu uvedena pouze jedna s jednou hodnotou);

•	se systémovými proměnnými (IP adresa browseru apod.);

Poslední dva body se využívají zřídka (jejich význam je v konektoru).

Bezchybová citace proměnné

Pokud není jisté, zda bude či nebude určitá vstupní proměnná přečtena z formuláře, použijte tzv. bezchybovou citaci dané proměnné. Tato bezchybová citace vstupní proměnné se od normální citace liší tím, že mezi prvními procenty a názvem proměnné je znak otazník (?). Mezi procenty a otazníkem, resp. otazníkem a názvem proměnné může být libovolný počet mezer a tabulátorů. Při vyhodnocení citace se postupuje takto: pokud je daná proměnná přečtena z formuláře, bude citace nahrazena její hodnotou, pokud proměnná není přečtena z formuláře, bude citace nahrazena prázdným řetězcem a nebude generována chyba. Bezchybové proměnné lze s výhodou použít u INPUT typu CHECKBOX (pokud totiž uživatel ve formuláři checkbox nezatrhne, CGI skriptu by nebyla předána odpovídající proměnná - pokud se ovšem použije bezchybová citace, předá se buď hodnota nebo prázdný string a podle délky je možné rozlišit dva stavy - TRUE a FALSE).

Hlášení uživatelských chyb

Cílem je umožnit vývojáři dynamických HTML stránek reagovat na nečekaný stav, který nastal při běhu procedury ve vnitřním jazyce (volané z bloku Program nebo RunProgram) a ukončit provádění WBC konektoru (neprovádět následující bloky) a nastavit požadované chybový stav, na nějž zareaguje WBIK chybovou šablonou. Toho vývojář dosáhne zavoláním funkce SetUserError z knihovny WBINET.DLL. Tato procedura nastaví chybu č. 90 (chyba vyvolaná z programu) a jako chybové hlášení nastaví obsah předaného řetězce. Bezprostředně po ukončení bloku Program (nebo RunProgram), ve kterém byla tato funkce zavolána, Internet klient ukončí provádění WBC konektoru a vygeneruje chybovou HTML stránku dle nastavené chybové šablony.

Následující tabulka ukazuje bloky údajů, které může WBC konektor obsahovat. Jedině blok SQLStatement je povinný:

ErrorTemplate	Template
RequiredValues	MaxRecords
Program	SQLStatement
RunProgram	GetVariable


Komentáře ve WBC konektorech

Formát:

; komentář

// komentář

Význam:

Všechny řádky ve WBC konektorech, které začínají znakem středník (;), nebo dvojicí znaků lomeno (//), jsou považovány za komentáře a WBIK je přeskakuje. Znaky středník, příp. dvojice lomítek, musí být uvedeny bezprostředně na začátku řádku. Komentářové řádky můžete vložit kamkoliv do WBC konektoru (např. také do bloku SQLStatement, nebo do bloku Program).


if
if (v konektoru) - větvení konektoru

Formát:

#if výraz

 větev then

#else

 větev else

#endif

Význam:

Příkaz umožňuje podmíněně větvit WBC konektor.

Příkaz if musí končit direktivou #endif a může mít část #else.

Výraz musí být typu Boolean a musí být uveden na stejném řádku jako je uvedeno #if. Výraz je konstruovaný podle pravidel pro výrazy v šabloně, který může obsahovat názvy vstupních formulářových proměnných, názvy selectů a sloupců, které byly vyhodnoceny před tímto příkazem #if a názvy proměnných získaných pomocí GetVariable nebo DeclareVariable a názvy systémové proměnné šablony.

Příkaz if může být uvnitř bloku SQLStatement nebo také vně:

#if podmínka

SQLStatement: abcd

+SELECT * FROM Tab

#else

SQLStatement: efgh

+SELECT * FROM JinaTab

#endif

Příklad:

V HTML formuláři je combo s názvem "typ" a listbox s názvem "kateg" (SELECT NAME=kateg). V konektoru následující šablony se reaguje na to, co je v combu vybráno a je-li v listboxu vybrána žádná nebo jedna a více hodnot:

<%WBC%>

SQLStatement: Vyber

+ SELECT Reality.cislo,Reality.nazev,Reality.popis,Reality.dat,

+ Kategorie.nazevk

+ FROM Reality JOIN Okresy ON (Reality.okres=Okresy.cisloo)

+              JOIN Kategorie ON (Reality.kategorie=Kategorie.cislok)

+ WHERE TRUE

// je-li v combu vybrána položka se zápornou hodnotou, nedělat nic,

// jinak přidat podmínku

#if typ > -1

+ AND prodej = %typ%

#endif

// je-li vybrána v listboxu alespoň jedna hodnota, přidat podmínku

#if exists kateg

+ AND (

#repeat var=kateg delimiter=OR

+ (kategorie=%kateg%)

#endrepeat

+ )

#endif

Další příklad:

z aplikace Anketa, kdo ještě nehlasoval, nemá dosud cookie:

#if exists HTTP_COOKIE_anketa

; pokud existuje cookie pro tuto anketu uživatel v této anketě už hlasoval, přepsat jeho volbu

SQLStatement: Akce

+ UPDATE Odpovedi

+ SET volba=%hodnota%,ipadr="%REMOTE_ADDR%"

+ WHERE id=%HTTP_COOKIE_anketa%;

#else

; ještě nehlasoval, vložit nový záznam

SQLStatement: Akce

+ START TRANSACTION;

+ INSERT INTO Odpovedi(ipadr,volba,anketaid)

+ VALUES ("%REMOTE_ADDR%",%hodnota%,%anketaid%);

; sloupec id tabulky Odpovedi má implicitní hodnotu sekvencí Odpoved_id,

; vloženou unikátní hodnotu přečteme pomocí sekvence.CurrVal

SQLStatement: id_odpovedi

+ SELECT id FROM Odpovedi WHERE id=Odpoved_id.CURRVAL;

+ COMMIT;

EndSQLStatement;

#endif


Template

Formát bloku:

Template: HTW_šablona

Význam:

HTW_šablona je jméno databázového objektu typu WWW objekt, která má být použita pro vytvoření HTML dokumentu, který bude odeslán WWW browseru uživatele, pokud nenastane žádná chyba při práci s WinBase602 SQL Serverem. Databázový objekt se musí nacházet v té samé aplikaci, ve které je daný WBC konektor. Název šablony doporučujeme uvést s příponou (.htw), není to však povinné. Lze také uvést případné parametry.

Příklad:

Template: Anketa.htw?anketaid=%anketaid%


ErrorTemplate

Formát bloku:

ErrorTemplate: HTW_šablona

Význam:

HTW_šablona je jméno databázového objektu typu WWW objekt, která má být použita pro vytvoření HTML dokumentu, který bude odeslán WWW browseru uživatele, pokud nastane jakákoliv chyba při práci s WinBase602 SQL Serverem. Databázový objekt se musí nacházet v té samé aplikaci, ve které je daný WBC konektor. Název šablony lze uvést s příponou (.htw), není to však povinné. Není-li v konektoru tento údaj uveden, použije se standardní chybová šablona.

Příklad:

ErrorTemplate: ErrAnk.htw

Poznámka:

Obsahuje-li chybová šablona WBC sekci (od verze 2.0), je při generování chybové HTML stránky WBC sekce zcela ignorována.


MaxRecords

Formát bloku:

MaxRecords: počet_záznamů

Význam:

Při čtení odpovědi na jakýkoliv SQL příkaz SELECT bude přečteno nejvýše počet_záznamů záznamů. Počet_záznamů je nezáporné celé číslo. Není-li uvedeno, bude přečteno maximálně 2147483647 záznamů.

Omezit počet přečtených záznamů je možné taky pro každý SELECT zvlášť, viz blok SQLStatement.

Příklad:

MaxRecords: 1000


RequiredValues

Formát bloku:

RequiredValues: jméno_proměnné[povinný_počet_hodnot]

Význam:

WBIK zkontroluje, zda přečetl z formuláře uvedenou vstupní proměnnou se jménem jméno_proměnné a zda je její hodnota různá od prázdného řetězce. Pokud není splněna aspoň jedna z těchto podmínek, vygeneruje chybu číslo 47 (viz seznam chyb). Použitá chybová šablona by pak měla na tuto chybu reagovat - většinou oznámením, aby se uživatel pomocí tlačítka Zpět v browseru vrátil a zadal parametry správně.

Parametr povinný_počet_hodnot, uzavřený v hranatých závorkách a následující bezprostředně za jménem proměnné, je nepovinný. Pokud jej uvedeme, pak povinný_počet_hodnot je celé kladné číslo, které udává, kolik hodnot dané proměnné musí být přečteno z formuláře, aby nebyla generována chyba. Všechny tyto hodnoty dané proměnné musí splňovat podmínku na různost od prázdného řetězce. Pokud aspoň jedna hodnota této proměnné je prázdná, pak je generována chyba číslo 47. Na témže řádku může být uvedeno více proměnných (případně následovaných povinným počtem hodnot), pak musí být jednotlivé proměnné od sebe odděleny mezerou, nebo tabulátorem. Pokud bychom chtěli psát další povinnou hodnotu na následující řádek, tento řádek musí začínat klauzulí RequiredValues:.

Příklad:

RequiredValues: vybrRadio


SQLStatement

Formát bloku:

SQLStatement: název_SQL_příkazu

řádek_SQLStatement_bloku

[EndSQL]

Význam:

Blok, podle kterého se sestaví jednotlivé SQL příkazy, které budou předány databázi. Je to jediný povinný blok v konektoru - neobsahuje-li konektor tento blok, nastane chyba č. 7 (viz seznam chyb).

Můžete použít libovolné SQL příkazy WinBase602 SQL Serveru, pouze následující příkazy však mají praktický význam: SELECT, INSERT INTO, DELETE FROM, UPDATE, příp. CALL.

V každém WBC konektoru musí být aspoň jeden blok SQLStatement. Do jednoho bloku SQLStatement lze zapsat více SQL příkazů, v tom případě jsou jednotlivé příkazy od sebe odděleny středníkem.

Název_SQL_příkazu je slovo z písmen, číslic a znaku podtržení ( _ ). V šabloně, která bude použita pro sestavení HTML dokumentu, se můžete na tento SQL příkaz odkazovat pomocí jména název_SQL_příkazu. Pojmenovat můžete libovolný SQL příkaz, ale praktický význam má pouze pojmenování příkazu SELECT. Tímto pojmenováním máte možnost zjistit, kolik záznamů obsahuje odpověď (název_SQL_příkazu.CurrentRecord), máte možnost se přímo odkazovat na sloupce odpovědi v detail sekci šablony atd.

Pokud blok SQLStatement obsahuje více SQL příkazů a zároveň je pojmenovaný, pak se název_SQL_příkazu vztahuje k prvnímu z uvedených SQL příkazů a ostatní SQL příkazy v bloku SQLStatement jsou nepojmenované.

Za pojmenováním příkazu SELECT v hlavičce bloku  může následovat v hranatých závorkách výčet záznamů, které se mají přečíst. Výčet má formát

  [číslo_prvního_záznamu + počet_záznamů]

kde číslo_prvního_záznamu je pořadové číslo záznamu v odpovědi (číslováno od nuly), který má být přečten, počet_záznamů udává, kolik záznamů od výše uvedeného (včetně něho) má být přečteno. Část +počet_záznamů je nepovinná, není-li přítomna, předpokládá se, že má být přečten pouze záznam, jehož pořadové číslo je uvedeno (tzn. počet_záznamů=1).

Blok může být nepovinně ukončen příkazem EndSQL; nebo EndSQLStatement;. Důvodem je případné nutné rozlišení případů s #if, jako:

SQLStatement: abcd

+ ...

#if podmínka

+ ...

#endif

EndSQL;

a

SQLStatement: abcd

+ ...

EndSQL;

#if podmínka

...

#endif

Příklady:

1) více SQL příkazů v jednom bloku

SQLStatement: první

+ INSERT INTO tabulka

+ DEFAULT VALUES;

+ SELECT * FROM tabulka

+ ORDER BY sloupec DESC

2) pojmenovaný blok, na výsledek (jedna hodnota) se lze v šabloně odkázat pomocí citace <%KolikVoleb.KolikV%>

SQLStatement: KolikVoleb

+ SELECT Count(*) AS KolikV

+ FROM Volby

Řádek_SQLStatement_bloku je buď řádek SQL příkazu, nebo příkaz WBC preprocesoru:

•	řádek SQL příkazu musí začínat znakem plus (+), za ním může být libovolný (i nulový) počet mezer a tabulátorů a za těmito znaky musí následovat text SQL příkazu.

•	každý příkaz WBC preprocesoru začíná znakem dvojitý křížek (#) - viz Přehled příkazů WBC preprocesoru.

Příklad:

3) složitější blok využívající příkaz preprocesoru #ifexists; v příkazu citována proměnná REMOTE_ADDR vracející IP adresu uživatele

SQLStatement:

#ifexists

+ SELECT * FROM Anketa

+ WHERE (ipadr="%REMOTE_ADDR%");

#then

+ UPDATE Anketa

+ SET volba=Str2Int("%hodnota%")

+ WHERE (ipadr="%REMOTE_ADDR%");

#else

+ INSERT INTO Anketa(ipadr, volba)

+ VALUES ("%REMOTE_ADDR%", %hodnota%);

#endif


Příkaz INSERT INTO s automatickým přečtením nového záznamu

SQL příkaz INSERT INTO vkládá nový záznam (řádek) do databázové tabulky. V prostředí webu je často třeba takový nově vložený záznam vypsat pro kontrolu na následující stránce. Např. uživatel zadá údaje o sobě do formuláře a na následující stránce je třeba tyto údaje vypsat pro kontrolu, a to ty údaje, které byly skutečně zapsány do databáze.

Samotné SQL jednoduše zjistit právě vložený záznam neumožňuje. Z tohoto důvodu byla pro tento konkrétní příklad syntaxe SQLStatement rozšířena.

Formát bloku:

SQLStatement: název_SQL_příkazu_INSERT(název_atr_Date, název_atr_Time)

řádek_bloku_s_INSERT_INTO

SQL příkaz INSERT musí být pojmenovaný. Tabulka, do níž se vkládá pomocí INSERT INTO musí mít dva sloupce typu Date a Time s nastavenou implicitní hodnotou CURRENT_DATE a CURRENT_TIME. Názvy těchto sloupců se uvedou v závorkách za názvem_SQL_příkazu_INSERT.  Po provedení takto definovaného bloku se lze v následujícím konektoru na sloupce vloženého záznamu odkázat pomocí citace <%název_SQL_příkazu_INSERT.název_sloupce%>.

Příklad:

Nechť tabulka Tobjednavky má tyto sloupce: cisloobj, email, telefon, datobj (typu Date) a casobj (typu Time). U těchto dvou posledních sloupců je pomocí implicitních hodnot zaručeno, že se při vložení do nich vloží aktuální datum a čas. V jednom konektoru se vloží záznam do Tobjednavky, v následujícím konektoru je třeba zpřístupnit tento vložený záznam, aby ho šablona mohla zobrazit (např. pro vizuální kontrolu).

SQLStatement: VlozenaObjednavka(datobj, casobj)

+ INSERT INTO Tobjednavky (cisloobj,email,telefon)

+ VALUES ("%c_obj%","%mail_obj%","%tel_obj%");

V následujícím konektoru se mohou jednotlivé hodnotu sloupců tohoto záznamu přečíst pomocí citací:

<%VlozenaObjednavka.cisloobj%>, <%VlozenaObjednavka.email%>, <%VlozenaObjednavka.telefon%>, <%VlozenaObjednavka.datobj%> a <%VlozenaObjednavka.casobj%>.


Přehled příkazů WBC preprocesoru

Příkazy preprocesoru jsou:

if

ifexists

repeat

Příkazy ifexists a repeat mohou být pouze součástí bloku SQLStatement, příkaz if může být i mimo něj.


ifexists

Formát:

#ifexists

+ SQL_příkaz_SELECT (= podmínka)

#then

+ řádek_SQL_příkazu (= větev then)

#else

+ řádek_SQL_příkazu (= větev else)

#endif

Význam:

Pokud odpověď na příkaz SELECT z podmínky obsahuje aspoň jeden záznam, pak budou pro sestavení SQL příkazů v bloku SQLStatement použity řádky ve větvi then, pokud výše zmíněná odpověď neobsahuje žádný záznam, bude pro sestavení SQL příkazů použito řádků ve větvi else.

Příkaz ifexists musí končit direktivou #endif a musí mít buď část #then, nebo část #else, nebo obě části.

Podmínku, větev then i větev else lze rozepsat na více řádků (začínajících znakem plus). V podmínce, větvi then i větvi else lze citovat libovolnou vstupní proměnnou (%jméno_proměnné%) a lze také použít libovolný příkaz WBC preprocesoru (např. vnořit ifexists do libovolné části jiného ifexists).

Vyhodnocením podmínky musí vzniknout právě jeden SQL příkaz SELECT.

Větev then i větev else může obsahovat více SQL příkazů. V tom případě musí být jednotlivé příkazy od sebe odděleny středníkem (;).

Příklad:

Jestliže uživatel vyplní ve formuláři pole Datum od a Datum do, vyberou se jeho objednávky v tomto intervalu, nevyplní-li je, vyberou se všechny

SQLStatement: SeznamObjednavek

+ SELECT *

+ FROM INP_TAB

#ifexists

+ SELECT *

+ FROM MAIN_DOD

+ WHERE (Str2Date("%obj_od%") <> NONEDATE AND Str2Date("%obj_do%") <> NONEDATE);

#then

+ WHERE (CIS_LIC="%lic%" AND DATUM >= Str2date("%obj_od%") AND DATUM <= Str2date("%obj_do%"))

#else

+ WHERE (CIS_LIC="%lic%")

#endif

+ ORDER BY DATUM;


repeat

Formát:

#repeat var|notemptyvar=řídící_proměnná delimiter=oddělovač

+ řádek_SQL_příkazu

#endrepeat

Význam:

Umožňuje automaticky generovat SQL příkazy (nebo jejich části) podle toho, kolikrát byla určitá proměnná (říkejme jí řídící proměnná repeat bloku) přečtena z formuláře (použito var=proměnná) nebo kolikrát byla přečtena neprázdná hodnota proměnné (použito notemptyvar=proměnná). WBIK zjistí, kolik hodnot řídící proměnné bylo přečteno z formuláře na vstupní WWW stránce (resp. kolik z těchto hodnot je neprázdných) a tolikrát budou za sebou vygenerovány řádky SQL příkazů uzavřené mezi #repeat a #endrepeat. Pokud je v těchto řádcích citace řídící proměnné, bude při prvním generování nahrazena první hodnotou z formuláře, při druhém generování druhou hodnotou až při posledním generování řádků bude citace řídící proměnné nahrazena poslední hodnotou řídící proměnné, která byla přečtena z formuláře na vstupní WWW stránce.

Vygenerované řádky budou odděleny oddělovačem (delimiter). Tento parametr je nepovinný, pokud není uveden, řádky budou odděleny mezerou. Pokud chceme oddělit jednotlivé řádky od sebe skupinou znaků, ve které je i jiný znak, než písmeno, číslice, nebo podtržítko ( _ ), musíme takový oddělovač uzavřít do obrácených apostrofů ( ` ).

Pokud je v řádcích uvedena citace proměnné, která není řídící proměnnou repeat bloku, pak tato citace bude nahrazena první hodnotou této proměnné, která byla přečtena z formuláře  (i kdyby bylo přečteno z formuláře více hodnot této proměnné).

Repeat blok může mít více řídících proměnných. Počet opakování řádků je stanoven podle řídící proměnné s nejmenším počtem přečtených hodnot.

Uvnitř repeat bloku lze použít libovolný další příkaz WBC preprocesoru. Nelze však vnořit do sebe dva repeat bloky, které mají shodnou aspoň jednu řídící proměnnou.

Příklad:

Uživatel ve WWW browseru zatrhne několik označovacích čtverců z dynamicky vygenerované tabulky podle následující části šablony (použije se SQLStatement Skupiny z předchozího WBC). Jedná se o označení skupin zboží.

<FONT SIZE="2">Zatržením vyberte skupiny zboží, ze kterých budete objednávat</FONT>

<BR>

<TABLE WIDTH="35%">

<TH ALIGN="Center" WIDTH="30%">Skupina</TH>

<TH ALIGN="Center" WIDTH="5%">Výběr</TH>

<%begindetail Skupiny%>

<TR><TD ALIGN="LEFT"><B><%Occis_skup%></B></TD><TD ALIGN="Center"><input type=checkbox name="Ridici" value="<%Cis_skup%>"></TD></TR>

<%enddetail%>

</TABLE>

Po stisku tlačítka SUBMIT se vykoná následující SQL příkaz SELECT, který vybere zboží pouze z označených skupin. Kolik skupin bylo zatrženo, tolikrát se provede repeat cyklus a vygeneruje podmínku WHERE. Delimiter oddělí vzniklé podmínky spojkou OR.

SQLStatement: Cenik

+ SELECT OUT_DECNK.CIS_SKUP,OUT_DECNK.CIS_CNK,

+ OUT_DECNK.CEN_PROD,Real2Str(C_012_DPH.CHPROCENTO,-2) AS DPHCKO

+ FROM OUT_DECNK,C_012_DPH

+ WHERE (OUT_DECNK.OC012_DPH=C_012_DPH.CH012_DPH) AND (

#repeat var=Ridici delimiter=` OR `

+ (CIS_SKUP= "%Ridici%")

#endrepeat

+ )

+ GROUP BY OUT_DECNK.CIS_CNK

Byly-li zatrženy dvě skupiny s číslem 4 a 6, podmínka SELECTu bude vypadat

...

WHERE (OUT_DECNK.OC012_DPH=C_012_DPH.CH012_DPH) AND ((CIS_SKUP=4) OR (CIS_SKUP=6))


Program

Formát bloku:

BeginProgram: název_projektu

  řádek_bloku_Program

EndProgram;

Příkazy BeginProgram a EndProgram musí být uvedeny na samostatných řádcích a musí být napsány bezprostředně na začátku řádku.

Název_projektu je nepovinný údaj. Je to název zdrojového programu v dané aplikaci WinBase602, v jehož kontextu má WBIK provést příkazy z tohoto bloku Program. Před provedením těchto příkazů WBIK nastaví uvedený zdrojový program jako projekt. Příkazy v bloku Program budou pak moci volat procedury a funkce z tohoto projektu a pracovat s globálními proměnnými tohoto projektu. Pokud název_projektu je vynechán, pak musí příkazy z bloku Program volat pouze standardní funkce a procedury a nesmí se odkazovat na proměnné zdrojových programů dané aplikace.

Řádek_bloku_Program může být kterýkoliv syntakticky a sémanticky správně napsaný řádek programu ve vnitřním programovacím jazyku WinBase602.

Význam:

Tento blok nám umožňuje provést libovolný zdrojový text ve formátu vnitřního programovacího jazyka WinBase602. Většinou se využije k zavolání procedury s parametrem tvořeným vstupní proměnnou formuláře a následně pomocí GetVariable se vypočtené hodnoty předají zpět mezi proměnné šablony.

Pokud se může v prováděném programu vyskytnout chyba, na níž je třeba reagovat (např. změnou hodnoty ve formuláři nebo ukončením provádění konektoru), je třeba v programu volat proceduru SetUserError z knihovny WBINET.DLL. Tato procedura nastaví chybu č. 90 (chyba vyvolaná aplikací) a jako chybové hlášení nastaví obsah předaného řetězce, takže chybová šablona na tuto chybu může reagovat. . Bezprostředně po ukončení bloku Program (nebo procedury RunProgram), ve kterém byla tato procedura zavolána, Internet klient ukončí provádění WBC konektoru a vygeneruje chybovou HTML stránku dle nastavené chybové šablony.

Pokud je v konektoru uvedeno několik bloků SQLStatement a Program, pak je WBIK provede v tom pořadí, v jakém jsou uvedeny ve WBC konektoru. Následující blok (SQLStatement i Program) bude pracovat s daty, do kterých budou zahrnuty výsledky všech příkazů v předchozích blocích SQLStatement a Program.

Před provedením zdrojového textu WBIK je většinou nutné nastavit projekt dané aplikace. Před provedením prvního bloku Program z daného WBC konektoru není nastaven projekt žádný. Po provedení prvního bloku Program, který požaduje nastavit projekt, zůstane projekt nastaven až do okamžiku, kdy další blok Program bude požadovat nastavení projektu. Tento fakt tedy znamená, že pokud první blok Program nastaví určitý projekt a druhý blok Program nebude požadovat nastavení projektu, pak příkazy druhého bloku Program budou provedeny v kontextu projektu, který nastavil první blok Program. Znamená to také, že globální proměnné projektu budou mít tu hodnotu, kterou měly při ukončení prvního bloku Program. Tímto způsobem můžeme předávat údaje mezi bloky Program.

Na tyto vlastnosti nemá vliv ani to, že mezi uvedenými bloky Program je (jeden, nebo několik) blok SQLStatement. Druhý blok Program bude v tomto případě pracovat s obsahem databáze, který bude obsahovat výsledky SQL příkazů v bloku (blocích) SQLStatement.

Pokud by druhý blok Program nastavoval ten samý projekt, budou všechny globální proměnné projektu inicializovány (vynulovány). Toto je způsobeno tím, že při nastavení projektu (i toho samého, který je momentálně nastaven) jsou inicializovány všechny globální proměnné daného projektu.

Pozor!!

V proceduře vnitřního jazyka prováděné v bloku Program nesmějí být prováděny akce, které vyžadují interakci s uživatelem!! Především nesmí tato procedura otevírat jakákoliv informační okna (Info_box, YesNo_box, Input_box), okna se zprávou o chybě (Signalize), ani žádné prvky prezentační vrstvy (pohledy, menu atd.)!! Pokud by tyto akce procedura prováděla, bude po jejich zobrazení čekat na akci uživatele (stisknutí tlačítka ap.) a díky tomu WBIK, který byl použit k provedení tohoto konektoru, nikdy neskončí svůj běh. Spolu s tímto bude webserver a browser nekonečně dlouho čekat na ukončení internetového klienta. Také nelze nastavovat tiskárny,  tisknout apod.

Na chybu při vykonávání procedury je nutné reagovat pouze voláním funkce SetUserError.

Příklad 1:

V konektoru se zavolá procedura Soucet_obj z projektu Sumace a předá se jí parametr. Vypočtené hodnoty se pomocí GetVariable dostanou zpět a je možno je použít v následující HTW šabloně.

BeginProgram: Sumace

    Soucet_obj(%id_obj%);

EndProgram;

GetVariable: w_bez0:=Nr_bez0

GetVariable: w_bez1:=Nr_bez1

GetVariable: w_bez2:=Nr_bez2

Příklad 2:

V šabloně je třeba zobrazit datum ve speciálním formátu, kterého nelze dosáhnout prostředky HTW:

V programu nazvaném WWW_procs uloženém v aplikaci (jediný program => tvoří projekt) je vytvořena procedura Datum():

var

  prom_proj : string[200];

procedure Datum();

var

  i : integer;

  ss : string[20];

  pomstr : string[200];

begin

  i :=  Day_of_week(Today);

  ss := "Dnes je "+(i=0 ? "neděle" : i=1 ? "pondělí" : i=2 ? "úterý" : i=3 ? "středa" : i=4 ? "čtvrtek": i=5 ? "pátek" : "sobota");

  pomstr := ss+", "+Date2str(Today,4);

  prom_proj := pomstr;

end;

begin

end.

Konektor může tuto proceduru zavolat a hodnotu v globální proměnné projektu překopírovat do nové HTW proměnné nazvané Datestr:

<%WBC%>

...

BeginProgram: WWW_procs

      Datum();

EndProgram:

GetVariable: Datestr:=prom_proj;

<%/WBC%>

V následující šabloně lze datum vypsat např.:

Vítejte na našich stránkách - <%Datestr%><BR>


GetVariable

Formát bloku:

GetVariable: jméno_nové_proměnné:=jméno_proměnné_projektu

Význam:

Tento blok slouží k předání hodnoty proměnné aktuálně nastaveného projektu ve vnitřním jazyce do HTW šablony, nebo do následujících bloků tohoto konektoru. Bloku GetVariable obvykle předchází blok Program, který potřebné proměnné projektu nastaví.

Provedením bloku bude vytvořena nová proměnná stejného typu a hodnoty jako proměnná projektu. Lze předat hodnoty proměnných pouze jednoduchých typů a typů řetězec. Lze tedy předat proměnné následujících typů: Short (zkonvertuje se na Integer), Integer, Money (zkonvertuje se na Real), Real, Char (zkonvertuje se na String délky 1), Boolean, Date, Time, Timestamp, String, CSString, CSIString. V HTW šabloně můžeme takto vytvořenou proměnnou citovat (zobrazit), nebo ji použít v podmínce v příkazu if. V následujících blocích tohoto konektoru můžeme tuto proměnnou použít, změnit pomocí SetVariable, větvit konektor pomocí #if, případně také použít v hlavičce příkazu repeat apod.

Jméno_nové_proměnné musí být složeno z písmen, číslic a znaku podtržení ´_´, nerozlišuje se velikost písmen. Jméno nesmí být stejné jako automaticky vytvářené proměnné (CurrentRecord, MaxRecords apod. a chybové proměnné HTW šablony), ani nesmí být stejné jako už vytvořené proměnné. Pokud jméno proměnné projektu obsahuje speciální znaky (jiné, než písmena, číslice a znak podtržení ´_´), musí být uzavřeno ve dvojici obrácených apostrofů.

Blokem GetVariable získáme hodnotu jedné proměnné aktuálně nastaveného projektu. Pokud chceme získat hodnotu další proměnné projektu, musíme ji přečíst v dalším bloku GetVariable (v jednom bloku GetVariable je možno přečíst hodnotu právě jedné proměnné projektu).

V případě, že nemáme projekt nastaven (tzn. pokud není před blokem GetVariable nějaký blok Program, který provádí nastavení projektu), musíme před blokem GetVariable nastavit projekt, ze kterého chceme přečíst hodnotu proměnné. K tomuto použijeme blok Program, v jehož těle neuvedeme žádný příkaz vnitřního jazyka WinBase602. Takový blok Program pouze nastaví projekt. Upozorňujeme, že tento projekt zůstane nastaven až do té doby, než některým z následujících bloků Program nastavíme projekt jiný.

Příklad 1:

Chceme přečíst hodnotu globální proměnné nazvané vnitrni_promenna v projektu vnitrni_projekt do HTW proměnné moje_promenna. Není nastaven projekt. Tuto operaci provedeme pomocí následujících příkazů:

BeginProgram: vnitrni_projekt

EndProgram;

GetVariable: moje_promenna:=vnitrni_promenna

Příklad 2:

V konektoru se zavolá procedura Soucet_obj z projektu Sumace a předá se jí parametr. Vypočtené hodnoty se pomocí GetVariable dostanou zpět jako nově vytvořené proměnné a je možno je použít v následujících příkazech konektoru nebo v HTW šabloně.

BeginProgram: Sumace

    Soucet_obj(%id_obj%);

EndProgram;

GetVariable: w_bez0:=Nr_bez0

GetVariable: w_bez1:=Nr_bez1

GetVariable: w_bez2:=Nr_bez2

GetVariable: w_dph0:=Nr_dph0

GetVariable: w_dph1:=Nr_dph1

GetVariable: w_dph2:=Nr_dph2

GetVariable: w_sum0:=Nr_sum0

GetVariable: w_sum1:=Nr_sum1

GetVariable: w_sum2:=Nr_sum2


DeclareVariable

Formát bloku:

DeclareVariable: jméno_nové_proměnné:=výraz_definující_proměnnou

Význam:

Tento blok slouží k vytvoření nové lokální proměnné, která lze použít kdekoliv v konektoru - např. pro podmíněné větvení WBC konektoru pomocí #if, pro sestavení podmínky WHERE apod.

Jméno nově vytvořené proměnné musí být složeno z písmen, číslic a znaku podtržení ´_´, nerozlišuje se velikost písmen. Jméno nesmí být stejné jako automaticky vytvářené proměnné (CurrentRecord, MaxRecords apod. a chybové proměnné HTW šablony), ani nesmí být stejné jako už vytvořené proměnné.

Výraz_definující_proměnnou je konstruovaný podle pravidel pro výrazy v šabloně, může obsahovat názvy vstupních formulářových proměnných, názvy selectů a sloupců, které byly vyhodnoceny v pojmenovaném SQLStatement před tímto blokem a názvy proměnných získaných pomocí GetVariable a DeclareVariable před tímto blokem.

Typ takto vzniklé proměnné je dán typem Výrazu_definujícího_proměnnou.

Příklad:

<%WBC%>

RequiredValues: hodnota anketaid

#if exists HTTP_COOKIE_anketaid%anketaid%

; pokud existuje cookie pro tuto anketu, zkopirujeme jej do proměnné 'anketacookie'

DeclareVar: anketacookie:=HTTP_COOKIE_anketaid%anketaid%

#endif

Příklad 2:

Na začátku konektoru se vytvoří proměnná typu Boolean s hodnotou FALSE, podle výsledku SELECTu se případně změní na TRUE:

<%WBC%>

DeclareVariable: Logged :=FALSE

SQLStatement: Login

+ SELECT id,jmeno,heslo

+ FROM Logtable

+ WHERE jmeno="%name%" AND heslo="%passw%"

EndSQL

#if exists Login[0].id

SetVariable: Logged :=TRUE

#endif

<%/WBC%>

Následující šablona může vypadat:

<%if Logged = TRUE%>

  Přihlášen jako <B><%Login.jmeno%></B>.<BR>

...

<FORM ACTION="<%wb_url%>/next.htw" METHOD="POST">

<INPUT TYPE="Submit" VALUE="Předat parametry">

<INPUT TYPE="Hidden" NAME="name" VALUE="<%login.jmeno%>">

<INPUT TYPE="Hidden" NAME="passw" VALUE="<%login.heslo%>">

</FORM>

<%else%>

  Přihlášení neúspěšné.<BR>

<%endif%>


SetVariable

Formát bloku:

SetVariable: jméno_existující_proměnné:=výraz_definující_novou_hodnotu

Význam:

Tento blok slouží ke změně hodnoty existující vstupní formulářové proměnné nebo proměnné získané pomocí GetVariable a DeclareVariable před tímto blokem.

Výraz_definující_novou_hodnotu je konstruovaný podle pravidel pro výrazy v šabloně, může obsahovat názvy vstupních formulářových proměnných, názvy selectů a sloupců, které byly vyhodnoceny v pojmenovaném SQLStatement před tímto blokem a názvy HTW proměnných získaných pomocí GetVariable a DeclareVariable před tímto blokem. Výraz může obsahovat i starou hodnotu proměnné.

Typ existující proměnné a typ výrazu musí být kompatibilní (buď stejný, nebo lze přiřadit Integer do Real proměnné, případně naopak);

Příklad 1:

Na začátku konektoru se vytvoří proměnná typu Boolean s hodnotou FALSE, podle výsledku SELECTu se případně změní na TRUE:

<%WBC%>

DeclareVariable: Logged :=FALSE

SQLStatement: Login

+ SELECT id,jmeno,heslo

+ FROM Logtable

+ WHERE jmeno="%name%" AND heslo="%passw%"

EndSQL

#if exists Login[0].id

SetVariable: Logged :=TRUE

#endif

<%/WBC%>

Následující šablona může vypadat:

<%if Logged = TRUE%>

  Přihlášen jako <B><%Login.jmeno%></B>.<BR>

...

<FORM ACTION="<%wb_url%>/next.htw" METHOD="POST">

<INPUT TYPE="Submit" VALUE="Předat parametry">

<INPUT TYPE="Hidden" NAME="name" VALUE="<%login.jmeno%>">

<INPUT TYPE="Hidden" NAME="passw" VALUE="<%login.heslo%>">

</FORM>

<%else%>

  Přihlášení neúspěšné.<BR>

<%endif%>


RunProgram

Formát bloku:

RunProgram: program_ve_vnitřním_jazyce

Program_ve_vnitřním_jazyce je název objektu typu program v aplikaci, který obsahuje proceduru s pevným jménem RunProgram, bez parametrů:

  procedure RunProgram;

  begin

    ...

  end;

Význam:

Pomocí tohoto bloku lze provádět generování dynamických HTML stránek poněkud odlišným způsobem, než konektor  šablona. Ke generování slouží procedura vnitřního jazyka, která umí přečíst vstupní formulářové a systémové proměnné a na určená místa HTW šablony dosazovat již hotové texty.

Generování textu

V HTW šabloně je definován libovolný počet návěští

<%:název_návěští%>

Název_návěští musí být slovo začínající písmenem (i s diakritikou), nebo znakem _ a obsahující pouze písmena (včetně písmen s diakritikou), číslice a znak _ .

V proceduře RunProgram lze pomocí speciální funkce SendToWeb generovat na tato návěští libovolný text. Tento text může obsahovat i formátovací značky HTML - viz příklad.

Blok RunProgram může být v konektoru i na více místech, lze generovat text vícekrát na stejná návěští (starší text se vždy  "odsune dopředu"). Bloky se provedou v tom pořadí, v jakém se naleznou v konektoru.

Čtení vstupních proměnných

V proceduře lze přečíst vstupní proměnné, které byly předány webserverem tomuto WBC konektoru.

Funkce, které lze použít v proceduře RunProgram, jsou uloženy v knihovně WBINET.DLL, která je součástí dodávky WinBase602. Funkce je nutné proto deklarovat jako externí. V přiloženém includu I_WBINET.PGM (soubor v adresáři s WinBase602) jsou  všechny potřebné deklarace již uvedeny, nejjednodušší cestou je tedy vložit include do Vašeho programu. Předtím pochopitelně musíme naimportovat tento soubor a tím vytvořit nový databázový objekt typu program.

POZOR!!:

•	WBINET.DLL musí být v adresáři, který je součástí proměnné PATH!!! (nejlépe v adresáři s WinBase602)

•	V proceduře RunProgram nesmějí být prováděny akce, které vyžadují interakci s uživatelem!! Především nesmí tato procedura otevírat jakákoliv informační okna (Info_box, YesNo_box, Input_box), okna se zprávou o chybě (Signalize), ani žádné prvky prezentační vrstvy (pohledy, menu atd.)!! Pokud by tyto akce procedura prováděla, bude po jejich zobrazení čekat na akci uživatele (stisknutí tlačítka ap.) a díky tomu internetový klient WinBase602, který byl použit k provedení tohoto konektoru, nikdy neskončí svůj běh. Spolu s tímto bude webserver a WWW browser nekonečně dlouho čekat na ukončení internetového klienta.

Na chybu při vykonávání procedury  RunProgram je nutné reagovat pouze voláním funkce SetUserError.

Blok RunProgram lze kombinovat s "obvyklým" způsobem generování dynamického HTML dokumentu (tj. pomocí SQLStatement, bloku Program a bloku GetVariable). Lze si představit situaci, kdy méně komplikované časti HTML dokumentu jsou generovány "klasicky" a pro generování např. komplikovanějších formulářů je použit blok RunProgram.

Provoz na Novell NetWare a Linux

Zdrojové texty procedury RunProgram mohou být stejné jako při provozu na platformě Windows. Je třeba naincludovat I_WBINET.PGM (bez ohledu na to, že v něm jsou výše zmíněné funkce označeny jako externí, nacházející se v knihovně WBINET.DLL). LCGI klient (NetWare) i CGI klient (Linux) při provádění procedury RunProgram poznají volání těchto funkcí a nehledá knihovnu WBINET.DLL, ale tyto funkce zavolá přímo, protože se nacházejí v Internet klientovi pro tyto OS..

Díky tomuto řešení lze používat stejné konektory a procedury RunProgram beze změny jak na platformě Windows, tak na platformě Novell NetWare i Linux.

Příklad kombinující oba způsoby použití - na návěští v šabloně vypíše názvy a obsah vstupních proměnných:

HTW šablona

<%WBC%>

RunProgram: Test_runprogram

<%/wbc%>

<html><head><title>Titulek</title></head>

<body>

Seznam vstupních proměnných:<br>

<table border=0 cellpadding=0 cellspacing=2>

<%:promenne%>

</table>

<p>

Obsah prvního návěští: <%:navesti1%>

</body>

</html>

Program Test_runprogram

{$I I_wbinet}

procedure RunProgram;

var

    varcount,i:short;

    varname,varvalue:string[255];

begin

    // vypsat vstupní proměnné na návěští promenne

    varcount:=GetVarCount;

    for i:=0 to varcount-1 do

      begin

        varname:="";

        if( GetVar(i,varname) ) then

          begin

            GetVarValue(i,varvalue);

            SendToWeb("promenne","<tr><td>");

            SendToWeb("promenne",varname);

            SendToWeb("promenne","</td><td>");

            SendToWeb("promenne",varvalue);

            SendToWeb("promenne","</td></tr>");

          end

        else

            SetSTWError("GetVar failed");

      end;

    // vypsat libovolný další text na návěští navesti1 a navesti2

    SendToWeb("navesti1","text na návěští 1");

end;

begin

end.


Funkce jazyka
Funkce v RunProgram

Speciální funkce, které lze použít pouze v proceduře RunProgram:

SendToWeb

SetSTWError

GetValue

GetValueCount

GetVarCount

GetVar

GetVarValue

SetUserError (lze použít i mimo RunProgram, tzn. v bloku Program)

Zde deklarované funkce jsou definované v WBINET.DLL. Mají umožnit generovat dynamické HTML stránky pomocí programu ve vnitřním programovacím jazyku WinBase602.

Funkce SendToWeb a SetSTWError přímo generují HTML stránku, resp. ovlivňují výsledek generování.

Ostatní funkce zpřístupňují seznam vstupních proměnných, které byly přijaty od webserveru (typicky seznam proměnných formuláře).

Generování chyb

Při provádění těchto funkcí se chyby negenerují, pouze daná funkce vrátí chybovou hodnotu (typicky FALSE). Generování chyb musí zajistit autor programu ve WinBase602, pomocí kterého se generuje HTML stránka. Toto zajistí zavoláním funkce SetSTWError, kterou nastaví text chybového hlášení, které bude vygenerováno. Bude použit poslední text, který byl nastaven funkcí SetSTWError. Po ukončení programu, který nastavil text chybového hlášení, internetový klient WinBase602 (CGI, ISAPI, FastCGI, či LCGI) vygeneruje chybu č. 83 "Chyba při běhu programu v bloku Run" a jako text chyby nastaví poslední text, který byl nastaven voláním funkce SetSTWError.


Funkce SendToWeb
SendToWeb

function SendToWeb(var label : string; var text_to_send : string) : Boolean;

external "wbinet.dll";

Popis:

Vloží programem vytvořený text text_to_send na místo definované v šabloně pomocí návěští se jménem label. Vytvořený text může (a často právě proto se tato procedura používá) obsahovat také HTML značky, které doplní zdrojový text v šabloně na výsledný HTML dokument.


Funkce SetSTWError
SetSTWError

function SetSTWError(var errmsg : string) : Boolean;

external "wbinet.dll";

Popis:

V reakci na to, že jiná funkce z WBINET.DLL (GetVar, GetVarValue a GetValue apod.) skončí chybou, přeruší vykonávání procedury RunProgram a nahodí chybu č. 83 ( tj."chyba při běhu programu v bloku RunProgram") a jako text chyby nastaví řetězec errmsg. Tento řetězec nesmí být delší než 1024 znaků.

Při případné databázové chybě použijte funkci SetUserError, která nahodí chybu č. 90 (Uživatelská chyba).

Na obě chyby musí reagovat chybová šablona.


Funkce GetValue
GetValue

function GetValue(var varname : string; index : short; var value : string) : Boolean;

external "wbinet.dll";

Popis:

Do proměnné value zkopíruje index-tou hodnotu vstupní proměnné varname. Hodnoty proměnných jsou indexovány od 0.

Pokud proměnná jména varname existuje a pokud existuje její index-tá hodnota, bude tato hodnota zkopírována a bude vrácena hodnota TRUE.

V případě chyby (neexistence dané proměnné, resp. neexistence index-té hodnoty) je vrácena hodnota FALSE.

Počet hodnot proměnné varname zjistí funkce GetValueCount.


Funkce GetValueCount
GetValueCount

function GetValueCount(var varname : string) : short;

external "wbinet.dll";

Popis:

Vrátí počet hodnot vstupní proměnné varname. Pokud tato proměnná neexistuje,vrátí -1.

Hodnoty proměnné varname vrací funkce GetValue.


Funkce GetVarCount
GetVarCount

function GetVarCount : short;

external "wbinet.dll";

Popis:

Vrátí celkový počet hodnot vstupních proměnných, které byly získány od webserveru. Návratová hodnota je vždy větší, nebo rovna nule.

Jméno konkrétní vstupní proměnné vrací funkce GetVar.

Hodnotu konkrétní vstupní proměnné vrací funkce GetVarValue.


Funkce GetVar
GetVar

function GetVar(pos : short; var varname : string) : Boolean;

external "wbinet.dll";

Popis:

Do řetězce varname zkopíruje jméno vstupní proměnné, která byla předána jako pos-tá. Proměnné jsou číslovány od 0. Pokud pos-tá proměnná existuje, je vráceno TRUE, v případě chyby (pos-tá proměnná neexistuje, tj. bylo předáno méně proměnných) je vráceno FALSE.

Počet vstupních proměnných vrací funkce GetVarCount.

Hodnotu konkrétní vstupní proměnné vrací funkce GetVarValue.


Funkce GetVarValue
GetVarValue

function GetVarValue(pos : short; var varvalue : string) : Boolean;

external "wbinet.dll";

Popis:

Do řetězce varvalue zkopíruje hodnotu (!!ne jméno!!) pos-té vstupní proměnné.Proměnné jsou číslovány od nuly. Vrací pří úspěchu TRUE, při chybě (neexistuje pos-tá proměnná) FALSE.

Počet vstupních proměnných vrací funkce GetVarCount.

Jméno konkrétní vstupní proměnné vrací funkce GetVar.


Procedura SetUserError
SetUserError

procedure SetUserError(var errmsg : string);

external "wbinet.dll";

Popis:

Procedura nastaví chybu č. 90 (Uživatelská chyba vyvolaná aplikací) a jako chybové hlášení nastaví obsah řetězce errmsg. Tento řetězec nesmí být delší než 1024 znaků.

Bezprostředně po ukončení bloku Program (nebo procedury RunProgram), ve kterém byla tato procedura zavolána, Internet klient ukončí provádění WBC konektoru a vygeneruje chybovou HTML stránku dle nastavené chybové šablony. Proceduru lze volat vícekrát v jednom bloku Program (resp. RunProgram), uživateli se ohlásí poslední nastavené chybové hlášení.


HTW šablony

HTW šablony jsou databázové objekty kategorie WWW objekty, které obsahují vedle normálního textu ve formátu HTML také výrazy a příkazy pro formátování údajů přečtených z databáze a větvení HTML. Tyto výrazy i příkazy jsou uzavřeny do HTW závorek <% a %>. To znamená, že uvnitř těchto závorek jsou pokyny pro WinBase602 Internet klienty a vně je text ve formátu HTML, který bude pouze odeslán do WWW browseru internetového uživatele v nezměněné podobě. Příkaz může být uveden na libovolném místě HTML textu.

Výrazy a příkazy umístěné mezi značkami začátek a konec HTML komentáře (<!-- a -->) se ignorují.

Zdroj dat pro HTW šablonu je dán buď

•	samostatným WBC konektorem, který ve svém bloku Template volá tuto šablonu, nebo

•	tzv. WBC sekcí kdekoliv v této šabloně, což je sekce v HTW šabloně ohraničená tagy <%WBC%> a <%/WBC%>

Je-li blokem Template konektoru zavolána šablona s WBC sekcí, je tato sekce ignorována a uplatní se konektor, který šablonu volal.

Příklad části HTW šablony s konektorem (tučně jsou vyznačeny výrazy a příkazy HTW): podle počtu záznamů v odpovědi na SELECT z konektoru se vytvoří řádky HTML tabulky s přepínači.

...

<%WBC%>

SQLStatement: vstup

+ SELECT Volba, Popis

+ FROM Volby

+ ORDER BY Volba

SQLStatement: KolikVoleb

+ SELECT Count(*) AS KolikV

+ FROM Volby

<%/WBC%>

<FORM METHOD=POST ACTION="<%wb_url%>/anketawbs.wbs">

<HR>

<TABLE ALIGN=RIGHT BORDER=1 BGCOLOR=Silver BORDERCOLOR=Black WIDTH=40%>

<TR ALIGN=CENTER><TH COLSPAN=2>ANKETA</TH></TR>

<TR>

<TD ALIGN=CENTER ROWSPAN=<%KolikVoleb.KolikV%> WIDTH=60%>Zvolte jednu možnost</TD>

<%begindetail vstup%>

<TD ALIGN=LEFT WIDTH=40%><INPUT TYPE="RADIO" NAME="hodnota" <%if CurrentRecord=1%> CHECKED <%endif%> VALUE="<%Volba%>"> &nbsp;&nbsp;<%Popis%> </TD>

</TR>

<%enddetail%>

</TABLE>

...

V jazyce HTW šablon lze konstruovat výrazy a zobrazovat (citovat) je, v detail sekci vypisovat hodnoty sloupců v z odpovědi na dotaz položený v konektoru a pomocí příkazů if a for větvit HTML kód.


Citace výrazu

Formát:

<%výraz;výraz_typu_integer%>

Poznámka:

Část citace ;výraz_typu_integer se nazývá upřesnění citace (formát zobrazení). Upřesnění citace je nepovinné.

Význam:

Citace vypíše hodnotu výrazu, způsob vypsání závisí na typu výrazu a na upřesnění citace.

Citovaný výraz je třeba vložit do HTW závorek <% %>, aby se odlišil od okolního HTML textu.

Možnosti upřesnění citace (= zobrazení) jsou uvedeny v následujícím přehledu:

Boolean, Integer

U těchto typů se upřesnění citace ignoruje. Boolean se vypíše jako text "ano", nebo text "ne".

Typ Short se automaticky konvertuje na Integer.

Real (Money se automaticky konvertuje na Real )

upřesnění citace	způsob vypsání
100+počet des. míst	použije se účetní zobrazení na daný počet des. míst - desetinné zobrazení, kde jsou tisíce odděleny oddělovačem nastaveným ve Windows.
-100	bude zaokrouhleno na dvě des. místa; desetinná část bude oddělena čárkou a je-li nulová, bude nahrazena pomlčkou (např. 89,30 nebo 123,-)
-101	bude zaokrouhleno na dvě des. místa; desetinná část bude obsahovat dvě cifry oddělené od celé části tečkou (např. 89.30 nebo 123.00)
-102	bude zaokrouhleno na dvě des. místa; budou použity Windows separátory, a to jak oddělovač desetinných míst, tak oddělovač skupin číslic (např. tisíců)
-99 až 99	absolutní hodnota udává počet desetinných míst;  - je-li číslo kladné, výsledek bude v semilogaritmickém tvaru; - je-li číslo záporné, výsledek bude v desetinném tvaru.
Pokud není citace upřesněna, použije se citace <%hodnota;-3%>.

datum

upřesnění citace	způsob vypsání
0	zápis data bude obsahovat pouze měsíc zapsaný číslicí, bez roku;
1	zápis data bude obsahovat měsíc zapsaný číslicí a rok;
2	zápis data bude obsahovat pouze měsíc zapsaný slovem, bez roku;
3	zápis data bude obsahovat měsíc zapsaný slovem a rok;
4	zápis data bude v dlouhém formátu Windows;
5	zápis data bude v krátkém formátu Windows;
100 (cookieexpires)	pro zadání data při nastavování vypršení COOKIES;
Pokud není citace upřesněna, použije se citace <%hodnota;1%>.

čas

upřesnění citace	způsob vypsání
0	zápis času bude obsahovat pouze hodiny a minuty;
1	zápis času bude obsahovat hodiny, minuty a sekundy;
2	zápis času bude obsahovat hodiny, minuty,  sekundy a tisíciny sekundy;
3	zápis času bude ve Windows formátu;
Pokud není citace upřesněna, použije se citace <%hodnota;1%>.

Timestamp

upřesnění citace	způsob vypsání
0	27.prosinec 12:45:56
1	27.prosinec 1998 12:45:56
2	dlouhý W formát s časem
3	krátký W formát s časem
4	27.12. 12:45:56
5	27.12.1998 12:45:56
6	27.prosinec
7	27.prosinec 1998
8	dlouhý W formát bez času
9	krátký W formát bez času
10	27.12.
11	27.12.1998
12	27.prosinec 12:45
13	27.prosinec 1998 12:45
14	dlouhý W formát s časem bez sekund
15	krátký W formát s časem bez sekund
16	27.12. 12:45
17	27.12.1998 12:45
100 (cookieexpires)	pro zadání data a času při nastavování vypršení COOKIES;
Pokud není citace upřesněna, použije se citace <%hodnota;5%>.

String a Text

Char se konvertuje na String[1].

upřesnění citace	způsob vypsání
0	obsah se vypíše "tak jak je", beze změny
1 (NL2BR)	konce řádků v textu se naradí <BR>, aby se zachovalo rozlámání - uplatní se pouze pro vypisování hodnoty sloupců typu Text
2 (ASCII)	text se převede do 7 bitového ASCII - bez diakritiky
Pokud není citace upřesněna, použije se citace <%hodnota;0%>. Hodnoty lze sčítat.


Výraz v HTW šablonách

Výrazem se rozumí zápis, ve kterém se mohou objevit následující elementy:

•	proměnná - podrobnosti;

•	konstanta - podrobnosti;

•	operátory (logické, aritmetické, porovnání) - podrobnosti;

•	operátor EXISTS - podrobnosti;

•	kulaté závorky (v obvyklém významu);

•	hodnoty databázových sloupců - podrobnosti;

•	operátor # - počet prvků v multiatributu nebo počet hodnot vstupní proměnné - podrobnosti;

•	operátor [ ] - hodnota složky multiatributu nebo i-tá hodnota vstupní proměnné - podrobnosti;

•	systémové proměnné CGI klienta - podrobnosti;

•	proměnné detail sekce - podrobnosti;

Ve výrazech platí obvyklá precedence operátorů (od nejvyšší k nejnižší: kulaté závorky, hranaté závorky, #, unární -, * /, MOD - modulo (také operátor % - céčkový tvar - příklad (sudé záznamy): <%if CurrentRecord % 2 = 1%> ...) , + -, relační operátory, not, and, or).

Způsob zobrazení hodnoty výrazu je dán tzv. upřesněním citace - viz citace výrazu.

Příklad:

různě citované výrazy:

<TABLE BORDER=1 BGCOLOR=Silver BORDERCOLOR=Black WIDTH=60%>

<TH>Volba:</TH><TH>Počet hlasů:</TH><TH>Počet procent:</TH><TH>Vaše volba:</TH>

<%begindetail Vysledek%>

<TR ALIGN=CENTER>

<TD WIDTH=55%><%popis;1%></TD>

<TD WIDTH=15%><%pocet%></TD>

<TD WIDTH=15%><%pocet*100/KolikHlasovalo.pocet;-2%></TD>

<TD WIDTH=15%><INPUT TYPE="RADIO" NAME="hodnota" VALUE="<%Volba%>"></TD>

</TR>

<%enddetail%>

</TABLE>


Součást výrazu - proměnná

Význam:

Častým požadavkem při tvoření výrazů v HTW šabloně je vypsání hodnoty proměnné. Vstupní proměnné (tj. získané z HTML formuláře) jsou vždy typu string, proměnné získané z projektu WinBase602 pomocí GetVariable jsou téhož typu jako odpovídající globální proměnná projektu, proměnné vytvořené pomocí DeclareVariable jsou dané typem výrazu, který proměnnou vytváří.

Obsah proměnné se vypisuje pomocí tzv. citace. a HTW závorek ve tvaru <%proměnná;formát%>.

Je-li v šabloně použit výraz

   vstupní_proměnná operátor konstanta_typu_integer_nebo_real

a vstupní_proměnná je typu String, proběhne automatická konverze vstupní proměnné z řetězce na integer (nebo real), aby mohl být výraz vyhodnocen.

Příklad:

Listování v záznamech po jednom na obrazovce vyžaduje, aby se měnila vstupní proměnná určující pozici zobrazovaného záznamu. Ve výrazech jako index>0 dochází ke konverzi proměnné index (z řetězce na Integer).

<%if index>0%>

<A HREF="/cgi-bin/wbcgi.exe/katalog/katmain.htw?index=<%index-1%>">Předchozí</A>

<%else%>

První záznam

<%endif%>

<%if index+1<VyberJeden.TotalCount%>

<A HREF="/cgi-bin/wbcgi.exe/katalog/katmain.htw?index=<%index+1%>">Další</A>

<%else%>

Poslední záznam

<%endif%>

<BR>

Záznam č. <%index+1%> z <%VyberJeden.TotalCount%> záznamů celkem.


Součást výrazu - konstanta

Význam:

Součástí výrazů mohou být také konstanty.

Konstanty se vypisují pomocí tzv. citace a HTW závorek ve tvaru <%konstanta;formát%>.

Příklad:

vypsat datum ve formátu Windows:

<%1.1.1999;4%>


Součást výrazu - operátory

Význam:

Při tvoření složitějších výrazů se uplatní operátory.

Mezi aritmetické operátory patří plus (+), minus (-), krát (*), lomeno (/), celočíselné dělení (DIV) a zbytek po celočíselném dělení modulo (MOD) - mají stejný význam a použití jako ve WinBase602, modulo může být vyjádřeno také operátorem %;

Logické operátory lze použít ve tvaru AND OR NOT nebo ekvivalenty podle jazyka C, tj. && || !,

Mezi operátory porovnání patří kromě zřejmých i některé méně časté, zavedené ve WinBase602. Seznam všech je uveden v následující tabulce - pokud je na jednom řádku tabulky v prvním sloupci uvedeno více symbolů pro daný operátor, můžeme použít kterýkoliv z nich):

operátor	význam
EQ, ==, =	operátor rovná se
LT, <	operátor menší než
GT, >	operátor větší než
LE, <=,=<	operátor menší, nebo rovno
GE, >=, =>	operátor větší, nebo rovno
NE, <>, !=	operátor nerovná se
CONTAINS .=.	operátor "obsahuje..."; lze použít pouze pro operandy typu String
.=	operátor "začíná..."; lze použít pouze pro operandy typu String
~	operátor "je podobný..."; lze použít pouze pro operandy typu String

Příklady použití:

<%if logged = TRUE%>

  Přihlášen jako <B><%Login.jmeno%></B>.<BR>

nebo

<TR><TD><B><%if prodej=1%>Prodej<%else%>Pronájem<%endif%></TD></TR>

<TR><TD><B><%if prodej=1%>Cena za objekt:<%else%>Cena za měsíc:<%endif%>&nbsp;</B> <%cena;-102%>&nbsp;Kč</TD></TR>

nebo

<%begindetail zdroj%>

<TR <%if CurrentRecord % 2 = 1%>CLASS="txt" <%else%>CLASS="txtinvert" <%endif%>>

  <TD><%datum%></TD>

  <TD><%jmeno1%></TD>

  <TD><%if jmeno2=""%>&nbsp;<%else%><%jmeno2%><%endif%></TD>

  <TD><%problem%></TD>

  <TD><%if reseni=""%>&nbsp;<%else%><%reseni%><%endif%></TD>

</TR>

<%enddetail%>


Součást výrazu - operátor EXISTS

Formát:

exists jméno_proměnné

Význam:

Lze použít pro zjištění existence vstupní proměnné nebo proměnné vytvořené pomocí DeclareVariable či GetVariable. Vrátí TRUE, pokud proměnná existuje, FALSE, pokud neexistuje.

Lze použít i pro zjištění existence sloupce v n-tém řádku (číslováno od 0) odpovědi na SELECT v pojmenovaném bloku SQLStatement ve tvaru

exists jmeno_selectu[n].sloupec

Operátor vrátí FALSE, pokud neexistuje sloupec nebo záznam s číslem n v odpovědi (viz příklad 2).

Příklad 1:

pokud ještě nebylo u klienta uloženo COOKIE s názvem ANKETAID, ulož ho nyní (použití v jazyce šablon):

<HTML>

<HEAD>

<TITLE>Anketa - <%anketa.nazev%></TITLE>

<%if exists id_odpovedi.id %>

<meta http-equiv="Set-Cookie" content="anketa=<%id_odpovedi.id%>; Expires=<%today.today+2;cookieexpires%> 00:00:00 GMT">

<%endif%>

</HEAD>

<BODY BGCOLOR="#FFFFFF" BACKGROUND="">

...

Anketa - pokud nebylo u klienta uloženo COOKIE s názvem ANKETA, dosud ještě klient nevolil (použití v konektoru)

#if exists HTTP_COOKIE_anketa

; pokud existuje cookie pro tuto anketu uživatel v této anketě už hlasoval, přepsat jeho volbu

SQLStatement: Akce

+ UPDATE Odpovedi

+ SET volba=%hodnota%,ipadr="%REMOTE_ADDR%"

+ WHERE id=%HTTP_COOKIE_anketa%;

#else

; ještě nehlasoval, vložit nový záznam

SQLStatement: Akce

+ START TRANSACTION;

+ INSERT INTO Odpovedi(ipadr,volba,anketaid)

+ VALUES ("%REMOTE_ADDR%",%hodnota%,%anketaid%);

; sloupec id tabulky Odpovedi má implicitní hodnotu sekvencí Odpoved_id,

; vloženou unikátní hodnotu přečteme pomocí sekvence.CurrVal

SQLStatement: id_odpovedi

+ SELECT id FROM Odpovedi WHERE id=Odpoved_id.CURRVAL;

+ COMMIT;

EndSQLStatement;

#endif

...

Příklad 2:

Ověření přihlašovacího jména hesla:

<%WBC%>

DeclareVariable: Logged :=FALSE

SQLStatement: Login

+ SELECT id,jmeno,heslo

+ FROM Logtable

+ WHERE jmeno="%name%" AND heslo="%passw%"

EndSQL

#if exists Login[0].id

SetVariable: Logged :=TRUE

#endif

<%/WBC%>


Součást výrazu - hodnota sloupce

Formát:

název_SELECT_příkazu.sloupec

 nebo

sloupec

Význam:

Při zpracování HTW šablony bude příkaz název_SELECT_příkazu.sloupec nahrazen hodnotou sloupce z prvního záznamu odpovědi na SQL příkaz SELECT pojmenovaného název_SELECT_příkazu. Název_SELECT_příkazu je jméno, kterým je pojmenován daný SELECT v odpovídajícím WBC konektoru v bloku SQLStatement. Pokud daný sloupec neexistuje, bude vygenerována příslušná chyba při běhu Internet klienta.

Pokud je třeba citovat hodnoty sloupce odpovědi na SELECT (asi nejčastější případ použití WBK), v příslušné detail sekci šablony použijte pouze výraz sloupec. Pokud byste zde (chybně) použili prefix název_SELECT_příkazu, vypsala by se pouze hodnota sloupce z prvního záznamu daného SELECTu.

Ve výrazu sloupec použitého uvnitř vnořené detail sekce je možné se odkazovat i na sloupce z vnější detail sekce - případné stejné názvy sloupců je nutné rozlišit již v konektoru - pomocí klauzule AS v jednom ze SELECTů.

Příklad:

Nechť je ve WBC konektoru SQLStatement se dvěma SELECTy - první má jediný záznam v odpovědi, druhý několik:

SQLStatement: KolikHlasovalo

+ SELECT Count(ipadr) AS kolik

+ FROM Anketa

SQLStatement: SeznamHlasujicich

+ SELECT jmeno, prijmeni

+ FROM Anketa

+ ORDER BY prijmeni, jmeno

V šabloně HTW lze pak výsledek zobrazit takto:

<B>V anketě hlasovalo dosud <%KolikHlasovalo.kolik%> voličů </B>

<P>

<B>Seznam hlasujících:</B>

<TABLE>

<TR><TD>jméno</TD><TD>příjmení</TD></TR>

<%begindetail SeznamHlasujicich%>

<TR><TD><%jmeno%></TD><TD><%prijmeni%></TD></TR>

<%enddetail%>

</TABLE>


Součást výrazu - # (počet hodnot)

Formát (pro multiatribut):

název_SELECT_příkazu.multiatribut#

 nebo

multiatribut#

Význam:

Pomocný operátor # (mříž) se používá ke zjištění počtu hodnot multiatributu.

Při zpracování HTW šablony bude příkaz název_SELECT_příkazu.multiatribut# nahrazen počtem hodnot multiatributu z prvního záznamu odpovědi na SQL příkaz SELECT pojmenovaného název_SELECT_příkazu. Název_SELECT_příkazu je jméno, kterým je pojmenován daný SELECT v odpovídajícím WBC konektoru v bloku SQLStatement. Pokud daný multiatribut neexistuje, bude tento příkaz nahrazen prázdným řetězcem a neexistující jméno multiatributu se zaznamená do logfile.

Pokud je třeba citovat počet hodnot multiatributu odpovědi na SQL příkaz SELECT, v příslušné detail sekci šablony použijte pouze výraz multiatribut#.

Poznámka:

Pokud obsahuje název multiatributu mezery (a musí se tedy psát v obrácených apostrofech), počet jeho hodnot zjistíme pomocí zápisu`multiatribut`# );

Formát (pro proměnnou):

proměnná#

Význam:

Pomocný operátor # (mříž) se používá k zjištění počtu hodnot vstupní proměnné přečtených z formuláře do konektoru a šablony.


Součást výrazu - [ ] (i-tá hodnota)

Formát (pro multiatribut):

název_SELECT_příkazu.multiatribut[index]

 nebo

multiatribut[index]

Význam:

Hranatých závorek lze ve výrazu využít k přečtení jedné hodnoty multiatributu. Je to jediný způsob, jak hodnoty multiatributu číst.

Při zpracování HTW šablony bude příkaz název_SELECT_příkazu.multiatribut[index] nahrazen některou hodnotou multiatributu (podle hodnoty indexu) z prvního záznamu odpovědi na SQL příkaz SELECT pojmenovaného název_SELECT_příkazu. Název_SELECT_příkazu je jméno, kterým je pojmenován daný SELECT v odpovídajícím WBC konektoru v bloku SQLStatement. Pokud daný atribut neexistuje, bude tento příkaz nahrazen prázdným řetězcem a neexistující jméno multiatributu se zaznamená do logfile.

Pokud je třeba citovat některou hodnotu multiatributu odpovědi na SQL příkaz SELECT, v příslušné detail sekci šablony použijte pouze výraz multiatribut[index].

Poznámky:

index je výraz typu integer;

hodnoty multiatributu jsou číslovány od 0 (první hodnota má index 0) do multiatribut#-1;

pokud je název multiatributu napsán v obrácených apostrofech, jeho některou hodnotu lze získat pomocí zápisu`multiatribut`[index];

Formát (pro proměnnou):

proměnná[index]

Význam:

Tímto způsobem lze získat hodnoty vstupní proměnné, která byla zadána ve vstupního formuláře vícekrát. Počet hodnot proměnné lze zjistit výrazem proměnná#.  První hodnota proměnné má index 0, poslední má index proměnná#-1.


Součást výrazu - systémové proměnné

Formát:

proměnná

Význam:

Používá se k získání hodnoty systémové proměnné, tj. proměnné, která se naplní bez zásahu uživatele. Viz také proměnné detail sekce

název proměnné	význam a vlastnosti proměnné
MaxRecords	- hodnota z WBC konektoru, maximální počet záznamů, který mohl být přečten z databáze - pokud v souboru WBC není hodnota MaxRecords zadána, pak tato proměnná má hodnotu  2147483647 (7FFFFFFF hexadecimálně) - je typu Integer
wb_client	- hodnota parametru cgi-binPath v INI souboru doplněná o typ klienta (např. /cgi-bin/wbcgi.exe) - viz podrobnosti
wb_database	název databáze, ke které se WBIK připojuje - viz podrobnosti
wb_application	název aplikace, se kterou WBIK pracuje - viz podrobnosti - je typu řetězec
wb_url	hodnota <%wb_client%>/<%wb_database%>/<%wb_application%>, tj. část URL připravená tak, aby v akcích bylo možno psát: <FORM ACTION="<%wb_url%>/název_www_objektu.htw"> - viz podrobnosti
CURRENT_DATE	aktuální datum
CURRENT_TIME	aktuální čas
CURRENT_TIMESTAMP	aktuální údaj o datu a čase
REMOTE_ADDR	- IP adresa vzdáleného uživatele získaná od WWW serveru
REMOTE_HOST	- název uživatele získaný od WWW serveru; ne všechny WWW servery tuto hodnotu předávají
REMOTE_USER_AGENT	- řetězec obsahující informaci o použitém browseru; ne všechny WWW servery tuto hodnotu předávají, konkrétní hodnoty je třeba vyzkoušet
HTTP_COOKIE_xxx	existuje-li cookie jménem xxx, lze jeho hodnotu získat z této proměnné

Příklad:

použití proměnné s konstantní částí URL

<FORM METHOD="POST" ACTION="<%wb_url%>/20f.htw" TARGET="hlava_frame">

atd.


HTW proměnné wb_xx
HTW proměnné wb_client, wb_database, wb_application, wb_url

wb_client

Tato proměnná byla zavedena proto, aby bylo možno psát HTW šablony, které lze bez úpravy použít ve všech korektních instalacích WinBase602 CGI Klienta. Tato proměnná se používá v těch částech HTW šablony, ve kterých se dříve uvádělo /cgi-bin/wbcgi.exe. Typicky tedy místo

<form action="/cgi-bin/wbcgi.exe/moje_db/aplikace/muj_konektor.wbc?param=hodnota">

budeme používat

<form action="<%wb_client%>/moje_db/aplikace/muj_konektor.wbc?param=hodnota">

Ve verzi 6 je lepší používat citaci proměnné wb_url.

Při zpracování šablony bude tato proměnná rozvinuta do dříve používaného zápisu. WinBase602 Internet klient vždy nastaví hodnotu této proměnné podle parametru cgi-binPath v INI souboru WBCGI.INI a doplní typ klienta. Když je takto vytvořená HTW šablona přenesena na jiný počítač, jehož adresář s CGI skripty má jiné URL, než tento adresář na počítači autora této šablony (např. místo /cgi-bin řekněme /scripts) a je správně nastaven parametr cgi-binPath v WBCGI.INI, pak tato HTW šablona poběží správně bez jakékoliv změny jejího obsahu.

Pokud ve webserveru asociujete přípony *.WBS, *.WBC a *.HTW s některým z Internet klientů (např. ISAPI klient a MS IIS), pak to Internet klient pozná a bude správně nastavovat hodnotu proměnné wb_client na prázdný řetězec.

Hodnoty těchto proměnných nejsou definovány na úvodní (statické HTML) stránce aplikace, tedy dokud nebyl zpracován první konektor.

wb_database a wb_application

Tyto proměnné obsahují název databáze a název aplikace, se kterou WBIK pracuje (tj. ty, údaje, které byly uvedeny v URL, kterým byl WBIK spuštěn). Hodnoty těchto proměnných jsou upraveny pro vložení do URL, takže znaky, které nesmějí být v URL, jsou zde nahrazeny tzv. escape sekvencí; např. mezera je nahrazena sekvencí %20.

wb_url

Tato proměnná obsahuje údaj
<%wb_client%>/<%wb_database%>/<%wb_application%>
a je připravena pro vložení do URL (opět jsou zde nahrazeny znaky nepovolené v URL escape sekvencemi).

Její typické použití je následující:
<FORM ACTION="<%wb_url%>/konektor.wbc">
nebo
<A HREF="<%wb_url%>/šablona.htw">

Tímto zápisem lze totiž zajistit, aby zůstaly šablony stejné i v případě, že danou aplikaci uživatel naimportuje do jiné databáze, případně pod jiným jménem. Tehdy stačí pouze změnit název databáze a název aplikace v úvodním vstupním URL (který je v některé statické HTML stránce) a veškeré šablony, konektory a selektory zůstávají stejné.


Detail sekce

Formát:

<%begindetail název_příkazu_SELECT%>

 tělo_detailu

<%enddetail%>

Význam:

Tato sekce umožňuje vygenerovat do HTML dokumentu obsah odpovědi na SQL příkaz SELECT z bloku SQLStatement konektoru, jehož název je uveden v hlavičce sekce. Příkaz provede tělo_detailu pro každý záznam v SELECTu (pokud je v odpovědi nula záznamů, tělo_detailu se nebude generovat ani jednou).

Pro vypsání hodnoty sloupce z odpovědi na dotaz SELECT v těle_detailu (což je nejčastější důvod, proč se CGI aplikace používají) použijte ve výrazu zápis sloupec (bez prefixování jménem SELECTu) - viz Výraz - sloupec.

Index (pořadové číslo) aktuálně generovaného záznamu je obsažen v proměnné CurrentRecord.

Pokud v těle_detailu bude použit ve výrazu zápis název_příkazu_SELECT.sloupec (méně častý případ), bude vždy použita hodnota tohoto sloupce v prvním záznamu odpovědi (záznam s číslem 0).

Detail sekce lze do sebe zanořovat.

Příklad

<TABLE BORDER=1 WIDTH=30%>

<TH>Volba:</TH><TH>Počet hlasů:</TH>

<%begindetail Vysledek%>

<TR ALIGN=CENTER><TD WIDTH=70%><%popis%></TD><TD WIDTH=30%><%pocet%></TD></TR>

<%enddetail%>

</TABLE>

Předpokládejme, že v odpovídajícím WBC konektoru jsme zapsali příkaz

SQLStatement: Vysledek

+ SELECT Volby.popis,Count(ipadr) AS pocet

+ FROM Volby LEFT OUTER JOIN Anketa ON (Volby.volba=Anketa.volba)

+ GROUP BY Volby.popis

+ ORDER BY 1

a že jsme jej pojmenovali Vysledek. Pak výše uvedeným příkladem vytvoříme HTML tabulku, která bude v každém řádku zobrazovat údaje o jednom záznamu z daného SELECTu. Do těla detailu můžeme zapsat v podstatě cokoliv, normální text, příkazy jazyka HTML i příkazy HTW šablony.


Součást výrazu - proměnné detail sekce

Formát:

proměnná

Význam:

Používá se k získání hodnoty proměnné svázané s konkrétní detail sekcí nebo přímo s blokem SQLStatement s příkazem SELECT.

Viz také systémové proměnné

název proměnné	typ	význam a vlastnosti proměnné
CurrentRecord	Integer	- uvnitř detail sekce (bez názvu detail sekce) znamená aktuální zpracovávaný záznam (číslováno od 1) - viz příklad níže - vně detail sekce, pouze se jménem SELECT příkazu    název_příkazu_SELECT.CurrentRecord  a znamená počet přečtených záznamů v příkazu SELECT; pokud bylo přečteno pouze několik záznamů (pomocí výčtu záznamů v hlavičce bloku SQLStatement), udává, kolik záznamů bylo skutečně přečteno
TotalCount	Integer	- vztahuje se k určitému SELECT příkazu      název_příkazu_SELECT.TotalCount  - udává počet záznamů, který by SELECT obsahoval, pokud by nebyl uplatněn výčet záznamů
Offset	Integer	- vztahuje se k určitému SELECT příkazu      název_příkazu_SELECT.Offset  - obsahuje pořadové číslo prvního záznamu v SELECTU vzhledem ke všem záznamům, které by SELECT obsahoval, pokud by nebyl uplatněn výčet záznamů (Offset je roven hodnotě číslo_prvního_záznamu z hlavičky bloku SQLStatement)

Poznámka

Pokud není uplatněn výčet záznamů (v hlavičce bloku SQLStatement s příkazem SELECT není zadáno omezení), platí

  název_příkazu_SELECT.Offset = 0

a

  název_příkazu_SELECT.TotalCount = název_příkazu_SELECT.CurrentRecord

Příklad:

Složitější HTML tabulka dynamicky naplněná daty z příkazu vstup; první z generovaných přepínačů (INPUT TYPE="RADIO") má být zatržen - použijeme podmínku CurrentRecord=1, která je splněna pouze na prvním záznamu

<TABLE ALIGN=RIGHT WIDTH=50%>

<TR ALIGN=CENTER><TH COLSPAN=2>ANKETA</TH></TR>

<TR>

<TD ALIGN=CENTER ROWSPAN=<%KolikVoleb.KolikV%> WIDTH=50%>Popis týkající se všech řádků </TD>

<%begindetail vstup%>

<TD ALIGN=LEFT WIDTH=50%><INPUT TYPE="RADIO" NAME="hodnota" <%if CurrentRecord=1%> CHECKED <%endif%> VALUE="<%Volba%>"> <%Popis%> </TD>

</TR>

<%enddetail%>

</TABLE>


Příkaz if

Formát:

<%if podmínka%>

 větev_then

<%else%>

 větev_else

<%endif%>

Význam:

Příkaz umožňuje podmíněné generování HTML dokumentu. Vyhodnotí se podmínka a pokud je pravdivá , použije se větev_then, jinak se použije větev_else. Příkaz if musí vždy končit slovem <%endif%>; buď část <%then%> nebo část <%else%> může být vynechána. V obou větvích můžeme použít další příkaz if (lze je vnořovat), resp. libovolné jiné HTW příkazy.

Poznámka

podmínka je výraz typu boolean

Příklad:

<%if KolikHlasovalo.kolik=0%>

<P>V anketě nehlasoval dosud žádný volič </P>

<%else%>

<P>V anketě hlasovalo dosud <%KolikHlasovalo.kolik%> voličů </P>

<%endif%>


Cyklus for

Formát:

<%for proměnná:=počáteční_hodnota to|downto koncová_hodnota step hodnota_kroku%>

tělo_for

<%endfor%>

Význam:

Verze s to přiřadí do proměnné počáteční_hodnotu a pokud je menší nebo rovna koncové_hodnotě, provede tělo_for a zvětší proměnnou o hodnotu_kroku. Znovu zkontroluje, zda-li je hodnota proměnné menší nebo rovna koncové_hodnotě, a pokud ano znovu provede tělo_for a zvětší proměnnou o hodnotu_kroku atd.

Verze s downto se chová obdobně, proměnná se však o hodnotu_kroku zmenšuje

Pokud je koncová_hodnota menší než počáteční_hodnota (resp. počáteční_hodnota menší než koncová_hodnota  ve verzi cyklu s downto), pak nebude generován žádný text.

Mezi <%for ...%> a <%endfor%> může být jak normální HTML text, tak libovolné HTW příkazy (i další cyklus for, nebo citace proměnné cyklu).

Poznámka

proměnná je nová HTW proměnná, která dosud nebyla v HTW šabloně použita

počáteční_hodnota, koncová_hodnota a hodnota_kroku jsou výrazy typu Integer

step je nepovinný údaj, není-li uveden, je hodnota_kroku rovna 1


Použití COOKIES

COOKIES jsou informace uložené webserverm na počítači klienta, sloužící k identifikaci a zapamatování určitých konstant.

Příkladem použití může být aplikace ANKETA. Při volbě je nutné pamatovat si, zda klient již nevolil dříve, aby při nové volbě se jeho stará volba přepsala a nezakládal se nový záznam s novou volbou. Při prvním přístupu do ankety se vytvoří COOKIE s názvem ANKETAID s unikátním číslem odpovědi. Při další volbě se tato hodnota přečte jakožto vstupní proměnná formuláře a ve WBC konektoru je možné na to reagovat.

Nastavení COOKIE:

Nastavení se provádí v HTML hlavičce v tagu META:

HTTP-EQUIV="Set-Cookie" CONTENT="NAME=VALUE; EXPIRES=DATE;…"

•	NAME - jméno cookie

•	VALUE - hodnota s tímto jménem spojená

•	DATE - doba, za jak dlouho vyprší platnost, lze s výhodou použít systémových proměnných CURRENT_DATE či CURRENT_TIME.

Čtení COOKIE:

Cookie jménem NAME patřící dané stránce je konektoru a šabloně k dispozici v systémové vstupní proměnné HTTP_COOKIE_NAME, vytvořené z prefixu HTTP_COOKIE_a jména cookie.

Pro existenci cookie je výhodné používat operátor exists.

Příklad:

<HTML>

<HEAD>

<TITLE>Anketa - výsledek</TITLE>

<%if NOT exists HTTP_COOKIE_ANKETAID %>

<META HTTP-EQUIV="Set-Cookie" CONTENT="anketaid=<%id_odpovedi.id%>; EXPIRES=<%CURRENT_TIME+432000;cookieexpires%>">

<!-- uložení COOKIE na počítači klienta -

  432000 je pocet sekund za 5 dní -->

<%endif%>

</HEAD>


Chybové šablony

Chybové šablony jsou speciálně navržené HTW šablony, které se použijí místo příslušných HTW šablon v případě, že při zpracovávání konektoru dojde k chybě.

Při generování HTML dokumentu podle chybové šablony nemůžeme zaručit, zda se z databáze přečetly požadované údaje. Z tohoto důvodu se budou tyto šablony používat ke generování HTML dokumentů poněkud jiným způsobem, než šablony normální. V chybových šablonách také máme k dispozici speciální proměnné, které obsahují informace o chybě.

Je-li v chybové šabloně umístěna WBC sekce, je při generování HTML ignorována.

Není-li chybová šablona v konektoru specifikována (blok ErrorTemplate), použije se chybová šablona standardní (defaultní), která se nalezne podle následujících pravidel

•	pokud je v konektoru předepsána  pomocí bloku DefaultErrorTemplate: XXX, použije se tato;

•	pokud je v aplikaci WWW objekt typu šablona jména "deferr”, použije se tento jako standardní chybová šablona;

•	jinak se použije obecná chybová šablona, která je obsažena v každém WBIK (“Chyba při běhu WBIK …”).

Pokud dojde k chybě při navazování spojení se serverem (např. server neběží, není založen uživatel __WEB, není Internet licence apod.), není možné číst šablony z databáze a proto se použije chybová šablona obecná (“Chyba při běhu WBIK …”).

Pokračování:	Generování HTML podle chybové šablony

Proměnné chybových šablon


Generování HTML podle chybové šablony
Generování HTML dokumentu podle chybové šablony

Pro generování HTML dokumentu podle chybové šablony platí následující odlišnosti od způsobu generování podle standardní HTW šablony:

1) Pokud je v chybové šabloně uvedena citace sloupce, který nebyl přečten z databáze (např. proto, že nešlo s databází navázat spojení), na místo této citace se nic nevygeneruje a do logfile se tato neznámá citace nezaznamená.

2) Pokud bude v podmínce HTW příkazu if uveden odkaz na neznámý sloupec, bude tato podmínka vyhodnocena jako “nepravda" (tzn. že se bude generovat případná větev else příkazu if), a opět se tento odkaz na neznámý sloupec nezaznamená do logfile.

3) Pokud bude v hlavičce detail bloku uveden neznámý kurzor (nebo nebyl uvedený kurzor z databáze přečten), celý detail blok se nebude generovat a opět se informace o chybném jménu kurzoru v hlavičce detail bloku nezaznamená do logfile.


Seznam chybových proměnných

V chybové šabloně můžeme použít některé speciální proměnné - chybové proměnné.

HTWErrrorCode

Tato proměnná obsahuje číslo vzniklé WBIK chyby. Je typu celé číslo. Viz seznam chyb

HTWErrorMessage

Obsahem uvedené proměnné je text se standardním popisem vzniklé WBIK chyby. Je typu řetězec. Viz seznam chyb

HTWErrorLineNumber

Obsahuje číslo řádku, na kterém došlo k chybě. Tato informace se vztahuje buď k použitému WBC konektoru, nebo k použité HTW šabloně. Je typu celé číslo.

HTWErrorFileId

Tato proměnná obsahuje kód objektu, ve kterém nastala chyba. Možné hodnoty této proměnné jsou vypsány v následující tabulce:

hodnota	význam
0	chyba nastala mimo zpracování jakéhokoliv WWW objektu (např. nelze najít WBC konektor, chyba WinBase602 atd.)
1	chyba nastala při zpracování WBC konektoru
2	chyba nastala při zpracování HTW šablony
Tato proměnná je typu celé číslo.

HTWErrorWWWObjectName

Tato proměnná obsahuje název WWW objektu aplikace, v němž došlo k chybě. Je typu String.

HTWErrorTimestamp

Tato proměnná obsahuje datum a čas, kdy došlo k chybě. Je typu Timestamp. Lze využít k dodatečnému vyhledání informací o chybě v logu, pokud bylo logování WBIK zapnuto (Konfigurační panel WinBase602)

HTWWinBaseErrorCode

V této proměnné je číslo chyby, kterou ohlásil WinBase602 SQL Server. Pokud komunikace s databází proběhla bezchybně, obsahuje tato proměnná hodnotu 0. Je typu celé číslo.

HTWWinBaseErrorMessage

Buď tato proměnná obsahuje text se standardním popisem chyby, kterou ohlásil WinBase602 SQL Server, nebo má prázdnou hodnotu (pokud komunikace s databází byla bezchybná). Je typu celé číslo.


WBS selektory
WBS - WinBase602 selektory

Pomocí WBS selektorů lze umístit do HTML formuláře více tlačítek typu SUBMIT a definovat, který WBC konektor nebo HTW šablona s WBC sekcí budou použity, pokud bylo stlačeno určité tlačítko. Pokud ve svých HTML formulářích vystačíte s jedním SUBMIT tlačítkem pro jeden formulář (nebo používáte pro přechody A HREF), není nutné se WBS selektory vůbec zabývat.

V určitých situacích může být užitečné mít ve svém HTML formuláři více tlačítek typu SUBMIT. Zde si vysvětlíme, jak umístit tato tlačítka do formuláře a jak zajistit, aby se po jejich stlačení provedly různé akce v závislosti na tom, které tlačítko bylo stlačeno.

Abychom zajistili výše zmíněné chování formuláře, musíme tlačítka typu SUBMIT ve formuláři pojmenovat stejným jménem. Tzn. všechny tagy <INPUT TYPE="SUBMIT"> musí mít v parametru NAME stejné jméno. Toto jméno musí být složeno z písmen (i s háčky a čárkami), z číslic a ze znaku podtržení ´_´.

Pokračování	Popis WBS konektoru


Popis WBS selektoru

WBS selektor je samostatný databázový objekt kategorie WWW objekty s následujícím obsahem:

[Submit]

SubmitName=jméno-tlačítek-typu-submit

[WBClist]

hodnota-tlačítka-číslo-1=WWW_objekt-číslo-1

hodnota-tlačítka-číslo-2= WWW_objekt-číslo-2

...

hodnota-tlačítka-číslo-n= WWW_objekt-číslo-n

Jméno-tlačítek-typu-submit je jméno, kterým jsou pojmenované všechna tlačítka typu SUBMIT ve formuláři. Ve formuláři je n tlačítek typu SUBMIT, hodnota-tlačítka-číslo-i je hodnota parametru VALUE i-tého tlačítka typu SUBMIT (tzn. to, co je na tlačítku zobrazeno v WWW browseru). WWW_objekt-číslo-i je WBC konektor (nebo HTW šablona), který má být použit, pokud uživatel stlačí i-té tlačítko. Musíme zde zapsat pouze název daného WWW objektu. WWW objekt musí být ze stejné aplikace, ze které je daný selektor. Stejný konektor (šablonu) můžeme uvést u více tlačítek (i když tato situace odporuje tomu, proč jsme multitlačítkový formulář vytvářeli).

V parametru ACTION tagu FORM našeho multitlačítkového formuláře uvedeme odkaz na námi vytvořený WBS selektor. Syntaxe tohoto odkazu se řídí identickými pravidly, jako syntaxe odkazu na jiný WW objekt. V tomto ohledu se můžeme na WBS selektory dívat jako na speciální typ konektoru, který obsahuje pouze jakousi tabulku s přiřazením tlačítek typu SUBMIT a WBC konektorů (HTW šablon).

Pokud máme vše správně nastaveno, WBIK zjistí, které tlačítko bylo uživatelem stlačeno, zjistí odpovídající obsah WWW objektu a pro připojení k WinBase602 SQL Serveru použije odpovídající WBC konektor.

Příklad:

[Submit]

SubmitName=BUTT

[WBClist]

Volba=anketa

Výsledek=vysledek


Konfigurace WBIK
Konfigurace WBIK (WBCGI.INI)

WinBase602 Internet klienti používají konfigurační soubor WBCGI.INI, který se nachází v adresáři, kde máte instalován systém Windows. V tomto souboru jsou uvedeny parametry, které ovlivňují běh programů WBIK. Hodnotu těchto parametrů změníte v programu Konfigurace WinBase602, na záložce WWW objekty, případně editací tohoto souboru libovolným ASCII editorem (např. pomocí editoru Notepad).

Nastavují se pouze parametry: adresář, do kterého se vytváří logfile; úroveň podrobnosti logfile; zda logfile mazat před každým spuštěním WBIK; a alias adresáře s CGI a ISAPI skripty. Pokud nejsou parametry nastaveny, nebo jsou nastaveny špatně, WBIK je správně nastaví a zapíše. Prakticky to znamená, že na rozdíl od předešlých verzí není nutno nastavovat téměř nic.

Pro  LCGI klienta na Novell NetWare a CGI klienta na Linuxu je nutné příslušné zásahy do wbcgi.ini (NetWare) a wbcgi.conf (Linux) dělat ručně.

Pokračování: 	sekce Setup

sekce Logging


Sekce Setup WBIK.INI
Sekce Setup

parametr cgi-binPath

Formát:

cgi-binPath=alias

Význam:

Tento parametr udává, jak se budete na adresář s CGI scripty (např. WBCGI.EXE) na Vašem Webserveru  odkazovat v URL zadávaném z WWW browseru nebo v tagu ACTION nebo HREF. Hodnota alias musí korespondovat s nastavením na Webserveru. Hodnota systémové proměnné wb_client je tvořena jako alias/typ_klienta.

Přiklad:

Webserver je nainstalován v adresáři C:\WEBSERVER a jeho CGI skripty jsou v adresáři C:\WEBSERVER\CGI-BIN. Adresa Webserveru je www.server.cz a v browseru chceme otevřít CGI skript wbcgi.exe s nějakými parametry. V konfiguraci webserveru definujeme alias na adresář C:\WEBSERVER\CGI-BIN, tento alias je /cgi-bin. Do browseru bychom tedy zadali adresu

http://www.server.cz/cgi-bin/wbcgi.exe/moje_db/Anketa/anketa.htw

Hodnotu parametru cgi-binPath je nutno tedy nastavit na /cgi-bin.


Sekce Logging WBIK.INI
Sekce Logging

Pomocí parametrů v této sekci řídíme, jakým způsobem budou WinBase602 Internet klienti generovat informace o své činnosti (tzv. logování).

WBIK je schopen automaticky vytvářet informace o průběhu své práce, tyto informace generuje do textových souborů v adresáři z parametru Directory. Soubory mají příponu LOG a jsou pojmenované podle aktuálního data takto: RRRRMMDD. První čtyři znaky jména souboru je aktuální rok, další dva znaky je aktuální měsíc a poslední dva znaky je aktuální den. Pro daný den, např. 12.9.1996, budou údaje o běhu WBIK archivovány do souboru se jménem 19960912.LOG. Tímto způsobem bude mít správce přehled, ve který den došlo k jakým událostem v souvislosti s během WBIK.

Soubory jsou vytvářeny do podadresáře, který je vytvořen podle názvu databáze a názvu aplikace, se kterou WBIK pracuje. Znamená to tedy, že logfile je vytvářen pro každou aplikaci zvlášť. Soubor je tedy vytvářen do adresáře:

adresář_z_Directory\název_databáze\název_aplikace

Pokud se nemůže WBIK připojit k databázi, nebo nenajde v dané databázi požadovanou aplikaci, je logfile vytvořen přímo do adresáře_z_Directory. Pokud tento podadresář neexistuje, WBIK jej vytvoří.

LCGI klient (wblcgi.nlm) upraví názvy databáze a aplikace tak, aby byly názvy podadresářů pojmenovány podle zvyklostí MS-DOSu, tj. jméno max. 8 znaků a přípona max. 3 znaky.

Parametr Level

Formát:

Level=none|normal|debug

Význam:

Hodnota tohoto parametru musí být právě jedno ze tří slov none, normal, debug. Parametrem určujeme, jak podrobně bude vytvářen záznam o práci programu (logfile).

Hodnota	zaznamenávané události
none	do logfile se nebude zaznamenávat nic
normal	budou zaznamenány pouze chyby při běhu programu (např. neexistující šablona, chyby při komunikaci s WinBase602 SQL serverem atd.)
debug	to, co při úrovni normal, a navíc podrobné údaje o prováděných akcích (analýza WBC konektoru, komunikace s databází, sestavování výsledného HTML dokumentu)

Při ladění WBC konektorů a HTW šablon doporučujeme nastavit úroveň debug. Po odladění můžeme buď logování úplně vypnout (nastavením úrovně none), nebo nechat zaznamenávat pouze chyby při práci WBIK (nastavením úrovně normal). Rozhodně nedoporučujeme ponechat úroveň debug i pro běžný provoz, generované soubory by byly neúměrně velké. I při normálním provozu je rozumné občas smazat staré soubory (např. všechny starší než jeden týden).

Parametr Directory

Formát:

Directory=úplné_jméno_adresáře

Význam:

Tímto parametrem určujeme, do kterého adresáře budou generovány soubory s popisem průběhu práce programu (logfiles). Adresář musí existovat.

Parametr DeleteLog

Formát:

DeleteLog=0|1

Význam:

Pokud je hodnota tohoto parametru 1, WBIK při každém spuštění na začátku smaže obsah logfile. Pokud je hodnota 0, pak nově generované zprávy o běhu přidá k už existujícímu obsahu logfile.

Tato vlastnost je významná při ladění WBC konektorů a HTW šablon. Při této činnosti nastavte hodnotu tohoto parametru na 1 a WBIK zajistí, že po každém spuštění bude logfile obsahovat pouze zprávy, které byly vygenerovány při tomto spuštění. Po odladění WBC konektorů a HTW šablon nastavte tento parametr na 0.

Pokud není ve WBCGI.INI tento parametr uveden, WBIK se chová, jako by měl tento parametr hodnotu 0.

Nastavování parametrů pro jednotlivé aplikace

Pro každou aplikaci zvlášť lze nastavit parametry LogLevel a DeleteLog. Parametry se nastavují pomocí záložky WWW objekty v dialogu Vlastnosti aplikace. Tento dialog vyvoláte ve Vývojovém prostředí WinBase602 pomocí příkazu Vlastnosti v kontextovém menu dané aplikace, případně pomocí tlačítka Vlastnosti na řídícím panelu.


Seznam chyb WBIK
Seznam čísel chyb WinBase602 Internet Klienta

Seznam obsahuje všechny chyby, které mohou nastat při běhu WBIK. Číslo chyby vrací chybová proměnná HTWErrorCode, popis chyby vrací chybová proměnná HTWErrorMessage. Použití - viz chybové šablony.

Číslo	popis chyby
1	nelze nalézt WBC konektor
2	rezervováno
3	rezervováno
4	rezervováno
5	rezervováno
6	chybí Template v samostatném WBC konektoru
7	v konektoru chybí blok SQLStatement
8	neznámá aplikace WinBase602
9	neznámý příkaz WBC preprocesoru
10	neočekávaný WBC příkaz then
11	neočekávaný WBC příkaz else
12	neočekávaný WBC příkaz endif
13	neočekávaný WBC příkaz endrepeat
14	neukončený WBC příkaz ifexists
15	neukončený WBC příkaz repeat
16	neznámá řídící proměnná repeat bloku v konektoru
17	chybná hlavička repeat bloku v konektoru
18	neznámá proměnná v SQLStatement bloku v konektoru
19	nelze se spojit s WinBase602 SQL serverem
20	chyba WinBase602, podrobnosti viz okno nebo log serveru
21	nelze nalézt HTW šablonu
22	neznámý HTW příkaz
23	obecná chyba syntaxe HTW šablony
24	neznámý operátor v HTW příkazu if
25	neočekávaný HTW příkaz else
26	neočekávaný HTW příkaz endif
27	neočekávaný HTW příkaz enddetail
28	neukončený HTW příkaz if
29	neukončený HTW příkaz detail
30	nesprávné vnoření detail sekcí v HTW šabloně
31	citace neznámého sloupce, nebo proměnné v HTW šabloně
32	nepojmenovaná detail sekce v HTW šabloně
33	neznámé jméno SQL příkazu v detail sekci v HTW šabloně
34	SQL příkaz v detail sekci v HTW šabloně není SELECT
35	nekompatibilní typy hodnot v podmínce v HTW příkazu if
36	neznámý adresář v parametru WBCRootDirectory v WBCGI.INI
37	neznámý adresář v parametru HTWRootDirectory v WBCGI.INI
38	neznámý adresář v parametru Directory v sekci Logging v WBCGI.INI
39	nepřípustná hodnota parametru Level v sekci Logging v WBCGI.INI
40	chybné jméno souboru v parametru DefaultHTWErrorTemplate v WBCGI.INI
41	chybný formát vstupních formulářových proměnných
42	příliš mnoho vnoření příkazů ifexists v konektoru
43	syntaktická chyba v SQLStatement v konektoru
44	nelze přečíst proměnnou prostředí SCRIPT_NAME
45	stejné řídící proměnné ve dvou vnořených repeat blocích v konektoru
46	citace sloupce vně detail bloku bez uvedení pojmenovaného SELECTu v HTW šabloně
47	chybí povinná hodnota proměnné vyžadovaná blokem RequiredValues:
48	neznámá proměnná v bloku Program v konektoru
49	chybný formát bloku Program v konektoru
50	neukončený blok v konektoru
51	neznámý projekt v hlavičce bloku Program v konektoru
52	chyba při běhu programu v bloku Program v konektoru
53	neznámá proměnná projektu v bloku GetVariable v konektoru
54	neočekávaný příkaz endfor v HTW šabloně
55	neukončený blok for v HTW šabloně
56	špatný typ mezí v HTW příkazu for
57	nedostatek paměti
58	neočekávaný konec HTW šablony
59	nelze přečíst token
60	neočekávaný typ tokenu v HTW šabloně
61	za názvem bloku konektoru chybí dvojtečka
62	chybný formát řádku ve WBC konektoru
63	SQL příkaz v podmínce příkazu #ifexists v konektoru není SELECT
64	rezervováno
65	rezervováno
66	z URL nelze zjistit jméno WBC konektoru
67	nelze vytvořit výsledný HTML dokument - pravděpodobně je nedostatek paměti
68	chybová šablona, která je uvedena ve WBC konektoru, neexistuje, nebo je chráněna proti čtení
69	upřesnění citace v HTW šabloně není celé číslo
70	podmínka v příkazu if v šabloně není typu Boolean
71	výraz za operátorem NOT musí být typu Boolean
72	chybně zapsaný výraz
73	nekompatibilní typy operandu ve výrazu
74	index hodnoty multiatributu nebo proměnné není typu Integer
75	index hodnoty multiatributu nebo proměnné odkazuje na hodnotu, která je mimo meze
76	SQL příkaz, u kterého se zjišťuje počet záznamů, není SELECT
77	neznámý identifikátor v HTW šabloně
78	ve výrazu v HTW šabloně je použit SQL příkaz, který není SELECT
79	rezervováno
80	v URL je odkaz na soubor, který není ani WBC konektor, ani WBS selektor, ani HTW šablona
81	v bloku RunProgram ve WBC konektoru chybí název programu
82	rezervováno
83	chyba v RunProgram vyvolaná funkcí SetSTWError
84	nelze nalézt program ve vnitřním jazyku, který je uveden v konektoru v bloku RunProgram, nebo tento program nelze zkompilovat
85	procedura RunProgram generuje text na návěští, které v HTW šabloně neexistuje
86	chybný formát WBS selektoru
87	není nastavena hodnota parametru cgi-binPath v sekci [Setup] v WBCGI.INI
88	neexistuje uživatel __WEB na serveru nebo není zakoupena licence - nelze se přihlásit
89	chyba dělení nulou
90	uživatelská chyba vyvolaná funkcí SetUserError
91	vyčerpán počet klientských licencí SQL serveru verze 6.0
92	podmínka v #if není typu Boolean
93	příkaz #if není ukončen #endif
94	neznámá chyba v SetVariable
95	výraz v SetVariable neodpovídá typu proměnné