Przejdź do głównej zawartości

Wyrażenia


Zobacz film ilustrujący poniższe zagadnienia​

  Wyrażenia

Wyrażenia nazywamy też formułami. Są to kawałki prostego kodu pozwalające na wyliczanie nowych wartości. Wyrażenia używają funkcji do operowania na dostępnych danych - tak jak w arkuszu kalkulacyjnym.

wskazówka

Edycję wyrażeń umożliwia użycie skrótu Ctrl+ Spacja, które pokazują nam rozbudowane, kontekstowe okienko drzewiastych podpowiedzi.

Wyrażenia stosujemy w zasadzie wszędzie - od prostej arytmetyki, dynamicznych właściwości, warunków, filtrów, lokalnych złączeń danych, a nawet do tworzenia rekordów ad-hoc.

Na wyrażenia składają się 3 główne składniki:

  1. dane, w postaci ścieżek i stałych

image

  1. funkcje - można używać funkcji z .NET i dodawać własne,
  2. zapisy gramatyczne, które sprawiają, że da się sprawnie budować rozwiązania na poziomie biznesowym, bez wnikania w jakieś detale języków programowania.

image

Wyrażenia zawsze zwracają wartość jakiegoś typu. Zwykle jest to wartość logiczna prawda/fałsz w jakiejś walidacji czy klasyfikacji. Ale może to być też prosta wartość dla wyliczanego akurat pola danych - typu liczbowego, data, strumień binarny itd. W bardziej skomplikowanych przypadkach może to też być lista czy nawet całe drzewo.

Najczęstsze użycie wyrażeń:

  1. Jednym ze sposobów użycia wyrażenia jest dodanie adnotacji Wyrażenie z menu kontekstowego do danego pola na schemacie danych. Adnotację taką możesz dodać zarówno na schematach danych na formularzu w Mapowaniach inicjalnych jak i w Przetwarzaniu Danych.
  2. Wyrażenie możesz zdefiniować w panelu Szczegóły lub wybierz przycisk image i przejdź do dedykowanego edytora wyrażeń.

image

  1. W różnych miejscach platformy na panelu Właściwości możesz wybrać Sposób określenia danej właściwości poprzez Wyrażenie.

image

  1. W powyższym przypadku określona została widoczność kontenera Ocena ryzyka na podstawie wyrażenia: StatusWnioskuId==DIC::VSF\Slowniki\StatusWniosku\Uzupełniony, gdzie sprawdzany jest status wniosku z wartością słownikową. Oznacza to, że kontener będzie widoczny na stronie www tylko i wyłącznie wtedy gdy wniosek będzie w statusie Uzupełniony.

image

  1. W generowaniu dokumentów logika wyrażeń stosowana jest do definiowania warunku w formule. W poniższym przykładzie przy użyciu funkcji IsNullOrEmpty() sprawdzane jest czy istnieje wartość w polu Imie.

image

Edytor wyrażeń​

Edytor języka programowania wykorzystywanego w pakietach przetwarzania a także w Mapowaniach startowych na formularzach posiada wbudowaną opcję podpowiadania wyrażeń.

Wyróżnione zostały dwa rodzaje edytorów:

  1. Prosty - dostępny jest na panelu Szczegóły po wcześniejszym zastosowaniu adnotacji Wyrażenie przy danym polu. Więcej o panelu Szczegóły patrz: Panel Szczegóły

image

  1. Zaawansowany - przejście do edytora jest możliwe między innymi poprzez wybór przycisku image obok pola, do którego została dodana adnotacja Wyrażenie.

image

W zależności od miejsca w Systemie wyświetlany jest inny rodzaj edytora (prosty lub zaawansowany).

Edytor wyrażeń zawiera listę wyrażeń, które można zastosować w bieżącym kontekście.

wskazówka

Uruchomienie podpowiadania składni następuje za pomocą skrótu klawiszowego Ctrl + Spacja. Zatwierdzenie wyboru – Enter.

Definiując wyrażenie, można odwoływać się do elementów w aktualnie przetwarzanym drzewie rekordów. Odwołania takie wykorzystują ścieżki do wybranych elementów. Wyróżnia się dwa rodzaje ścieżek:

  1. względną,
  2. bezwzględna – wyrażenie rozpoczyna znak \

