Blog JSystems - uwalniamy wiedzę!

Szukaj

Power Query w Excelu, Power BI i Fabric

Expression.Error: Nie możemy przekonwertować wartości null na typ Logical

W skrócie

  • Komunikat „Nie możemy przekonwertować wartości null na typ Logical” pojawia się w kolumnie warunkowej albo niestandardowej Power Query, gdy warunek porównuje pustą komórkę z liczbą.
  • Porównanie null z liczbą, na przykład null >= 3000, daje w języku M null, a nie fałsz. Instrukcja if wymaga prawdy albo fałszu, więc na wartości null zgłasza błąd.
  • Na początku warunku sprawdź, czy kolumna jest pusta, a dopiero potem porównuj liczby. Zero w miejsce pustej wartości wstawiaj operatorem ?? tylko wtedy, gdy brak danych oznacza w tym miejscu zero.

Komunikat „Nie możemy przekonwertować wartości null na typ Logical” pojawia się w kolumnach warunkowych zbudowanych na danych z pustymi komórkami, na przykład przy segmencie cenowym, progu rabatu albo fladze przekroczenia budżetu. Większość wierszy dostaje wynik, a w wierszach z pustą wartością stoi Error. Pokazujemy, skąd w warunku bierze się null, jak poprawić regułę i kiedy zamiana pustych wartości na zero ma sens.

Jak to wygląda w praktyce

Krok kolumny warunkowej albo niestandardowej działa, ale w części wierszy nowej kolumny stoi Error. Błąd dostają wiersze, w których kolumna użyta w warunku jest pusta. Kliknięcie w puste miejsce obok napisu Error pokazuje komunikat:

Expression.Error: Nie możemy przekonwertować wartości null na typ Logical.

Angielski oryginał to Expression.Error: We cannot convert the value null to type Logical. W polu Szczegóły Power Query podaje dwa pola: Value, czyli wartość, której nie dało się zamienić, i Type, czyli typ docelowy. W naszym teście na trzech produktach, z których jeden nie miał ceny, segment cenowy dostały dwa wiersze (Premium i Średni), a trzeci zgłosił ten błąd.

Dlaczego tak się dzieje

W języku M porównanie z null nie daje fałszu, tylko null. Sprawdziliśmy w Excelu, że null >= 3000 zwraca null. Instrukcja if potrzebuje wartości logicznej, czyli prawdy albo fałszu, a null nie jest żadną z nich, więc silnik zgłasza błąd konwersji. Kolumna warunkowa zapisuje reguły z okna jako zagnieżdżone wyrażenie if:

each if [Cena netto] >= 3000 then "Premium"
    else if [Cena netto] >= 1000 then "Średni"
    else "Podstawowy"

Dla pustej ceny już pierwsze porównanie daje null, więc ani druga reguła, ani W przeciwnym razie nie mają szansy zadziałać. Inaczej działa sprawdzanie równości: null = 3000 zwraca fałsz, a null <> 3000 prawdę, więc warunki z równością albo nierównością tego błędu nie dają.

Ten sam warunek w filtrze wierszy zachowuje się jeszcze inaczej. Filtr [Cena netto] >= 3000 nie zgłasza błędu, tylko pomija wiersze z pustą ceną: w naszym teście z trzech wierszy został jeden. Brak komunikatu w filtrze nie znaczy więc, że puste wartości zostały obsłużone.

Okno Dodawanie kolumny warunkowej w Power Query z regułami segmentu cenowego dla kolumny Cena netto: Premium, Średni i Podstawowy
Okno Dodawanie kolumny warunkowej. Reguły dla kolumny Cena netto są sprawdzane od góry: najpierw próg 3000, potem 1000, a pozostałe wiersze dostają wartość Podstawowy.

