Przykładowe obliczenia w oknie

Ta sekcja zawiera kilka przykładów obliczeń w oknie z wyjaśnieniem ich działania. Na początku przedstawiona jest rozszerzona wersja sformułowania wymagania oraz odpowiadający mu szablon obliczenia z symbolami zastępczymi. Użycie go może ułatwić pisanie podstawowych obliczeń.

Kiedy pole POLE_WYZWALAJĄCE obiektu OBIEKT_WYZWALAJĄCY jest ustawione na wartość WARTOŚĆ, chcę zmienić właściwość (PROPERTY) atrybutu CEL na wartość true/false.

Temu sformułowaniu wymagania odpowiada następujące obliczenie:

Copy
import System
static def GetAttributeValue(Incident):
    PropertyState = false
    if OBIEKT_WYZWALAJĄCY.POLE_WYZWALAJĄCE != null and OBIEKT_WYZWALAJĄCY.POLE_WYZWALAJĄCE._Title == 'WARTOŚĆ':
        PropertyState = true
    return String.Format(":SetPROPERTY(CEL, {0});", PropertyState)

Po zastąpieniu w obliczeniu symboli zastępczych ze sformułowania wymagania oraz dodaniu pola POLE_WYZWALAJĄCE do panelu Zależności w edytorze obliczeń dostępne będzie wymagane obliczenie. Zaleca się również zastąpienie wszystkich odwołań do zmiennej „PropertyState” nazwą, która lepiej oddaje przeznaczenie tej zmiennej.

W pozostałej części tej sekcji omówione są przykłady oparte na tym obliczeniu i wyjaśniona jest logika ich działania. W dalszych przykładach obliczenie to jest stopniowo coraz bardziej rozszerzane.

Wcięcia w tych obliczeniach są bardzo istotne i określają zasięg funkcji. Dlatego kopiując przykłady z tego dokumentu, należy pamiętać o zachowaniu właściwych wcięć po ich wklejeniu do edytora obliczeń.

Korzystanie z instrukcji if do resetowania wartości

Poniższy przykład stanowi rozszerzenie przykładu przedstawionego w sekcji Konfigurowanie obliczeń w oknach. Pole Wpływ jest ustawione jako nieobowiązkowe i staje się polem obowiązkowym tylko wtedy, gdy pole Pilność jest ustawione na wartość Pilne. Jeśli to pole zostaje skasowane (ustawione na wartość null) lub ustawione na inną wartość, pole Wpływ zostaje ponownie ustawione jako nieobowiązkowe.

Sformułowanie tego wymagania jest następujące:

Kiedy pole Pilność jest ustawione na wartość Pilne, chcę zmienić właściwość SetMandatory atrybutu Wpływ na wartość true.

Wynika stąd, że polem wyzwalającym jest Pilność, atrybutem docelowym jest Wpływ, a funkcją okna jest :SetMandatory(,).

Dobra struktura obliczenia w oknie charakteryzuje się następującymi cechami:

  • Na początku zadeklarowana jest zmienna określająca zwykle wartość true lub false dla funkcji okna.
  • Dalej znajduje się instrukcja zmieniająca wartość zmiennej, gdy wybrane są odpowiednie wartości.
  • Na końcu zwracana jest funkcja okna z użyciem zmiennej w celu ustawienia parametru true/false.

Na przykład:

Copy
import System
static def GetAttributeValue(Incident):
    MandatoryUrgency = false
    if Incident._IncidentUrgency != null and Incident._IncidentUrgency._Title == 'Pilne':
        MandatoryUrgency = true
return String.Format(":SetMandatory(_Impact, {0});", MandatoryUrgency)

Trzeci, czwarty i ostatni wiersz rozpoczynają się pojedynczym wcięciem, a wiersz piąty — podwójnym.

W trzecim wierszu tworzona jest zmienna o nazwie MandatoryUrgency, a jej wartość zostaje ustawiona na false. Jest to najczęściej występująca, domyślna wartość obliczenia.

W czwartym wierszu następuje sprawdzenie, czy pole Pilność jest ustawione na wartość Pilne (Incident._PilnoscIncydentu._Tytul == 'Pilne'). Należy zwrócić uwagę, że zanim w obliczeniu można będzie sprawdzić wartość atrybutu Incident._PilnoscIncydentu._Tytul, język stosowany w obliczeniu wymaga sprawdzenia, czy obiekt atrybutu nie ma wartości null (Incident._PilnoscIncydentu != null).

Jeśli warunek występujący w czwartym wierszu jest spełniony (wartość true), czyli Pilność nie jest równa null i jest ustawiona na wartość Pilne, wykonany zostaje wiersz piąty, w którym zmiennej MandatoryUrgency zostaje nadana wartość true.

