Reguła okresowa dla procesu
Ten specjalny typ reguły pozwala na wyselekcjonowanie zestawu spraw, na których mają być wykonane określone czynności i wykonanie tych czynności tylko i wyłącznie dla tych spraw. Powoduje to znacznie mniejsze obciążenie serwera i pozwala na obsługę spraw zamkniętych, których nie można już obsługiwać zwykłymi regułami okresowymi.
Podobnie jak reguła okresowa, tak i reguła okresowa dla procesu jest wywoływana w określonym czasie, ale jej konstrukcja i działanie jest inne.
Reguła okresowa dla procesu jest uruchamiana cyklicznie zgodnie z harmonogramem dla zadania RulePeriodicProcess (Ustawienia systemowe -> Zadania).
Działanie jej polega na wykonaniu czynności określonych w treści reguły tylko i wyłącznie dla wskazanych spraw. Reguła okresowa dla procesu musi składać się z dwóch części:
- Część pierwsza – wybór spraw do procesowania;
- Część druga – pętla wykonująca określone czynności dla wybranych spraw.
Konstrukcja reguły okresowej dla procesu:
_cases = FindCase("nazwa procesu","kryterium1","wartość1", itd) foreachcase(_cases) { // wykonaj to co tu jest napisane }
- W pierwszej kolejności używamy funkcji FindCase(), która pozwala na wyselekcjonowanie zestawu spraw, dla których chcemy wykonać jakieś akcje.
- Następnie wykonywana jest pętla o nazwie foreachcase(sprawy_do_uruchomienia){…}.
- W treści pętli foreachcase piszemy regułę tak, jakby była to ta konkretna sprawa, dla której mamy coś do wykonania. Czyli odwołujemy się bezpośrednio do pól formularza tej sprawy, używamy warunków if, czy funkcji jak np. SendMessageEx().
Taka konstrukcja sprawia, że:
- Platforma AMODIT wykonuje funkcję FindCase() jako zapytanie SQL i zwraca wyłącznie listę caseid znalezionych spraw. To działanie jest szybkie;
- W drugiej części wykonywane są polecenia (treść pętli foreachcase) w odniesieniu wyłącznie do znalezionych wcześniej spraw, co jest dużo szybsze niż wykonywanie reguł okresowych (godzinnych, dziennych lub okresowych wg własnego harmonogramu), które powodują przeglądanie wszystkich spraw, aby na każdej stwierdzić czy spełnia ona kryteria uruchomienia czy nie.
- Możliwa jest obsługa spraw zamkniętych. Proszę zwrócić uwagę na ustawienia opcji w funkcji FindCase().
Przykład praktyczny
Załóżmy, że chcemy wysyłać powiadomienia do opiekuna umowy, gdy dzisiaj jest dzień przypadający dokładnie 30 dni przed terminem zakończenia umowy.
W pierwszej części reguły, przed użyciem foreachcase możemy wykonywać pewne operacje, używać funkcji, pod warunkiem, że nie odnoszą się one do danych z formularza. Ograniczenie to wynika z tego, że przed pętlą foreachcase nie istnieje kontekst sprawy. Kontekst sprawy, a więc i dostęp do danych z formularza, pojawia się dopiero wtedy, gdy odnosimy się do konkretnej sprawy, a to dzieje się dopiero wewnątrz pętli foreachcase.
W poniższym przykładzie obliczamy dzień przypadający 30 dni przed dniem dzisiejszym. Następnie używamy w funkcji FindCase() konstrukcji pozwalającej na znalezienie spraw, dla których „Data zakończenia umowy” jest większa od tej obliczonej daty granicznej.
W FindCase() podajemy dodatkowo parametr, który zapobiega wielokrotnemu wykonywaniu reguły dla tych samych spraw, przy ponownym uruchomieniu reguły okresowej dla procesu np. w tym samym dniu.
Pętla foreachcase wykona się dla znalezionych spraw i jednocześnie, w każdej sprawie, dla której reguła się wykonała zapisze w polu „wysłano” wartość true. W ten sposób przy ponownym wykonaniu reguły nie zostaną wybrane te sprawy, dla których reguła już się wykonała.
_dataGraniczna = DateAdd("day",Today(),-30); _cases = FindCase("Rejestr umów","Data zakończenia umowy","> "+_dataGraniczna, "wysłano",false) foreachcase(_cases) { // tu coś do wykonania [wysłano] = true; }