Configureren van databronnen voor API's en webhooks
Een dataset is de basis van SQLio. Het bepaalt welke data uit je database beschikbaar wordt gesteld aan API endpoints en webhooks. Je definieert één keer welke tabellen, views of stored procedures je wilt gebruiken, welke velden je wilt tonen en hoe je de data wilt filteren. Daarna kun je diezelfde dataset hergebruiken bij meerdere API's en webhooks.
Een dataset levert altijd JSON op. De structuur van die JSON bepaal je zelf door middel van layers (lagen). Hiermee kun je eenvoudige platte lijsten maken, maar ook complexe geneste structuren met hoofd- en detailgegevens.
Instructievideo: dataset Verkooporders met orderregels en klantgegevens aanmaken, testen en op een tweede databron laten draaien.
Klik in het menu op Dataset Configuratie. Je ziet een overzicht van alle bestaande datasets.
Bovenaan verschijnt een formulier met de volgende velden:
| Veld | Verplicht | Toelichting |
|---|---|---|
| Naam | Ja | Unieke naam voor de dataset, bijvoorbeeld "Klanten" of "Order gegevens" |
| Databron | Ja | De connectie-alias waartegen je de dataset bouwt, bijvoorbeeld nl. Uit deze database komen de tabellen, views en velden die je kunt kiezen. Zie ook Databronnen hieronder. |
| Groep | Nee | Ordent datasets in het overzicht en in keuzelijsten, bijvoorbeeld "Verkoop" of "Klanten". |
| Omschrijving | Nee | Korte beschrijving van het doel van de dataset |
| Status | Nee | Actief/Inactief toggle. Alleen actieve datasets kunnen gebruikt worden in API's en webhooks |
nl, in groep Verkoop.Klik op Opslaan. De dataset is nu aangemaakt, maar bevat nog geen data-configuratie. Daarvoor moet je een layer toevoegen.
Bij elke keer opslaan vraagt SQLio om een versie en een korte notitie; zie Versioning.
In de kaart Geldig voor databronnen vink je aan op welke connectie-aliassen de dataset mag draaien. De ster markeert de databron waartegen je de dataset bouwt en test. Vink je een tweede alias aan, bijvoorbeeld de Belgische vestiging be, dan draait dezelfde definitie ook op die database, mits de tabellen en velden daar hetzelfde heten.
nl (ster) en mag ook draaien op be.De koppeling ligt op de alias, niet op de database. Synchroniseer je de dataset naar productie, dan blijft de lijst gelden: nl wijst daar naar de productiedatabase van de Nederlandse vestiging. Zie de handleiding Omgevingen & aliassen.
Een layer is één databron binnen je dataset. Elke layer verwijst naar een tabel, view of stored procedure en bepaalt welke velden daaruit worden opgehaald. Layers kunnen hiërarchisch worden opgebouwd: een root layer (hoofdlaag) met daaronder één of meer child layers (sublagen).
Dataset: "Order overzicht" ├── Root Layer: Orders (tabel) │ ├── Child Layer: Orderregels (tabel) │ └── Child Layer: Klantgegevens (tabel)
Dit levert de volgende JSON structuur op:
{
"orderId": 100,
"orderDate": "2024-01-15",
"orderregels": [
{ "artikelNr": "A001", "aantal": 5, "prijs": 12.50 },
{ "artikelNr": "A002", "aantal": 2, "prijs": 8.00 }
],
"klant": {
"naam": "ACME Corp",
"stad": "Amsterdam"
}
}
Klik op Root Layer Toevoegen in de "Layer Structuur" kaart. Er verschijnt een formulier.
dbo.Verkooporders, alle velden geselecteerd.Klik op het + icoon naast een bestaande layer. De child layer wordt automatisch gekoppeld aan de gekozen parent layer.
KlantNr.| Veld | Opties | Toelichting |
|---|---|---|
| Layer Naam | Vrije tekst | Naam van de layer. Dit wordt ook de sleutelnaam in de JSON output (bijv. "orderregels") |
| Bron Type | Table / View / StoredProcedure | Bepaalt waar de data vandaan komt |
| Output Type | Object / Array / Merge | Bepaalt hoe de data in de JSON verschijnt |
| Volgorde | Nummer | Bepaalt de volgorde bij meerdere layers op hetzelfde niveau |
Als je Table of View kiest, verschijnen extra velden:
| Veld | Toelichting |
|---|---|
| Tabel / View | Doorzoekbaar keuzevenster met alle tabellen of views uit de databron, inclusief schema (bijv. dbo.Verkooporders) |
| JOIN Type (alleen bij child layers) | INNER, LEFT of FULL OUTER — bepaalt hoe de child aan de parent wordt gekoppeld |
Als je Stored Procedure kiest, verschijnt een tekstveld voor het Execution Statement:
EXEC dbo.sp_GetOrders
@CustomerId = :CustomerId,
@FromDate = :FromDate,
@IncludeInactive = 0
:parameterNaam voor dynamische waarden (komen uit de API-aanroep of de parent layer). Gebruik vaste waarden direct (zoals 0, N'tekst') voor hardcoded parameters.
Het output type bepaalt hoe de data van een layer in de JSON verschijnt:
De layer levert één record op als JSON object met een eigen sleutel.
{
"klant": {
"naam": "ACME Corp",
"stad": "Amsterdam"
}
}
Gebruik voor: detailgegevens, enkele opzoekwaarden.
De layer levert meerdere records op als JSON array met een eigen sleutel.
{
"orderregels": [
{ "artikelNr": "A001", "aantal": 5 },
{ "artikelNr": "A002", "aantal": 2 }
]
}
Gebruik voor: lijsten van gerelateerde items (orderregels, factuurregels, etc.).
De velden van de layer worden samengevoegd met de parent layer. Er komt geen aparte sleutel in de JSON.
{
"orderId": 100,
"orderDate": "2024-01-15",
"telefoon": "020-1234567",
"email": "info@acme.nl"
}
In dit voorbeeld komen telefoon en email uit een child layer met output type Merge. Ze verschijnen alsof ze bij de parent horen.
Gebruik voor: extra kolommen uit een andere tabel toevoegen aan de parent, zonder nesting.
Na het kiezen van een tabel of view verschijnt de Veld Selectie kaart. Hier zie je alle beschikbare kolommen.
| Kolom | Toelichting |
|---|---|
| Checkbox | Vink aan om het veld op te nemen in de JSON output |
| Source Veld | De originele kolomnaam uit de database |
| Output Naam | De naam in de JSON response — pas deze aan om een leesbaardere naam te gebruiken |
| Type | Het SQL datatype (INT, NVARCHAR, DATETIME, etc.) |
| Volgorde | Bepaalt de positie in de JSON output |
Je kunt de Output Naam aanpassen om database-kolomnamen te vertalen naar leesbare JSON-veldnamen:
| Database kolom | Output naam | JSON resultaat |
|---|---|---|
| CustId | klantnummer | "klantnummer": "K001" |
| OrdDate | besteldatum | "besteldatum": "2024-01-15" |
| Descr | omschrijving | "omschrijving": "Levering Q1" |
Bij root layers op basis van een tabel of view kun je WHERE-condities toevoegen om de data te filteren. Klik op Conditie toevoegen.
Elke conditie-regel heeft de volgende opties:
| Kolom | Toelichting |
|---|---|
| ( | Optioneel: groepeer condities met haakjes |
| Veld | De kolom waarop je wilt filteren |
| Conditie | Vergelijkingsoperator: =, !=, >, <, >=, <=, LIKE, NOT LIKE, IN, NOT IN, BETWEEN, IS NULL, IS NOT NULL |
| Parameter | Dynamische waarde uit de API-aanroep, bijvoorbeeld :klantnummer |
| Waarde | Vaste waarde (als je geen parameter gebruikt) |
| Verbinding | AND of OR — logische koppeling met de volgende conditie |
| ) | Optioneel: sluit groepering |
| Required | Verschijnt alleen bij parameters — als aangevinkt is de parameter verplicht bij het aanroepen |
| Veld | Conditie | Parameter | Required |
|---|---|---|---|
| CustId | = | :klantnummer | Ja |
Als iemand de API aanroept met parameter klantnummer=K001, wordt de query:
SELECT ... FROM Customers WHERE CustId = 'K001'
| Veld | Conditie | Waarde |
|---|---|---|
| IsActive | = | 1 |
Dit filter wordt altijd toegepast — de aanroeper kan het niet wijzigen.
KlantNr zonder vinkje bij Required: de aanroeper mag hem meegeven, maar hoeft niet.Bij child layers op basis van een tabel of view definieer je hoe de child aan de parent gekoppeld wordt. Dit werkt als een JOIN in SQL.
| Kolom | Toelichting |
|---|---|
| Child Veld | Kolom in de child tabel |
| Operator | Meestal = |
| Parent Veld | Kolom uit de parent layer (dropdown toont alleen geselecteerde parent velden) |
Een child layer "Orderregels" gekoppeld aan parent layer "Orders":
| Child Veld | Operator | Parent Veld |
|---|---|---|
| OrderId | = | OrderId |
SQLio voert dan voor elke order-rij een query uit op de orderregels waar Orderregels.OrderId = Orders.OrderId.
Bij layers van het type Stored Procedure worden de parameters automatisch gedetecteerd uit het Execution Statement. Per parameter kun je instellen:
| Kolom | Toelichting |
|---|---|
| SP Parameter | De parameternaam (automatisch gedetecteerd) |
| Bron Type | ParentField (waarde uit parent layer), InputParameter (uit API-aanroep), of StaticValue (vaste waarde) |
| Bron Waarde | De daadwerkelijke waarde of veldnaam |
| Required | Of de parameter verplicht is |
| Optie | Toelichting |
|---|---|
| Wrap root-array in object | Alleen bij een root layer met output type Array. Uit: de output is een lijst [{ ... }]. Aan: { "orders": [{ ... }] }, handig voor systemen die geen lijst als hoofdelement accepteren. |
| NULL-waarden weglaten | Velden met een NULL-waarde worden uit de JSON verwijderd. Geldt voor API, webhook en test. |
Nadat je de dataset hebt opgeslagen, kun je deze testen met de knop Test JSON.
nl: orders uit de Nederlandse testdatabase.
be: Belgische orders en klanten.De test haalt maximaal 20 records op. Het JSON voorbeeld onder de layers toont de structuur al tijdens het bouwen, ook met niet-opgeslagen wijzigingen.
Elke dataset heeft een versie en optioneel versienotities:
| Veld | Toelichting |
|---|---|
| Versie | Versienummer, bijvoorbeeld "1.0", "1.1", "2.0" |
| Versienotities | Korte beschrijving van wat er gewijzigd is |
Bij opslaan opent het venster Versie Beheer. Met Versie verhogen maak je een nieuw versienummer; de notitie is optioneel.
De versie wordt als badge getoond in het overzicht. Gebruik dit om bij te houden welke wijzigingen je hebt aangebracht, vooral als de dataset in productie wordt gebruikt.
In het overzicht zie je alle datasets, gegroepeerd per groep. Met Alles open en Alles dicht klap je de groepen open of dicht. Met Importeer JSON laad je een eerder geëxporteerde dataset; SQLio vraagt dan op welke databron hij moet draaien.
Per dataset zie je:
| Kolom | Toelichting |
|---|---|
| Naam | Naam van de dataset, met de omschrijving eronder |
| Type | Icoon voor het brontype van de root layer (Table, View of Stored Procedure) |
| Parameters | Parameternamen die gebruikt worden in WHERE-condities |
| Layers | Aantal geconfigureerde layers |
| Status | Actief/Inactief toggle |
| Versie | Versiebadge |
| Acties | Bewerken (potlood), Exporteren als JSON (downloadpijl) en Verwijderen (prullenbak) |
Stel je wilt een dataset maken die ordergegevens teruggeeft inclusief orderregels en klantinformatie.
Selecteer de velden:
| Source Veld | Output Naam | Geselecteerd |
|---|---|---|
| OrderId | orderId | Ja |
| OrderDate | besteldatum | Ja |
| CustomerId | klantnummer | Ja |
| TotalAmount | totaalbedrag | Ja |
| Status | status | Ja |
Voeg een WHERE-conditie toe:
| Veld | Conditie | Parameter | Required |
|---|---|---|---|
| OrderId | = | :orderId | Ja |
Klik op + naast de Orders layer.
Selecteer de velden:
| Source Veld | Output Naam | Geselecteerd |
|---|---|---|
| LineId | regelId | Ja |
| ProductCode | artikelNr | Ja |
| Quantity | aantal | Ja |
| UnitPrice | stuksprijs | Ja |
| Description | omschrijving | Ja |
Voeg een JOIN-conditie toe:
| Child Veld | Operator | Parent Veld |
|---|---|---|
| OrderId | = | orderId |
Klik op + naast de Orders layer.
Selecteer de velden:
| Source Veld | Output Naam | Geselecteerd |
|---|---|---|
| CustomerName | naam | Ja |
| City | stad | Ja |
| Phone | telefoon | Ja |
Voeg een JOIN-conditie toe:
| Child Veld | Operator | Parent Veld |
|---|---|---|
| CustomerId | = | klantnummer |
Klik op Opslaan en vervolgens op Test JSON. Vul een bestaand orderId in. Het resultaat:
{
"orderId": 100,
"besteldatum": "2024-01-15",
"klantnummer": "K001",
"totaalbedrag": 74.50,
"status": "Verzonden",
"regels": [
{
"regelId": 1,
"artikelNr": "A001",
"aantal": 5,
"stuksprijs": 12.50,
"omschrijving": "Bout M8x40"
},
{
"regelId": 2,
"artikelNr": "A002",
"aantal": 2,
"stuksprijs": 8.00,
"omschrijving": "Moer M8"
}
],
"klant": {
"naam": "ACME Corp",
"stad": "Amsterdam",
"telefoon": "020-1234567"
}
}
Deze dataset kun je nu koppelen aan een API endpoint (GET) of gebruiken als JSON body voor een webhook.
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| "Dataset naam is verplicht" | Geen naam ingevuld | Vul een naam in |
| Dataset niet beschikbaar in API/webhook | Status staat op Inactief | Zet de status toggle op Actief |
| Child layer geeft geen data | JOIN-conditie klopt niet | Controleer of het child veld en parent veld correct gekoppeld zijn |
| Veld verschijnt niet in JSON | Veld is niet geselecteerd | Vink het veld aan in de Veld Selectie |
| "Required parameter not found" | Verplichte parameter ontbreekt bij aanroep | Geef de parameter mee bij het testen of in de API-aanroep |
| Stored procedure mislukt | Execution Statement syntax onjuist | Controleer het formaat: EXEC dbo.spNaam @Param = :waarde |
| Te veel data / trage response | Geen of te brede filters | Voeg WHERE-condities toe om de dataset te beperken |
| Permissie waarschuwing bij SP | Database gebruiker heeft geen EXECUTE rechten | Vraag de DBA om rechten toe te kennen op de stored procedure |