Echte relationele database-applicaties in plaats van gedoe met Excel – gewoon aanklikken, zonder SQL-kennis en met frontend-programmering. We laten aan de hand van een eenvoudig voorbeeld zien hoe dat werkt met de open source low-code database Grist.
Van spreadsheet naar database met Grist
Klantenadressen, het wagenparkbeheer, inventaris- en activalijsten: veel gebruikers hebben niet de kennis of de tijd om voor dergelijke klassieke databaseapplicaties een SQL-backend op te zetten en een eigen frontend te programmeren. In plaats daarvan grijpen ze naar Excel of een ander spreadsheetprogramma.
Dat werkt min of meer wel, maar is kwetsbaar en foutgevoelig. Zeker als je meerdere tabellen aan elkaar wilt koppelen en daarvoor constructies als VLOOKUP (VERT.ZOEKEN) en SUMIF (SOM.ALS) moet gebruiken of halfdynamische draaitabellen als filter moet inzetten, wordt duidelijk dat spreadsheets daar niet voor gemaakt zijn.
De kloof tussen de complexiteit van SQL en het klooien met Excel moet worden overbrugd door low-code databases zoals Airtable en SeaTable. Daarbij zitten het gegevensmodel en de gebruikersinterface in één programma, waardoor de instapdrempel laag is.
Een nog vrij onbekend alternatief, dat qua concept en functionaliteit vergelijkbaar is, is Grist. Dat is in de Community-editie beschikbaar onder een opensource-licentie. In dit artikel laten we aan de hand van een eenvoudig voorbeeld van verenigingsbeheer zien hoe je met Grist snel en zonder kennis van SQL of programmeren een werkende database-applicatie kunt opzetten.
De werkwijze kun je met een paar aanpassingen net zo goed toepassen op andere doeleinden, zoals klanten- en voorraadbeheer.
Grist is beschikbaar als cloudapplicatie in een betaalde versie en een gratis versie met slechts enkele beperkingen. Je kunt er meteen mee aan de slag, daar heb je alleen een browser voor nodig.
De webservice slaat de gegevens echter op servers in de VS op. Als je dat niet wilt, kun je het programma als alternatief zelf hosten via een Docker-container, maar daarvoor moet je wel wat moeite steken in de configuratie – vooral voor gebruik door meerdere gebruikers. In dit artikel gebruiken we voor het gemak de cloudversie, in een ander artikel gaan we dieper in op zelfhosting.
Open in een browser de pagina getgrist.com en klik rechtsboven op Sign Up. In het volgende venster log je in via je Google-account of met een e-mailadres en een wachtwoord naar keuze. Je moet toegang hebben tot het bijbehorende e-mailadres voor een bevestigingsmail.
Na het inloggen kom je op de startpagina met een introductievideo. Die kun je gerust overslaan. Op de navigatiebalk aan de linkerkant is al een werkruimte Home aangemaakt. Via het menu met de drie puntjes kun je die hernoemen of verwijderen. Met Add new kun je er indien nodig nog meer aanmaken.
Document en eerste tabel aanmaken
De organisatie in Grist is onderverdeeld in workspaces (organisatorische containers op accountniveau), documenten (zelfstandige databasebestanden – het volledige verenigingsbeheer zit in dit voorbeeld in één document) en pagina’s (tabbladen/weergaven binnen een document).