Na końcu zostaje wykonany wiersz szósty, w którym ustawiana jest wartość atrybutu obliczenia. Ze względu na stosowanie odwołania do zmiennej język, w którym pisane jest obliczenie, wymaga wygenerowania zwracanego ciągu znaków za pomocą funkcji String.Format. Ma to postać wywołania String.Format("funkcja(atrybut, {0});", zmienna), w którym podczas generowania ciągu znaków parametr {0} zostaje zastąpiony zmienną, dając w rezultacie :SetMandatory(_Wplyw,MandatoryUrgency);. Domyślnie zmienna MandatoryUrgency ma wartość false, co oznacza, że pole Wpływ nie jest obowiązkowe. Jeśli jednak pole Pilność jest ustawione na wartość Pilne, warunki określone w czwartym wierszu są spełnione i wykonany zostaje wiersz piąty. Powoduje to ustawienie zmiennej MandatoryUrgency na wartość true, przez co pole Wpływ staje się obowiązkowe.

Należy zwrócić uwagę, że w wierszach trzecim i piątym używany jest pojedynczy znak równości =, a w wierszu czwartym —dwa znaki równości==.
Symbol = oznacza „ustaw to jako równe”, a symbol == oznacza „czy to jest równe?”

Aktualizowanie dwóch pól z użyciem jednego obliczenia

W następnym przykładzie zaprezentowano aktualizację dwóch pól za pomocą pojedynczego obliczenia, podobnego do przedstawionego w poprzednim przykładzie. W tym przykładzie pola Element konfiguracji i Typ elementu konfiguracji są wyświetlane tylko wtedy, gdy pole Kategoria jest ustawione na wartość Sprzęt.

Sformułowanie tego wymagania jest następujące:

Kiedy pole Kategoria jest ustawione na wartość Sprzęt, chcę zmienić właściwość SetHidden atrybutu Element konfiguracji ORAZ Typ elementu konfiguracji na wartość false.

Wynika stąd, że polem wyzwalającym jest Kategoria, atrybutami docelowymi są Element konfiguracji ORAZ Typ elementu konfiguracji, a funkcją okna jest :SetHidden(,).

Copy
import System
static def GetAttributeValue(Incident):    HideCI = true
    if Incident.Category != null and Incident.Category.FullName == 'Sprzęt':
        HideCI = false
    return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI)

Trzeci, czwarty i szósty wiersz rozpoczynają się pojedynczym wcięciem, a wiersz piąty — podwójnym. Długi szósty wiersz jest wyświetlany jako wiersz pojedynczy w edytorze obliczeń.

W trzecim wierszu zmienna HideCI jest ustawiana na wartość true.

W wierszu czwartym występuje sprawdzenie, czy wartością pola Category nie jest null i czy wartość jest ustawiona na Sprzęt.

Jeśli warunek zapisany w wierszu czwartym jest spełniony (wartość true), zostaje wykonany wiersz piąty i zmienna HideCI przyjmuje wartość false.

Na końcu wykonywany jest wiersz szósty, w którym wartość atrybutu obliczenia zostaje ustawiona na String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI). Domyślnie wartością zmiennej HideCI jest true, co oznacza, że pola ConfigurationItemType i ConfigurationItem ukryte. Jeśli jednak pole Category jest ustawione na wartość Sprzęt, warunki określone w czwartym wierszu są spełnione i wykonany zostaje wiersz piąty. Spowoduje to, że zmienna HideCI zostaje ustawiona na wartość false, dzięki czemu pola ConfigurationItemType i ConfigurationItem stają się widoczne.

Jeśli funkcja String.Format jest używana do zwracania więcej niż jednej funkcji korzystającej ze zmiennych, należy odwoływać się do zmiennych w funkcji za pomocą numerów umieszczonych w nawiasach klamrowych, a następnie dodać te zmienne w odpowiedniej kolejności. Na przykład:

String.Format("funkcja(atrybut, {0});funkcja(atrybut, {1});funkcja(atrybut, {2});", zmienna0, zmienna1, zmienna2)

Funkcja :SetHidden powoduje również wyświetlenie lub ukrycie etykiety powiązanej z atrybutem docelowym. Nie można jednak używać funkcji :SetHidden w przypadku etykiet statycznych dodawanych z drzewa Formanty w Menedżerze okien.

Użycie różnych funkcji z jednym wyzwalaczem

