Přehledové formuláře
Přehledové formuláře jsou zamýšleny spíše pro potřebu vedoucích pracovníků nebo účetních. Jejich pomocí by například mohli obecně sledovat požadavky zadané pomocí procesních formulářů v prostředí Sofa a vytvářet jejich statistické přehledy.
Okno Správa přehledů otevřete v okně Administrace klepnutím na tlačítko Správa přehledů. Okno je ve výchozím stavu prázdné. Hotový přehledový formulář můžete do Sofa importovat ze souboru nebo jej vytvořit jako zcela nový pomocí návrháře.
Vytvoření nového přehledového formuláře
Pokud chcete vytvořit nový přehledový formulář, postupujte takto. Klepněte na tlačítko Akce a v rozvinuté nabídce spusťte příkaz Vytvořit nový přehled.
V okně Nový přehled nastavte vlastnosti nového přehledu.
-
V sekci Popisné údaje uveďte český a anglický název a také slovní popis, k čemu má přehled sloužit.
-
V sekci Nastavení zapište do pole Priorita řazení číslo udávající, s jakou prioritou bude položka přehledu uváděna v pohledu na přehledové formuláře.
-
Voličem Úroveň logování vyberte, do jaké úrovně se mají zaznamenávat systémové události.
-
Do pole Identifikátor napište stručný řetězec znaků, pod kterým bude přehled jednoznačně dostupná v interních tabulkách Sofa ve vztahu k jiným procesům. Pole nesmí být prázdné. Jako výchozí volba se nabízí obsah pole Český název – bez mezer, speciálních znaků a znaků s diakritikou. Jednoznačnost identifikátoru se kontroluje.
-
V sekci Ikona agendy můžete vybrat obrázek, který bude vyjadřovat ikonu agendy. Přepínačem vlevo nejprve zvolte, zda chcete použít některou z přednastavených ikon (volba Z galerie), nebo vlastní obrázek (volba Vlastní ikona).
-
V případě výběru z galerie jednoduše klepněte na zvolený motiv, ten se označí černým orámováním.
-
Pokud chcete použít vlastní motiv, připravte si soubor ve formátu PNG, s rozlišením 48×48 pixelů. Klepněte na tlačítko Nahrát ikonu agendy a soubor vyhledejte na disku počítače.
-
Od verze Sofa 5.0 lze také zvolit barevné schéma zobrazení tzv. dlaždic – velkoplošných tlačítek pro spouštění přehledů v okně Dashboard nebo v pohledu Zadat okna Agendy.
Návrhář přehledu
Tlačítkem Navrhnout přehled přejdete přímo z okna Nový přehled do okna návrháře přehledů.
Obsluha Návrháře přehledu je popsána v kapitole Prostředí návrháře přehledu.
Jakmile návrh publikujete, přejdete do okna Úprava přehledu, které je v podstatě totožné s výše uvedeným oknem Nový přehled. Zde můžete upravit vlastnosti přehledu a tlačítkem Uložit práci zakončit.
Import přehledového formuláře
Předpokladem je, že máte k dispozici soubor, ve kterém je uložen hotový přehledový formulář.
Postupujte takto:
-
Klepněte na tlačítko Akce.
-
V rozvinuté nabídce spusťte příkaz Importovat přehled.
-
V dialogu Import přehledu vyhledejte pomocí tlačítka Procházet v poli Soubor s exportovaným přehledem soubor s přehledovým formulářem. Soubor musí mít koncovku S602.
-
Chcete-li exportovaný přehled načíst do jiného přehledu, vyhledejte ho voličem Naimportovat do.
-
Stiskněte tlačítko Importovat přehled.
-
V okně Úprava přehledu zkontrolujte načtené vlastnosti přehledu a podle potřeby je upravte.
-
Klepněte na tlačítko Uložit.
Tlačítkem Uložit otevřete Návrhář přehledů, kde můžete vzhled přehledu podle potřeby upravit.
Správa přehledových formulářů
Položky vytvořených i importovaných přehledů jsou zobrazeny v okně Správa přehledů.
Nastavení dostupnosti přehledu
Ve výchozím stavu není vytvořený přehledový formulář nikomu dostupný. Dostupnost je tedy nutné nastavit. V položce přehledu klepněte na tlačítko se třemi tečkami a potom na příkaz Nastavit oprávnění přehledu.
Otevře se okno Dostupnost přehledu xxx. Zde klepněte na tlačítko Přidat skupinu/roli nebo na odkaz Zpřístupnit pohled skupině / roli.
V dialogu Přidání skupiny / role do dostupnosti přehledu vyberte pomocí voliče požadovanou skupinu (roli); podle potřeby postup opakujte pro další skupiny (role).
Poté volbu uložte. Nastavení se promítnou do sloupce Dostupnost přehledu v okně Správa přehledů.
Takto nastavený přehledový formulář nadále budou mít příslušní uživatelé k dispozici v pohledu Přehledy okna Agendy.
Úpravy přehledového formuláře
Klepnutím na tlačítko se třemi tečkami ve sloupci Akce se pro danou položku otevře příkazová nabídka obsahující servisní příkazy pro úpravy přehledového formuláře. Zastoupení příkazů může být u některých formulářů odlišné podle jejich dostupnosti.
-
Upravit popis – otevře okno Úprava přehledu pro úpravy popisných údajů přehledu.
-
Upravit předpis přehledu – otevře pro daný přehled okno návrháře přehledů.
-
Smazat přehled – vymaže přehledový formulář ze seznamu.
-
Exportovat přehled – exportuje údaje o přehledu do nastaveného souboru.
-
Vytvořit kopii přehledu – vloží do přehledů nový přehled, který bude přesnou kopií předmětu, u kterého byl příkaz spuštěn. Název kopie i další parametry lze změnit v okně otevřeném příkazem Upravit popis.
-
Nastavit oprávnění přehledu – umožňuje spravovat dostupnost přehledu podle skupin a rolí.
Prostředí Návrháře přehledu
Návrhář slouží k samotnému sestavení vlastností přehledu. Do prostřední části stránky je třeba vložit základní GraphQL dotaz, který získává data do hlavní tabulky přehledu.
Dále můžete použít Sofa JavaScript, ten slouží pro přípravu proměnných pro hlavní dotaz. Je možné provolávat poddotazy, např. profiltrovat data ze zobrazení (typicky např. podřízení přihlášeného uživatele).
Je možné definovat názvy sloupců zobrazených v přehledu: podle kterých sloupců bude možné filtrovat, podle kterých sloupců lze rychle vyhledávat, šířky sloupců a pro čísla a datumy nastavovat zobrazovanou masku.
V přehledu je možné zobrazovat podtabulky, tedy tabulky propojené s hlavní tabulkou pomocí cizích klíčů. Pro každou podtabulku je možné definovat její název a u sloupců jejich název, šířku a zobrazované masky.
GraphQL dotazy pro vytváření přehledů
Přehledy jsou v Sofa od verze 4 realizovány přímo nad databází pomocí GraphQL dotazů. Aby v přehledu vše správně fungovalo (stránkování, filtrování) je nutné přesně dodržovat určité tvary dotazů.
Okno pro práci s datovými zdroji je možné otevřít z okna Administrace klepnutím na tlačítko Přehledy.
Příprava databáze
Aby bylo možné pracovat s přehledy, je nutné mít ve své organizaci vytvořený a nastavený přístup k Sofa databázi.
Aniž byste cokoliv museli nastavovat, existuje vždy položka systémové databáze Sofa. Ta obsahuje tabulky všech agend Sofa. V této databázi byste neměli nic měnit.
Ukažme si, jak vytvoříte svůj vlastní nový datový zdroj. Ten můžete vytvořit v okně Datové zdroje po stisknutí tlačítka Přidat nový datový zdroj.
V okně Datový zdroj je předem nastaveno několik parametrů bez možnosti jejich úprav. Jedná se o:
-
Typ datového zdroje – což je Sofa databáze.
-
Databázové schéma – systém generuje automaticky.
-
Uživatelské jméno – nastavené systémem a neměnné.
U datového zdroje je nejdůležitější nastavení hesla pro přístup do databáze. Heslo musí obsahovat písmena, číslice a speciální znaky.
V tuto chvíli je možné se přihlásit do databáze s loginem uvedeným v položce uživatelské jméno a zadaným heslem.
Po vytvoření tabulek a jejich požadovaném propojení je možné načíst do Sofa databázové schéma. To opět uděláte v administraci Sofa:
-
U položky daného datového zdroje klepněte na tlačítko se třemi tečkami a v následující příkazové nabídce spusťte příkaz Tabulky.
-
V okně Tabulky datového zdroje xxx klepněte na tlačítko Aktualizovat databázové schéma.
-
Poté se z databáze načtou tabulky a vypíšou se definované vazby mezi nimi.
-
Po stisknutí tlačítka Publikovat se otevře přehled všech tabulek, podle kterého je možné tyto tabulky používat v GraphQL dotazech v Sofa.
Po klepnutí na tlačítko se třemi tečkami a spuštění příkazu Editovat tabulku je možné jednotlivé tabulky upravovat – například měnit jejich názvy pro GraphQL dotazy. V editaci tabulek je dále možno označit, že daný sloupec obsahuje identifikátor přílohy, se kterou je pak možné v GraphQL dále pracovat.
Adresy pro připojení k DB pro jednotlivá prostředí
Prostředí | URL | Název DB |
---|---|---|
TEST |
presecudb.database.windows.net |
testsofauserdata |
PROD |
sofa.database.windows.net |
sofauserdata |
Příklad nastavení SQL Management Studia pro prostředí DEV:
Obecný tvar dotazu
Nejprve je nutné nastavit Hlavní dotaz. Dotaz má obecně mít následující tvar:
query ($page: Int = 1, $limit: Int = null, $order:[InvoicesOrderByExpr!] = null, $where:InvoicesBooleanExpr = null) { invoicess(page:$page, limit:$limit, orderBy:$order, where:$where) { pageInfo { totalPages hasNextPage hasPreviousPage } edges { node { polozky_z_tabulky } } aggregate { count } } }
Názvy proměnných musí odpovídat názvům tabulek. Správné tvary našeptává přímo nápověda v pravém bočním panelu, viz screenshot (v tomto případě se hlavní tabulka jmenuje invoices:
Při zkoušení dotazu je dobré omezit si počet vrácených výsledků. To se provede nastavením hodnoty proměnné limit ve spodním panelu Proměnné pro test dotazu, např. tedy {"limit": 10} (stačí zadat složené závorky a uvnitř stisknout CTRL+mezerník, editor začne našeptávat).
Nastavení přehledu
Po vytvoření a otestování dotazu je možné nastavit samotný přehled, tedy to co bude zobrazeno uživateli. Toto se provádí v levém panelu v položce "Popis hlavní tabulky". Zde je nutné přidat veškeré sloupce, které se mají uživateli v přehledu zobrazit. Pozor, zobrazují se zde pouze sloupce, které vrací GraphQL dotaz. Je možné zde nastavit text zobrazený v záhlaví sloupce, šířky sloupců, pro datetime proměnné zobrazovaný tvar podle odkazu https://momentjs.com/docs/#/displaying/ a zobrazovaný tvar číselné proměnné podle odkazu http://numeraljs.com/#format.
Hodnoty z jiných tabulek napojených přes cizí klíč zatím nelze použít k filtrování. |
Dále je možné nastavit sloupce použité pro rychlé vyhledávání v pravé horní části přehledu. Pro rychlé vyhledávání lze využít jen sloupce typu string. Po nastavení je nutné přehled publikovat a nastavit mu dostupnost.
Při používání podtabulek je nutné po každé publikaci editor zavřít a znovu otevřít, jinak dojde k duplikování podtabulek. |
Podtabulky
Přehled může obsahovat n podtabulek propojených s hlavní tabulkou pomocí cizích klíčů. Pro každou zobrazovanou podtabulku je nutné vytvořit GraphQL dotaz. Toto se provede v levém bočním panelu v položce "Popis podtabulky". Dotaz je velmi podobný hlavnímu dotazu, jen je nutné doplnit podmínku pro propojení s hlavní tabulkou. Obecný tvar:
query ($page: Int = 1, $limit: Int = null, $order:[Invoice_attachmentsOrderByExpr!] = null, $nazev_porovnavaci_promenne:Int) { invoice_attachmentss(page:$page, limit:$limit, orderBy:$order, where:{ eqInt: { left:{ col:NAZEV_SLOUPCE_S_ID_Z_HLAVNI_TABULKY }, right:{ const: $nazev_porovnavaci_promenne } } }) { edges { node { polozky_z_tabulky } } pageInfo { totalPages hasNextPage hasPreviousPage } aggregate { count } } }
Samotné zobrazení podtabulky se opět provede přes levý boční panel a položku "Popis podtabulky". U podtabulek není možní filtrovat.
Pro správnou funkčnost propojení je nutno nastavit proměnnou dotazu. |
Název proměnné dotazu musí odpovídat názvu používaném v GraphQL dotazu a sloupec musí odpovídat sloupci s cizím klíčem, např.:
Zobrazování záznamů podřízených
U přehledů 4.0 je možné zobrazované informace třídit pomocí poddotazů a JS funkcí. Příkladem může být např. zobrazování záznamů pouze přímých podřízených (+ aktuálně přihlášeného uživatele). V editoru přehledů je nutno přidat poddotaz a hlavní JavaScriptovou funkci a použít dotaz a skript, který napsal Kuba (oboje funguje univerzálně).
Poddotaz
query byId($id:String) { findUser(by: { id: $id }) { firstName lastName id subordinates { firstName lastName id } } }
Hlavní JavaScriptová funkce
function main(summaryVariables) { // ziskame id aktualniho uzivatele const currentUserId = CurrentUser.User.GetValue('Id'); // zavolame GQL dotaz pro ziskani seznamu podrizenych const queryVariables = { ...summaryVariables, id: currentUserId }; const queryResult = GraphQL.Execute('byId', queryVariables); // JSON odpovedi const toJsonOptions = JSONConvert.CreateToJsonOptions(); toJsonOptions.DetectRepeAction = false; toJsonOptions.WithJsonTypes = false; toJsonOptions.EmitRootObject = false; toJsonOptions.EmitArrayObject = false; const queryData = queryResult.EvaluatePathAsJson(null, toJsonOptions); // vytahneme podrizene const { data: { findUser: { subordinates } } } = queryData; // a sestavime podminku const subordinatesWhere = { inString: { expr: { // POZOR! zde musi byt nazev sloupce z hlavniho dotazu col: 'USER_ID' }, values: [currentUserId, ...subordinates.map(su => su.id)] } }; // sestavime novy where spojenim pripadneho puvodniho + podrizeni let where; let { where: originalWhere } = summaryVariables; if (originalWhere !== null && typeof originalWhere === 'object') { where = { and: [ originalWhere, subordinatesWhere ] }; } else { where = subordinatesWhere } // nakonec rozsirime puvodni promenne const outVariables = { ...summaryVariables, where }; Log.DbgLog(JSON.stringify(outVariables)); return outVariables; }
Komplexní příklad vytvoření přehledu
Jako případ poslouží přehled pro zobrazování faktur. Každá zadaná faktura může mít n položek a m příloh. Příklad obsahuje čtyři tabulky:
-
Tabulka dodavatelů (1 dodavatel může být na n fakturách).
-
Tabulka faktur (faktura má 1 dodavatele, n příloh a m položek).
-
Tabulka položek (1 faktura má n položek).
-
Tabulka příloh (1 faktura má m příloh).
Příklad je možno doplnit o filtrování na podřízené, viz výše.
Vytvoření tabulek
Skripty lze spouštět přímo v SQL Management Studiu po kliknutí na New query a po vložení Execute.
Vytvoření tabulky dodavatelů
--DROP TABLE suppliers; create table suppliers ( [id] [int] IDENTITY(1,1) NOT NULL, [company_name] [nvarchar](max) NOT NULL, [company_address] [nvarchar](max) NOT NULL, [company_identification] [nvarchar](max) NOT NULL PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY]) insert into suppliers values ('Firma 1', 'Hornokrcska', '123456'); insert into suppliers values ('Firma 2', 'Dolnokrcska', '1234567'); insert into suppliers values ('Firma 3', 'Pravokrcska', '12345678'); insert into suppliers values ('Firma 4', 'Levokrcska', '123456789');
Vytvoření tabulky faktur
--DROP TABLE [invoices] --GO CREATE TABLE [invoices]( [id] [int] IDENTITY(1,1) NOT NULL, [text] [nvarchar](max) NOT NULL, [note] [nvarchar](max) NULL, [amount] [int] NOT NULL, [amount_decimal] [decimal](18, 2) NOT NULL, [date_received] [datetime] NOT NULL, [paid] [bit] NOT NULL, [supplier_id] [int] NULL, [user_id] [nvarchar](max) NOT NULL, [user_name] [nvarchar](max) NOT NULL CONSTRAINT [pk_invoices] PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY]) ALTER TABLE [invoices] WITH CHECK ADD CONSTRAINT [fk_invoice_supplier] FOREIGN KEY([supplier_id]) REFERENCES [suppliers] ([id]) ALTER TABLE [invoices] CHECK CONSTRAINT [fk_invoice_supplier]
Vytvoření tabulky příloh
--DROP TABLE [invoice_attachments] --GO CREATE TABLE [invoice_attachments]( [id] [int] IDENTITY(1,1) NOT NULL, [attachment] [nvarchar](max) NOT NULL, [invoice_id] [int] NOT NULL CONSTRAINT [pk_invoice_attachments] PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY]) ALTER TABLE [invoice_attachments] WITH CHECK ADD CONSTRAINT [fk_attachment_invoice] FOREIGN KEY([invoice_id]) REFERENCES [invoices] ([id]) ALTER TABLE [invoice_attachments] CHECK CONSTRAINT [fk_attachment_invoice]
Vytvoření tabulky položek
--DROP TABLE [invoice_items] --GO CREATE TABLE [invoice_items]( [id] [int] IDENTITY(1,1) NOT NULL, [item_name] [nvarchar](max) NOT NULL, [item_value] [decimal](18, 2) NOT NULL, [invoice_id] [int] NOT NULL CONSTRAINT [pk_invoice_items] PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY]) ALTER TABLE [invoice_items] WITH CHECK ADD CONSTRAINT [fk_invoice_items] FOREIGN KEY([invoice_id]) REFERENCES [invoices] ([id]) ALTER TABLE [invoice_items] CHECK CONSTRAINT [fk_invoice_items]
Naplnění tabulek daty
Pozor, u tabulek faktur a příloh je nutné použít identifikátory z vlastní firmy a u náhodného vybírání upravit čísla podle rozsahu pole!
Naplnění tabulky faktur
DECLARE @i int = 0 DECLARE @zaznamy int set @zaznamy = (select COUNT(*) from [invoices]) WHILE @i < 1000 BEGIN SET @i = @i + 1 DECLARE @supp_id int SELECT @supp_id = Cast(RAND()*(4-1)+1 as int) DECLARE @amount int SELECT @amount = Cast(RAND()*(10001-1)+1 as int) DECLARE @amount_decimal decimal(18, 2) SELECT @amount_decimal = Cast((@amount + RAND()) as decimal(18, 2)) DECLARE @paid bit SELECT @paid = Cast(ROUND(RAND(), 0) as bit) DECLARE @day int = Cast(RAND()*(29-1)+1 as int) DECLARE @month int = Cast(RAND()*(13-1)+1 as int) -- 2015 - 2020 DECLARE @year int = Cast(RAND()*(2021-2015)+2015 as int) DECLARE @date_received datetime SELECT @date_received = CONCAT(@year, '-', @month, '-', @day, ' 00:00:00.000') -- zmenit ID uzivatelu a jmena uzivatelu, pro kazdou firmu unikatni! Je nutne zachovat spravne poradi ID a jmen a upravit hodnotu n pro pocet uzivatelu. Pro 5 uzivatelu by tedy bylo DECLARE @n int = Cast(RAND()*(6-1)+1 as int) DECLARE @n int = Cast(RAND()*(10-1)+1 as int) DECLARE @user_id nvarchar(max) = choose(@n, '98688029-fc7c-4e08-9ac2-ffe2e7c1b79b','1ee5d82a-5cc5-4a18-a058-2fb2f1121917','61cda2dd-11bf-4a3b-a0fa-e81a3b85cf37','42387e6f-8e96-4fe0-aa55-84ceda92ae3c','75d65294-4e0f-47ab-a252-cfce3d47f686','11092dbf-f678-4287-ac3d-a7290ac99b9c','932d019c-6546-4b58-849c-bd7ac9ef6f84','2411b897-2f59-448c-89a0-b9579265c44e','d3eb53f6-65ed-40a7-a5cc-bdcd7ac881bc') DECLARE @user_name nvarchar(max) = choose(@n, 'Eva Účetní','Marie Účetní','Petr Administrátor','Tomáš Ředitel','Jan Žadatel','Jana Účetní','Josef Jednorožec','Lukáš Jednorožec','Miroslav Jednorožec') INSERT INTO [invoices] ([text] ,[note] ,[supplier_id] ,[amount] ,[amount_decimal] ,[paid] ,[date_received] ,[user_id] ,[user_name]) VALUES (CONCAT('Faktura', @i) ,CONCAT('Moje faktura #', @i) ,@supp_id ,@amount ,@amount_decimal ,@paid ,@date_received ,@user_id ,@user_name) END GO
Naplnění tabulky příloh
DECLARE @i int = 0 DECLARE @zaznamy int set @zaznamy = (select COUNT(*) from [invoices]) WHILE @i < @zaznamy BEGIN SET @i = @i + 1 -- zde musi byt detachidenty z dane firmy pro vlozene prilohy, lze zjistit z dat formulare kde je prilohove pole, hledejte detachident DECLARE @n int = Cast(RAND()*(5-1)+1 as int) DECLARE @priloha nvarchar(max) = choose(@n, 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiZTZmMmYwYmYtMzlkOS00YmYwLWE1MmQtMDAwMWZkZjY0MzQ2IiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.aGOag0DQwnDKbnJP5JymXJbDUub0TIcj7OqWd_OpekQ','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiMDkzMGE5NGItNjc5NS00ZTdmLWI2NzQtNWM0OTIzZjk0OWU5IiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.-vNJVTmDRoE-e2_i9n8FIHPNh2CTJKfQAVvWxYyNq-k','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiNjFlZWY2ZjMtYmZjMS00NDg0LTgwMjgtMGFkYzNiNDg3MzBkIiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.8lJPOrIl21LVhYZQgqgfaa-mC8rjJk_m_Ys2Q6lq0wc','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiJkZWZhdWx0IiwiZmlkIjoiNmNhMjQxZjgtZDY2Mi00ZjNmLThiZmYtMWI0ZDU0YmI5N2ZjIiwiaXNzIjoiaHR0cHM6Ly9kZXZzb2ZhLjYwMi5jei8ifQ.xKrFVnX7phEgxSvDTN6BIVVv-vdy3ldkgdMl-Xh7qPI') DECLARE @inv_id int SELECT @inv_id = Cast(RAND()*(@zaznamy-1)+1 as int) INSERT INTO [invoice_attachments] ([attachment] ,[invoice_id]) VALUES (@priloha, @inv_id) END GO
Naplnění tabulky faktur
DECLARE @i int = 0 DECLARE @zaznamy int set @zaznamy = (select COUNT(*) from [invoices]) WHILE @i < @zaznamy BEGIN SET @i = @i + 1 DECLARE @amount int SELECT @amount = Cast(RAND()*(10001-1)+1 as int) DECLARE @amount_decimal decimal(18, 2) SELECT @amount_decimal = Cast((@amount + RAND()) as decimal(18, 2)) INSERT INTO [invoice_items] ([item_name] ,[item_value] ,[invoice_id]) VALUES (NEWID(), @amount_decimal, @i) END SET @i = 0 WHILE @i < @zaznamy BEGIN SET @i = @i + 1 DECLARE @inv_id int SELECT @inv_id = Cast(RAND()*(@zaznamy-1)+1 as int) SELECT @amount = Cast(RAND()*(10001-1)+1 as int) SELECT @amount_decimal = Cast((@amount + RAND()) as decimal(18, 2)) INSERT INTO [invoice_items] ([item_name] ,[item_value] ,[invoice_id]) VALUES (NEWID(), @amount_decimal, @inv_id) END SET @i = 0 WHILE @i < 200 BEGIN SET @i = @i + 1 SELECT @amount = Cast(RAND()*(10001-1)+1 as int) SELECT @amount_decimal = Cast((@amount + RAND()) as decimal(18, 2)) INSERT INTO [invoice_items] ([item_name] ,[item_value] ,[invoice_id]) VALUES (NEWID(), @amount_decimal, '1') END GO
Tvorba samotného přehledu
Hlavní tabulka
GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[InvoicesOrderByExpr!] = null, $where:InvoicesBooleanExpr = null) { invoicess(page:$page, limit:$limit, orderBy:$order, where:$where) { pageInfo { totalPages hasNextPage hasPreviousPage } edges { node { invoiceId:id amount amount_decimal date_received note paid user_id user_name fk_invoice_supplier_Invoices { suppId:id company_name company_address company_identification } } } aggregate { count } } }
Podtabulka přílohy
GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[Invoice_attachmentsOrderByExpr!] = null, $fakid:Int) { invoice_attachmentss(page:$page, limit:$limit, orderBy:$order, where:{ eqInt: { left:{ col:INVOICE_ID }, right:{ const: $fakid } } }) { edges { node { attachment { fileName downloadLink size } } } pageInfo { totalPages hasNextPage hasPreviousPage } aggregate { count } } }
Podtabulka položky
GraphQL dotaz
query ($page: Int = 1, $limit: Int = null, $order:[Invoice_itemsOrderByExpr!] = null, $fakid:Int) { invoice_itemss(page:$page, limit:$limit, orderBy:$order, where:{ eqInt: { left:{ col:INVOICE_ID }, right:{ const: $fakid } } }) { edges { node { id invoice_id item_name item_value } } pageInfo { totalPages hasNextPage hasPreviousPage } aggregate { count } } }