1. Dotazy na sloupce odkazující na více tříd

    Článek: AN0001887Aktualizováno::

    ObjectGears nabízí sloupec umožňující odkázat na data z více tříd. Pokud s takovým sloupcem pracujeme v dotazu, musíme použít zvláštní syntaxi, kterou si ukážeme na příkladu třídy Úkoly odkazující v jednom sloupci na třídy Partner, Potenciální partner/Lead, Příležitost, Případ, Smlouva, Kampaň, Událost a další (viz model Business).

    V níže uvedeném příkladě budeme chtít vytvořit dotaz zobrazující Úkoly, které odkazují na Partnera. Dotaz vytváříme za účelem napojení do Master-Detail relace Partnera, a proto musí tento dotaz mít sloupec typu odkaz na Partnera. Nejprve si vytvoříme základní kostru dotazu a v druhém kroku pak přidáme další užitečné sloupce.

     V prvním dotazu vybíráme sloupce Id Úkolu, jeho Krátký popis a hlavně vytváříme sloupec ukazující do třídy Partner (account), přes který pak dotaz do master-detail relace budeme moci napojit.

    Data sloupce odkazujícího na více tříd jsou uložena ve více tabulkách. My volíme tu, která se týká Partnera (account) a jejíž název v sobě obsahuje id třídy Úkolu a Partnera (DatarowX_YLink, kde X je id třídy Úkolu a Y id třídy Partnera). Vztahy tabulek zobrazuje následující schéma.

    Tabulka DatarowX_YLink obsahuje všechna data ze všech sloupců třídy Úkol (X), které jsou typu odkaz na více tříd a ukazují na třídu Partner (Y). Proto musíme definovat dvojnásobnou vazbu třídy Partnera a tabulky DatarowX_YLink - na hodnotu uloženou v odkazujícím sloupci a na odkazující sloupec samotný.

    Obě vazby jsou uloženy ve sloupcích tabulky DatarowX_YLink. První vazba představuje Id konkrétní záznamu Úkolu, který je ve sloupci ReferentionId. Druhá vazba určuje Id sloupce třídy Úkol podílejícího se na vazbě - Id je uloženo ve sloupci ColumnClassDefId.

    Kvůli přenositelnosti neuvádíme v názvu tabulky DatarowX_YLink X a Y v definici dotazu přímo, ale zjistíme si je pomocí notace {{: class.kódtřídy.id :}}. Stejně tak při porovnávání hodnot ve sloupci ColumnClassDefId zjistíme Id sloupce related_to pomocí notace {{: class.názevtřídy.column.kódsloupce.id :}}.

    SELECT t.id, t.shortdescription, l.LinkReferentionId link___account
    FROM {{: class.task :}} t
    INNER JOIN DataRow{{: class.task.id :}}_{{: class.account.id :}}Link l ON l.ReferentionId = t.id and l.ColumnClassDefId = {{: class.task.column.related_to.id :}}

     Získáme dotaz s následujícími základními sloupci.

    Jakmile si nadefinujeme tuto základní kostru, dotaz jednoduše rozšíříme o další sloupce třídy Úkol a o FullId konkrétního Úkolu a Partnera. Tyto FullId skládající se z Id třídy a Id záznamu pak použijeme jako URL odkazy ve sloupcích, aby bylo možné se jednoduše dostat z master-detail relace Partnera k Úkolu a to včetně return URL zpět do záznamu Partnera

    SELECT t.id, t.shortdescription, t.code, t.name, t.description, t.target_date, l.LinkReferentionId link___account, s.id AS status___status,
    p.fullname AS solver, sg.id AS status_group___status_group,
    CONVERT( varchar,{{: class.account.id :}}) + '-' + CONVERT( varchar, l.LinkReferentionId) AS AccountFullId,
    CONVERT( varchar,{{: class.task.id :}}) + '-'+ CONVERT( varchar, t.id) AS TaskFullId
    FROM {{: class.task :}} t
    INNER JOIN DataRow{{: class.task.id :}}_{{: class.account.id :}}Link l on l.ReferentionId = t.id and l.ColumnClassDefId = {{: class.task.column.related_to.id :}}
    LEFT JOIN {{: class.status :}} s ON t.status = s.id
    LEFT JOIN {{: class.status_group :}} sg ON s.status_group = sg.id
    LEFT JOIN person p ON t.assigned_to = p.id

    Získáme dotaz s dalšími sloupci.

×