W ścieżkach kolejne elementy rozdzielane są za pomocą znaku \ Więcej o ścieżkach patrz: Dane.

wskazówka

Ścieżki są rozwiązywane do pełnych wskazań na rekordy lub pola. Ścieżki względne mają punkt startowy w miejscu zależnym od sytuacji. Ścieżki bezwzględne rozpoczynają się w korzeniu rekordu.

Nie zawsze można wymieniać rodzaje zapisanych ścieżek bez utraty informacji. Dla przykładu: rekord Order i pod nim wielokrotny rekord Clients. Rozwiązując ścieżkę względną od konkretnego rekordu klienta (np. w celu wyznaczenia wartości pola w funkcji innego pola tego samego rekordu) wiemy od razu, o którego konkretnego klienta chodzi. Próba zamiany ścieżki na bezwzględną zgłosi prawdopodobnie błąd, że brakuje w wyrażeniu funkcji agregującej (np. sumującej) wiele wartości wejściowych.

image

Dane​

Wyrażenia zwykle odwołują się do danych za pomocą ścieżek, które prowadzą nas po gałęziach drzewa struktury.

  1. W poniższym przykładzie mamy strukturę – konto, (Account) z listą podłączonych klientów (Clients), połączonych z kolei z listą historii relacji klienta do rachunku.
  2. Rekord klienta jest listą zwaną też multi-rekordem. Oznacza to, że w danych może potem wystąpić kilku klientów. Brak żółtej gwiazdki sugeruje, że lista jest niewymagalna, to znaczy może czasem takiego klienta nie być wcale.
  3. Rekordy historii relacji i operacji też są listami, ale wymagalnymi, to znaczy zawsze będą zawierać choćby jeden wpis. To rozróżnienie bardzo potem upraszcza działania na danych i obsługę braków wartości.

image

Tak wygląda struktura, która została zdefiniowana w bloczku w pakietach przetwarzania. Analogiczna struktura może być zdefiniowana na zakładce Mapowania startowe na formularzach poprzez podpięcie jej do formularza operacją Query data Model (zapytanie do modelu danych) lub poprzez operację zapytania SQL. Więcej o mapowaniach startowych i formularzu patrz: Mapowania inicjalne (startowe).

Wygląd struktury jak pogrubienie czcionki, kursywa dodatkowe ikony może się różnić w zależności od tego, na którym bloczku w Pakietach przetwarzania operujemy danymi lub też w samych Mapowaniach startowych na formularzu. Jednak zakres funkcjonalny stosowania wyrażeń pozostaje bez zmian. Poniżej przykład modelu danych z formularza z zakładki Mapowania startowe.

image

ostrzeżenie

Zawsze przy pracy w drzewie trzeba zdawać sobie sprawę skąd zaczynamy przejście po ścieżce, bo oczywiście nie zawsze od korzenia. Zwykle nasz punkt startowy wynika z miejsca gdzie akurat wyrażenie tworzymy, w ramach na przykład operacji wyznaczania wartości pola.

Dla przykładu:

Te dwa wyrażenia są równoważne, jeśli są liczone od korzenia. Pojedyncza kropka w ścieżce oznacza wprost bieżące miejsce. Wygląd ścieżek jest wzorowany na ścieżkach w systemie plików windows.

image

W poniższym przykładzie z kolei zaczynamy rozwiązanie ścieżki od rekordu klienta, jednego z elementów listy klientów. Mamy tu tylko nazwę lokalnego pola ClientId.

image

W przypadku gdybyśmy chcieli wyliczyć największe ID wszystkich aktualnie podłączonych klientów, wówczas:

  1. musimy iść w górę przy pomocy dwóch kropek .. do korzenia, czyli naszego rekordu konta,

image

  1. następnie w dół przez listę klientów,

image

  1. i w dół do pola. Dostajemy listę liczb, która potem trafia do agregującej funkcji maksimum. W tym przypadku moglibyśmy się posłużyć ścieżką absolutną, bezwzględną, wychodzącą od korzenia i wynik byłby niemalże taki sam. Ale - ścieżki względne zwykle nadają się lepiej, bo można ich używać w większych fragmentach rozwiązań typu szablon, można też potem całe fragmenty rozwiązania przesunąć w nieco inne miejsce drzewa i nadal będą działać.