Jak to rozwiązać krok po kroku

  1. Zaznacz nową kolumnę, na karcie Strona główna rozwiń Zachowaj wiersze i wybierz Zachowaj błędy. Sprawdź, która kolumna z warunku jest w tych wierszach pusta, a potem usuń krok Zachowano błędy krzyżykiem.
  2. Ustal, co oznacza pusta wartość: brak danych w źródle, który trzeba wyjaśnić, czy wartość, która w tym kontekście jest zerem. Od tej decyzji zależy naprawa.
  3. Jeśli pusty wiersz ma dostać osobny wynik, kliknij krok kolumny warunkowej i w pasku formuły dopisz na początku wyrażenia sprawdzenie null: each if [Cena netto] = null then null else if [Cena netto] >= 3000 then "Premium", a dalszą część zostaw bez zmian. Zamiast pierwszego null możesz wstawić tekst, na przykład "Brak ceny". W naszym teście ta zmiana usunęła wszystkie błędy.
  4. Pilnuj kolejności: sprawdzenie null musi stać przed porównaniami liczb, bo reguły są sprawdzane od góry. W pojedynczej regule możesz połączyć oba warunki: w naszym teście [Cena netto] <> null and [Cena netto] >= 3000 dla pustej ceny dało fałsz, a nie błąd.
  5. Jeśli brak wartości oznacza zero, zastąp null zerem w samym porównaniu operatorem ??: each if ([Cena netto] ?? 0) >= 3000 then "Premium". Wiersz z pustą ceną trafi wtedy do segmentu Podstawowy. Zamianę w całej kolumnie zrobi krok = Table.ReplaceValue(#"Poprzedni krok", null, 0, Replacer.ReplaceValue, {"Cena netto"}), ale wtedy zero zobaczą też wszystkie dalsze obliczenia.
  6. Gdy pusta wartość to brak danych, nie zamieniaj jej na zero. Zostaw null w wyniku i ustal z właścicielem danych, skąd się wziął, bo zero w cenie przesunęłoby produkt do najniższego segmentu bez żadnego śladu.

Jak sprawdzić, że zadziałało

Włącz na karcie Widok pole Jakość kolumn i przełącz profilowanie na cały zestaw danych: w nowej kolumnie Błąd ma pokazywać 0%. Udział pustych wartości w wyniku powinien odpowiadać udziałowi pustych wartości w kolumnie z warunku, bo to te same wiersze. Przefiltruj wynik po null albo po tekście w rodzaju „Brak ceny” i przejrzyj te wiersze, zanim przekażesz dane dalej.

Nawrotom zapobiegniesz, sprawdzając Jakość kolumn kolumny źródłowej przed zbudowaniem warunku: każdy procent przy słowie Puste oznacza, że reguła dla null jest potrzebna. Sprawdź też filtry na tych samych kolumnach. Tam błąd się nie pojawi, a wiersze z pustą wartością znikną bez ostrzeżenia.

Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query

Baner szkolenia Microsoft Excel - Power Query w JSystems z edytorem Power Query na ekranie laptopa

Szkolenie Microsoft Excel - Power Query --> Dwa dni warsztatów z Excela: pobieranie danych z plików, folderów, SharePointa i baz SQL, ich czyszczenie i łączenie w Power Query, praca w języku M, a na koniec model danych i oparta na nim tabela przestawna. Prowadzi Sebastian Stasiak.

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego porównanie pustej komórki z liczbą nie daje fałszu?
W języku M porównanie wartości null z liczbą operatorem większe albo mniejsze zwraca null, czyli wynik nieznany. Instrukcja if przyjmuje tylko prawdę albo fałsz, więc na null zgłasza błąd konwersji na typ Logical. Sprawdzanie równości z null działa inaczej i zwraca prawdę albo fałsz.
Dlaczego filtr z tym samym warunkiem nie zgłasza błędu?
Filtr wierszy traktuje wynik null jak niespełniony warunek i po cichu pomija takie wiersze. W naszym teście filtr cen od 3000 zostawił jeden wiersz z trzech, a wiersz z pustą ceną zniknął bez komunikatu. Dlatego puste wartości obsługuj jawnie także w filtrach.
Czy puste wartości lepiej zamienić na zero?
Tylko wtedy, gdy brak wartości naprawdę oznacza zero, na przykład brak sprzedaży w danym dniu. Jeśli to brak danych, zero zafałszuje wynik: produkt bez ceny trafi do najniższego segmentu, a średnie spadną. Wtedy zostaw null i wyjaśnij, skąd wziął się brak.
Jak w jednej regule zabezpieczyć warunek przed pustymi wartościami?
Połącz dwa warunki operatorem and: najpierw sprawdź, czy kolumna jest różna od null, a potem porównaj liczbę. Dla pustej komórki cały warunek da wtedy fałsz zamiast błędu. Drugą możliwością jest operator ??, który podstawia wartość zastępczą, ale tylko gdy zero ma sens biznesowy.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...