Naar inhoud
hulpbij
hulpbijpowerbi

DAX-fout "True/False expression" oplossen (2026)

Een CALCULATE-filter mist een geldige kolomverwijzing. Herstel measures, variabelen, aggregaties en complexe voorwaarden met FILTER of KEEPFILTERS.

De fout “A True/False expression does not specify a column. Each True/False expression used as a table filter expression must refer to exactly one column” betekent dat een filterargument geen geldige modelkolom aanwijst waarop Power BI het filter kan toepassen. Vergelijk een kolom met je gekozen scalar, of verplaats measure- en rijlogica naar een passende tabeluitdrukking met FILTER.

Wat gaat er precies mis?

CALCULATE en CALCULATETABLE wijzigen de filtercontext. Ieder argument na de eerste expressie moet één van deze vormen hebben:

  • een booleaanse filterexpressie;
  • een tabelexpressie;
  • een filtermodifier zoals REMOVEFILTERS, KEEPFILTERS of USERELATIONSHIP.

Een geldige eenvoudige filterexpressie is:

Omzet Nederland =
CALCULATE(
    [Omzet],
    Customer[Land] = "Nederland"
)

De vergelijking levert TRUE of FALSE op en verwijst naar Customer[Land]. Daardoor weet Power BI welke waarden van welke kolom in de nieuwe filtercontext horen.

Een losse scalar heeft dat doeladres niet:

Omzet gekozen week =
CALCULATE(
    [Omzet],
    SELECTEDVALUE(Forecastversie[Week])
)

SELECTEDVALUE kan bijvoorbeeld 2026-W31 retourneren, maar die tekst vertelt CALCULATE niet welke kolom moet worden gefilterd. Hetzelfde probleem ontstaat bij een losse variabele, een booleaanse measure of TRUE() als filterargument.

Microsoft beschrijft de toegestane filtervormen in de actuele documentatie voor CALCULATE en CALCULATETABLE.

De fouttekst is strenger dan de actuele regel

De melding zegt dat iedere True/False-expressie naar precies één kolom moet verwijzen. De actuele Microsoft-pagina voor CALCULATE formuleert de regel anders: een direct booleaans filter mag kolommen uit één tabel gebruiken. De pagina voor CALCULATETABLE gebruikt nog de formulering “één kolom”, hoewel beide functies dezelfde soorten filterargumenten verwerken. Lees de fouttekst daarom niet als een compleet overzicht van moderne filterregels. Een vergelijking tussen twee kolommen uit dezelfde tabel kan geldig zijn:

Omzet met positieve marge =
CALCULATE(
    [Omzet],
    KEEPFILTERS(
        Sales[Verkoopbedrag] > Sales[Kostbedrag]
    )
)

Een direct booleaans filter mag niet:

  • een measure noemen;
  • kolommen uit verschillende tabellen combineren;
  • een geneste CALCULATE gebruiken;
  • een functie scannen of retourneren die een tabel oplevert, tenzij die binnen een aggregatie tot één scalar wordt teruggebracht.

De woorden “exactly one column” zijn dus geen volledige samenvatting van de huidige regels. Zoek bij deze fout eerst naar een filterargument zonder doelkolom. Krijg je een melding over kolommen uit meerdere tabellen, dan is de verwante beperking geraakt.

Waar staat het ongeldige filter?

De fout zit meestal in een filterargument van:

  • CALCULATE;
  • CALCULATETABLE;
  • een tijdintelligentiepatroon dat intern filtercontext wijzigt;
  • een variabele die later als filterargument wordt doorgegeven.

Controleer ook de argumentvolgorde. Bij CALCULATE staat de scalaire resultaatexpressie eerst en komen de filters daarna:

CALCULATE(
    <scalaire expressie>,
    <filter 1>,
    <filter 2>
)

Heb je een tabel als eerste argument gebruikt, lees dan de decoder voor “Multiple columns cannot be converted to a scalar value”. Kan een gewone kolomverwijzing niet tot één waarde worden herleid, begin dan bij “A single value for column cannot be determined”.

Stap voor stap de True/False-fout oplossen

1. Isoleer iedere CALCULATE of CALCULATETABLE