image

Poniżej przedstawiono jak użyć tego samego wyrażenia, ale zaczynając od innego miejsca w strukturze.

  1. W tym przykładzie zaczynamy nie od klienta, ale od ale od głównej umowy Main Agreement. Ścieżka jest taka sama, wynik też.
  2. Jeżeli zaczynamy rozwiązywać nasze wyrażenie nie od konkretnego istniejącego klienta, tylko innego rekordu (mimo iż na tym samym poziomie), to nie możemy zakładać, że jakiś klient w ogóle będzie istniał.

image

Inny przykład użycia wyrażenia obrazuje po drodze aż dwa przejścia przez listy – pierwsze przez listę klientów, a drugie przez listę historii relacji.

  1. Ta ścieżka zwraca listę wartości i próba jej wykorzystania w kontekście np. wyliczania pola zwróci nam błąd, mówiący, że wartość jest zbyt złożona dla zwykłego pola.
  2. Z kolei – znak pytajnika na końcu oznacza niewymagalność wyniku, a to dlatego, że po drodze multirekord klienta jest niewymagalny.

image

wskazówka

Podsumowując – ścieżki prowadzą nas po drzewach i śledzą zarówno krotność jak i wymagalność wyniku.

Drzewa nazwane​

W wyrażeniach, za pomocą ścieżek, można posługiwać się odwołaniami do danych dostępnych „intuicyjnie” – do rekordu bieżącego (odwzorowanie w miejscu), do danych wejściowych (odwzorowanie-kopia). Oprócz tego są też dostępne drzewa nazwane, niekoniecznie powiązane z konkretnym rekordem podlegającym przetwarzaniu. Odwołanie do takiego drzewa oznaczamy prefixem NAZWA:

W wyrażeniu zwykle mamy dostępne więcej, niż tylko jedno drzewo. Drzewo domyślne nie ma nazwy i w odwołaniach nie potrzebuje żadnych dodatków i prefixów. W poniższym przykładzie jak napiszemy Balance + Limit, to dostaniemy prostą sumę liczb. Dwa pobrania pól z drzewa danych i przekazanie ich do funkcji – operatora +.

image

Oprócz tego są też dostępne drzewa nazwane, niekoniecznie powiązane z konkretnym rekordem podlegającym przetwarzaniu. Odwołanie do takiego drzewa oznaczamy prefiksem NAZWA:

Lista dostępnych drzew nazwanych jest zależna od kontekstu i miejsca, w którym został aktywowany edytor wyrażeń. Przykładowo inny zakres danych może być dostępny przy użycia edytora przy pakietach przetwarzania, a inny na formularzach w Mapowaniach startowych.

Dostępne drzewa nazwane:

  1. ARG: zawiera drzewo danych argumentów wywołania pakietu,
  2. DIC: lista dostępnych słowników wraz z kolumnami,
  3. PKG: zawiera wartości parametrów elementów pakietu (np. czas rozpoczęcia przetwarzania) i jego składowych (np. szczegóły poszczególnych bloczków),
  4. PREV: i NEXT: odniesienie do rekordu poprzedniego i aktualnie rozpatrywanego; dostępne w kontekście warunków wykonywania operacji i wyliczania pól, jeśli rekord jest wielokrotny, a także w normalizacji rekordów; wówczas rekord PREV oznacza rekord już znormalizowany.

Podczas iteracji po liście, wyrażenia np. warunku wykonania operacji mogą wygodnie odnieść się do poprzedniego rekordu z iteratora – a to przy pomocy drzewka o nazwie PREV: W tym przypadku sprawdzamy, czy poprzednia wartość Limit była mniejsza niż bieżąca.

image

  1. QUERY: odniesienie do rekordu zapytania w bloczku kodu (CCEvent),
  2. DST: drzewo danych docelowych, dostępne w warunkach operacji przenoszenia, klonowania i scalania rekordów (drzewo źródłowe jest drzewem domyślnym, bez nazwy). Podczas przenoszenia czy klonowania list, rekordów w inne miejsce, przy pomocy drzewa DST mamy wygodny dostęp właśnie do miejsca docelowego, co pozwala nam połączyć tylko rekordy o zgodnych wartościach w polach kluczowych. Jeden ze sposobów na wykonywanie złączeń danych już wczytanych.
  3. ConfigKeys: Klucze konfiguracyjne dostępne z poziomu konfiguracji głównej (appSettings), pliku .ini i pozostałych źródeł konfiguracji technicznej. Komentarz każdego elementu wskazuje na źródło klucza.
