Print

Reguła okresowa dla procesu według własnego harmonogramu

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 według własnego harmonogramu, tak i reguła okresowa dla procesu według własnego harmonogramu jest wywoływana w określonym czasie zgodnie z ustalonym harmonogramem (np. w każdą sobotę o 23:00), ale jej konstrukcja i działanie jest inne.

Reguła okresowa dla procesu według własnego harmonogramu jest uruchamiana cyklicznie zgodnie z częstotliwością wywołania zadania ProcedureRuleSchedule (Ustawienia systemowe -> Zadania). Natomiast to, czy zostanie ona uruchomiona w danym cyklu wykonania wspomnianego zadania zależy od ustawionego w jej konfiguracji harmonogramu.

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 według własnego harmonogramu musi składać się z trzech części:

  • Część pierwsza – wybór spraw do procesowania;
  • Część druga – pętla wykonująca określone czynności dla wybranych spraw;
  • Część trzecia – ustawiony harmonogram.

 

Konstrukcja reguły okresowej dla procesu:

_cases = FindCase("nazwa procesu","kryterium1","wartość1", itd)
foreachcase(_cases)
{
     // wykonaj to co tu jest napisane
}
  1. W pierwszej kolejności używamy funkcji FindCase(), która pozwala na wyselekcjonowanie zestawu spraw, dla których chcemy wykonać jakieś akcje.
  2. Następnie wykonywana jest pętla o nazwie foreachcase(sprawy_do_uruchomienia){…}.
  3. 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:

  1. Platforma AMODIT wykonuje funkcję FindCase() jako zapytanie SQL i zwraca wyłącznie listę caseid znalezionych spraw. To działanie jest szybkie;
  2. 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().
  3. Reguła uruchamiana jest tylko zgodnie z założonym harmonogramem.

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;
}

 

Czy artykuł był pomocny?
0 na 5 gwiazdek
5 Stars 0%
4 Stars 0%
3 Stars 0%
2 Stars 0%
1 Stars 0%
5
How can we improve this article?
How Can We Improve This Article?