Więcej przykładów obliczeń

Ta sekcja zawiera więcej przykładów obliczeń. W tych przykładach obiekt, na którym wykonywane jest obliczenie, jest reprezentowanym przez obiekt dataObject. Otwierając edytor wzorów, należy pamiętać o pozostawieniu bez zmian dwóch pierwszych wierszy obliczenia.

Copy
import System
static def GetAttributeValue(dataObject):

W wielu z tych przykładów używane są atrybuty, których nie ma w bazie danych. Aby móc korzystać z tych przykładów, należy albo utworzyć wymagane atrybuty albo zmienić przykłady, stosując atrybuty dostępne w bazie danych.

Porównywanie bieżącego użytkownika z użytkownikiem zgłaszającym

Copy
import System
static def GetAttributeValue(Incident):
    if Incident.RaiseUser == null:
        return 'Użytkownik zgłaszający ma wartość null'
    if Incident.GetCurrentUserName().ToLower() == Incident.RaiseUser.Name.ToLower():
        return 'Zgłoszone przez bieżącego użytkownika'
    return 'Bieżący użytkownik=' + Incident.GetCurrentUserName() + ' Użytkownik zgłaszający=' + Incident.RaiseUser.Name

Pierwsza instrukcja if sprawdza, czy Użytkownik zgłaszający związany z incydentem ma wartość null, i zwraca komunikat Użytkownik zgłaszający ma wartość null, jeśli jest to prawda.

Jeśli warunek określony w tej instrukcji if nie jest spełniony, zostaje wykonana druga instrukcja if, sprawdzająca, czy bieżący użytkownik jest taki sam, jak użytkownik zgłaszający. Jeśli tak jest, zwracany jest komunikat Zgłoszone przez bieżącego użytkownika.

Funkcja .ToLower() jest stosowana w tym wierszu, aby zapobiec problemom związanym z różną wielkością liter. W wyniku jej działania oba ciągi składają się wyłącznie z małych liter.

Jeśli żadna z powyższych instrukcji if nie jest spełniona, wykonywany jest ostatni wiersz, który zwraca osobne wartości Bieżący użytkownik i Użytkownik zgłaszający.

Obliczanie wieku użytkownika

Copy
age = DateTime.Now.Year - dataObject.DateOfBirth.Year
age-- if DateTime.Now.Month < dataObject.DateOfBirth.Month or (DateTime.Now.Month == dataObject.DateOfBirth.Month and DateTime.Now.Day < dataObject.DateOfBirth.Day)
return age

W tym obliczeniu występuje zmienna o nazwie age, której wartość jest określana przez odjęcie daty urodzenia użytkownika od roku bieżącego. Dodatkowy rok jest odejmowany, jeśli użytkownik nie miał jeszcze urodzin w bieżącym roku (jeśli bieżący miesiąc jest mniejszy od miesiąca urodzenia lub bieżący miesiąc jest równy miesiącowi urodzenia, ale bieżący dzień jest mniejszy od dnia urodzenia).
Instrukcja age-- oznacza „odejmij 1 od wartości zmiennej age”.
Pojedynczy operator = oznacza „ustaw to jako równe”, natomiast operator == (dwa symbole równości obok siebie) oznacza „to jest równe”.

Obliczanie długości czasu usługi użytkownika

Copy
end = DateTime.Now
end = dataObject.EndDate if dataObject.EndDate != nulllos = end.Year - dataObject.StartDate.Year
    los-- if end.Month < dataObject.StartDate.Month or (end.Month == dataObject.StartDate.Month and end.Day < dataObject.StartDate.Day)
return los

Zmienna end jest ustawiana na bieżącą datę lub na wartość w polu EndDate, jeśli zapis użytkownika ma określoną datę końcową (wartość w polu EndDate jest różna od null). Wartość zmiennej los jest obliczana przez odjęcie wartości StartDate od wartości zmiennej end. Jeśli data końcowa (EndDate) przypada w roku wcześniej niż data początkowa (StartDate), odejmowany jest dodatkowy rok.
Operator != oznacza „nie jest równe”.

Obliczanie ostatniej daty w kolekcji