ważne

Klucze bazy centralnej konfiguracji oznaczone jako wrażliwe CK_SENSITIVE=1 nie są w ten sposób dostępne.

image

  1. FORM: Opisuje w szczegółach bieżącą formatkę www.
  2. CTL: Opisuje aktualną kontrolkę formularza.
  3. BLK: Zawiera informacje o nazwie aktualnej fazy procesowania i nazwie wykonywanego bloczka.
  4. THIS: Opisuje aktualnie mapowane, wyliczane pole lub rekord. Zawiera zarówno metadane jak i bieżącą wartość przerobionego pola, co pozwala na wygodną obróbkę szeregu pól identycznym wyrażeniem korzystającym z pola THIS::Value

Dla przykładu:

W poniższej strukturze pole str 1 ma zdefiniowane wyrażenie z użyciem parametru THIS::Value

  1. Przeciągnij to pole na pozostałe i wybierz opcję z menu kontekstowego Dostosuj ten obiekt (adnotacje).

image

Możesz także zaznaczyć wszystkie pola bez adnotacji i przeciągnąć je na pierwsze pole i wybrać opcję z menu kontekstowego. Dzięki temu zostały utworzone nowe operacje dla pozostałych pól, posługujące się identycznym wyrażeniem.

image

Wybierz Ctrl+Spacja aby wyświetlić dostępne drzewa danych w edytorze. Poza tym drzewa te dostępne są też jako poszczególne zakładki w sekcji z danymi. W zależności od tego czy okno edytora wyrażeń otwarte jest w kontekście pakietów przetwarzania czy mapowań inicjalnych na formularzu dostępne są różne drzewa danych.

image

Poniżej okno edytora wyrażeń otwartego w kontekście pracy z pakietami przetwarzania. Tutaj dostępne będą drzewa danych charakterystyczne dla pakietów przetwarzania jak: ARG, PKG czy PART

image

Składnia​

Fragmenty programowania w przetwarzaniu danych na platformie archITekt są używane w kontekście wyrażeń, tzn. ich zadaniem jest zwrócenie wartości. W treści można posługiwać się następującymi elementami:

Stałymi – prostymi np. 1, 3.1415, „abcdef”

  1. Stałe logiczne: true, false

  2. Stałymi listami, np. {„a”, „b”, „cde”} – przydatne do naturalnej notacji postaci:

    czy Abc in {„a”, „b”, „c”}

  3. Stałe typu data lub guid nie występują – należy posłużyć się funkcjami tworzącymi elementy tych typów: np.

    Date(y, m, d), Guid(„1234-…”)

  4. Stała null, oznaczająca brak wartości.

image

Odnośnikami do danych (opisane wyżej), np. abc, [Pole 1], ..\..\[Rekord x]\Pole

image

Funkcjami - zapisywanymi postaci f(arg1, arg2, argN)

  1. Funkcjami skalarnymi (operującymi na prostych wartościach),
  2. Funkcjami agregującymi

W poniższym przykładzie została wykorzystana funkcja Length() dla pola Nowe pole 4, w wyniku której zwrócona zostanie długość napisu, który będzie w tym polu. Więcej o funkcjach patrz: Funkcje.

image

Operatorami (wymienione w kolejności od najsilniej do najsłabiej wiążących):

  1. ??? – silny operator zastępowania wartości pustej

    np. a ??? 0 + b ??? 1 – zwróci sumę a i b, gdzie domyślnymi wartościami (w razie braku wartości) będą kolejno 0 i 1. Przykład można też zapisać przy użyciu nawiasów i słabego operatora zastępowania wartości pustej:

    (a ?? 0) + (b ?? 1) – co przy większych wyrażeniach jest problematyczne.

  2. Negacja liczbowa - i logiczna !

  3. Różne addytywne:

  • Arytmetyczne + -

  • Operatory napisowe:

    + (sklejanie napisów),

    == (równość co do znaku),

    - (usuwanie wystąpień prawego napisu z lewego),

    / (obcinanie prawego z początku i końca lewego – ang. Trim),

  • Operator dodający dni: +

    np. Date(2010, 01, 01) + 31 == Date(2010, 02, 01)