Elke pagina bevat een of meer widgets (tabel-, kaart-, kalender- of formulierweergaven). De eigenlijke (ruwe) gegevens staan in tabellen waarnaar de widgets verwijzen.
Het voorbeeld van een verenigingsbeheer heeft drie tabellen nodig: Leden voor de stamgegevens, Afdelingen voor de organisatie-eenheden en daarnaast Lidmaatschappen als koppeling tussen beide.
Omdat een lid bij meerdere afdelingen kan horen en een afdeling meerdere leden kan hebben (n:m-relatie), heeft Lidmaatschappen voor elke combinatie een eigen rij nodig en verwijst het via een referentiekolom (daarover straks meer) zowel naar leden als naar afdelingen.
Bij de eerste stap maak je het document aan, dus de database voor het verenigingsbeheer. Klik daarvoor linksboven op de Grist-hoofdpagina op Add new en kies Create empty document. De pagina verandert in een lege tabel met de drie kolommen A, B en C.
In het navigatiemenu links verschijnt hij als Table1.
Dan heb je twee mogelijkheden: je maakt de benodigde tabellen en kolomdefinities handmatig aan en vult ze met gegevens of je importeert bestaande CSV- of Excel-bestanden. De voor dit voorbeeld benodigde tabellen staan bij de link bij dit artikel.
De importmethode vereist een paar extra handelingen die we hieronder behandelen.
Kolommen van de ledentabel definiëren
Maar eerst leggen we uit hoe je de structuur handmatig aanmaakt: Hernoem de tabel Table1 naar Leden. Selecteer daarvoor het item en klik erop.
Dan komen de kolomdefinities. Selecteer de betreffende kolom door één keer op de koptekst te klikken. Met nog een klik of Ctrl+M open je een dialoogvenster waarin je de kolomnaam kunt invoeren. Voeg meer kolommen toe met het plusteken. Open dan de rechterzijbalk met de kolomeigenschappen door met de rechtermuisknop op de betreffende kolomnaam te klikken en Column Options te kiezen.
Via het zijpaneel kun je diverse instellingen voor de geselecteerde kolom aanpassen. Allereerst is Column Type belangrijk. Daar bepaal je welke inhoud in de betreffende kolom toegestaan is, bijvoorbeeld tekst, getallen met of zonder decimalen, een datum of een selectie uit vooraf gedefinieerde opties.

Sommige typen beïnvloeden de weergave of bediening. Zo open je in datumvelden met een dubbelklik een kalender om een datum te kiezen, en het type Toggle (voor ja/nee, waar/onwaar, aan/uit) kan naar keuze worden weergegeven als selectievakje of schuifschakelaar.
Afhankelijk van het gekozen kolomtype zijn er nog meer opties beschikbaar. Bij de Date-velden kun je de opmaak instellen, bij Choice en Choice List geef je een lijst met toegestane inhoud op. Bij de laatste is meervoudige selectie mogelijk, bij de eerste niet.
Voor het ledenoverzicht definieer je de volgende kolommen: Lidnummer (Integer), Voornaam, Achternaam, Straat, Postcode, Plaats, Telefoon, E-mail, Geboortedatum (Date), Geslacht (Choice), Begindatum (Date), Einddatum (Date), Actief (Toggle) en Opmerkingen.
Aan alle velden zonder typeaanduiding tussen haakjes wijs je het type Text toe. Bij de datumvelden stel je bij Date Format de gewenste indeling in, bijvoorbeeld DD-MM-YYYY.
Bij het schakelveld Toggle kies je onder Cell Format een tekstweergave (TextBox), een selectievakje om aan te vinken (CheckBox) of een grafische schuifschakelaar (Switch). De keuzelijst voor het veld Geslacht vul je bij het veld Choices in, waarin je M, V en D onder elkaar schrijft.
Eigenlijk zou deze eerste kennismaking met Grist zonder formules en coderegels moeten kunnen. Er is echter een kleine uitzondering nodig. De ledentabel heeft een extra, automatisch ingevulde kolom nodig die de voor- en achternaam combineert. Die kolom is later nodig als weergave in referentiekolommen van andere tabellen, zodat er bijvoorbeeld bij de afdelingsindeling een volledige naam staat.
Maak in de tabel Leden met een klik op de + een nieuwe kolom aan en geef die de naam Naam en het kolomtype Text. Klik in de kolomeigenschappen in het gedeelte Column Behavior op Set formula en voer de volgende regel in:
f"{$Voornaam} {$Achternaam}"
Grist bepaalt vanaf dan voor elke bestaande en toekomstige rij zelfstandig de gecombineerde naam. De kolom is als berekende formulekolom automatisch alleen-lezen.