Begin bij de binnenste aanroep. Schrijf het eerste argument en ieder filterargument afzonderlijk op. Noteer per filter:

  • is dit een scalar, tabel of filtermodifier;
  • welke modelkolom of modeltabel wordt gefilterd;
  • bevat de expressie een measure;
  • komen kolommen uit één of meerdere tabellen;
  • staat er een geneste CALCULATE in.

Zo voorkom je dat je een geldig buitenste filter aanpast terwijl de werkelijke fout dieper in de formule staat.

2. Zoek een filter zonder kolomverwijzing

Veelvoorkomende voorbeelden zijn:

CALCULATE([Omzet], TRUE())
CALCULATE([Omzet], GekozenWeek)
CALCULATE([Omzet], [Is winstgevend])

De uitkomsten kunnen booleaans, tekst of numeriek zijn, maar geen van deze argumenten wijst zelfstandig een doelkolom aan.

3. Bepaal welke kolom werkelijk moet worden gefilterd

Vraag niet alleen hoe de fout verdwijnt. Bepaal welke modelkolom de gekozen waarde hoort te ontvangen. Een weekselectie kan bijvoorbeeld Forecast[Week] filteren en een statusvariabele Orders[IsOpen].

Bestaat die kolom niet of probeer je verschillende tabellen rij voor rij te vergelijken, controleer dan eerst het datamodel en de relaties. Een extra FILTER kan een ontbrekende of verkeerde relatie verbergen.

4. Kies een direct filter of een tabelexpressie

Gebruik:

  • een directe vergelijking voor eenvoudige kolomvoorwaarden binnen één tabel;
  • KEEPFILTERS als het nieuwe filter een bestaand filter op dezelfde kolom moet doorsnijden;
  • FILTER wanneer een measure of echte rij-voor-rijlogica nodig is;
  • TREATAS om waarden uit een niet-gerelateerde tabel op een doelkolom toe te passen;
  • een relatie wanneer twee tabellen structureel bij elkaar horen.

5. Verplaats complexe scalars naar een variabele

Een geneste CALCULATE is niet toegestaan in een direct booleaans filterargument. Bereken de benodigde scalar daarom eerst in de bestaande filtercontext en gebruik de variabele daarna rechts van een kolomvergelijking.

6. Test de filtersemantiek

Test na de reparatie:

  1. geen selectie;
  2. één selectie;
  3. meerdere selecties;
  4. een detailrij;
  5. subtotalen en het eindtotaal;
  6. een bestaand filter op dezelfde doelkolom.

De formule kan technisch geldig zijn en toch een bestaand slicerfilter vervangen waar je een doorsnede bedoelde. Controleer daarom expliciet het verschil met en zonder KEEPFILTERS.

Oplossing 1: zet de berekening vóór de filters

Deze argumenten staan omgekeerd:

Omzet alle producten =
CALCULATE(
    REMOVEFILTERS(Product),
    [Omzet]
)

REMOVEFILTERS(Product) hoort de filtercontext te wijzigen en [Omzet] hoort de resultaatwaarde te berekenen. In de getoonde volgorde staat de measure op een filterpositie, waar een losse measure niet is toegestaan.

Zet de scalaire expressie eerst en de filtermodifier daarna:

Omzet alle producten =
CALCULATE(
    [Omzet],
    REMOVEFILTERS(Product)
)

Loop bij een lange aanroep alle komma’s van links naar rechts langs. Het eerste argument beantwoordt “wat bereken ik?” en ieder volgend argument “welk filter pas ik toe?”.

Oplossing 2: een geselecteerde scalar aan een doelkolom koppelen

Deze measure gebruikt de gekozen week los als filter:

Prognose gekozen week =
VAR GekozenWeek =
    SELECTEDVALUE(Forecastversie[Week])
RETURN
    CALCULATE(
        [Prognose],
        GekozenWeek
    )

Vergelijk de doelkolom met de variabele en handel een ontbrekende of meervoudige selectie bewust af:

Prognose gekozen week =
VAR GekozenWeek =
    SELECTEDVALUE(Forecastversie[Week])
RETURN
    IF(
        ISBLANK(GekozenWeek),
        BLANK(),
        CALCULATE(
            [Prognose],
            Forecast[Week] = GekozenWeek
        )
    )