W poniższym przykładzie w polu Nowe pole 4 zwrócona zostanie suma pól Nowe pole 2 i Nowe pole 5.

image

  1. Multiplikatywne:
  • Arytmetyczne: * / % (lo)
  • * - zwielokrotnianie napisu, np.: „abc” * 4 = „abcabcabcabc”
  1. Sprawdzenia:
  • >, >=, <, <=, ==, != (nierówność),

  • Operator is_empty – sprawdza czy wyrażenie po lewej nie ma wartości; występują też funkcje IsNotNull() i IsNull o analogicznym działaniu.

  • Operator listowy in – czy element po lewej zawiera się w liście po prawej (oraz wariant napisowy ignorujący wielkość liter: in_CI)

    „a” in { „a”, „b”, „c”} – oczywiście zwróci true,

    po prawej może też wystąpić odwołanie do danych, które zostanie „spłaszczone” do listy, np. "02" in Klienci\typKlienta – czy którykolwiek klient jest typu „02”.

  • Zaawansowane operatory napisowe:

    Contains, ContainsCI – czy prawa strona występuje w lewej (z wariantem ignorującym wielkości liter),

    StartsWith, StartsWithIC – czy lewa strona rozpoczyna się prawą,

    EndsWith, EndsWithIC – j.w. dotyczy końcówek lewego napisu,

    LikeRgx, LikeRgxCI - czy lewa strona pasuje do wyrażenia regularnego po prawej,

    Like - działa jak w SQL – znaczki wieloznaczne to ? (dowolny znak) i % (dowolny ciąg),

  1. Logika: &&, |

image

  1. Operator ternarny ?

    np. a ? b : c - Jeżeli zajdzie a to zwróć b, w przeciwnym wypadku zwróć c. W razie większej ilości sprawdzeń, należy się posłużyć nawiasami np. a ? ( b ? c : d ) : e

  2. Słaby operator zastępowania wartości pustej: ??

W poniższym przykładzie zastosowano wyrażenie do wyświetlania tekstu dla kontrolki Etykieta:

IsNullOrEmpty(KlientId)?Klient\Imie+" "+Klient\Nazwisko:"Klienta nie wybrano"

W wyrażeniu zastosowano operator ternarny gdzie, sprawdzane jest czy wartość w polu KlientId jest null lub pusta: IsNullOrEmpty(KlientId)?, jeżeli tak, to zwróć pierwszy element "Klienta nie wybrano", czyli dane z pól: Klient\Imie+" "+Klient\Nazwisko, w przeciwnym wypadku, zwróć drugi element czyli dane z pól: Klient\Imie+" "+Klient\Nazwisko

image

Możesz także zastosować zaprzeczenie całego wyrażenia wówczas zmień kolejność argumentów w funkcji. Efekt będzie ten sam. W poniższym przykładzie zastosowano wyrażenie:

!IsNullOrEmpty(KlientId)?"Klienta nie wybrano":Klient\Imie+" "+Klient\Nazwisko

co oznacza: Jeżeli KlientId nie jest puste lub nie jest NULL, to zwróć Imię i Nazwisko, w przeciwnym razie zwróć tekst Klienta nie wybrano.

image

Operacje bitowe – nie występują (można doimplementować w razie potrzeby),

Stosowane nawiasy w wyrażeniach:

  1. Okrągłe ( ) – grupowanie wiązania i lista argumentów funkcji,
  2. Kwadratowe [ ] – nietypowe nazwy w ścieżkach, poniżej w nazwie rekordu New record znajduje się spacja, stąd automatycznie dodawany jest nawias kwadratowy do ścieżki.

image

  1. Klamrowe { } – użycie tych nawiasów tworzy listę stałych. Przykładowo w takim zapisie w wyrażeniu: { "A", "B" } - tworzona jest lista o długości 2, wypełniona stałymi "A" i "B".