Als je wilt, kun je de kolom met de gecombineerde naam verbergen (klik met rechts op de kolomtitel, Hide column), aangezien de namen van de leden al in de kolommen Voornaam en Achternaam staan.
Meer tabellen voorbereiden en koppelen
De twee andere benodigde tabellen maak je aan via Add new / Add empty table. De eerste noem je Afdelingen en daar definieer je de volgende kolommen: Afdelingsnaam, Beschrijving en Oprichtingsjaar. Alle kolommen krijgen het type Text, het oprichtingsjaar optioneel ook Integer.
Als derde tabel maak je Lidmaatschappen aan. De eerste kolom noem je Lid. Dat wordt de gekoppelde kolom en die haalt zijn inhoud uit de tabel Leden. Stel daarvoor bij de eigenschappen het type Reference in, selecteer onder Data from table de optie Leden en zet Show Column op Naam – de kolom die je eerder met een formule hebt gemaakt.
Bij het invoeren van gegevens typ je daar dan geen namen in, maar kies je uit een lijst die wordt gevuld vanuit de ledentabel. De tweede kolom heet Afdeling en is ook een referentiekolom, dit keer met gegevens uit de tabel Afdelingen en weergave van de kolom Afdelingsnaam.
Daarna komt het veld Toetredingsdatum (type Date) en tot slot nog de kolom Rol. Dat laatste bevat maar een paar termen, dus een aparte referentietabel daarvoor is niet de moeite waard. Maak in plaats daarvan een keuzelijst, net zoals eerder voor de kolom Geslacht in de ledenlijst. Als keuzemogelijkheden vul je deze keer Leider/leidster, Speler/speelster en Begeleider/begeleidster in.
Daarmee is het raamwerk voor het ledenbeheer klaar.
Goede relaties
Via referentiekolommen leg je in Grist de koppelingen tussen tabellen aan.