De filterexpressie verwijst nu alleen naar Forecast[Week]. GekozenWeek is vóór CALCULATE als scalar vastgesteld. De officiële SELECTEDVALUE-documentatie legt uit dat de functie het alternatieve resultaat geeft wanneer nul of meerdere onderscheidende waarden zichtbaar zijn.

Moeten meerdere geselecteerde weken geldig blijven, gebruik dan geen kunstmatige MAX of eerste waarde. Geef de hele selectietabel door met TREATAS:

Prognose gekozen weken =
VAR GekozenWeken =
    VALUES(Forecastversie[Week])
RETURN
    CALCULATE(
        [Prognose],
        TREATAS(
            GekozenWeken,
            Forecast[Week]
        )
    )

TREATAS gebruikt de waarden uit de tabeluitdrukking als filter op de opgegeven doelkolom. De kolomaantallen en volgorde moeten overeenkomen. Zie de officiële uitleg van TREATAS.

Oplossing 3: een booleaanse variabele met een kolom vergelijken

Een losse booleaanse variabele is nog geen kolomfilter:

Omzet actieve producten =
VAR AlleenActief = TRUE()
RETURN
    CALCULATE(
        [Omzet],
        AlleenActief
    )

Koppel de waarde aan de bedoelde kolom:

Omzet actieve producten =
VAR AlleenActief = TRUE()
RETURN
    CALCULATE(
        [Omzet],
        Product[Actief] = AlleenActief
    )

De variabele staat rechts als scalar. Product[Actief] geeft Power BI het adres waarop het filter moet worden toegepast.

Gebruik dit patroon alleen als de kolom en de booleaanse betekenis werkelijk overeenkomen. Een algemene vlag als Is rapport geldig hoort niet automatisch bij een productkolom.

Oplossing 4: een measure binnen FILTER evalueren

Deze directe filterexpressie is ongeldig omdat zij een measure noemt:

Omzet winstgevende maanden =
CALCULATE(
    [Omzet],
    [Winst] > 0
)

Laat FILTER de measure per gekozen maand evalueren:

Omzet winstgevende maanden =
CALCULATE(
    [Omzet],
    FILTER(
        VALUES('Datum'[JaarMaand]),
        [Winst] > 0
    )
)

VALUES('Datum'[JaarMaand]) vormt hier de korrel waarop winstgevendheid wordt getest. Gebruik een unieke jaar-maandsleutel, zodat januari uit verschillende jaren niet wordt samengevoegd.

Microsoft gebruikt hetzelfde patroon in de best practice Avoid using FILTER as a filter argument. De titel is bewust geen absoluut verbod. Een direct booleaans kolomfilter is efficiënter wanneer dat kan, maar FILTER is nodig wanneer de voorwaarde een measure bevat.

Oplossing 5: een aggregatie als scalargrens gebruiken

Sinds Power BI Desktop van september 2021 mag een direct booleaans filter een aggregatie bevatten die één scalar teruggeeft. Dit patroon is geldig:

Omzet laatste zichtbare orderdatum =
CALCULATE(
    [Omzet],
    Sales[Orderdatum] = MAX(Sales[Orderdatum])
)

MAX(Sales[Orderdatum]) levert één datum op. De linkerkant wijst de gefilterde kolom aan.

Een geneste CALCULATE in dezelfde filterexpressie blijft ongeldig. Schrijf de drempel eerst naar een variabele:

Omzet boven gemiddelde orderwaarde =
VAR GemiddeldeOrderwaarde =
    CALCULATE(
        AVERAGE(Sales[Orderbedrag]),
        REMOVEFILTERS(Sales[Orderbedrag])
    )
RETURN
    CALCULATE(
        [Omzet],
        KEEPFILTERS(
            Sales[Orderbedrag] > GemiddeldeOrderwaarde
        )
    )

De eerste CALCULATE wordt vóór het buitenste filterargument geëvalueerd. Daarna bevat de booleaanse filterexpressie één Sales-kolom en een bestaande scalarvariabele.

Oplossing 6: kolommen uit verschillende tabellen scheiden

Twee onafhankelijke voorwaarden uit verschillende tabellen horen niet samen in één booleaans argument:

Nederlandse omzet in 2026 =
CALCULATE(
    [Omzet],
    Customer[Land] = "Nederland"
        && 'Datum'[Jaar] = 2026
)

Geef iedere tabel een eigen filterargument:

Nederlandse omzet in 2026 =
CALCULATE(
    [Omzet],
    Customer[Land] = "Nederland",
    'Datum'[Jaar] = 2026
)

CALCULATE combineert deze afzonderlijke argumenten met AND. Beide argumenten blijven kolomgebonden aan hun eigen tabel.

Dit directe filter combineert kolommen uit twee tabellen:

Omzet gekozen land =
CALCULATE(
    [Omzet],
    Sales[Landcode] = Landkeuze[Landcode]
)

Dat is niet toegestaan in één direct booleaans filter. Voor precies één selectie kun je de waarde eerst reduceren:

Omzet gekozen land =
VAR GekozenLand =
    SELECTEDVALUE(Landkeuze[Landcode])
RETURN
    IF(
        ISBLANK(GekozenLand),
        BLANK(),
        CALCULATE(
            [Omzet],
            Sales[Landcode] = GekozenLand
        )
    )

Voor meerdere selecties past het eerdere TREATAS-patroon. Hoort Landkeuze structureel bij Sales, geef een geldige modelrelatie de voorkeur boven steeds opnieuw virtuele filters schrijven.

Oplossing 7: eenvoudige filters direct en bewust toepassen

Gebruik niet automatisch FILTER rond iedere voorwaarde. Voor een eenvoudige kleurfilter is dit duidelijk:

Rode omzet =
CALCULATE(
    [Omzet],
    KEEPFILTERS(
        Product[Kleur] = "Rood"
    )
)

Zonder KEEPFILTERS vervangt de nieuwe voorwaarde een bestaand filter op Product[Kleur]. Met KEEPFILTERS gebruikt Power BI de doorsnede van het bestaande en nieuwe filter.

KEEPFILTERS repareert het type niet. Deze variant blijft ongeldig:

CALCULATE(
    [Omzet],
    KEEPFILTERS([Winst] > 0)
)

De onderliggende expressie verwijst nog steeds naar een measure. Gebruik daarvoor FILTER over de juiste korrel, zoals in oplossing 4.

Let op bij DirectQuery

De regels voor booleaanse filterargumenten gelden ook in DirectQuery. Een measure wordt niet ineens een geldige directe filterexpressie doordat de opslagmodus verandert.

Controleer daarnaast de functiebeperkingen per berekeningscontext. Microsoft vermeldt bij CALCULATE, CALCULATETABLE, FILTER, KEEPFILTERS en TREATAS dat ze in DirectQuery niet worden ondersteund wanneer je ze in berekende kolommen of RLS-regels gebruikt. Dat is geen algemeen verbod op gebruik in measures.

Houd een tabeluitdrukking zo klein als de businessregel toelaat, zeker bij DirectQuery. FILTER(VALUES('Datum'[JaarMaand]), ...) onderzoekt een gerichte maandkorrel; FILTER(Sales, ...) kan veel meer rijen en kolommen betrekken.

Veelgemaakte fouten

  • Een SELECTEDVALUE-resultaat los doorgeven. De scalar mist een doelkolom.
  • Een booleaanse measure als filterargument gebruiken. Een measure mag niet in een direct booleaans CALCULATE-filter staan.
  • De fouttekst letterlijk als één-kolomsmaximum lezen. De actuele regel staat kolommen uit één tabel toe.
  • Kolommen uit twee tabellen rechtstreeks vergelijken. Gebruik een scalarvariabele, TREATAS of een modelrelatie.
  • Een geneste CALCULATE in de vergelijking zetten. Bereken de benodigde scalar vooraf in een variabele.
  • FILTER altijd vermijden. Bij een measure-afhankelijke voorwaarde is een tabelexpressie juist nodig.
  • KEEPFILTERS als typeconversie zien. De functie verandert filtergedrag, niet de geldigheid van de onderliggende expressie.
  • Zonder selectiegedrag testen. SELECTEDVALUE geeft bij nul en meerdere waarden hetzelfde alternatieve resultaat.

Zo voorkom je deze fout