W poprzednich przykładach zwracana była zawsze jedna funkcja okna: albo zmieniając stan obowiązkowości jednego lub większej liczby pól, albo zmieniając stan ukrycia. W tym przykładzie zaprezentowano sposób aktualizowania dwóch różnych funkcji przy użyciu jednego obliczenia. Ten przykład stanowi rozszerzenie poprzedniego. Pola Element konfiguracji i Typ elementu konfiguracji zostają wyświetlone, jeśli pole Kategoria jest ustawione na wartość Sprzęt, ale dodatkowo pole Typ elementu konfiguracji zostaje ustawione jako pole obowiązkowe.

Sformułowanie tego wymagania jest następujące:

Kiedy pole Kategoria jest ustawione na wartość Sprzęt, chcę zmienić właściwość SetHidden atrybutów Element konfiguracji ORAZ Typ elementu konfiguracji na wartość false ORAZ zmienić właściwość SetMandatory atrybutu Typ elementu konfiguracji na wartość true.

Wynika stąd, że polem wyzwalającym jest Kategoria, atrybutami docelowymi są Element konfiguracji ORAZ Typ elementu konfiguracji, a funkcjami okna są :SetHidden(,) i SetMandatory(,).

Copy
import System
static def GetAttributeValue(Incident):
    HideCI = true
    MandatoryCI = false
    if Incident.Category != null and Incident.Category.FullName == 'Sprzęt':
        HideCI = false
        MandatoryCI = true
    return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});:SetMandatory(ConfigurationItemType,{2});", HideCI, HideCI, MandatoryCI)

Trzeci, czwarty, piąty i ósmy wiersz rozpoczynają się pojedynczym wcięciem, a wiersze szósty i siódmy — podwójnym. Długi ósmy wiersz jest wyświetlany jako wiersz pojedynczy w edytorze obliczeń.

W wierszu trzecim zmienna HideCI zostaje ustawiona na wartość true — domyślnie pola Element konfiguracji i Typ elementu konfiguracji mają być ukryte.

W wierszu czwartym zmienna MandatoryCI zostaje ustawiona na wartość false — domyślnie pole Typ elementu konfiguracji ma być nieobowiązkowe.

Jeśli warunki określone w wierszu piątym są spełnione (wartość true), zostają wykonane wiersze szósty i siódmy, powodując ustawienie zmiennej HideCI na wartość false i zmiennej MandatoryCI na wartość true. Wykonywane są obydwa te wiersze, ponieważ mają w obliczeniu takie samo wcięcie.

Na końcu zostaje wykonany wiersz ósmy, w którym wartość zmiennej HideCI przekazywana jest do pierwszych dwóch funkcji, a wartość zmiennej MandatoryCI — do trzeciej funkcji.

Ponieważ do pierwszych dwóch funkcji przekazywana jest ta sama zmienna, ósmy wiersz można zapisać w następujący sposób:
return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{0});:SetMandatory(ConfigurationItemType,{1});", HideCI, MandatoryCI)

Stosowanie różnych funkcji w oparciu o wartości jednego wyzwalacza

W tym przykładzie zaprezentowano sposób użycia różnych funkcji w zależności od wybranej wartości atrybutu wyzwalającego. Jeśli pole Priorytet jest ustawione na wartość Wysoka, pole Przyczyna zostaje ustawione jako obowiązkowe i możliwe do edycji, a jeśli pole Priorytet jest ustawione na wartość Niska, pole Przyczyna zostaje ustawione jako nieobowiązkowe i dostępne tylko do odczytu. W innym razie pole Przyczyna pozostaje w swoim stanie domyślnym.

W tym obliczeniu potrzebny jest atrybut o właściwości Nazwa ustawionej na wartość _przyczyna dodany do obiektu Incydent.

Sformułowanie tego wymagania jest następujące:

Kiedy pole Priorytet jest ustawione na wartość Wysoka, chcę zmienić właściwość SetMandatory atrybutu Przyczyna na wartość true ORAZ pozostawić właściwość SetReadOnly atrybutu Przyczyna równą false, natomiast kiedy pole Priorytet jest ustawione na wartość Niska, chcę zmienić właściwość SetReadOnly atrybutu Przyczyna na wartość true ORAZ pozostawić właściwość SetMandatory atrybutu of Przyczyna równą false.

Wynika stąd, że polem wyzwalającym jest Priorytet, atrybutem docelowym jest Przyczyna, a funkcjami okna są :SetMandatory(,) i SetReadOnly(,).. Można również napisać:

We wszystkich innych przypadkach chcę, aby zarówno właściwość SetMandatory, jak i SetReadOnly atrybutu Przyczyna były równe false.

Wynika stąd, że wartością domyślną obydwu właściwości SetMandatory i SetReadOnly atrybutu Przyczyna jest false.