W tym obliczeniu występuje kolekcja Zamówienia powiązana z obiektem dataObject i należy odnaleźć ostatnią datę zamówienia (OrderDate) wśród wszystkich elementów tej kolekcji. (Można użyć po prostu funkcji kolekcji środowiska Max(" "), ale w tym przykładzie prezentowane są pewne przydatne koncepcje).

Copy
lastOrderDate = null
for order in dataObject.Orders:
    if lastOrderDate == null or lastOrderDate < order.OrderDate:
        lastOrderDate = order.OrderDate
        return lastOrderDate

W pierwszym wierszu zmienna lastOrderDate jest ustawiana na wartość null. (Należy pamiętać, że pojedynczy operator = oznacza „ustaw to jako równe”, natomiast operator == oznacza „to jest równe”).
W drugim wierszu tworzona jest pętla przebiegająca kolekcję zamówień (Orders) związanych obiektem dataObject z użyciem zmiennej order. Część obliczenia zaczynająca się od wiersza zawierającego wcięcie jest wykonywana kolejno dla każdego obiektu należącego do kolekcji.
Należy zauważyć, że trzeci wiersz ma pojedyncze wcięcie, które wskazuje, że należy on do wiersza drugiego. Znaczenie trzeciego wiersza jest następujące: jeśli wartość zmiennej lastOrderDate jest równa null (ma to miejsce za pierwszym razem, ponieważ taka wartość zmiennej zostaje ustawiona w pierwszym wierszu) lub jest mniejsza od wartości OrderDate zapisanej w obiekcie, to...
w czwartym wierszu wartość zmiennej lastOrderDate zostaje ustawiona na wartość OrderDate bieżącego obiektu w kolekcji.
Następnie obliczenie wraca do trzeciego wiersza i dla kolejnego obiektu w kolekcji następuje sprawdzenie, czy bieżąca wartość zmiennej lastOrderDate jest równa null (tak już nie będzie) lub jest mniejsza od wartości OrderDate zapisanej w kolejnym obiekcie kolekcji. Jeśli wartość zmiennej jest mniejsza od wartości OrderDate danego obiektu, to zmiennej lastOrderDate zostaje przypisana ta nowa wartość.
Po zbadaniu wszystkich obiektów znajdujących się w kolekcji w ostatnim wierszu obliczenia zostaje zwrócona ustawiona wartość zmiennej lastOrderDate.

Sumowanie wyników obliczeń uzyskanych dla wszystkich obiektów w kolekcji

W poprzednich przykładach przedstawiono sposób wykonywania obliczeń arytmetycznych oraz wykonywania obliczeń w pętli dla wszystkich obiektów w kolekcji. W tym przykładzie obie te techniki zostaną połączone w celu zsumowania wyników obliczeń wykonanych na wszystkich obiektach w kolekcji.

Za pomocą tego obliczenia wyznaczony zostanie łączny koszt obiektów w kolekcji na podstawie kosztu jednostkowego elementu oraz liczby elementów zawartych w każdym obiekcie kolekcji. Koszt każdego obiektu w kolekcji jest zatem wynikiem mnożenia liczby elementów przez koszt jednostkowy elementu. Natomiast koszt łączny stanowi sumę kosztów wszystkich obiektów. Przebieg obliczenia polega na określeniu kosztu pierwszego obiektu, następnie dodaniu kosztu drugiego obiektu itd. dla wszystkich obiektów w kolekcji.

 

obiekt kolekcji

ilość

koszt jednostkowy

koszt

 

dataObject

Element 1

2

3

6

 

Element 2

1

4

4

 

Element 3

3

3

9

 

 

 

 

 

19

koszt łączny

Copy
koszt = 0
for item in dataObject.Items:
    koszt = koszt + (item.Quantity * item.UnitCost)
        return koszt

W pierwszym wierszu zmienna koszt jest ustawiana na wartość 0.
W drugim wierszu tworzona jest pętla przebiegająca kolekcję elementów (Items) związanych z obiektem dataObject z użyciem zmiennej item.
W trzecim wierszu (zaczynającym się od wcięcia) wartość zmiennej koszt jest ustawiana na sumę jej wartości bieżącej i wyniku mnożenia liczby elementów (wartość atrybutu Quantity) przez ich koszt jednostkowy (wartość atrybutu UnitCost). Trzeci wiersz jest powtarzany dla wszystkich obiektów w kolekcji — w każdym obiegu pętli do kosztu łącznego dodawany jest koszt nowego obiektu w kolekcji.
Po zbadaniu wszystkich obiektów znajdujących się w kolekcji w ostatnim wierszu obliczenia zostaje zwrócona ustawiona wartość zmiennej koszt.