Przykładowo dla funkcji konkatenacji concat( ), która skleja napisy, parametrem funkcji jest lista elementów (napisów do sklejenia z pól: Nowe pole 3 i Nowe pole) oraz separator ("-"). Jeżeli funkcja przyjmuje argument jako listę, wówczas niezbędne jest użycie nawiasów { } Więcej o funkcjach patrz: Funkcje.

image

Funkcje​

Dostęp do wbudowanych funkcji możliwy jest z kilku poziomów.

  1. Po przejściu do szczegółowego edytora wyrażeń, poprzez dodanie adnotacji Wyrażenie do pola, a następnie przycisk image przy polu. Funkcje dostępne są w oknie edytora bez potrzeby przechodzenia do podpowiadania składni, gdzie również są dostępne.

image

  1. Na panelu Szczegóły lub w oknie edytora wyrażeń zaawansowanym po wybraniu opcji Ctrl+Spacja, gdzie zostanie wyświetlone okno podpowiadania składni wraz z dostępnymi funkcjami.

image

Istnieje kilkaset wbudowanych różnych funkcji. Najpopularniejsze funkcje są dostępne w postaci operatorów:

  1. arytmetycznych

    (1 / 3 * 5 + 2) % 7

  2. logicznych

    true || false
    false && true
    ! [i know everything]
  3. operacji na zbiorach

    Status in {"Some", "good", "statuses"}
    && Status not in {"Other", "bad", "ones"}
  4. dopasowywania napisów

    everyone Like "?Me?"
    ||
    everyone NOT LikeRgx "regular expressions.*""

image

Pozostałe funkcje wywołujemy w tradycyjny sposób – przez nazwę, z argumentami pozycyjnymi umieszczanymi w nawiasach. Niektóre funkcje są dostępne tylko w niektórych kontekstach, jak np. w pakietach masowego przetwarzania danych, czy w formularzach www i wówczas wyglądają jak wywołania metod obiektów, czyli po kropce w nazwie.

namedObject.f(x, y, z)

Więcej informacji patrz: Składnia oraz Funkcje - rodzaje i ich budowa

Operator ternarny​

Jednym z popularniejszych operatorów jest operator ternarny, warunkowy, złożony z pytajnika i dwukropka, można powiedzieć że pożyczony z popularnych języków programowania. Działa jak operacja IF lub JEŻELI w Excelu.

Zwraca swój drugi lub trzeci element w zależności od wartości logicznej elementu pierwszego.

a > b
? "a is greater"
: "b is greater (or equal)"

Można sobie taki operator składać w dłuższe łańcuszki. Jednakże zwykle zamiast takiego łańcucha warunkowego lepiej użyć innych konstrukcji, łatwiejszych potem w rozbudowie i utrzymaniu, a mianowicie sterowanych danymi konfiguracyjnymi słowników czy tabel decyzyjnych.

Balance > Limit ? "Alrighty"
: Balance > 0 ? "Still above"
: "the sad default"

Więcej o rodzajach funkcji i ich budowie patrz: Funkcje - rodzaje i budowa.

Funkcje słownikowe​

Co rozumiemy jako słownik? Można powiedzieć, że to taki podręczny, samo indeksujący się podgląd czy dołączenie danych z wolno zmiennego wymiaru, slowly changing dimension, takiego jak np. lista departamentów, krajów, użytkowników itd. Każdy element słownikowy ma swój unikalny numer Id. Do pobierania wartości elementów słownikowych lub ich opisów możemy wykorzystać adnotację Słownik patrz: Słownik. Można też wykorzystać wbudowane funkcje do pobierania elementów słownikowych jak: DicItemName() oraz DicItemDescription() w edytorze wyrażeń po wcześniejszym dodaniu adnotacji Wyrażenie.

image

W środku funkcji należy wskazać jakiego elementu słownikowego (Id elementu) chcemy pobrać nazwę lub opis.

image

Taki sam efekt możemy uzyskać jeżeli pobierzemy nazwę elementu słownikowego bezpośrednio z kategorii słownikowej ze schematu danych.

image

Gramatyka​

Brak wartości i wartość nieznana​