Tabellen importeren
In plaats van gegevens handmatig in een Grist-database in te voeren, kun je ook bestaande gegevenssets importeren. Dat kan onder meer met tabellen in het Excel-formaat (XLSX) en met door komma’s gescheiden tekstbestand (CSV). Je kunt de tabelstructuren voorbereiden zoals beschreven en ze vullen met inhoud uit de CSV-bestanden, of – wat in dit voorbeeld zinvoller en eenvoudiger is – Grist nieuwe tabellen laten aanmaken op basis van de importbestanden. Voor beide heb je de voorbeeldgegevens nodig die bij de link bij dit artikel staan.
Wil je de net aangemaakte tabellenstructuur vullen, klik dan linksboven op Add new en kies Import from file. Navigeer in het bestandsvenster naar het eerste CSV-bestand (Leden.csv) en klik op Openen. De inhoud verschijnt in een voorbeeldvenster. Op de linkerzijbalk kies je onder Destination Table de optie Leden. Start het importeren door op Import te klikken.
Op dezelfde manier importeer je de bestanden Afdelingen.csv en Lidmaatschappen.csv. De nog aanwezige lege standaardtabel Table1 verwijder je via het driepuntsmenu naast de naam.
Begin je blanco zonder vooraf aangemaakte structuur, maak dan een workspace aan en ga naar Add new / Import document. Selecteer Leden.csv, waarna de tabel onder die naam aangemaakt wordt en de gegevens worden geïmporteerd.
Grist leest de kolomnamen uit de eerste regel van het CSV-bestand, voor zover die daar staan. Daarnaast probeert het programma de betreffende gegevenstypen te herkennen. Maar omdat CSV alleen tekst bevat zonder dergelijke aanvullende informatie, probeert Grist het juiste type af te leiden uit de inhoud. Dat lukt soms beter en soms slechter.
Controleer daarom de kolominstellingen, met name het kolomtype en de betreffende opmaakinstellingen (getallen, valuta’s, datumnotatie …). Pas verkeerd toegewezen kolommen aan zoals beschreven in het gedeelte Kolommen van de ledentabel definiëren.
Maak van de twee kolommen Lid en Afdeling in de tabel Lidmaatschappen nog geen referentiekolommen, dat komt zo meteen. Voeg eerst een nieuwe kolom toe aan de tabel Leden, waarin de voor- en achternaam worden gecombineerd – zie eerder in dit artikel.
Hulp voor relaties
Aangezien CSV-bestanden geen tabellenkoppelingen kennen, moet je na het importeren elk lid afzonderlijk aan zijn afdeling toewijzen. Dat kan echter makkelijker met een gemeenschappelijk sleutelveld. Dat is een kolom met dezelfde unieke waarde in beide tabellen, bijvoorbeeld een bedrijfs-, product- of, in dit geval, een lidnummer.
Als de CSV-bestanden zo’n veld bevatten, wijst Grist de rijen automatisch toe als je die kolom als referentiekolom definieert. In tegenstelling tot klassieke databases heeft Grist het sleutelveld alleen nodig voor die eerste toewijzing omdat het tabellen intern via rij-ID’s met elkaar verbindt. De referentiekolom zelf kan vervolgens de inhoud van elke willekeurige kolom in de doeltabel weergeven, dus in ons geval de volledige naam in plaats van het lidnummer.
Open vanuit de navigatiebalk aan de linkerkant de tabel Lidmaatschappen en wijzig het type van de kolom Lid (bevat de lidnummers) van Numeric in Reference. De nummers in de kolom krijgen dan een koppelsymbool voor zich (kettingschakels). Stel bij de kolomeigenschappen Data From Table in op Leden. Om ervoor te zorgen dat de bijbehorende namen in plaats van de lidnummers worden weergegeven, stel je Show Column in op Naam.


Op dezelfde manier koppel je de vermeldingen in Lidmaatschappen aan de Afdelingen, zodat je daaruit de afdelingsnamen kunt halen. Verander het kolomtype van Text naar Reference. Grist stelt voor Date From Table al terecht Afdelingen voor. Bij Show Column stel je Afdelingsnaam in.
De eerste database
Je hebt dan– toegegeven, nog heel eenvoudig – een ledenbeheer voor een vereniging. Omdat het meerdere tabellen met elkaar verbindt, is het echter al superieur aan menig Excel-oplossing. Je kunt stamgegevens wijzigen, toevoegen, sorteren, zoeken en filteren.
Bestaande vermeldingen bewerk je direct in de tabelcellen (dubbelklikken of de cel selecteren en Enter-toets), nieuwe voeg je toe via de automatisch toegevoegde lege regel helemaal onderaan. Toewijzingen wijzig je door te dubbelklikken op een referentiekolom. Als je de spatiebalk indrukt terwijl een cel geselecteerd is, wordt het record geopend in een eenvoudig invoerscherm.

De functies voor sorteren en filteren vind je op het tabblad met dezelfde naam op de rechterzijbalk onder het tabblad Table of via het kleine pijltje dat verschijnt als je de muis op een kolomkop plaatst.
Met een op de juiste manier aangepaste tabel- en kolomstructuur kun je op dezelfde manier andere databasetoepassingen opzetten, zoals een klantenbeheer (Customer Relationship Management, CRM). In een ander artikel over Grist laten we zien hoe je met widgets verschillende weergaven, dashboards en pivot-achtige analyses kunt maken en eenvoudige berekeningen kunt uitvoeren, bijvoorbeeld voor betalingen en leeftijdsberekeningen.
Stefan Wischner en Noud van Kruysbergen
Links bij dit artikel
Zipbestand met voorbeeldgegevens
File: grist-worskhop_deel1.zip
Grist cloudplatform
Praat mee