1. SQL definice dotazu

    Článek: AN0001640Aktualizováno::

    Pro definici SQL dotazu lze použít všechny vlastnosti použité databáze s několika modifikacemi.

    • tabulky je třeba pojmenovat 
    • nesmíte použít klauzuli ORDER BY - dotaz se následně vkládá do jiného pro potřeby řazení a stránkování

    Na použité třídy v dotazu se lze odkazovat přímo (zapsání DataRow a ID dané třídy). Tento zápis je ovšem nepřenosný na jiné instance systému ObjectGears a uživatelsky nekomfortní. Proto přednostně používejte druhý zápis:

    select * from {{: class.__kod_tridy__ :}} tab
    select * from {{: query.__kod_dotazu__ :}} query
    select * from {{: model.__kod_modelu__.class.__kod_tridy__ :}} tab

    První příklad vloží třídu ze stejného modelu jako je vlastní dotaz. Druhý příklad vloží dotaz ze stejného modelu. Třetí příklad umožňuje vložit třídu z jiného modelu.

    Použitou třídu nebo dotaz je třeba explicitně pojmenovat (v příkladu je název tabquery), jinak dojde k chybě při uložení dotazu. 

    Dále můžete v dotazu použít níže uvedené příkazy. Ty vkládají aktuální ID objektu. Nemusíte tak do sql zadávat konkrétní ID z jedné instance, což by bránilo přenositelnosti. Příkazy nepoužívejte pro skládání názvů použitých tabulek, ale např. pro vrácení ID jako součásti dat.

    {{: model.__kod__.id :}}
    {{: class.__kod__.id :}}
    {{: query.__kod__.id :}}

    {{: class.__kod__.column.__kod_sloupce__.id :}}
    {{: query.__kod__.column.__kod_sloupce__.id :}}

    select id, {{: class.ukol.id :}} parentId
    from {{: class.ukol :}} u

    Parametrizace dotazu

    V dotazu můžete použít příkazy, které jsou při vlastním spuštění nahrazeny aktuální hodnotou. Dotaz tak lze lehce přizpůsobit aktuálnímu kontextu. Příkazy se zadávají do dvojitých závorek, ale bez dvojteček.

    Následující příklady načtou záznamy ze třídy "akce", kde je hodnota ve sloupci "adminid", resp. "adminname" rovna aktuálně přihlášenému uživateli. Výsledná hodnota příkazu je text. Proto musí být vložen do apostrofů.

    select * from {{: class.akce :}} a where adminid = {{ LoginUser.Id }}
    select * from {{: class.akce :}} a where adminname = '{{ LoginUser.FullName }}'

    Příkaz Popis
    LoginUser.Id Příkaz vloží ID aktuálně přihlášeného uživatele.
    LoginUser.FullName Příkaz vloží celé jméno aktuálně přihlášeného uživatele.
    LoginUser.Account Příkaz vloží účet aktuálně přihlášeného uživatele.
    LoginUser.Code Příkaz vloží kód aktuálně přihlášeného uživatele.
    LoginUser.Email Příkaz vloží email aktuálně přihlášeného uživatele.

    Návratová hodnota příkazu LoginUser.Id je celé číslo, zatímco ostatní příkazy LoginUser... vrací text. Proto je třeba tyto příkazy uzavřít do apostrofů. Jinak při vykonávání SQL příkazu databází dojde k chybě.

    Dotaz s těmito parametry můžete použít na webu nebo pro webové služby. Nemůžete však pro něj vytvořit v databázi view pomocí funkce Vytvoření API view. V databázi totiž není dostupná informace o aktuálním uživateli.

    Dotaz s WITH

    V dotazu nemůžete normálně použít příkaz WITH. Musíte tento "poddotaz" vložit do jiného pomocného dotazu a na něj se opakovaně odkázat.

    V dotazu tedy nemůžete použít ani rekurzivní volání. Při jeho potřebě použijte jako zdroj dotazu uloženou proceduru

    Důvodem je obalení Vašeho dotazu jiným dotazem pro řazení, stránkování a správné pojmenování sloupců, které přidává systém ObjectGears. Příkaz WITH můžete použít, jen pokud použijete i příkaz /*ENDWITH*/.

    Příklad použití:

    WITH ArticleTopic(first_article_id, article_id, parent_article_id, topic_id, Level)
    AS
    (
      ...
    )
    /*ENDWITH*/
    select ...
    from ...

    Příkaz /*ENDWITH*/ vložte hned za část WITH a před klauzuli SELECT.

×