Copy
import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    ReadOnlyReason = false
    if Incident.Priority != null and Incident.Priority.Title == 'Wysoka':
        MandatoryReason = true
    elif Incident.Priority != null and Incident.Priority.Title == 'Niska':
        ReadOnlyReason = true
    return String.Format(":SetMandatory(_reason, {0});:SetReadOnly(_reason, {1});", MandatoryReason, ReadOnlyReason)

Trzeci, czwarty, piąty, siódmy i dziewiąty wiersz rozpoczynają się pojedynczym wcięciem, a wiersze szósty i ósmy — podwójnym. Długi dziewiąty wiersz jest wyświetlany jako wiersz pojedynczy w edytorze obliczeń.

W wierszu trzecim zmienna MandatoryReason zostaje ustawiona na wartość false — domyślnie pole Przyczyna ma być nieobowiązkowe.

W wierszu czwartym zmienna ReadOnlyReason zostaje ustawiona na wartość false — domyślnie pole Przyczyna ma być dostępne tylko do odczytu.

Jeśli warunki określone w wierszu piątym są spełnione (wartość true), a pole Priorytet jest ustawione na wartość Wysoka, zostaje wykonany wiersz szósty, powodując ustawienie zmiennej MandatoryReason na wartość true.

Jeśli warunki określone w wierszu piątym NIE są spełnione, zostaje wykonany wiersz siódmy. Wiersze elif („else if”) są wykonywane tylko wtedy, gdy warunek określony w wierszu poprzedzającym nie jest spełniony (wartość false). Jeśli warunki określone w tym wierszu są spełnione (wartość true), a pole Priorytet jest ustawione na wartość Niska, zostaje wykonany wiersz ósmy, powodując ustawienie zmiennej ReadOnlyReason na wartość true.

Na końcu zostaje wykonany wiersz dziewiąty, w którym użyte zostają zmienne MandatoryReason i ReadOnlyReason.

Oznacza to, że domyślnie zmienne MandatoryReason i ReadOnlyReason mają wartość false, przez co pole Przyczyna nie jest ani obowiązkowe, ani dostępne tylko do odczytu. Jeśli jednak pole Priorytet jest ustawione na wartość Wysoka, to zmienna MandatoryReason przyjmuje wartość true (piąty i szósty wiersz), ale zmienna ReadOnlyReason ma wciąż wartość false, dlatego pole Przyczyna jest obowiązkowe, ale nie jest dostępne tylko do odczytu. Jeśli pole Priorytet jest ustawione na wartość Niska, to zmienna ReadOnlyReason przyjmuje wartość true (siódmy i ósmy wiersz), ale zmienna MandatoryReason ma wartość false, dlatego pole Przyczyna jest dostępne tylko do odczytu, ale nie jest obowiązkowe.

Użycie dat w obliczeniach

W tym przykładzie pole Przyczyna zostaje ustawione jako obowiązkowe, jeśli data wybrana w polu Wymagana data jest oddalona od daty bieżącej o nie więcej niż siedem dni.

W tym obliczeniu potrzebne są atrybuty o właściwościach Nazwa ustawionych na wartości _przyczyna oraz _wymaganadata dodane do obiektu Incydent. Należy pamiętać, aby nie aktualizować tego samego pola z użyciem różnych obliczeń.

Sformułowanie tego wymagania jest następujące:

Kiedy pole Wymagana data jest oddalona od daty dzisiejszej o nie więcej niż 7 dni, chcę zmienić właściwość SetMandatory atrybutu Przyczyna na wartość true.

Wynika stąd, że polem wyzwalającym jest Wymagana data, atrybutem docelowym jest Przyczyna, a funkcją okna jest :SetMandatory(,).

Copy

import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    if Incident._daterequired != null and Incident._daterequired < DateTime.Today.AddDays(7):
        MandatoryReason = true
    return String.Format(":SetMandatory(_reason,{0});", MandatoryReason)

Trzeci, czwarty i ostatni wiersz rozpoczynają się pojedynczym wcięciem, a wiersz piąty — podwójnym.

W wierszu trzecim tworzona jest zmienna o nazwie MandatoryReason i zostaje ustawiona na wartość false — domyślnie pole Przyczyna ma być nieobowiązkowe.

W wierszu czwartym używana jest metoda platformy .Net o nazwie .AddDays w celu określenia, czy wartość Wymagana data jest mniejsza od daty o 7 dni późniejszej od dzisiejszej. Jeśli tak jest, zostaje wykonany wiersz piąty i zmienna MandatoryReason przyjmuje wartość true.

W wierszu szóstym zostaje wygenerowana odpowiednia funkcja SetMandatory.

Więcej informacji na temat korzystania z funkcji platformy .Net w obliczeniach można znaleźć na stronie internetowej społeczności użytkowników pakietu Ivanti.