Obejście ograniczenia uruchamiania reguły cyklicznej tylko na jednym etapie
Ograniczenie uruchamiania reguły cyklicznej tylko na jednym etapie
Od wersji 220930.53 i 221231.12 (i każdej kolejnej) wyłączono wykonywanie reguł czasowych (godzinnych, dziennych, z własnym harmonogramem) bez ustawionego etapu początkowego. Innymi słowy, musi być ustawiony etap, na którym dana reguła cykliczna będzie uruchamiana.
Jeżeli etap nie zostanie wskazany, to projektant procesu otrzyma następujący komunikat:
W praktyce wdrożeniowej jednak zdarza się czasami potrzeba uruchomienia tego samego kodu (albo przynajmniej jakiegoś powtarzalnego fragmentu) na kilku etapach w ramach reguł cyklicznych. W kontekście powyższego ograniczenia projektant zmuszony byłby do stworzenia kilku reguł, uruchamianych na różnych etapach, i powieleniu kodu. To z czasem mogłoby doprowadzić do m.in. kłopotów z utrzymaniem właściwej wersji kodu reguł (zwłaszcza przy dużej ich ilości) – wystarczyłoby, że zapomniałby zaktualizować kod w jednej z reguł, a działanie procesu mogłoby zostać zaburzone.
Poniżej prezentujemy propozycję obejścia powyższego problemu poprzez zastosowanie tricku z wykorzystaniem reguły typu „funkcja” i … reguł cyklicznych.
Propozycja obejścia
Idea obejścia polega na tym, że fragment kodu reguły, który ma być uruchamiany cyklicznie na różnych etapach, zostanie wydzielony do odrębnej reguły typu „funkcja”. Następnie za pomocą funkcji reguł CallFunction() ten wydzielony kod będzie uruchamiany w regułach cyklicznych, np. godzinowych, które to reguły będą uruchamiane na różnych etapach.
Reguła typu „funkcja”
Na początek przedstawiamy konfigurację prostej reguły typu „funkcja”. Reguła ta przechowuje wspólny kod, który będzie wywoływany w dwóch różnych regułach cyklicznych godzinowych.
Jest to przykładowa reguła, której zadaniem jest wpisanie w logu systemowym tekstu informacyjnego o tym, z jakiej reguły godzinowej została ona uruchomiona. Oczywiście może ona zawierać bardziej skomplikowany kod. O czym zaznaczono w komentarzu w ostatniej linii.
Na początku sprawdzane jest czy zmienna iRuleIndex została zadeklarowana i ustawiona w regule godzinowej, w której będzie wołana reguła „f: to be run in some periodic rule”. Tej zmiennej zostanie przypisany indeks/numer reguły uruchamiającej funkcję.
Reguły cykliczne godzinowe
Na potrzeby tego przykładu w procesie zostały skonfigurowane dwie reguły godzinowe, uruchamiane na dwóch różnych etapach – „Etap 1” i „Etap 2”. Kod każdej z tych reguł troszeczkę różni się od siebie, ale częścią wspólną jest wywołanie reguły typu „funkcja” za pomocą CallFunction(). Poniższe obrazki przedstawiają konfiguracje reguł godzinowych.
W pierwszej linii każdej z reguł deklarowana i ustawiana jest zmienna iRuleIndex odpowiednim numerem reguły. Następnie, co już zostało wspomniane wcześniej, ta zmienna jest używana wewnątrz reguły „f: to be run in some periodic rule”.
Efekt uruchomienia reguł godzinowych
Na poniższym obrazku przedstawiamy efekt uruchomienia się dwóch reguł godzinowych z naszego przykładu.
Dane zapisane w logu systemowym potwierdzają uruchomienie tego samego, aczkolwiek sparametryzowanego numerem reguły godzinowej i nazwą etapu, kodu w dwóch różnych regułach godzinowych.