Najważniejsza rzecz – jak obsługujemy nulle, czyli brak wartości czy też wartości nieznane. Mechanizm wyrażeń śledzi wymagalność każdego pola, rekordu i ścieżki i w razie czego zmusza projektanta do podjęcia decyzji jak z brakiem wartości w danym miejscu postąpić, uniemożliwiając pozostawienie pewnych pytań otwartych do momentu wykonania.

  1. Po pierwsze – nie da się wywołać funkcji nie przyjmującej wartości null z wartością null. Mechanizm wyrażeń w razie czego ominie takie wywołanie i przekaże wartość pustą dalej. Niektóre funkcje akceptują nulle i traktują je jako, powiedzmy, rozsądne wartości domyślne, ale w ogólności należy o brakach wartości myśleć tak jak w bazodanowym języku SQL.

  2. Po drugie – operatory zastępowania braku wartości jakimś konkretem. Mamy tu dwie postaci takiego operatora – znany z popularnych języków programowania podwójny pytajnik, a także jego ulepszoną wersję trójpytajnikową. W przykładzie poniżej jeśli wartość nullable_number nie ma wartości, to w wyniku dostaniemy zero.

    nullable_number ?? 0

  3. W przykładzie poniżej w tak zdefiniowanym wyrażeniu, jeżeli przyjmiemy, że obydwie zmienne będą miały wartość 1, wydawać by się mogło, że wynik powinien być 2. Niestety nie, gdyż nie możemy tego obsłużyć zwykłym operatorem dwupytajnikowym.

    nullable_number ?? 0 + another_nullable_number ?? 0

  4. Tu mamy to samo wyrażenie z dopisanymi nawiasami ilustrującymi kolejność operacji. Gdy pierwsza liczba ma wartość niepustą, np. 1, druga część w ogóle nie jest liczona i wynikiem całości jest jeden, a nie dwa.

    nullable_number ?? (0 + (another_nullable_number ?? 0) )

  5. W związku z tym należy operator trochę wzmocnić, aby był bardziej przywiązany do wartości po lewej. Tak właśnie działa operator potrójnego pytajnika. Niżej jest też jego równoważnik z nawiasami, które jak widać nie są potrzebne. Wynikiem dodawania dwóch jedynek będzie w tym przypadku dwójka.

nullable_number ??? 0 + another_nullable_number ??? 0
(nullable_number ??? 0) + (another_nullable_number ??? 0)
wskazówka

Posługując się wartościami, które mogłyby być puste warto sobie dokładnie zdawać sprawę, jak one współpracują czy też przechodzą przez operatory logiczne, czy różne inne. Więcej informacji patrz: Brak wartości i specjalne wartości puste.

Wartość pusta​

Wartość pusta nie występuje dla wszystkich typów, ale bardzo często przewija się w praktyce. Możliwe wartości puste to:

  1. Pusty napis
  2. Pusta lista
  3. Pusty strumień binarny, np. plik
  4. Pusty GUID.

Jeśli chodzi o listy to nie ma nulli na listach. Ścieżki prowadzące przez niewymagalne w danym momencie nieistniejące rekordy, czy też prowadzące do pustych pól na listach, rozwiążą się do wartości do list pozbawionych nulli.

Właściwości operacji Wyrażenie​

Po zaznaczeniu danej operacji na drzewie operacji na panelu Właściwości dostępne są poszczególne właściwości, które możesz dodatkowo ustawić dla danej operacji.

CreateMissingField - Po ustawieniu ta operacja doda brakujące pole z typem wywnioskowanym na podstawie wartości.

TryGuesMissingType - Po ustawieniu brakujący typ pola zostanie uzupełniony (np. 123 jako liczbowy, „true” jako bool itp.), w przeciwnym razie będzie to zwykły ciąg znaków.

Właściwość AllowSetStatement pozwala funkcji działać jak mały program, który lepiej rozumie, jak dane pola wpływają na siebie nawzajem.

image

Po jej włączeniu, system podczas obliczania wartości jednego pola (np. b) automatycznie najpierw obliczy inne pole, od którego to pole zależy (np. a), zapisze jego wartość, a dopiero potem poprawnie obliczy i zwróci wartość pola b.

image

Zobacz również​

Zmienne lokalne

Zapytania do list

Tworzenie rekordu in-line