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
}
]
}