Schrijf CALCULATE met één zichtbare resultaatregel en ieder filter op een eigen regel. Geef scalarvariabelen namen als GekozenWeek of GemiddeldeOrderwaarde en tabelvariabelen namen als WinstgevendeMaandenTabel.

Controleer vóór iedere directe filter welke modelkolom wordt gefilterd, uit hoeveel tabellen de genoemde kolommen komen en of een measure in de vergelijking staat. Kies pas daarna voor een directe voorwaarde, KEEPFILTERS, FILTER, TREATAS of een relatie.

Geeft de reparatie een eenkolomstabel met meerdere mogelijke waarden, gebruik dan de decoder voor “A table of multiple values”. Bij rode parsermeldingen helpt “The syntax for ... is incorrect”. Bekijk voor andere meldingen het DAX-foutmeldingsoverzicht of ga terug naar de Power BI-hub.

Veelgestelde vragen

Wat betekent 'A True/False expression does not specify a column' in DAX?
Een filterargument van CALCULATE of CALCULATETABLE levert een losse scalar of booleaanse uitkomst op zonder geldige modelkolom waaraan Power BI het filter kan koppelen. Vergelijk een kolom met de bedoelde waarde, of gebruik voor complexere logica een tabelexpressie met FILTER.
Moet een booleaans filter in 2026 echt precies één kolom noemen?
De fouttekst zegt dat, maar de actuele Microsoft-regel is dat een booleaanse filterexpressie alleen kolommen uit één tabel mag gebruiken. Meerdere kolommen uit dezelfde tabel kunnen dus geldig zijn. Measures, kolommen uit verschillende tabellen en een geneste CALCULATE blijven in zo'n direct filter niet toegestaan.
Waarom kan ik een measure niet rechtstreeks als CALCULATE-filter gebruiken?
Een measure is een scalaire berekening en geen kolomgebonden filterexpressie. Als de measure bepaalt welke items geldig zijn, laat FILTER dan over een bewuste tabelkorrel lopen en evalueer de measure per rij van die tabel.
Waarom werkt SELECTEDVALUE niet los als filterargument?
SELECTEDVALUE retourneert één scalar, maar zegt niet welke doelkolom gefilterd moet worden. Bewaar de selectie in een variabele en vergelijk een doelkolom met die variabele, of gebruik TREATAS wanneer je één of meerdere selecties als tabel wilt doorgeven.
Wanneer gebruik ik FILTER en wanneer een direct booleaans filter?
Gebruik een direct kolomfilter voor eenvoudige voorwaarden binnen één tabel. Gebruik FILTER wanneer de voorwaarde een measure, rij-voor-rijlogica of een complexere tabelkorrel nodig heeft. Kies eerst de kleinste tabel die inhoudelijk moet worden onderzocht.
Mag MAX of een andere aggregatie in een CALCULATE-filter?
Ja. Sinds Power BI Desktop van september 2021 mag een booleaanse filterexpressie een aggregatie bevatten die één scalar teruggeeft, bijvoorbeeld Sales[Orderdatum] gelijk aan MAX van die kolom. Een geneste CALCULATE in dezelfde filterexpressie blijft niet toegestaan.
Wat doet KEEPFILTERS bij de reparatie?
Een normaal CALCULATE-filter vervangt een bestaand filter op dezelfde kolom. KEEPFILTERS laat Power BI de doorsnede van het bestaande en nieuwe filter gebruiken. Het maakt een ongeldige measure of losse scalar niet geldig; de onderliggende filterexpressie moet nog steeds aan de regels voldoen.
Waarom kan een verkeerde CALCULATE-argumentvolgorde deze fout geven?
Het eerste argument van CALCULATE is de waarde die je wilt berekenen. Alle volgende argumenten moeten geldige filters of filtermodifiers zijn. Zet je een measure per ongeluk na een filtermodifier, dan probeert Power BI die measure als filter te lezen en ontbreekt de vereiste kolomgebonden filterexpressie.

Lees ook

Hulp nodig bij jouw situatie?

Kom je er niet uit? Stuur kort wat context, wat je wilt bereiken en waar je vastloopt. Vraag een offerte aan als je wilt dat ik het voor je oplos.

w.bouwmeester@bouwmeesterconsultancy.nl · +31 6 28963636