Vytváření uživatelských tabulek
Pomocí GraphQL lze přistupovat i do uživatelských databázových tabulek. Tyto tabulky může administrátor libovolně vytvářet a následně nad nimi může provádět dotazy pomocí GraphQL. Názvy do schématu se generují automaticky podle toho, jak jsou nastaveny v Sofa při publikaci tabulek. Pro příklad bude použita tabulka faktura, kterou lze vytvořit v databázi následovně:
CREATE TABLE [Faktury](
[id] [int] IDENTITY(1,1) NOT NULL,
[id_zadatel] [nvarchar](max) NOT NULL,
[jmeno_zadatel] [nvarchar](255) NOT NULL,
[dosla_dne] [datetime] NOT NULL,
[splatnost] [datetime] NOT NULL,
[castka] [decimal](10, 2) NOT NULL,
[mena] [nvarchar](255) NOT NULL,
[variabilni_symbol] [nvarchar](255) NOT NULL,
[dodavku_prevzal] [nvarchar](255) NULL,
[zahranicni_subjekt] [nvarchar](max) NULL,
[ico] [nvarchar](255) NULL,
[spolecnost_nazev] [nvarchar](max) NOT NULL,
[ulice] [nvarchar](max) NULL,
[cp] [nvarchar](255) NULL,
[co] [nvarchar](255) NULL,
[obec] [nvarchar](255) NOT NULL,
[psc] [nvarchar](255) NOT NULL,
[stat] [nvarchar](255) NOT NULL,
[zpusob_platby] [nvarchar](255) NOT NULL,
[popis_agendy] [nvarchar](max) NOT NULL,
[id_agendy] [uniqueidentifier] NOT NULL,
[cislo_zadosti] [nvarchar](max) NULL,
[schvalovatele] [nvarchar](max) NULL,
CONSTRAINT [PK_Faktury] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Query pro vytažení všech záznamů
Slouží pro získání všech záznamů v dané tabulce.
Dotaz:
query findAllInvoices{ fakturys{ edges{ node{ id id_zadatel jmeno_zadatel dosla_dne splatnost castka mena variabilni_symbol dodavku_prevzal zahranicni_subjekt ico spolecnost_nazev ulice cp co obec psc stat zpusob_platby popis_agendy id_agendy{ agendaName } cislo_zadosti schvalovatele } } } }
Query pro vytažení konkrétního záznamu na základě id
Slouží pro získání konkrétního záznamu z tabulky na základě id. Pozor, lze hledat opravdu jen na základě id. Hledat na základě jiných podmínek je nutné přes prohledávání všech záznamů na základě podmínek (viz kapitola graphql_jednoduche_priklady.adoc#query-pro-ziskani-seznamu-agend).
Dotaz:
query findAllInvoices{ fakturys{ edges{ node{ id id_zadatel jmeno_zadatel dosla_dne splatnost castka mena variabilni_symbol dodavku_prevzal zahranicni_subjekt ico spolecnost_nazev ulice cp co obec psc stat zpusob_platby popis_agendy id_agendy{ agendaName } cislo_zadosti schvalovatele } } } }
Proměnné:
{ "id": 59 }
Query pro vytažení všech záznamů odpovídajících zadaným podmínkám
V praxi je samozřejmě nutné hledat konkrétní záznamy na základě různých podmínek, nikoliv jen na základě id. K tomu slouží dotaz pro vytažení všech záznamů doplněný o WHERE podmínku. Například je tedy možné vytáhnout faktury zadané konkrétním uživatelem:
Dotaz:
query findAllInvoicesWhere($idZadatele:String!){ fakturys( where: { eqString: { left: { col: ID_ZADATEL }, right: { const:$idZadatele } } } ) { edges{ node{ id id_zadatel jmeno_zadatel dosla_dne splatnost castka mena variabilni_symbol dodavku_prevzal zahranicni_subjekt ico spolecnost_nazev ulice cp co obec psc stat zpusob_platby popis_agendy id_agendy{ agendaName } cislo_zadosti schvalovatele } } } }
Proměnné:
{ "idZadatele": "6ff32e10-15df-48b9-8645-ac3ddde9a932" }
Samozřejmě lze skládat i složitější podmínky. Pomocí AND/OR lze nakombinovat libovolné množství podmínek. Například vyhledat faktury, které zadal konkrétní uživatel a jsou zadané v rámci jednoho určitého měsíce. Na konci tohoto dotazu je ještě ukázáno, jakým způsobem lze zjistit počet odpovídajících záznamů.
Databázový count je velmi náročná operace, je proto lepší vyhodnotit si počet záznamů na základě vráceného JSONu přímo v PAJS. |
Dotaz:
query findAllInvoicesWhere($idZadatele:String!, $zacatekMesice:DateTime!, $konecMesice:DateTime!){ fakturys( where: { and: [ { eqString: { left: { col: ID_ZADATEL }, right: { const:$idZadatele } } }, { gteDateTime: { left: { col: DOSLA_DNE }, right: { const:$zacatekMesice } } }, { lteDateTime: { left: { col: DOSLA_DNE }, right: { const:$konecMesice } } } ] } ) { edges{ node{ id id_zadatel jmeno_zadatel dosla_dne splatnost castka mena variabilni_symbol dodavku_prevzal zahranicni_subjekt ico spolecnost_nazev ulice cp co obec psc stat zpusob_platby popis_agendy id_agendy{ agendaName } cislo_zadosti schvalovatele } } aggregate { #Získání počtu záznamů, používat opatrně count } } }
Proměnné:
{ "idZadatele": "6ff32e10-15df-48b9-8645-ac3ddde9a932", "zacatekMesice": "2021-09-01T00:00:00", "konecMesice": "2021-09-30T00:00:00" }
Mutace pro vložení jednoho záznamu
Pro vložení jednoho záznamu do tabulky lze použít dotaz, který jako proměnnou dostane JSON s klíči, které odpovídají názvům proměnných použitých v dotazu. U mutací je vždy návratová hodnota – v tomto případě se vrací databázové id vytvořeného záznamu, ale lze samozřejmě vracet i hodnoty dalších sloupců. Pro další práci je ale nejčastěji potřeba právě databázoví id. Příklad pro vložení jedné faktury by tedy byl následující:
Dotaz:
mutation insertIntoDB ( $id_zadatel: String!, $jmeno_zadatel: String!, $dosla_dne: DateTime!, $splatnost: DateTime!, $castka: Decimal!, $mena: String!, $variabilni_symbol: String!, $dodavku_prevzal: String, $zahranicni_subjekt: String, $ico: String, $spolecnost_nazev: String!, $ulice: String, $cp: String, $co: String, $obec: String!, $psc: String!, $stat: String!, $zpusob_platby: String!, $popis_agendy: String!, $id_agendy: Guid!, $cislo_zadosti: String ) { vysledek: insertFaktury ( id_zadatel: $id_zadatel, jmeno_zadatel: $jmeno_zadatel, dosla_dne: $dosla_dne, splatnost: $splatnost, castka: $castka, mena: $mena, variabilni_symbol: $variabilni_symbol, dodavku_prevzal: $dodavku_prevzal, zahranicni_subjekt: $zahranicni_subjekt, ico: $ico, spolecnost_nazev: $spolecnost_nazev, ulice: $ulice, cp: $cp, co: $co, obec: $obec, psc: $psc, stat: $stat, zpusob_platby: $zpusob_platby, popis_agendy: $popis_agendy, id_agendy: $id_agendy, cislo_zadosti: $cislo_zadosti ) { id } }
Proměnné:
{ "id_zadatel": "8732e257-0400-49de-bc37-4c9588a1751e", "jmeno_zadatel": "Technický Uživatel", "dosla_dne": "2021-09-06T22:00:00.000Z", "splatnost": "2021-09-06T22:00:00.000Z", "castka": 10000, "mena": "CZK", "variabilni_symbol": "123123123", "dodavku_prevzal": "Technický Uživatel", "zahranicni_subjekt": "Ne", "ico": "112233", "spolecnost_nazev": "test spol", "ulice": "ulice", "cp": "111", "co": "22", "obec": "obec", "psc": "12345", "stat": "Česká republika", "zpusob_platby": "Bankovním převodem", "popis_agendy": "123132132121", "id_agendy": "4f73b59b-1b2a-4c69-9667-8cda12ec51f9", "cislo_zadosti": "00021/2021" }
Mutace pro hromadnou úpravu záznamů
Pro úpravu více záznamů lze použít mutaci pro hromadnou úpravu. Mutace je velmi jednoduchá, důležitý je JSON s proměnnými, který obsahuje akce, které se nad jednotlivými záznamy mají provádět. Vstupem je pole JSONů, přičemž u každého JSONu se do klíče "_action" musí nastavit, jaká operace se má provést. Lze provádět tři operace:
-
INSERT: vložení záznamu
-
UPDATE: úprava záznamu, je nutné uvést databázové id upravovaného záznamu do klíče id
-
DELETE: smazání záznamu, je nutné uvést databázové id záznamu ke smazání do klíče id
Dotaz:
mutation editMultipleInvoices($faktury: [FakturyMutation!]!) { mutateFakturys(actions: $faktury) { id } }
Vzorový obsah proměnných pracuje se čtyřmi záznamy – dochází k vložení dvou nových záznamů (1. a 2. JSON), úpravě záznamu s id 211 (3. JSON) a ke smazání záznamu s id 210 (4. JSON).
Proměnné:
{ "faktury":[ { "_action": "INSERT", "id_zadatel":"8732e257-0400-49de-bc37-4c9588a1751e", "jmeno_zadatel":"Technický Uživatel 1", "dosla_dne":"2021-09-06T22:00:00.000Z", "splatnost":"2021-09-06T22:00:00.000Z", "castka":11111, "mena":"CZK", "variabilni_symbol":"123123123", "dodavku_prevzal":"Technický Uživatel", "zahranicni_subjekt":"Ne", "ico":"112233", "spolecnost_nazev":"test spol", "ulice":"ulice", "cp":"111", "co":"22", "obec":"obec", "psc":"12345", "stat":"Česká republika", "zpusob_platby":"Bankovním převodem", "popis_agendy":"123132132121", "id_agendy":"4f73b59b-1b2a-4c69-9667-8cda12ec51f9", "cislo_zadosti":"00021/2021" }, { "_action": "INSERT", "id_zadatel":"8732e257-0400-49de-bc37-4c9588a1751e", "jmeno_zadatel":"Technický Uživatel 2", "dosla_dne":"2021-09-06T22:00:00.000Z", "splatnost":"2021-09-06T22:00:00.000Z", "castka":22222, "mena":"CZK", "variabilni_symbol":"123123123", "dodavku_prevzal":"Technický Uživatel", "zahranicni_subjekt":"Ne", "ico":"112233", "spolecnost_nazev":"test spol", "ulice":"ulice", "cp":"111", "co":"22", "obec":"obec", "psc":"12345", "stat":"Česká republika", "zpusob_platby":"Bankovním převodem", "popis_agendy":"123132132121", "id_agendy":"4f73b59b-1b2a-4c69-9667-8cda12ec51f9", "cislo_zadosti":"00021/2021" }, { "_action": "UPDATE", "id":211, "jmeno_zadatel":"Jiný uživatel" }, { "_action": "DELETE", "id":210 } ] }