{"id":8286,"date":"2025-10-30T11:55:54","date_gmt":"2025-10-30T10:55:54","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=8286"},"modified":"2025-10-30T12:06:18","modified_gmt":"2025-10-30T11:06:18","slug":"interfejsy-do-workflow-management","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/","title":{"rendered":"Interfejsy do Workflow Management"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Definicje_terminow\" >Definicje termin\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Instrukcja\" >Instrukcja<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#CisWorkflowManager_i_ActivityContainer\" >CisWorkflowManager i ActivityContainer<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Metody_ustawiania_i_odczytywania_identyfikatora_GUID_bazy_danych_oraz_kodu\" >Metody ustawiania i odczytywania identyfikatora GUID bazy danych oraz kodu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Zachowanie_transakcyjne\" >Zachowanie transakcyjne<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Wlaczenie_do_istniejacej_transakcji\" >W\u0142\u0105czenie do istniej\u0105cej transakcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Uzycie_wlasnej_transakcji_najwyzszego_poziomu\" >U\u017cycie w\u0142asnej transakcji najwy\u017cszego poziomu<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_aktywnosci\" >Tworzenie aktywno\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Ladowanie_aktywnosci\" >\u0141adowanie aktywno\u015bci<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Zapisywanie_aktywnosci\" >Zapisywanie aktywno\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Usuwanie_aktywnosci\" >Usuwanie aktywno\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Duplikowanie_aktywnosci\" >Duplikowanie aktywno\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_kopii_obiektu_ActivityContainer\" >Tworzenie kopii obiektu ActivityContainer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Flagi\" >Flagi<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Seria\" >Seria<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_serii\" >Tworzenie serii<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Interwal_serii_i_kalendarz\" >Interwa\u0142 serii i kalendarz<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Linki_Attachments\" >Linki (Attachments)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Ustawianie_aplikacji_dla_zadan\" >Ustawianie aplikacji dla zada\u0144<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Bezposrednie_ustawienie_aplikacji\" >Bezpo\u015brednie ustawienie aplikacji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Ustawienie_aplikacji_w_sposob_posredni\" >Ustawienie aplikacji w spos\u00f3b po\u015bredni<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Realizatorzy_zadan\" >Realizatorzy zada\u0144<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Realizator_przy_przekroczeniu_czasu_wykonania\" >Realizator przy przekroczeniu czasu wykonania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Warunki\" >Warunki<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Zmiana_stanu_aktywnosci\" >Zmiana stanu aktywno\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Klasyfikacje\" >Klasyfikacje<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Pozostale_informacje\" >Pozosta\u0142e informacje<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Confirmation\" >Confirmation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Workitem\" >Workitem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#WorkState\" >WorkState<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#CrmType\" >CrmType<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#DefinitionGuid\" >DefinitionGuid<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#SeriesActivityGuid\" >SeriesActivityGuid<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Priorytet\" >Priorytet<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tlumaczenia\" >T\u0142umaczenia<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Klasy_i_interfejsy\" >Klasy i interfejsy<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserLogic\" >ParserLogic<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserEnvironment\" >ParserEnvironment<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserExpression\" >ParserExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserFunction\" >ParserFunction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserResult\" >ParserResult<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#ParserType\" >ParserType<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Zakres_waznosci_funkcji\" >Zakres wa\u017cno\u015bci funkcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Rejestrowanie_funkcji\" >Rejestrowanie funkcji<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Rozszerzanie_jezyka_skryptowego\" >Rozszerzanie j\u0119zyka skryptowego<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_fabryki\" >Tworzenie fabryki<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_klasy\" >Tworzenie klasy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Definiowanie_nazwy_metody_i_mozliwych_sygnatur\" >Definiowanie nazwy metody i mo\u017cliwych sygnatur<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_konstruktora\" >Tworzenie konstruktora<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Pozostale_funkcje\" >Pozosta\u0142e funkcje<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Tworzenie_funkcji\" >Tworzenie funkcji<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Konstruktor\" >Konstruktor<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Metoda_evaluate%E2%80%A6\" >Metoda evaluate(&#8230;)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Metoda_create%E2%80%A6\" >Metoda create(&#8230;)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Metoda_getShortName\" >Metoda getShortName()<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Zdarzenia\" >Zdarzenia<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Uruchamianie_zdarzen\" >Uruchamianie zdarze\u0144<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejsy-do-workflow-management\/#Podtypy_zdarzen\" >Podtypy zdarze\u0144<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1 id=\"wprowadzenie\" >Wprowadzenie<\/h1>\n<p>Workflow opiera si\u0119 na dzia\u0142aniach i zadaniach, kt\u00f3re s\u0105 przetwarzane w silniku Workflow. Dzia\u0142ania mog\u0105 by\u0107 tworzone zar\u00f3wno w bazach danych OLTP, jak i w bazie repozytorium. Pierwsza cz\u0119\u015b\u0107 artyku\u0142u opisuje, w jaki spos\u00f3b mo\u017cna tworzy\u0107 i przetwarza\u0107 dzia\u0142ania z aplikacji za pomoc\u0105 dostarczonych interfejs\u00f3w Workflow. Przyk\u0142ady kodu \u017ar\u00f3d\u0142owego dla poszczeg\u00f3lnych punkt\u00f3w s\u0142u\u017c\u0105 do wyja\u015bnienia krok\u00f3w, kt\u00f3re nale\u017cy wykona\u0107, aby osi\u0105gn\u0105\u0107 po\u017c\u0105dany cel.<\/p>\n<p>Terminy, warunki i polecenia s\u0105 u\u017cywane w wielu miejscach Workflow do wyra\u017cania z\u0142o\u017conych relacji. Wszystkie te wyra\u017cenia s\u0105 cz\u0119\u015bci\u0105 wsp\u00f3lnego j\u0119zyka skryptowego. Sk\u0142adnia j\u0119zyka skryptowego jest oparta na SQL, Pascal i Java. <span style=\"font-size: revert; color: initial;\">J\u0119zyk skryptowy mo\u017cna rozszerzy\u0107 o nowe polecenia i funkcje w dowolnym momencie. Zw\u0142aszcza gdy konieczne jest sprawdzanie z\u0142o\u017conych warunk\u00f3w, mo\u017cna napotka\u0107 ograniczenia j\u0119zyka skryptowego pod wzgl\u0119dem jego mo\u017cliwo\u015bci wyra\u017cania logiki lub wydajno\u015bci. W takim przypadku problemy te mo\u017cna rozwi\u0105za\u0107 za pomoc\u0105 specjalnych funkcji. W drugiej cz\u0119\u015bci artyku\u0142u wyja\u015bniono, w jaki spos\u00f3b j\u0119zyk skryptowy mo\u017ce zosta\u0107 rozszerzony o nowe funkcje.<\/span><\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Deweloperzy<\/li>\n<\/ul>\n<h3 id=\"definicje-terminow\" ><span class=\"ez-toc-section\" id=\"Definicje_terminow\"><\/span>Definicje termin\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><em>ActivityContainer &#8211; <\/em>to wielokrotnego u\u017cytku kontener przeznaczony dla aktywno\u015bci. Udost\u0119pnia on wszystkie podstawowe metody potrzebne do obs\u0142ugi (przetwarzania) aktywno\u015bci.<\/p>\n<p data-start=\"178\" data-end=\"396\" data-is-last-node=\"\" data-is-only-node=\"\">Na diagramie, w celu zachowania przejrzysto\u015bci, przedstawiono jedynie metody typu <em data-start=\"260\" data-end=\"268\">getter<\/em>. Z poziomu ActivityContainer mo\u017cna uzyska\u0107 dost\u0119p do Workitems, SeriesElements, Attachments oraz Performer.<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-39683\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow.jpg\" alt=\"\" width=\"1109\" height=\"755\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow.jpg 1109w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-300x204.jpg 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-1024x697.jpg 1024w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-768x523.jpg 768w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-50x34.jpg 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-920x626.jpg 920w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-600x408.jpg 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/10\/Interfejs-Workflow-320x218.jpg 320w\" sizes=\"auto, (max-width: 1109px) 100vw, 1109px\" \/><\/a><\/p>\n<p>Diagram klas ActivityContainer i zale\u017cnych od niego obiekt\u00f3w.<\/p>\n<p><em>Workitem<\/em> &#8211; je\u015bli dana aktywno\u015b\u0107 jest typu <em>STANDARD <\/em>lub <em>SERIES_ELEMENT<\/em>, mo\u017ce posiada\u0107 przypisane zadania. Interfejs Workitem zapewnia niemodyfikowalny widok zadania \u2014 oznacza to, \u017ce pozwala jedynie na odczyt danych, bez mo\u017cliwo\u015bci ich zmiany. Za pomoc\u0105 tego interfejsu mo\u017cna uzyska\u0107 informacje o statusie zadania, osobie realizuj\u0105cej\u00a0oraz momentach zmiany statusu (te elementy nie s\u0105 pokazane na diagramie).<\/p>\n<p><em>SeriesElement <\/em>&#8211; je\u015bli aktywno\u015b\u0107 jest typu <em>SERIES<\/em>, mo\u017ce w okre\u015blonych momentach czasowych generowa\u0107 kolejne aktywno\u015bci. Interfejs SeriesElement udost\u0119pnia ograniczony (uproszczony) widok aktywno\u015bci. Dane z tego interfejsu mog\u0105 by\u0107 wykorzystywane do prezentacji element\u00f3w serii w listach lub tabelach. Za pomoc\u0105 zawartych w nim kluczy mo\u017cna ponownie wczyta\u0107 odpowiednie aktywno\u015bci, korzystaj\u0105c z CisWorkflowManager oraz ActivityContainer. Atrybuty interfejsu SeriesElement s\u0105 niemodyfikowalne \u2013 s\u0142u\u017c\u0105 wy\u0142\u0105cznie do odczytu.<\/p>\n<p data-start=\"573\" data-end=\"589\"><em>Attachment <\/em>&#8211; do jednej aktywno\u015bci mo\u017cna do\u0142\u0105czy\u0107 dowoln\u0105 liczb\u0119 powi\u0105za\u0144 (za\u0142\u0105cznik\u00f3w).<br data-start=\"669\" data-end=\"672\" \/>Celem takiego powi\u0105zania (Attachment) mo\u017ce by\u0107 dowolny obiekt biznesowy (Business Entity).<br data-start=\"770\" data-end=\"773\" \/>Jedynym warunkiem jest to, \u017ce dany obiekt musi by\u0107 utrwalony w tej samej bazie danych, w kt\u00f3rej znajduje si\u0119 aktywno\u015b\u0107.<\/p>\n<p data-start=\"905\" data-end=\"920\"><em>Performer<\/em> &#8211; okre\u015bla, kto otrzymuje zadania wynikaj\u0105ce z danej aktywno\u015bci. Mo\u017ce to by\u0107 pojedyncza osoba lub grupa os\u00f3b. Ka\u017cda osoba z tej grupy otrzymuje osobne zadanie przypisane do tej samej aktywno\u015bci.<\/p>\n<h3 id=\"instrukcja\" ><span class=\"ez-toc-section\" id=\"Instrukcja\"><\/span>Instrukcja<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"cisworkflowmanager-i-activitycontainer\" ><span class=\"ez-toc-section\" id=\"CisWorkflowManager_i_ActivityContainer\"><\/span>CisWorkflowManager i ActivityContainer<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Dwie klasy CisWorkflowManager i ActivityContainer stanowi\u0105 centralny punkt wej\u015bcia do programowania Workflow.<\/p>\n<p>ActivityContainer reprezentuje widok aktywno\u015bci i zale\u017cnych od niej obiekt\u00f3w. I mo\u017ce by\u0107 ponownie u\u017cyty, tzn. ActivityContainer, kt\u00f3ry zosta\u0142 utworzony raz, mo\u017ce by\u0107 u\u017cyty dla kilku aktywno\u015bci z rz\u0119du.<\/p>\n<p>Podczas gdy ActivityContainer s\u0142u\u017cy do przetwarzania aktywno\u015bci, CisWorkflowManager jest odpowiedzialny za Persistence service. CisWorkflowManager mo\u017ce by\u0107 u\u017cywany do tworzenia, \u0142adowania, zapisywania itp. aktywno\u015bci.<\/p>\n<h5 id=\"metody-ustawiania-i-odczytywania-identyfikatora-guid-bazy-danych-oraz-kodu\" ><span class=\"ez-toc-section\" id=\"Metody_ustawiania_i_odczytywania_identyfikatora_GUID_bazy_danych_oraz_kodu\"><\/span>Metody ustawiania i odczytywania identyfikatora GUID bazy danych oraz kodu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>ActivityContainer zawiera metody ustawiania i odczytywania UserData baseGuid i UserCode, a tak\u017ce metody odczytywania DatabaseGuid i kodu.<\/p>\n<p>Metody z <em>User<\/em> s\u0105 u\u017cywane dla wszystkich operacji Persistence service. Aby za\u0142adowa\u0107 aktywno\u015b\u0107, nale\u017cy wywo\u0142a\u0107 metody setUserDatabaseGuid(&#8230;) i setUserCode(&#8230;). Metoda \u0142adowania aktywno\u015bci musi by\u0107 nast\u0119pnie wywo\u0142ana w CisWorkflowContainer.<\/p>\n<p>Dwie metody getDatabaseGuid() i getCode() zawsze zawieraj\u0105 odpowiednie dane bie\u017c\u0105cej aktywno\u015bci ActivityContainer, podczas gdy dwie metody getUserDatabaseGuid() i getUserCode() mog\u0105 r\u00f3wnie\u017c przyjmowa\u0107 inne warto\u015bci, np. w celu p\u00f3\u017aniejszego za\u0142adowania aktywno\u015bci.<\/p>\n<h5 id=\"zachowanie-transakcyjne\" ><span class=\"ez-toc-section\" id=\"Zachowanie_transakcyjne\"><\/span>Zachowanie transakcyjne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>CisWorkflowManager umo\u017cliwia integracj\u0119 kontenera ActivityContainer z istniej\u0105c\u0105 transakcj\u0105 lub u\u017cycie go w oddzielnej transakcji najwy\u017cszego poziomu.<\/p>\n<p>Decyzja ta jest podejmowana w momencie tworzenia kontenera ActivityContainer. Nie ma mo\u017cliwo\u015bci zmiany tego zachowania w p\u00f3\u017aniejszym czasie.<\/p>\n<h6 id=\"wlaczenie-do-istniejacej-transakcji\" ><span class=\"ez-toc-section\" id=\"Wlaczenie_do_istniejacej_transakcji\"><\/span>W\u0142\u0105czenie do istniej\u0105cej transakcji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Je\u015bli ActivityContainer ma zosta\u0107 zintegrowany z istniej\u0105c\u0105 transakcj\u0105, ActivityContainer musi zosta\u0107 utworzony przy u\u017cyciu metody createEmptyActivityContainer() w CisWorkflowManager.<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisWorkflowManager wm = CisWorkflowManager.getInstance();<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ActivityContainer ac = wm.createEmptyActivityContainer();<\/code><\/p>\n<p>Podczas integracji z istniej\u0105cymi transakcjami wa\u017cne jest, aby otaczaj\u0105ca (nadrz\u0119dna) transakcja korzysta\u0142a z tej samej bazy danych co ActivityContainer.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisEnvironment env = CisEnvironment.getInstance();\n\nCisTransactionManager tm = env.getTransactionManager();\n\nbyte[] dbGuid = tm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nac.setUserDatabaseGuid(dbGuid);<\/pre>\n<p>ActivityContainer mo\u017cna nast\u0119pnie wywo\u0142a\u0107 w ramach oddzielnej transakcji w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">byte[] transactionGuid = tm.beginNew(CisTransactionManager.OLTP);<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">try {<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u2026<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisWorkflowManager wm = CisWorkflowManager.getInstance();<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">wm.update(ac);<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u2026<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tm.commit(transactionGuid);<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">} catch \u2026<\/code><\/p>\n<h6 id=\"uzycie-wlasnej-transakcji-najwyzszego-poziomu\" ><span class=\"ez-toc-section\" id=\"Uzycie_wlasnej_transakcji_najwyzszego_poziomu\"><\/span>U\u017cycie w\u0142asnej transakcji najwy\u017cszego poziomu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Je\u015bli ActivityContainer nie musi by\u0107 trwa\u0142y z innymi obiektami w tej samej transakcji, mo\u017cna u\u017cy\u0107 oddzielnej transakcji najwy\u017cszego poziomu. Wszystkie transakcje s\u0105 nast\u0119pnie przeprowadzane w ramach ActivityContainer lub CisWorkflowManager. Aby uzyska\u0107 taki ActivityContainer, nale\u017cy wywo\u0142a\u0107 metod\u0119 createEmptyStandaloneActivityContainer() w CisWorkflowManager. Podobnie jak w przypadku innych ActivityContainer, identyfikator GUID bazy danych mo\u017cna odpowiednio ustawi\u0107.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisWorkflowManager wm = CisWorkflowManager.getInstance();\n\nActivityContainer ac = wm.createEmptyStandaloneActivityContainer();\n\nbyte[] dbGuid = tm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nac.setUserDatabaseGuid(dbGuid);<\/pre>\n<h3 id=\"tworzenie-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Tworzenie_aktywnosci\"><\/span>Tworzenie aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Aby utworzy\u0107 aktywno\u015b\u0107, nale\u017cy utworzy\u0107 ActivityContainer, zdefiniowa\u0107 baz\u0119 danych i wywo\u0142a\u0107 odpowiedni\u0105 metod\u0119 w CisWorkflow Manager.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisEnvironment env = CisEnvironment.getInstance();\n\nCisTransactionManager tm = env.getTransactionManager();\n\nCisWorkflowManager wm = CisWorkflowManager.getInstance();\n\nActivityContainer ac = wm.createEmptyStandaloneActivityContainer();\n\nbyte[] dbGuid = tm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nac.setUserDatabaseGuid(dbGuid);\n\nwm.create(ac);<\/pre>\n<h3 id=\"ladowanie-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Ladowanie_aktywnosci\"><\/span>\u0141adowanie aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Aby za\u0142adowa\u0107 aktywno\u015b\u0107 do kontenera ActivityContainer, nale\u017cy ustawi\u0107 identyfikator GUID bazy danych i kod \u017c\u0105danej aktywno\u015bci w kontenerze w metodach setUserDatabaseGuid i setUserCode. Nast\u0119pnie nale\u017cy wywo\u0142a\u0107 metod\u0119 load(&#8230;) w CisWorkflowManager.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisEnvironment env = CisEnvironment.getInstance();\n\nCisTransactionManager tm = env.getTransactionManager();\n\nCisWorkflowManager wm = CisWorkflowManager.getInstance();\n\nActivityContainer ac = wm.createEmptyStandaloneActivityContainer();\n\nbyte[] dbGuid = tm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nString code = \u201c\u2026\u201d;\n\nac.setUserDatabaseGuid(dbGuid);\n\nac.setUserCode(code);\n\nwm.load(activity);<\/pre>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"><\/code><\/p>\n<h5 id=\"zapisywanie-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Zapisywanie_aktywnosci\"><\/span>Zapisywanie aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Aby zapisa\u0107 aktywno\u015b\u0107, nale\u017cy wywo\u0142a\u0107 metod\u0119 update(&#8230;) w CisWorkflow Manager. Nast\u0119pnie nale\u017cy wywo\u0142a\u0107 metod\u0119 reload(..) w celu dostarczenia do kontenera aktualnych danych. Wa\u017cne jest, aby wywo\u0142a\u0107 t\u0119 metod\u0119, poniewa\u017c na przyk\u0142ad elementy robocze zosta\u0142y utworzone po zapisaniu, kt\u00f3re staj\u0105 si\u0119 widoczne tylko w ActivityContainer poprzez metod\u0119 reload(&#8230;).<\/p>\n<p>Je\u015bli kontener jest zawarty w innej transakcji, funkcja reload(&#8230;) mo\u017ce zosta\u0107 wywo\u0142ana dopiero po zatwierdzeniu.<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisWorkflowManager wm = CisWorkflowManager.getInstance();<br \/>\n<\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ActivityContainer ac = ...; wm.update(ac); wm.reload(ac);<\/code><\/p>\n<h5 id=\"usuwanie-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Usuwanie_aktywnosci\"><\/span>Usuwanie aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Aktywno\u015bci nie mo\u017cna usun\u0105\u0107. Zamiast tego status aktywno\u015bci mo\u017cna ustawi\u0107 na CANCELED lub DONE.<\/p>\n<h5 id=\"duplikowanie-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Duplikowanie_aktywnosci\"><\/span>Duplikowanie aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Podczas powielania aktywno\u015bci powielane s\u0105 tylko dane wymagane do utworzenia nowej aktywno\u015bci. Status, zadania itp. nie s\u0105 kopiowane. Je\u015bli powiedzie si\u0119, zduplikowana aktywno\u015b\u0107 znajduje si\u0119 w przeniesionym ActivityContainer.<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisWorkflowManager wm = CisWorkflowManager.getInstance(); <\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ActivityContainer ac = ...; <\/code><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">boolean successfull = wm.duplicate(ac);<\/code><\/p>\n<h5 id=\"tworzenie-kopii-obiektu-activitycontainer\" ><span class=\"ez-toc-section\" id=\"Tworzenie_kopii_obiektu_ActivityContainer\"><\/span>Tworzenie kopii obiektu ActivityContainer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W przypadku, gdy wymagana jest dok\u0142adna kopia ActivityContainer, istnieje metoda getCopy(). Kopia nie zawiera jednak tekst\u00f3w, kt\u00f3re mo\u017cna sprawdzi\u0107 za pomoc\u0105 getText(&#8230;).<\/p>\n<h5 id=\"flagi\" ><span class=\"ez-toc-section\" id=\"Flagi\"><\/span>Flagi<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Znajomo\u015b\u0107 stanu ActivityContainer jest wa\u017cna dla programowania interfejsu, zw\u0142aszcza dla wy\u015bwietlania trybu aplikacji.<\/p>\n<p>Poni\u017csza lista przedstawia metody dost\u0119pne w ActivityContainer.<\/p>\n<ul>\n<li>isPersistent()<\/li>\n<li>isValid()<\/li>\n<li>isChanged()<\/li>\n<li>isReadOnly()<\/li>\n<li>isStateChangeAllowed()<\/li>\n<li>isDatabaseGuidChanged()<\/li>\n<li>isCodeChanged()<\/li>\n<\/ul>\n<h4 id=\"seria\" ><span class=\"ez-toc-section\" id=\"Seria\"><\/span>Seria<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Serie s\u0105 specjaln\u0105 form\u0105 aktywno\u015bci. W przeciwie\u0144stwie do aktywno\u015bci, serie nie maj\u0105 element\u00f3w roboczych. Zamiast tego, serie generuj\u0105 inne aktywno\u015bci w okre\u015blonych momentach ich \u017cycia. Aktywno\u015bci te mo\u017cna sprawdza\u0107 za pomoc\u0105 metody getSeriesElements().<\/p>\n<h5 id=\"tworzenie-serii\" ><span class=\"ez-toc-section\" id=\"Tworzenie_serii\"><\/span>Tworzenie serii<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Aby utworzy\u0107 seri\u0119, nale\u017cy najpierw utworzy\u0107 aktywno\u015b\u0107 analogiczn\u0105 do znanego wzorca.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisEnvironment env = CisEnvironment.getInstance();\n\n\nCisTransactionManager tm = env.getTransactionManager();\n\n\nCisWorkflowManager wm = CisWorkflowManager.getInstance();\n\n\nActivityContainer ac = wm.createEmptyStandaloneActivityContainer();\n\nbyte[] dbGuid = tm.getDatabaseGuid(CisTransactionManager.OLTP);\n\nac.setUserDatabaseGuid(dbGuid);\n\n\nwm.create(ac);\n\n\u2026<\/pre>\n<p>Aby przekszta\u0142ci\u0107 &#8222;normaln\u0105&#8221; aktywno\u015b\u0107 w seri\u0119, nale\u017cy zmieni\u0107 typ na <em>SERIES<\/em>.<\/p>\n<p>Czas rozpocz\u0119cia serii zawsze reprezentuje nast\u0119pny punkt w czasie, w kt\u00f3rym tworzona jest aktywno\u015b\u0107. Czas ten zmienia si\u0119 po ka\u017cdej utworzonej aktywno\u015bci.<\/p>\n<p data-start=\"332\" data-end=\"369\">Nowo utworzona aktywno\u015b\u0107 otrzymuje:<\/p>\n<ul data-start=\"370\" data-end=\"554\">\n<li data-start=\"370\" data-end=\"437\">\n<p data-start=\"372\" data-end=\"437\">jako czas rozpocz\u0119cia \u2013 bie\u017c\u0105cy czas rozpocz\u0119cia serii,<\/p>\n<\/li>\n<li data-start=\"438\" data-end=\"554\">\n<p data-start=\"440\" data-end=\"554\">jako czas zako\u0144czenia \u2013 warto\u015b\u0107 obliczon\u0105 przez dodanie parametru <em>seriesDuration<\/em>\u00a0do czasu rozpocz\u0119cia.<\/p>\n<\/li>\n<\/ul>\n<p>Interwa\u0142 serii i powi\u0105zany kalendarz s\u0105 u\u017cywane do obliczenia nast\u0119pnego czasu, w kt\u00f3rym aktywno\u015b\u0107 ma zosta\u0107 wygenerowana.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ac.setType(ActivityType.SERIES);\n\nac.setStartTime(...);\n\nac.setEndTime(...);\n\nac.setSeriesDuration(...);\n\nac.setSeriesInterval(...);\n\nac.setSeriesIntervalCalendar(...);\n\n...\n\nwm.update(ac);\n\n...<\/pre>\n<h3 id=\"interwal-serii-i-kalendarz\" ><span class=\"ez-toc-section\" id=\"Interwal_serii_i_kalendarz\"><\/span>Interwa\u0142 serii i kalendarz<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Interwa\u0142 serii to symboliczny czas np:<\/p>\n<ul>\n<li>W drugi wtorek ka\u017cdego miesi\u0105ca o 17:15<\/li>\n<li>W ka\u017cdy poniedzia\u0142ek i wtorek o 15:00<\/li>\n<\/ul>\n<p>Godziny te zawsze zale\u017c\u0105 od kalendarza, na kt\u00f3rym maj\u0105 by\u0107 oparte obliczenia. Na przyk\u0142ad <em>17:15<\/em> to inna godzina w Europie ni\u017c w Azji.<\/p>\n<p>Pole <em>SymbolicIntervalField<\/em> jest dost\u0119pne do wprowadzania czasu symbolicznego w programowaniu interfejsu. Zawiera ono wszystkie mo\u017cliwe warianty czas\u00f3w symbolicznych w wyskakuj\u0105cym okienku i posiada regulowany kalendarz. Pole ma dwie metody getValue() i getCisCalendar(), aby uzyska\u0107 wymagane warto\u015bci do ustawienia serii.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SymbolicIntervalField field = new SymbolicIntervalField(...); \n... \nac.setSeriesInterval(field.getValue()); \nac.setSeriesIntervalCalendar(field.getCisCalendar()); ...<\/pre>\n<h4 id=\"linki-attachments\" ><span class=\"ez-toc-section\" id=\"Linki_Attachments\"><\/span>Linki (Attachments)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Dla ka\u017cdej aktywno\u015bci mo\u017cna utworzy\u0107 dowoln\u0105 liczb\u0119 link\u00f3w do innych obiekt\u00f3w CisObjects. Warunkiem utworzenia \u0142\u0105cza jest to, \u017ce aktywno\u015b\u0107 i obiekty CisObjects znajduj\u0105 si\u0119 w tej samej bazie danych. \u0141\u0105cza s\u0105 zapisywane wraz z aktywno\u015bci\u0105 w formie za\u0142\u0105cznik\u00f3w.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Attachment attachment = ac.createAttachment();\n\nattachment.setCisObject(aCisObject);\n\nattachment.setDescription(\u201c\u2026\u201d);\n\nac.getAttachments().add(attachment);<\/pre>\n<p>SequenceNumber jest przypisywany na podstawie kolejno\u015bci na li\u015bcie podczas zapisywania, zaczynaj\u0105c od zera i rosn\u0105co. Pierwszy za\u0142\u0105cznik na li\u015bcie, tj. z numerem SequenceNumber zero, m a szczeg\u00f3lne znaczenie dla uruchomienia aplikacji dla zadania.<\/p>\n<h4 id=\"ustawianie-aplikacji-dla-zadan\" ><span class=\"ez-toc-section\" id=\"Ustawianie_aplikacji_dla_zadan\"><\/span>Ustawianie aplikacji dla zada\u0144<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Zadania aktywno\u015bci s\u0105 przetwarzane za pomoc\u0105 aplikacji dost\u0119pnych w systemie. W aktywno\u015bci mo\u017cna okre\u015bli\u0107, kt\u00f3ra aplikacja ma zosta\u0107 otwarta.<\/p>\n<p>Mo\u017cna to zrobi\u0107 bezpo\u015brednio, okre\u015blaj\u0105c aplikacj\u0119, lub po\u015brednio za pomoc\u0105 obiekt\u00f3w biznesowych, system\u00a0na ich podstawie okre\u015bla, jaka aplikacja powinna zosta\u0107 otwarta.<\/p>\n<h5 id=\"bezposrednie-ustawienie-aplikacji\" ><span class=\"ez-toc-section\" id=\"Bezposrednie_ustawienie_aplikacji\"><\/span>Bezpo\u015brednie ustawienie aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ka\u017cda aplikacja w systemie mo\u017ce by\u0107 jednoznacznie identyfikowana za pomoc\u0105 identyfikatora GUID. Ten identyfikator GUID musi by\u0107 ustawiony w ActivityContainer. Mo\u017cna r\u00f3wnie\u017c okre\u015bli\u0107, kt\u00f3re ActionId i parametry s\u0105 przekazywane do aplikacji. Mo\u017cliwe ActionIds i parametry s\u0105 zdefiniowane w obiekcie programistycznym Application dla danej aplikacji.<\/p>\n<p>W poni\u017cszym przyk\u0142adzie bie\u017c\u0105ca aplikacja jest zdefiniowana jako aplikacja dla aktywno\u015bci.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisApplicationManager am = env.getApplicationManager();\n\n\u2026\n\nbyte[] applicationGuid = am.getApplicationGuid();\n\nCisParameterList actionParameters = new CisParameterList();\n\n\u2026\n\nac.setApplicationGuid(applicationGuid);\n\nac.setActionId((short) 1);\n\nac.setActionParameters(actionParameters);<\/pre>\n<p><\/div><\/section>\n<h5 id=\"ustawienie-aplikacji-w-sposob-posredni\" ><span class=\"ez-toc-section\" id=\"Ustawienie_aplikacji_w_sposob_posredni\"><\/span>Ustawienie aplikacji w spos\u00f3b po\u015bredni<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli \u017cadna aplikacja nie jest ustawiona bezpo\u015brednio, linki s\u0105 u\u017cywane do okre\u015blenia aplikacji. U\u017cywany jest link, kt\u00f3ry ma zero jako SequenceNumber. Domy\u015blna aplikacja jest okre\u015blana i uruchamiana dla obiektu, kt\u00f3ry zawiera. Sam obiekt jest parametrem transferu.<\/p>\n<h4 id=\"realizatorzy-zadan\" ><span class=\"ez-toc-section\" id=\"Realizatorzy_zadan\"><\/span>Realizatorzy zada\u0144<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"26\" data-end=\"275\">Dla ka\u017cdej aktywno\u015bci, z wyj\u0105tkiem aktywno\u015bci typu <em>SERIES<\/em>, w momencie przej\u015bcia w status <em>WAITING<\/em> tworzone s\u0105 zadania. Dla ka\u017cdego realizatora powstaje osobne zadanie. Spos\u00f3b ustalania realizator\u00f3w zale\u017cy od konfiguracji w Performerze.<\/p>\n<p data-start=\"277\" data-end=\"609\">Performer okre\u015bla, w jaki spos\u00f3b maj\u0105 zosta\u0107 znalezieni realizatorzy zada\u0144. Mog\u0105 oni pochodzi\u0107 z relacji partnerskich powi\u0105zanych ze stanowiskiem, organizacj\u0105 lub osob\u0105. W przypadku partnera w systemie zapisane jest, kt\u00f3ry u\u017cytkownik (User) jest z nim zwi\u0105zany. Ka\u017cdemu znalezionemu u\u017cytkownikowi przypisywane jest osobne zadanie.<\/p>\n<p data-start=\"611\" data-end=\"805\">Opr\u00f3cz okre\u015blania realizatora poprzez partnera mo\u017cna r\u00f3wnie\u017c wskaza\u0107 u\u017cytkownika bezpo\u015brednio. Je\u015bli zadanie ma zosta\u0107 przypisane do kilku u\u017cytkownik\u00f3w, mo\u017cna ich zgrupowa\u0107 w role workflowowe.<\/p>\n<p data-start=\"807\" data-end=\"1051\">Je\u015bli do ustalenia u\u017cytkownik\u00f3w potrzebne s\u0105 dodatkowe powi\u0105zania lub funkcje, mo\u017cna w Performerze zdefiniowa\u0107 odpowiednie wyra\u017cenie. Umo\u017cliwia to na przyk\u0142ad przypisanie zadania prze\u0142o\u017conemu, gdy warto\u015b\u0107 zam\u00f3wienia przekracza okre\u015blony pr\u00f3g.<\/p>\n<p data-start=\"807\" data-end=\"1051\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Aktualny u\u017cytkownik zostaje ustawiony jako realizator zadania.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Performer p = ac.getPerformer();\n\np.setType(PerformerType.USER);\n\np.setGuid(env.getUserGuid());<\/pre>\n<p data-start=\"807\" data-end=\"1051\"><\/div><\/section><\/p>\n<p>Je\u015bli istnieje wi\u0119cej ni\u017c jeden u\u017cytkownik, tj. utworzono wi\u0119cej ni\u017c jedno zadanie, wa\u017cne jest, aby rozr\u00f3\u017cni\u0107, czy wszystkie zadania musz\u0105 zosta\u0107 przetworzone, czy tylko jedno z nich, aby zako\u0144czy\u0107 dzia\u0142anie. Metoda setAllocation(&#8230;) mo\u017ce by\u0107 u\u017cyta do ustawienia po\u017c\u0105danego zachowania.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W poni\u017cszym przyk\u0142adzie wszyscy u\u017cytkownicy musz\u0105 uko\u0144czy\u0107 swoje zadania, aby dzia\u0142anie mog\u0142o zosta\u0107 zako\u0144czone.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Performer p = ac.getPerformer();\n\np.setType(PerformerType.ROLE);\n\np.setAllocation(PerformerAllocation.ALL);\n\np.setGuid(env.getUserGuid());<\/pre>\n<p><\/div><\/section>\n<h5 id=\"realizator-przy-przekroczeniu-czasu-wykonania\" ><span class=\"ez-toc-section\" id=\"Realizator_przy_przekroczeniu_czasu_wykonania\"><\/span>Realizator przy przekroczeniu czasu wykonania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"55\" data-end=\"265\">Je\u015bli czas realizacji aktywno\u015bci zostanie przekroczony, system reaguje w zale\u017cno\u015bci od ustawionego typu eskalacji. To zachowanie mo\u017cna okre\u015bli\u0107 za pomoc\u0105 metody setEscalationType w obiekcie ActivityContainer.<\/p>\n<p data-start=\"267\" data-end=\"513\">Je\u017celi zostanie ustawiona warto\u015b\u0107 <em>FORWARD<\/em>, to po przekroczeniu dopuszczalnego czasu wszystkie istniej\u0105ce zadania zostan\u0105 odebrane ich dotychczasowym u\u017cytkownikom, a w ich miejsce zostan\u0105 utworzone nowe zadania przypisane do innych u\u017cytkownik\u00f3w.<\/p>\n<p data-start=\"515\" data-end=\"623\" data-is-last-node=\"\" data-is-only-node=\"\">Nowych u\u017cytkownik\u00f3w, kt\u00f3rzy maj\u0105 przej\u0105\u0107 zadania po eskalacji, definiuje si\u0119 w obiekcie EscalationPerformer.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ac.setEscalationType(EscalationType.FORWARD);\n\n \n\nPerformer ep = ac.getEscalationPerformer();\n\nep.setType(PerformerType.USER);\n\nep.setAllocation(PerformerAllocation.ALL);\n\nep.setGuid(env.getUserGuid());<\/pre>\n<h4 id=\"warunki\" ><span class=\"ez-toc-section\" id=\"Warunki\"><\/span>Warunki<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Warunki mog\u0105 by\u0107 definiowane w aktywno\u015bciach. Je\u015bli warunek zostanie przekazany do metody setCondition(&#8230;), Workflow Engine sprawdza, czy warunek jest spe\u0142niony przy ka\u017cdej zmianie statusu. Je\u015bli nie jest on ju\u017c spe\u0142niony, aktywno\u015b\u0107, a w konsekwencji wszystkie zadania, s\u0105 ustawiane na CANCELED.<\/p>\n<p>Podobnie mo\u017cna ustawi\u0107 warunek dla serii. W tym celu dost\u0119pna jest metoda setSeriesCondition(&#8230;). Je\u015bli ten warunek nie jest ju\u017c spe\u0142niony, nie s\u0105 generowane dalsze dzia\u0142ania.<\/p>\n<p>Opis sk\u0142adni warunk\u00f3w mo\u017cna znale\u017a\u0107 w artykule dotycz\u0105cym <a title=\"Silnik workflow\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/silnik-workflow\/\"><em>Silnik workflow<\/em>.<\/a><\/p>\n<h4 id=\"zmiana-stanu-aktywnosci\" ><span class=\"ez-toc-section\" id=\"Zmiana_stanu_aktywnosci\"><\/span>Zmiana stanu aktywno\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Status aktywno\u015bci mo\u017cna r\u0119cznie zmieni\u0107 na DONE lub CANCELED. Takie dzia\u0142anie stosuje si\u0119 na przyk\u0142ad wtedy, gdy aktywno\u015b\u0107 zosta\u0142a utworzona omy\u0142kowo. Zmiana statusu oznacza, \u017ce wszystkie zadania zostan\u0105 r\u00f3wnie\u017c zmienione po zapisaniu dzia\u0142ania.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ac.setState(ActivityState.DONE)\n\nac.setState(ActivityState.CANCELED)<\/pre>\n<h4 id=\"klasyfikacje\" ><span class=\"ez-toc-section\" id=\"Klasyfikacje\"><\/span>Klasyfikacje<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>W celu ograniczenia liczby aktywno\u015bci znalezionych w wyszukiwarkach i aplikacjach zapyta\u0144, ActivityContainer posiada kilka metod klasyfikacji aktywno\u015bci. SourceType wskazuje pochodzenie aktywno\u015bci. W wi\u0119kszo\u015bci przypadk\u00f3w s\u0105 to tak zwane dzia\u0142ania &#8222;ad hoc&#8221;.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ac.setGroup1(\u2026);\n\nac.setGroup2(\u2026);\n\nac.setGroup3(\u2026);\n\nac.setHierarchy1(\u2026);\n\nac.setHierarchy2(\u2026);\n\nac.setActivityClass(\u2026);\n\nac.setSourceType(\u2026);<\/pre>\n<h4 id=\"pozostale-informacje\" ><span class=\"ez-toc-section\" id=\"Pozostale_informacje\"><\/span>Pozosta\u0142e informacje<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"confirmation\" ><span class=\"ez-toc-section\" id=\"Confirmation\"><\/span>Confirmation<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda setConfirmation(&#8230;) s\u0142u\u017cy do okre\u015blenia, czy przetwarzanie zadania musi zosta\u0107 potwierdzone. W tym celu w systemie nale\u017cy klikn\u0105\u0107 przycisk na pasku narz\u0119dzi Workflow. Je\u015bli potwierdzenie nie jest wymagane, zadanie zmienia status na <em>Completed<\/em> zaraz po jego otwarciu.<\/p>\n<h5 id=\"workitem\" ><span class=\"ez-toc-section\" id=\"Workitem\"><\/span><em>Workitem<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>List\u0119 zada\u0144 aktywno\u015bci mo\u017cna uzyska\u0107 za pomoc\u0105 metody getWorkitems(). Zawarte w niej elementy robocze nie mog\u0105 zosta\u0107 zmienione.<\/p>\n<h5 id=\"workstate\" ><span class=\"ez-toc-section\" id=\"WorkState\"><\/span><em>WorkState<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli podczas przetwarzania aktywno\u015bci wyst\u0105pi\u0105 b\u0142\u0119dy w silniku Workflow, aktywno\u015b\u0107 zostanie zatrzymana, tj. wykluczona z dalszego przetwarzania. Status dzia\u0142ania mo\u017cna sprawdzi\u0107 za pomoc\u0105 funkcji getWorkState().<\/p>\n<h5 id=\"crmtype\" ><span class=\"ez-toc-section\" id=\"CrmType\"><\/span><em>CrmType<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>CrmType jest wymagany tylko dla zarz\u0105dzania relacjami. Wszystkie dzia\u0142ania nale\u017c\u0105ce do elementu zarz\u0105dzania relacjami mo\u017cna okre\u015bli\u0107, podaj\u0105c identyfikator GUID w CrmType.<\/p>\n<h5 id=\"definitionguid\" ><span class=\"ez-toc-section\" id=\"DefinitionGuid\"><\/span><em>DefinitionGuid<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli aktywno\u015b\u0107 jest oparta na definicji aktywno\u015bci, identyfikator GUID tej definicji aktywno\u015bci mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody getDefinitionGuid().<\/p>\n<h5 id=\"seriesactivityguid\" ><span class=\"ez-toc-section\" id=\"SeriesActivityGuid\"><\/span><em>SeriesActivityGuid<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli aktywno\u015b\u0107 jest oparta na serii, identyfikator GUID serii mo\u017cna uzyska\u0107 za pomoc\u0105 metody getSeriesActivityGuid().<\/p>\n<h5 id=\"priorytet\" ><span class=\"ez-toc-section\" id=\"Priorytet\"><\/span><em>Priorytet<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dzia\u0142anie mo\u017ce mie\u0107 priorytet od 1 (wysoki) do 9 (niski).<\/p>\n<h5 id=\"tlumaczenia\" ><span class=\"ez-toc-section\" id=\"Tlumaczenia\"><\/span>T\u0142umaczenia<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Aktywno\u015bci w systemie maj\u0105 elementy, kt\u00f3re mo\u017cna przet\u0142umaczy\u0107: oznaczenia i opis.<\/p>\n<p>Opis mo\u017cna sprawdzi\u0107 za pomoc\u0105 funkcji getDescription() w ActivityContainer, a powi\u0105zane dane NLS za pomoc\u0105 funkcji getDescriptionNLSData().<\/p>\n<p>Opr\u00f3cz nazwy mo\u017cna wprowadzi\u0107 opis w kilku j\u0119zykach. Opis ten mo\u017ce by\u0107 u\u017cywany na przyk\u0142ad jako szczeg\u00f3\u0142owy opis zadania.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Sring text = ac.getText(\"en\"); \nac.setText(\"en\", \"text...\");<\/pre>\n<h4 id=\"klasy-i-interfejsy\" ><span class=\"ez-toc-section\" id=\"Klasy_i_interfejsy\"><\/span>Klasy i interfejsy<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wszystkie klasy i interfejsy wymagane do rozszerzenia j\u0119zyka skryptowego mo\u017cna znale\u017a\u0107 w pakiecie com.cisag.pgm.util.<\/p>\n<p>Nast\u0119puj\u0105ce klasy\/interfejsy s\u0105 interesuj\u0105ce dla tego rozszerzenia:<\/p>\n<ul>\n<li>ParserLogic<\/li>\n<li>ParserEnvironment<\/li>\n<li>ParserExpression<\/li>\n<li>ParserFunction<\/li>\n<li>ParserResult<\/li>\n<li>ParserType<\/li>\n<\/ul>\n<h5 id=\"parserlogic\" ><span class=\"ez-toc-section\" id=\"ParserLogic\"><\/span>ParserLogic<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"346\">Klasa ParserLogic udost\u0119pnia dla warunk\u00f3w, wyra\u017ce\u0144 i sekwencji polece\u0144 oddzielne metody, kt\u00f3re umo\u017cliwiaj\u0105 utworzenie drzewa parsowania\u00a0na podstawie przekazanego ci\u0105gu znak\u00f3w.<br data-start=\"199\" data-end=\"202\" \/>Utworzone drzewo sk\u0142ada si\u0119 z obiekt\u00f3w typu ParserExpression, a wynikiem dzia\u0142ania metody jest element nadrz\u0119dny (korze\u0144) tego drzewa.<\/p>\n<p data-start=\"348\" data-end=\"603\" data-is-last-node=\"\" data-is-only-node=\"\">Dodatkowo klasa ParserLogic pe\u0142ni rol\u0119 pami\u0119ci podr\u0119cznej (cache) dla utworzonych drzew parsowania, dzi\u0119ki czemu ci\u0105gi znak\u00f3w, kt\u00f3re zosta\u0142y ju\u017c wcze\u015bniej przetworzone, nie musz\u0105 by\u0107 ponownie parsowane, co zwi\u0119ksza wydajno\u015b\u0107 dzia\u0142ania systemu.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public ParserExpression getStatement(String statement) \nthrows ParserException {...}\n\npublic ParserExpression getCondition(String condition) \nthrows ParserException {...}\n\npublic ParserExpression getExpression(String expression) \nthrows ParserException {...}<\/pre>\n<h5 id=\"parserenvironment\" ><span class=\"ez-toc-section\" id=\"ParserEnvironment\"><\/span>ParserEnvironment<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa ParserEnvironment reprezentuje \u015brodowisko uruchomieniowe dla wyra\u017ce\u0144 ParserExpression. Wyra\u017cenie ParserExpression mo\u017ce zosta\u0107 przekazane do metody evaluate(&#8230;). Jest ono oceniane, a wynik jest zwracany jako ParserResult.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public ParserResult evaluate(ParserExpression expression) \nthrows ParserException {...}<\/pre>\n<h5 id=\"parserexpression\" ><span class=\"ez-toc-section\" id=\"ParserExpression\"><\/span>ParserExpression<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa ParserExpression reprezentuje abstrakcyjn\u0105 nadklas\u0119 funkcji. Metoda evaluate(&#8230;) zawiera rzeczywist\u0105 funkcj\u0119. Jako parametr wej\u015bciowy przekazywana jest tablica z wynikami ParserResults. Warto\u015bci\u0105 zwracan\u0105 jest pojedynczy ParserResult. Metoda jest wywo\u0142ywana dla wszystkich mo\u017cliwych sygnatur, tzn. musi by\u0107 rozpoznane w metodzie, kt\u00f3ra sygnatura zosta\u0142a u\u017cyta do wywo\u0142ania.<\/p>\n<p>ParserExpressions mog\u0105 by\u0107 u\u017cywane w OLTP i sesjach. Klasa ParserExpression nie mo\u017ce zatem mie\u0107 \u017cadnych zmiennych instancji specyficznych dla sesji lub OLTP, tj. w szczeg\u00f3lno\u015bci \u017cadnych mened\u017cer\u00f3w z com.cisag.pgm.appserver i \u017cadnych instancji klas logicznych.<\/p>\n<h5 id=\"parserfunction\" ><span class=\"ez-toc-section\" id=\"ParserFunction\"><\/span>ParserFunction<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa ParserFunction pe\u0142ni rol\u0119 fabryki oraz abstrakcyjnej klasy bazowej dla wszystkich fabryk funkcji parsera. Aby utworzy\u0107 jedn\u0105 lub wi\u0119cej w\u0142asnych funkcji, nale\u017cy odziedziczy\u0107 t\u0119 klas\u0119. Nale\u017cy zaimplementowa\u0107 metody:<\/p>\n<ul>\n<li>getNames() &#8211; zwraca nazwy wszystkich funkcji, kt\u00f3re mo\u017cna utworzy\u0107 w tej fabryce.<\/li>\n<li>getExpression(&#8230;) &#8211; zwraca \u017c\u0105dan\u0105 funkcj\u0119 (ParserExpression) dla nazwy funkcji.<\/li>\n<\/ul>\n<p>Nale\u017cy zauwa\u017cy\u0107, \u017ce metoda getExpression(&#8230;) jest wywo\u0142ywana tylko raz dla ka\u017cdej nazwy funkcji. Sama wygenerowana funkcja zapewnia metod\u0119 umo\u017cliwiaj\u0105c\u0105 generowanie kolejnych kopii funkcji, je\u015bli jest to wymagane.<\/p>\n<h5 id=\"parserresult\" ><span class=\"ez-toc-section\" id=\"ParserResult\"><\/span>ParserResult<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa ParserResult mo\u017ce by\u0107 zar\u00f3wno parametrem, jak i wynikiem funkcji. Typ danych obiektu w ParserResult jest okre\u015blony przez ParserType.<\/p>\n<p>Zawarto\u015b\u0107 ParserResult nie mo\u017ce zosta\u0107 zmieniona, dost\u0119pne s\u0105 tylko odpowiednie metody getter. Aby utworzy\u0107 ParserResult, nale\u017cy wywo\u0142a\u0107 odpowiedni\u0105 statyczn\u0105 metod\u0119 create na ParserResult, np. createBoolean(boolean value).<\/p>\n<h5 id=\"parsertype\" ><span class=\"ez-toc-section\" id=\"ParserType\"><\/span>ParserType<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>ParserType zapewnia metadane dla ParserResult. Niekt\u00f3re typy ParserType, takie jak STRING, GUID, NUMBER, s\u0105 ju\u017c wst\u0119pnie zdefiniowane w samej klasie. Mo\u017cna jednak r\u00f3wnie\u017c tworzy\u0107 w\u0142asne typy, np. w oparciu o CisObject.<\/p>\n<h4 id=\"zakres-waznosci-funkcji\" ><span class=\"ez-toc-section\" id=\"Zakres_waznosci_funkcji\"><\/span>Zakres wa\u017cno\u015bci funkcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"32\" data-end=\"270\">Aby funkcje dzia\u0142a\u0142y poprawnie, potrzebuj\u0105 odpowiedniego \u015brodowiska, tzn. musz\u0105 by\u0107 spe\u0142nione okre\u015blone warunki brzegowe. Rozr\u00f3\u017cnia si\u0119 dwa g\u0142\u00f3wne aspekty: po pierwsze baz\u0119 danych, a po drugie to, czy funkcja wymaga aktywno\u015bci, czy nie.<\/p>\n<p data-start=\"272\" data-end=\"464\">Je\u015bli funkcja ma by\u0107 u\u017cyta np. w warunku przej\u015bcia (Transition) w definicji aktywno\u015bci, nie mo\u017ce ona odwo\u0142ywa\u0107 si\u0119 do aktywno\u015bci, poniewa\u017c ta zostanie utworzona dopiero w p\u00f3\u017aniejszym etapie.<\/p>\n<p data-start=\"466\" data-end=\"611\" data-is-last-node=\"\" data-is-only-node=\"\">Zakres wa\u017cno\u015bci funkcji okre\u015bla si\u0119 w konstruktorze funkcji. W klasie ParserFunctions zdefiniowane s\u0105 mo\u017cliwe zakresy wa\u017cno\u015bci w postaci sta\u0142ych.<\/p>\n<ul>\n<li>WF_ACTIVITY_REPOSITORY<\/li>\n<li>WF_ACTIVITY_OLTP<\/li>\n<li>WF_TRANSITION_OLTP<\/li>\n<li>WF_TRANSITION_REPOSITORY<\/li>\n<\/ul>\n<p>Je\u015bli wykonanie funkcji zale\u017cy tylko od bazy danych, mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 jednej z dw\u00f3ch podsumowanych sta\u0142ych.<\/p>\n<ul>\n<li>WF_REPOSITORY<\/li>\n<li>WF_OLTP<\/li>\n<\/ul>\n<p>Je\u015bli funkcja mo\u017ce by\u0107 u\u017cywana niezale\u017cnie od bazy danych i aktywno\u015bci, mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 nast\u0119puj\u0105cej sta\u0142ej:<\/p>\n<ul>\n<li>WF_ALL<\/li>\n<\/ul>\n<h4 id=\"rejestrowanie-funkcji\" ><span class=\"ez-toc-section\" id=\"Rejestrowanie_funkcji\"><\/span>Rejestrowanie funkcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Nowo utworzone funkcje musz\u0105 zosta\u0107 zarejestrowane w klasie CisInitaliser w pakiecie com.cisag.app.general.log przy u\u017cyciu metody initParserFunctions(&#8230;).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public static void initParserFunctions(\n\nParserFunctionProvider functionProvider) {\n\nfunctionProvider.addFunction(new WorkflowFunctions());\n\nfunctionProvider.addFunction(new BookFunctions());\n\n}<\/pre>\n<h3 id=\"rozszerzanie-jezyka-skryptowego\" ><span class=\"ez-toc-section\" id=\"Rozszerzanie_jezyka_skryptowego\"><\/span>Rozszerzanie j\u0119zyka skryptowego<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Przyk\u0142ad zostanie wykorzystany do wyja\u015bnienia, w jaki spos\u00f3b j\u0119zyk skryptowy mo\u017ce zosta\u0107 rozszerzony o wyra\u017cenie <em>loadBook<\/em>.<\/p>\n<h4 id=\"tworzenie-fabryki\" ><span class=\"ez-toc-section\" id=\"Tworzenie_fabryki\"><\/span>Tworzenie fabryki<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"tworzenie-klasy\" ><span class=\"ez-toc-section\" id=\"Tworzenie_klasy\"><\/span>Tworzenie klasy<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Obiekt biznesowy <em>Book<\/em> znajduje si\u0119 w pakiecie com.cisag.app.edu.obj. Nowa funkcja jest zdefiniowana w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">package com.cisag.app.edu.log;\n\n \n\nimport com.cisag.app.edu.obj.Book;\n\nimport com.cisag.pgm.util.ParserFunction;\n\nimport \u2026 \/\/ Weitere Imports\n\n \n\npublic class BookFunctions extends ParserFunction {\n\n\u2026.\n\n}<\/pre>\n<h5 id=\"definiowanie-nazwy-metody-i-mozliwych-sygnatur\" ><span class=\"ez-toc-section\" id=\"Definiowanie_nazwy_metody_i_mozliwych_sygnatur\"><\/span>Definiowanie nazwy metody i mo\u017cliwych sygnatur<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W wygenerowanej klasie zdefiniowane s\u0105 dwie sta\u0142e. Sta\u0142a NAMES zawiera tablic\u0119 \u0142a\u0144cuch\u00f3w z list\u0105 nazw funkcji. W tym przypadku jest to funkcja <em>loadBook<\/em>.<\/p>\n<p>Mo\u017cliwe sygnatury dla funkcji s\u0105 przechowywane w sta\u0142ej SIGNATURE_LOAD. Sygnatura mo\u017ce nie zawiera\u0107 \u017cadnego, jednego lub wielu parametr\u00f3w. Ka\u017cdy parametr ma nazw\u0119 i typ. Funkcja <em>loadBook<\/em> powinna by\u0107 wywo\u0142ywana przy u\u017cyciu parametru <em>guid<\/em> typu GUID lub <em>number<\/em>\u00a0typu STRING.<\/p>\n<p>Nazwy sta\u0142ych NAMES i SIGNATURE_LOAD s\u0105 dowolne.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">private final static String[] NAMES = new String[]{\u201cloadBook\u201d};\n\n \n\npublic final static ParserExpression.Signature[]\n\nSIGNATURE_LOAD = new ParserExpression.Signature[] {\n\nParserExpression.signature(\u201cguid\u201d, ParserType.GUID),\n\nParserExpression.signature(\u201cnumber\u201d, ParserType.STRING),\n\n};<\/pre>\n<h5 id=\"tworzenie-konstruktora\" ><span class=\"ez-toc-section\" id=\"Tworzenie_konstruktora\"><\/span>Tworzenie konstruktora<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Obszary, dla kt\u00f3rych ta funkcja jest dozwolona, s\u0105 zdefiniowane w konstruktorze. Niezb\u0119dne sta\u0142e mo\u017cna znale\u017a\u0107 w klasie ParserFunctions.<\/p>\n<p>Metoda setFlag mo\u017ce by\u0107 u\u017cywana do w\u0142\u0105czania lub wy\u0142\u0105czania obszaru. Funkcja &#8222;loadBook&#8221; jest dozwolona tylko dla baz danych OLTP.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public BookFunctions() {\n\nsetFlag(ParserFunction.WF_OLTP, true);\n\n}<\/pre>\n<h5 id=\"pozostale-funkcje\" ><span class=\"ez-toc-section\" id=\"Pozostale_funkcje\"><\/span>Pozosta\u0142e funkcje<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa BookFunctions zawiera dwie kolejne metody do implementacji: getNames() i getExpression(String)<\/p>\n<p>Metoda getNames() zwraca nazwy wszystkich funkcji zdefiniowanych w klasie. W tym przyk\u0142adzie sta\u0142a NAMES zawiera tylko warto\u015b\u0107 <em>loadBook<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public String[] getNames() {\n\nreturn NAMES;\n\n}<\/pre>\n<p>Metoda getExpression(String) jest wywo\u0142ywana tylko raz. Dla ka\u017cdej przekazanej nazwy funkcji tworzy ona instancj\u0119 klasy, w kt\u00f3rej funkcja jest zaimplementowana. Wygenerowana klasa jest u\u017cywana jako prototyp do p\u00f3\u017aniejszego tworzenia kolejnych instancji.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public ParserExpression getExpression(String name) {\n\nif (name.equals(NAMES[0])) {\n\nreturn new LoadExpression(0, 0);\n\n} else {\n\nthrow new RuntimeException(\u201cunkown function\u201d);\n\n}\n\n}<\/pre>\n<h4 id=\"tworzenie-funkcji\" ><span class=\"ez-toc-section\" id=\"Tworzenie_funkcji\"><\/span>Tworzenie funkcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Funkcja <em>loadBook<\/em> jest zaimplementowana w klasie LoadExpresion, kt\u00f3ra zosta\u0142a wbudowana w kod \u017ar\u00f3d\u0142owy jako klasa wewn\u0119trzna.<\/p>\n<p>Klasa LoadExpression dziedziczy z ParserExpression i dlatego musi implementowa\u0107 dwie abstrakcyjne metody, evaluate(&#8230;) i create(&#8230;). Metoda getShortName() jest r\u00f3wnie\u017c nadpisana i zwraca nazw\u0119 funkcji.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public static class LoadExpression extends ParserExpression {\n\npublic LoadExpression(int line, int col) {\n\n... }\n\nprotected ParserResult evaluate(ParserResult[] parameters) throws ParserException { ... }\n\npublic ParserExpression create(int line, int col) {\n\n... }\n\npublic String getShortName() { ...\n\n}\n\n}<\/pre>\n<h5 id=\"konstruktor\" ><span class=\"ez-toc-section\" id=\"Konstruktor\"><\/span>Konstruktor<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Konstruktor jest wywo\u0142ywany z dwiema warto\u015bciami int dla wiersza i kolumny. Te dwie warto\u015bci okre\u015blaj\u0105 pozycj\u0119 w tek\u015bcie do przeanalizowania i s\u0105 u\u017cywane do komunikat\u00f3w o b\u0142\u0119dach.<\/p>\n<p>Podpisy (guid i numer) oraz warto\u015b\u0107 zwracana s\u0105 ustawiane w konstruktorze. W tym przypadku warto\u015b\u0107 zwracana powinna zawiera\u0107 instancj\u0119 klasy Book.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public LoadExpression(int line, int col) {\n\nsuper(line, col, TYPE_FUNCTION);\n\nsetSignatures(SIGNATURE_LOAD);\n\nsetResultType(ParserType.createCisObject(\n\nCisObjectUtility.getClassGuid(Book.class)));\n\n}<\/pre>\n<h5 id=\"metoda-evaluate\" ><span class=\"ez-toc-section\" id=\"Metoda_evaluate%E2%80%A6\"><\/span>Metoda evaluate(&#8230;)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Funkcja jest wykonywana w ramach tej metody. Najpierw sprawdza, czy jako parametr przekazano warto\u015b\u0107 null. Je\u015bli tak jest, wynikiem funkcji jest r\u00f3wnie\u017c null lub ParserResult.NULL. To zachowanie powinno by\u0107 obecne we wszystkich funkcjach.<\/p>\n<p>Nast\u0119pnie podejmowana jest pr\u00f3ba wygenerowania klucza dla \u017c\u0105danego obiektu. Mo\u017cliwe sygnatury s\u0105 analizowane. Je\u015bli parametr jest typu ParserResult.STRING, klucz jest generowany przy u\u017cyciu metody buildByNumberKey(&#8230;); w przypadku ParserResult.GUID u\u017cywana jest metoda buildPrimaryKey(&#8230;). Je\u015bli nie mo\u017cna oceni\u0107 sygnatury lub nie mo\u017cna okre\u015bli\u0107 klucza, nale\u017cy wy\u015bwietli\u0107 odpowiednie komunikaty o b\u0142\u0119dach.<\/p>\n<p>Po okre\u015bleniu klucza obiekt jest \u0142adowany zgodnie ze znanym schematem i pakowany jako ParserResult.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">protected ParserResult evaluate(ParserResult[] parameters)\n\nthrows ParserException {\n\n \n\n\/\/ retrieve parameter\n\nParserResult keyValue = parameters[0];\n\nif (keyValue.isNull()) {\n\nreturn ParserResult.NULL;\n\n}\n\n \n\n\/\/ build key\n\nbyte[] key = null;\n\nswitch (keyValue.getDatatype()) {\n\ncase ParserResult.STRING:\n\nkey = Book.buildByNumberKey(keyValue.getString());\n\nbreak;\n\ncase ParserResult.GUID:\n\nkey = Book.buildPrimaryKey(keyValue.getGuid());\n\nbreak;\n\ndefault:\n\nerrorMessage(\u201cinvalid argument type\u201d);\n\n}\n\nif (key == null) {\n\nerrorMessage(\u201cinternal error\u201d);\n\nreturn ParserResult.NULL;\n\n}\n\n \n\n\/\/ load object\n\nCisEnvironment        env = CisEnvironment.getInstance();\n\nCisObjectManager      om = env.getObjectManager();\n\nCisTransactionManager tm = env.getTransactionManager();\n\n \n\nbyte[] transactionGuid = tm.beginNew();\n\ntry {\n\nCisObject result = om.getObject(key);\n\n \n\nif (result != null) {\n\nreturn ParserResult.createCisObject(\n\n(CisObject)result.clone());\n\n} else {\n\nreturn ParserResult.NULL;\n\n}\n\n}\n\nfinally {\n\ntm.rollback(transactionGuid);\n\n}\n\n}<\/pre>\n<h5 id=\"metoda-create\" ><span class=\"ez-toc-section\" id=\"Metoda_create%E2%80%A6\"><\/span>Metoda create(&#8230;)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda create(\u2026) s\u0142u\u017cy do tworzenia nowej instancji klasy ParserExpression. Po tym, jak metoda getExpression(\u2026) utworzy prototyp obiektu ParserExpression, wszystkie kolejne instancje tej klasy s\u0105 tworzone w\u0142a\u015bnie poprzez wywo\u0142anie metody create(\u2026) na tym prototypie.<\/p>\n<p>Wa\u017cne jest, aby tworzenie nowej klasy odbywa\u0142o si\u0119 z wykorzystaniem mechanizmu refleksji (Classreflection), poniewa\u017c pozwala to uwzgl\u0119dni\u0107 ewentualne podmiany lub rozszerzenia klas.<\/p>\n<p>Przy takich podmianach nale\u017cy pami\u0119ta\u0107, \u017ce nowa klasa musi posiada\u0107 ten sam zestaw parametr\u00f3w w konstruktorze, co klasa oryginalna, aby mog\u0142a by\u0107 poprawnie utworzona przez mechanizm refleksji.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public ParserExpression create(int line, int col) {\n\n\/\/ must use class reflection to use\n\n\/\/ the correct class loader\n\ntry {\n\nClass loadExpression = CisClass.forName(\n\n\u201ccom.cisag.app.edu.log.BookFunctions\u201d +\n\n\u201c$LoadExpression\u201d);\n\nConstructor constuctor = loadExpression.getConstructor(\n\nnew Class[] {Integer.TYPE,Integer.TYPE});\n\nreturn (ParserExpression)constuctor.newInstance(\n\nnew Object[] {new Integer(line),\n\nnew Integer(col)});\n\n} catch (Exception ex) {\n\nthrow new CisRuntimeException(ex);\n\n}\n\n}<\/pre>\n<h5 id=\"metoda-getshortname\" ><span class=\"ez-toc-section\" id=\"Metoda_getShortName\"><\/span>Metoda getShortName()<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metoda zwraca nazw\u0119 funkcji, w tym przypadku <em>loadBook<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public String getShortName() {\n\nreturn NAMES[0];\n\n}<\/pre>\n<h3 id=\"zdarzenia\" ><span class=\"ez-toc-section\" id=\"Zdarzenia\"><\/span>Zdarzenia<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>System rozr\u00f3\u017cnia dwa rodzaje zdarze\u0144: zdarzenia jednostek biznesowych i zdarzenia zaprogramowane. Wyzwalanie zaprogramowanego zdarzenia jest wyra\u017anie zakodowane w logice programu aplikacji. Zdarzenia jednostki biznesowej s\u0105 wyzwalane niejawnie, gdy obiekt biznesowy jest zmieniany przez us\u0142ug\u0119 trwa\u0142o\u015bci.<\/p>\n<p>Podczas tworzenia definicji aktywno\u015bci definiowane s\u0105 zdarzenia, dla kt\u00f3rych maj\u0105 one generowa\u0107 dzia\u0142ania. Gdy zdarzenie jest wyzwalane, Workflow Engine sprawdza, czy definicja aktywno\u015bci powinna zareagowa\u0107 na zdarzenie i powiadamia odpowiednie definicje aktywno\u015bci.<\/p>\n<h4 id=\"uruchamianie-zdarzen\" ><span class=\"ez-toc-section\" id=\"Uruchamianie_zdarzen\"><\/span>Uruchamianie zdarze\u0144<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"0\" data-end=\"194\">Zdarzenia programowane s\u0105 definiowane w aplikacji <em>Obiekty deweloperskie<\/em> jako zdarzenia obiektu deweloperskiego.<br data-start=\"147\" data-end=\"150\" \/>W definicji takiego zdarzenia okre\u015bla si\u0119:<\/p>\n<ul data-start=\"195\" data-end=\"336\">\n<li data-start=\"195\" data-end=\"237\">\n<p data-start=\"197\" data-end=\"237\">jakie parametry ma ono przyjmowa\u0107<\/p>\n<\/li>\n<li data-start=\"238\" data-end=\"287\">\n<p data-start=\"240\" data-end=\"287\">w kt\u00f3rej bazie danych ma by\u0107 uruchamiane<\/p>\n<\/li>\n<li data-start=\"288\" data-end=\"336\">\n<p data-start=\"290\" data-end=\"336\">oraz czy maj\u0105 istnie\u0107 podtypy zdarzenia<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"338\" data-end=\"628\">Deweloperzy aplikacji definiuj\u0105 w kodzie, kiedy i w jakich warunkach dane zdarzenia maj\u0105 zosta\u0107 wywo\u0142ane.<br data-start=\"447\" data-end=\"450\" \/>Do ich uruchamiania s\u0142u\u017cy interfejs com.cisag.pgm.appserver.CisSystemManager, kt\u00f3ry udost\u0119pnia metod\u0119 fireEvent w kilku wariantach \u2013 z r\u00f3\u017cnymi zestawami parametr\u00f3w.<\/p>\n<p data-start=\"630\" data-end=\"748\">Za pomoc\u0105 tej metody uruchamiane jest zdarzenie, kt\u00f3re nast\u0119pnie jest przetwarzane przez silnik Workflow.<\/p>\n<p data-start=\"750\" data-end=\"813\">Minimalny zestaw parametr\u00f3w wymaganych przez metod\u0119 obejmuje:<\/p>\n<ul data-start=\"814\" data-end=\"960\" data-is-last-node=\"\" data-is-only-node=\"\">\n<li data-start=\"814\" data-end=\"886\">\n<p data-start=\"816\" data-end=\"886\">nazw\u0119 zdarzenia (nazwa obiektu deweloperskiego typu <em>Zdarzenia<\/em>),<\/p>\n<\/li>\n<li data-start=\"887\" data-end=\"960\" data-is-last-node=\"\">\n<p data-start=\"889\" data-end=\"960\" data-is-last-node=\"\">list\u0119 parametr\u00f3w przekazywanych do zdarzenia.<\/p>\n<\/li>\n<\/ul>\n<p>Wywo\u0142anie wygl\u0105da nastepujaco:<\/p>\n<p>fireEvent(String name, CisParameterList parameters).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">fireEvent(String name, CisParameterList parameters)<\/pre>\n<p>Nazwa jest w pe\u0142ni kwalifikowan\u0105 nazw\u0105 zdarzenia obiektu deweloperskiego, np. com.cisag.app.internal.log.SupportRequestNotification.<\/p>\n<p>Parametr przekazywany do metody, parameters, musi zawiera\u0107 wszystkie parametry, kt\u00f3re zosta\u0142y zdefiniowane w obiekcie deweloperskim typu zdarzenia. Lista parametr\u00f3w musi zawiera\u0107 wszystkie parametry zdefiniowane w obiekcie deweloperskim. Je\u015bli w zdarzeniu obiektu deweloperskiego zdefiniowano wi\u0119cej parametr\u00f3w ni\u017c jest dost\u0119pnych na li\u015bcie parametr\u00f3w przekazywanej do metody, zostanie zg\u0142oszony wyj\u0105tek. W zdarzeniu obiektu deweloperskiego mo\u017cna zdefiniowa\u0107 dwa typy parametr\u00f3w: parametry typu Business Object i typu logicznego typu danych. Parametry typu<\/p>\n<p>Business Object s\u0105 przekazywane do CisParameterList za pomoc\u0105 metody<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">setObject(String name, Object value)<\/pre>\n<p>jest ustawiony. Nazwa parametru ze zdarzenia obiektu deweloperskiego jest oczekiwana jako parametr name.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">com.cisag.app.internal.obj.SupportRequest boRequest=\u2026.; \nCisParameterList parameterList=new CisParameterList(); \nparameterList.setObject(\u201enewRequest\u201c, boRequest);<\/div><\/section><\/pre>\n<p>Je\u015bli do zdarzenia maj\u0105 zosta\u0107 przekazane typy prymitywne, nale\u017cy skorzysta\u0107 z odpowiednich metod klasy CisParameterList.<br \/>\nPrzyk\u0142adowo, dla typu danych String u\u017cywana jest metoda:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public void setString(String name, String value);\n<\/pre>\n<p>W obiekcie deweloperskim typu <em>Zdarzenia<\/em> takie typy proste s\u0105 definiowane jako parametry typu logicznego (logischer Datentyp).<\/p>\n<p>Zdarzenia mog\u0105 by\u0107 wywo\u0142ywane na r\u00f3\u017cnych bazach danych: OLTP, OLAP, repozytorium oraz konfiguracyjnych. Je\u015bli podczas wywo\u0142ania metody nie zostanie okre\u015blona \u017cadna baza danych, system domy\u015blnie wykorzystuje baz\u0119 OLTP.<\/p>\n<h4 id=\"podtypy-zdarzen\" ><span class=\"ez-toc-section\" id=\"Podtypy_zdarzen\"><\/span>Podtypy zdarze\u0144<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Niekt\u00f3re metody fireEvent oczekuj\u0105 kr\u00f3tkiej warto\u015bci jako dodatkowego parametru. S\u0142u\u017cy ona do identyfikacji podtypu zdarzenia. Obiekty wywo\u0142uj\u0105ce zdarzenia mog\u0105 by\u0107 typowane za pomoc\u0105 ValueSets, kt\u00f3rego warto\u015b\u0107 jest nast\u0119pnie przekazywana w celu identyfikacji podtypu metody. Podtypy s\u0105 u\u017cywane do ograniczenia liczby zdarze\u0144. Je\u015bli Na przyk\u0142ad, je\u015bli w aplikacji mo\u017cna wywo\u0142a\u0107 kilka r\u00f3\u017cnych zdarze\u0144, ale maj\u0105 one te same parametry, mo\u017cna u\u017cy\u0107 jednego zdarzenia za pomoc\u0105 podtyp\u00f3w.<\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-8286","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-interfejsy-techniczne"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=8286"}],"version-history":[{"count":14,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8286\/revisions"}],"predecessor-version":[{"id":39692,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8286\/revisions\/39692"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=8286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}