Obliczenia na obliczeniach wykonanych na kolekcjach

To obliczenie stanowi rozszerzenie poprzedniego przykładu. Polega ono na wyliczeniu łącznej wartości kolekcji zamówień, z których każde składa się z pewnej liczby pozycji. W tym przykładzie kosztem jest suma dla kolekcji składających się z kolekcji.

 

obiekt kolekcji

obiekt kolekcji podrzędnej

ilość

koszt jednostkowy

koszt

 

zamówienie

ObiektDanych_1

Element 1_1

2

3

6

 

 

Element 1_2

1

4

4

 

 

Element 1_3

3

3

9

 

ObiektDanych_2

Element 2_1

2

4

8

 

 

Element 2_2

3

2

6

 

 

Element 2_3

4

1

4

 

 

 

 

 

 

37

koszt łączny

Copy
koszt = 0
    for order in dataObject.Orders:
        for item in order.Items:
            koszt = koszt + (item.UnitCost * item.Quantity)
        return koszt

W pierwszym wierszu zmienna koszt jest ustawiana na wartość 0.
W drugim wierszu (zaczynającym się od wcięcia) tworzona jest pętla przebiegająca kolekcję zamówień (Orders) związanych z obiektem dataObject z użyciem zmiennej order.
W trzecim wierszu (zaczynającym się od podwójnego wcięcia) tworzona jest pętla przebiegająca kolekcję pozycji (Items) związanych z określonym obiektem kolekcji dataObject.Orders z użyciem zmiennej item.
W czwartym wierszu (zaczynającym się od potrójnego wcięcia) wartość zmiennej koszt jest ustawiana na sumę jej wartości bieżącej i wyniku mnożenia liczby elementów (wartość atrybutu Quantity) przez ich koszt jednostkowy (wartość atrybutu UnitCost). Czwarty wiersz jest powtarzany dla wszystkich obiektów w kolekcji dataObject.Items — w każdym obiegu pętli do kosztu łącznego dodawany jest koszt nowego obiektu w kolekcji.
Po uwzględnieniu w obliczeniu wszystkich pozycji kolekcji podrzędnej pierwszego zamówienia następuje przejście do kolekcji podrzędnej pozycji drugiego zamówienia i czwarty wiersz zostaje powtórzony dla każdego obiektu kolekcji podrzędnej pozycji drugiego zamówienia.
Po zbadaniu wszystkich obiektów znajdujących się w kolekcji zamówień w ostatnim wierszu obliczenia zostaje zwrócona ustawiona wartość zmiennej koszt.

Generowanie tekstu zawierającego dane z bazy danych

Ten przykład ilustruje tworzenie ciągu tekstowego zawierającego dane pochodzące z bazy danych.

Copy
return String.Format("Witaj {0}. Użytkownikiem, który to ostatnio modyfikował, był użytkownik {1}", dataObject.RaiseUser.Title, dataObject.LastUpdateUser.Title)

Funkcja String.Format(" ", {0}, {1}, ...) zwraca ciąg, w którym parametry {0}, {1} itd. definiują, skąd należy pobrać dane zawarte w ciągu. Należy zwrócić uwagę, że numery parametrów zaczynają się od {0}. W tym przykładowym obliczeniu parametr {0} zostaje zastąpiony nazwą użytkownika zgłaszającego (dataObject.RaiseUser.Title), a parametr {1} — nazwą ostatniego użytkownika, który zaktualizował dany zapis (dataObject.LastUpdateUser.Title).
Jeśli na przykład incydent został zarejestrowany przez użytkownika Gill Bond, a ostatnim użytkownikiem, który go zapisał, był użytkownik Jane Green, ciąg będzie miał następującą postać: Witaj Gill Bond. Użytkownikiem, który to ostatnio modyfikował, był użytkownik Jane Green.