Správa reportů
Reporty jsou určeny pro potřebu vedoucích pracovníků nebo účetních. Jejich pomocí například mohou sledovat požadavky zadané pomocí formulářů v prostředí Sofa a vytvářet jejich statistické přehledy.
Okno Správa reportů otevřete v okně Administrace klepnutím na tlačítko Správa reportů. Okno je ve výchozím stavu prázdné. Reporty můžete do Sofa importovat ze souborů nebo je vytvářet jako zcela nové pomocí návrháře.
Vytvoření nového reportu
Pokud chcete vytvořit nový report, postupujte takto. Klepněte na tlačítko Akce a v rozvinuté nabídce spusťte příkaz Vytvořit nový report.
V okně Nový report nastavte vlastnosti nového reportu.
-
V sekci Popisné údaje uveďte český, slovenský, anglický a německý název a také slovní popis, k čemu má report sloužit. Povinný je český název.
-
V sekci Nastavení:
-
Do pole Priorita řazení můžete nepovinně zadat číslo udávající, s jakou prioritou bude položka reportu uváděna v pohledu na reporty.
-
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 report 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 reportu. 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.
-
-
Lze také zvolit barevné schéma zobrazení symbolu reportu v okně pro administraci reportů.
Základní nastavení ukončíte klepnutím na tlačítko Navrhnout report.
Návrhář reportů
Tlačítkem Navrhnout report přejdete do okna Návrh reportu.
Obsluha Návrháře reportů je popsána v kapitole Prostředí Návrháře reportů a následujících.
Jakmile návrh reportu publikujete, přejdete do okna Úprava reportu, které je v podstatě totožné s výše uvedeným oknem Nový report. Zde můžete upravit vlastnosti reportu a tlačítkem Uložit práci zakončit.
Import reportu
Předpokladem je, že máte k dispozici soubor, ve kterém je uložen hotový report a ten chcete importovat do prostředí Sofa.
Postupujte takto:
-
V okně Správa reportů klepněte na tlačítko Akce.
-
V rozvinuté nabídce spusťte příkaz Importovat report.
-
V dialogu Import reportu vyhledejte pomocí tlačítka Zvolit soubor v poli Soubor s exportovaným reportem soubor, který obsahuje hledaný report. Soubor musí mít příponu S602.
-
Chcete-li načítaný report importovat jako samostatný nový report, zaškrtněte políčko Importovat jako nový report a v poli Nový identifikátor mu přidělte nový jednoznačný identifikátor. Pozor, jde o identifikátor a nikoliv o popisný název! Nesmí tedy obsahovat nepovolené znaky, jako jsou znaky s diakritikou, mezery a podobně.
-
Stiskněte tlačítko Importovat report.
V okně Úprava reportu zkontrolujte načtené vlastnosti reportu a podle potřeby je upravte.
Klepněte na tlačítko Uložit.
Report se uloží a najdete ho v okně Správa reportů.
Pokud v okně Úprava reportu klepnete na tlačítko Upravit report, načte se popis reportu do okna Návrh reportu, kde můžete obsah a vzhled reportu podle potřeby upravit.
Nastavení dostupnosti reportu
Ve výchozím stavu není vytvořený report nikomu z uživatelů Sofa dostupný. Dostupnost je nutné teprve nastavit. V položce reportu klepněte na tlačítko se třemi tečkami a potom na příkaz Nastavit oprávnění reportu.
Otevře se okno Dostupnost reportu xxx. Zde klepněte na tlačítko Přidat skupinu/roli nebo na odkaz Zpřístupnit report skupině / roli.
V dialogu Přidání skupiny / role do dostupnosti reportu vyberte pomocí voliče požadovanou skupinu (roli); podle potřeby postup opakujte pro další skupiny (role).
Nastavení se promítnou do sloupce Dostupnost reportu v okně Správa reportů.
Takto nastavený report nadále budou mít příslušní uživatelé k dispozici v okně Reporty.
Úpravy reportu
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 reportu. Zastoupení příkazů může být u některých reportů odlišné podle jejich dostupnosti.
-
Upravit popis – otevře okno Úprava reportu pro úpravy popisných údajů reportu.
-
Upravit předpis reportu – otevře pro daný report okno návrháře reportů.
-
Smazat report – odebere celou definici reportu ze Sofa.
-
Exportovat report – exportuje údaje o reportu do souboru.
-
Vytvořit kopii reportu – vloží do reportů nový report, který bude přesnou kopií reportu, 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í reportu – umožňuje spravovat dostupnost reportu podle skupin a rolí.
Prostředí Návrháře reportů
Návrhář slouží k samotnému sestavení vlastností reportu. Do prostřední části stránky je třeba vložit základní GraphQL dotaz, který získává data do hlavní tabulky reportu.
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 reportu. Lze tak určit, podle kterých sloupců bude možné filtrovat, podle kterých sloupců rychle vyhledávat, určit šířky sloupců a pro čísla a kalendářní data nastavovat masku způsobu zobrazení.
V reportu 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í reportů
Reporty jsou v Sofa vytvářeny přímo nad databází pomocí GraphQL dotazů. Aby v reportu 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 Datové zdroje.
Příprava databáze
Aby bylo možné pracovat s reporty, 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 Nový datový zdroj.
V okně Datový zdroj v polích Název a Popis datový zdroj pojmenujte.
V okně je předem nastaveno několik parametrů. Jedná se o:
-
Typ datového zdroje – ponechte nastavení Sofa databáze. Další nabízenou možností je Externí databáze, tu však pro tento případ nevolte.
-
Databázové schéma – systém generuje automaticky bez možnosti změny.
-
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 zapsané do pole Heslo musí obsahovat písmena, číslice a speciální znaky a být dlouhé minimálně 9 znaků.
V tuto chvíli je možné se přihlásit do databáze s loginem uvedeným v poli 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.
Okno může být velice rozsáhlé, takže na následujícím obrázku je jen jeho začátek a konec.
-
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 obrázek (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í reportu
Po vytvoření a otestování dotazu je možné nastavit vlastní report, 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 reportu zobrazit.
Zobrazují se zde pouze ty 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 reportu. Pro rychlé vyhledávání lze využít jen sloupce typu string. Po nastavení je nutné report 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 jejich duplikování. |
Podtabulky
Report 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 } } }
Zobrazení podtabulky vyžádáte 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 reportů 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 reportů je nutno přidat poddotaz a hlavní JavaScriptovou funkci a použít vhodný dotaz a skript.
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í reportu
Jako případ poslouží report 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 reportu
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 } } }