{"id":8684,"date":"2025-12-09T15:29:27","date_gmt":"2025-12-09T14:29:27","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=8684"},"modified":"2025-12-09T15:29:27","modified_gmt":"2025-12-09T14:29:27","slug":"rozwoj-aktualizacji-danych","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/","title":{"rendered":"Rozw\u00f3j aktualizacji danych"},"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\/rozwoj-aktualizacji-danych\/#Wymagania_wstepne\" >Wymagania wst\u0119pne<\/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\/rozwoj-aktualizacji-danych\/#Opis\" >Opis<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Aktualizacje_danych_w_tle\" >Aktualizacje danych w tle<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Szczegolne_zastosowanie_Aktualizacja_danych\" >Szczeg\u00f3lne zastosowanie Aktualizacja danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Szczegolne_zastosowanie_Aktualizacja_danych_w_tle\" >Szczeg\u00f3lne zastosowanie Aktualizacja danych w tle<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Dialogowe_aktualizacje_danych\" >Dialogowe aktualizacje danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Mozliwosc_wykonywania_aktualizacji_danych\" >Mo\u017cliwo\u015b\u0107 wykonywania aktualizacji danych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Uruchamianie_aktualizacji_danych_podczas_instalacji_aktualizacji_oprogramowania\" >Uruchamianie aktualizacji danych podczas instalacji aktualizacji oprogramowania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Uruchamianie_aktualizacji_danych_w_aplikacji_Zapytanie_o_aktualizacje_oprogramowania\" >Uruchamianie aktualizacji danych w aplikacji Zapytanie o aktualizacje oprogramowania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Status_wykonania\" >Status wykonania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Implementacja_aktualizacji_danych_w_tle\" >Implementacja aktualizacji danych w tle<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Metody_logiki_w_API\" >Metody logiki w API<\/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\/rozwoj-aktualizacji-danych\/#Przykladowa_struktura_aktualizacji_danych_w_tle\" >Przyk\u0142adowa struktura aktualizacji danych w tle<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Implementacja_rownoleglych_aktualizacji_danych\" >Implementacja r\u00f3wnoleg\u0142ych aktualizacji danych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Podzial_danych_na_bloki\" >Podzia\u0142 danych na bloki<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Rownolegle_przetwarzanie_blokow\" >R\u00f3wnoleg\u0142e przetwarzanie blok\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Scalenie_wynikow_przetwarzania\" >Scalenie wynik\u00f3w przetwarzania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Zakonczenie_przetwarzania\" >Zako\u0144czenie przetwarzania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Implementacja_dialogowych_aktualizacji_danych\" >Implementacja dialogowych aktualizacji danych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Metody_logiki_w_API-2\" >Metody logiki w API<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-aktualizacji-danych\/#Metody_GUI_w_API\" >Metody GUI w API<\/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\/rozwoj-aktualizacji-danych\/#Przykladowa_struktura_dialogowej_aktualizacji_danych\" >Przyk\u0142adowa struktura dialogowej aktualizacji danych<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p>Ten artyku\u0142 opisuje spos\u00f3b post\u0119powania przy implementacji aktualizacji danych. Szczeg\u00f3\u0142owo opisano, jak zbudowana jest struktura programu aktualizacji danych. Ponadto wyja\u015bniono r\u00f3\u017cnice mi\u0119dzy aktualizacjami danych uruchamianymi w trybie dialogowym i w tle.<\/p>\n<p>W artykule dotycz\u0105cym aplikacji <em>Zapytanie o aktualizacje danych<\/em> znajduj\u0105 si\u0119 dodatkowe informacje na temat sposobu wykonywania aktualizacji danych.<\/p>\n<h3 id=\"wymagania-wstepne\" ><span class=\"ez-toc-section\" id=\"Wymagania_wstepne\"><\/span>Wymagania wst\u0119pne<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Wymagana jest znajomo\u015b\u0107 aplikacji <em>Obiekty deweloperskie<\/em> oraz <em>Zapytanie o aktualizacje danych<\/em>, a tak\u017ce obiektu deweloperskiego typu <em>Aplikacja<\/em>.<\/p>\n<h3 id=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"691\" data-end=\"1001\">Aktualizacje danych to aplikacje, za pomoc\u0105 kt\u00f3rych mo\u017cna modyfikowa\u0107 dane dowolnych obiekt\u00f3w biznesowych. Ka\u017cda aktualizacja danych jest wykonywana dla wszystkich baz danych, kt\u00f3re zawieraj\u0105 dane obiekty biznesowe. Do uruchamiania aktualizacji danych nale\u017cy u\u017cywa\u0107 aplikacji <em>Zapytanie o aktualizacje danych<\/em>.<\/p>\n<p data-start=\"1003\" data-end=\"1569\">Aktualizacja danych jest rejestrowana jako aplikacja w aplikacji <em>Obiekty deweloperskie<\/em>. Na podstawie wpisanego g\u0142\u00f3wnego obiektu biznesowego definiuje si\u0119, na kt\u00f3rych bazach danych ma zosta\u0107 uruchomiona aktualizacja danych. Zale\u017cy to od tego, na kt\u00f3rej bazie danych dany obiekt biznesowy zosta\u0142 utworzony (baza OLTP, baza OLAP, baza repozytorium, baza konfiguracji). Aktualizacja danych nie musi jednak odnosi\u0107 si\u0119 wy\u0142\u0105cznie do wskazanego obiektu biznesowego. Dla aktualizacji danych pracuj\u0105cych na obiektach OLAP nale\u017cy wybra\u0107 obiekt OLTP pasuj\u0105cy do obiektu OLAP.<\/p>\n<p data-start=\"1571\" data-end=\"1611\">Istniej\u0105 r\u00f3\u017cne typy aktualizacji danych:<\/p>\n<ul>\n<li data-start=\"1614\" data-end=\"1731\">Aktualizacje danych w tle to aplikacje dzia\u0142aj\u0105ce w tle, kt\u00f3re mog\u0105 by\u0107 uruchamiane w zleceniach przetwarzania.<\/li>\n<li data-start=\"1734\" data-end=\"1929\">R\u00f3wnoleg\u0142e aktualizacje danych to aktualizacje danych w tle, w kt\u00f3rych dane s\u0105 przetwarzane r\u00f3wnolegle. Z regu\u0142y r\u00f3wnoleg\u0142e przetwarzanie wyra\u017anie skraca czas wykonania aktualizacji danych.<\/li>\n<li data-start=\"1932\" data-end=\"2091\">Dialogowe aktualizacje danych to aplikacje dialogowe, uruchamiane interaktywnie przez u\u017cytkownika. Mog\u0105 przed wykonaniem pobiera\u0107 od u\u017cytkownika parametry.<\/li>\n<\/ul>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u017celi to mo\u017cliwe, nale\u017cy stosowa\u0107 r\u00f3wnoleg\u0142e aktualizacje danych lub aktualizacje danych w tle, poniewa\u017c dzia\u0142aj\u0105 one w tle i nie blokuj\u0105 sesji dialogowej podczas wykonania.<\/div><\/section>\n<p data-start=\"2409\" data-end=\"2487\">Pomoc kontekstowa aktualizacji danych powinna zawiera\u0107 nast\u0119puj\u0105ce informacje:<\/p>\n<ul>\n<li data-start=\"2490\" data-end=\"2515\">cele aktualizacji danych<\/li>\n<li data-start=\"2518\" data-end=\"2573\">wymagania wst\u0119pne dla uruchomienia aktualizacji danych<\/li>\n<\/ul>\n<h4 id=\"aktualizacje-danych-w-tle\" ><span class=\"ez-toc-section\" id=\"Aktualizacje_danych_w_tle\"><\/span>Aktualizacje danych w tle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"2609\" data-end=\"2857\">Aktualizacje danych w tle s\u0105 aplikacjami dzia\u0142aj\u0105cymi w tle o szczeg\u00f3lnym zastosowaniu <em>Aktualizacja danych<\/em> lub <em>Aktualizacja danych w tle<\/em>. Aktualizacje danych w tle powinny znajdowa\u0107 si\u0119 w obszarze nazw <em>com.&lt;obszar nazw&gt;.app.update.log<\/em>.<\/p>\n<p data-start=\"2859\" data-end=\"3049\">W zale\u017cno\u015bci od ustawienia pola <em>Szczeg\u00f3lne zastosowanie<\/em> aktualizacje danych w tle s\u0105 uruchamiane w zleceniu przetwarzania albo automatycznie podczas instalacji aktualizacji oprogramowania.<\/p>\n<p data-start=\"2859\" data-end=\"3049\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u017celi to mo\u017cliwe, aktualizacje danych w tle powinny by\u0107 zawsze implementowane jako r\u00f3wnoleg\u0142a aktualizacja danych. Dalsze informacje znajduj\u0105 si\u0119 w rozdziale <em>Implementacja r\u00f3wnoleg\u0142ych aktualizacji danych<\/em>.<\/div><\/section><\/p>\n<p data-start=\"2859\" data-end=\"3049\">Aktualizacje danych powinny wymaga\u0107 uruchomienia tylko jednokrotnie. Aplikacje do regularnych korekt danych nale\u017cy implementowa\u0107 jako aplikacje dialogowe lub aplikacje w tle, a reorganizacje \u2014 jako aplikacje reorganizacyjne.<\/p>\n<h5 data-start=\"2859\" data-end=\"3049\" id=\"szczegolne-zastosowanie-aktualizacja-danych\" ><span class=\"ez-toc-section\" id=\"Szczegolne_zastosowanie_Aktualizacja_danych\"><\/span>Szczeg\u00f3lne zastosowanie <em>Aktualizacja danych<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2859\" data-end=\"3049\">Aktualizacje danych w tle o szczeg\u00f3lnym zastosowaniu <em>Aktualizacja danych<\/em> s\u0105 wykonywane podczas instalacji tej aktualizacji oprogramowania, kt\u00f3ra zawiera dan\u0105 aktualizacj\u0119 danych. W czasie wykonywania tych aktualizacji danych \u017caden u\u017cytkownik nie mo\u017ce zalogowa\u0107 si\u0119 do systemu.<\/p>\n<p data-start=\"3837\" data-end=\"3876\">Takie zachowanie ma nast\u0119puj\u0105ce zalety:<\/p>\n<ul>\n<li data-start=\"3879\" data-end=\"3931\">nie mo\u017cna zapomnie\u0107 o wykonaniu aktualizacji danych,<\/li>\n<li data-start=\"3934\" data-end=\"4020\">aktualizacja danych jest wykonywana, gdy \u017caden u\u017cytkownik nie jest aktywny w systemie,<\/li>\n<li data-start=\"4023\" data-end=\"4144\">aktualizacja danych jest z pewno\u015bci\u0105 wykonywana, zanim ewentualnie zmieniona logika aplikacji zacznie pracowa\u0107 na danych,<\/li>\n<li data-start=\"4147\" data-end=\"4216\">brak dodatkowej pracy podczas instalacji aktualizacji oprogramowania.<\/li>\n<\/ul>\n<p>Wad\u0105 jest to, \u017ce w czasie wykonywania aktualizacji danych \u017caden u\u017cytkownik nie mo\u017ce pracowa\u0107 w systemie. System jest podczas instalacji aktualizacji oprogramowania znacz\u0105co d\u0142u\u017cej niedost\u0119pny.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Szczeg\u00f3lne zastosowanie <em>Powtarzalna aktualizacja danych<\/em> nie mo\u017ce by\u0107 ju\u017c u\u017cywane.<\/div><\/section>\n<h5 data-start=\"2859\" data-end=\"3049\" id=\"szczegolne-zastosowanie-aktualizacja-danych-w-tle\" ><span class=\"ez-toc-section\" id=\"Szczegolne_zastosowanie_Aktualizacja_danych_w_tle\"><\/span>Szczeg\u00f3lne zastosowanie <em>Aktualizacja danych w tle<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"4611\" data-end=\"4835\">Aktualizacje danych w tle o szczeg\u00f3lnym zastosowaniu <em>Aktualizacja danych w tle<\/em> nie s\u0105 uruchamiane automatycznie, lecz musz\u0105 zosta\u0107 uruchomione w zleceniu przetwarzania za pomoc\u0105 aplikacji <em>Zapytanie o aktualizacje danych<\/em>.<\/p>\n<p data-start=\"4837\" data-end=\"4876\">Takie zachowanie ma nast\u0119puj\u0105ce zalety:<\/p>\n<ul>\n<li data-start=\"4879\" data-end=\"4951\">wykonanie aktualizacji danych mo\u017ce zosta\u0107 zaplanowane na dowolny moment,<\/li>\n<li data-start=\"4954\" data-end=\"5068\">aktualizacja danych wykonywana jest w tle podczas normalnej pracy, a wi\u0119c dost\u0119pno\u015b\u0107 systemu nie jest ograniczona.<\/li>\n<\/ul>\n<p>Wady:<\/p>\n<ul>\n<li data-start=\"5078\" data-end=\"5204\">nie ma ustalonego momentu wykonania aktualizacji danych; do czasu jej uruchomienia programy pracuj\u0105 na niepoprawionych danych,<\/li>\n<li data-start=\"5207\" data-end=\"5269\">wykonanie aktualizacji danych nie jest wymuszane przez system.<\/li>\n<\/ul>\n<h4 id=\"dialogowe-aktualizacje-danych\" ><span class=\"ez-toc-section\" id=\"Dialogowe_aktualizacje_danych\"><\/span>Dialogowe aktualizacje danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"5309\" data-end=\"5495\">Dialogowe aktualizacje danych s\u0105 aplikacjami dialogowymi o szczeg\u00f3lnym zastosowaniu <em>Aktualizacja danych<\/em>. Powinny znajdowa\u0107 si\u0119 w obszarze nazw <em>com.&lt;obszar nazw&gt;.app.update.ui.<\/em><\/p>\n<p data-start=\"5497\" data-end=\"5686\">Dialogowe aktualizacje danych mog\u0105 by\u0107 uruchamiane w aplikacji <em>Zapytanie o aktualizacje danych<\/em> wy\u0142\u0105cznie pojedynczo i interaktywnie. Umo\u017cliwiaj\u0105 wprowadzanie parametr\u00f3w poprzez interfejs.<\/p>\n<p data-start=\"5688\" data-end=\"5695\">Zaleta:<\/p>\n<ul>\n<li data-start=\"5688\" data-end=\"5695\">przed wykonaniem mo\u017cna wprowadzi\u0107 parametry.<\/li>\n<\/ul>\n<p data-start=\"5744\" data-end=\"5749\">Wady:<\/p>\n<ul>\n<li data-start=\"5752\" data-end=\"5922\">musz\u0105 by\u0107 uruchamiane pojedynczo, co w ka\u017cdym systemie, do kt\u00f3rego wgrywana jest odpowiednia aktualizacja oprogramowania, powoduje relatywnie wysoki nak\u0142ad pracy r\u0119cznej,<\/li>\n<li data-start=\"5925\" data-end=\"6145\">s\u0105 wykonywane w sesji interaktywnej; przy d\u0142ugim czasie wykonania przegl\u0105darka mo\u017ce zosta\u0107 zamkni\u0119ta albo po\u0142\u0105czenie mo\u017ce wygasn\u0105\u0107 i w takiej sytuacji u\u017cytkownik mo\u017ce nie m\u00f3c ju\u017c odczyta\u0107 istotnych komunikat\u00f3w,<\/li>\n<li data-start=\"6148\" data-end=\"6288\">do wprowadzania parametr\u00f3w mog\u0105 by\u0107 potrzebni u\u017cytkownicy merytoryczni, poniewa\u017c administrator cz\u0119sto nie jest w stanie okre\u015bli\u0107 parametr\u00f3w.<\/li>\n<\/ul>\n<p data-start=\"6360\" data-end=\"6500\">Je\u017celi aktualizacja danych nie wymaga wprowadzania parametr\u00f3w, zamiast dialogowej aktualizacji danych nale\u017cy u\u017cy\u0107 aktualizacji danych w tle.<\/p>\n<p data-start=\"6502\" data-end=\"6590\">Przy wyborze aktywnej bazy danych dla dialogowych aktualizacji danych nale\u017cy uwzgl\u0119dni\u0107:<\/p>\n<ul>\n<li data-start=\"6593\" data-end=\"6806\">je\u017celi jako wymagan\u0105 aktywn\u0105 baz\u0119 danych wybrano OLTP, aktualizacja danych mo\u017ce zosta\u0107 wykonana tylko na bazie danych bie\u017c\u0105cej sesji. Pr\u00f3ba wyboru innej po\u0142\u0105czonej bazy OLTP zostanie zablokowana komunikatem b\u0142\u0119du,<\/li>\n<li data-start=\"6809\" data-end=\"6995\">je\u017celi dialogowa aktualizacja danych ma zosta\u0107 wykonana na wszystkich bazach OLTP pod\u0142\u0105czonych do systemu, jako wymagana aktywna baza danych mo\u017ce by\u0107 wpisana wy\u0142\u0105cznie baza repozytorium.<\/li>\n<\/ul>\n<h4 id=\"mozliwosc-wykonywania-aktualizacji-danych\" ><span class=\"ez-toc-section\" id=\"Mozliwosc_wykonywania_aktualizacji_danych\"><\/span>Mo\u017cliwo\u015b\u0107 wykonywania aktualizacji danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aktualizacja danych nie mo\u017ce zosta\u0107 wykonana, je\u017celi wpisany obiekt biznesowy jest zablokowany przez zadanie deweloperskie lub przez instalacj\u0119 aktualizacji oprogramowania. Je\u017celi obiekt biznesowy jest jednostk\u0105 biznesow\u0105, sprawdzana jest blokada r\u00f3wnie\u017c wszystkich powi\u0105zanych zale\u017cno\u015bci. W przypadku zale\u017cno\u015bci sprawdzany jest wy\u0142\u0105cznie jej status blokady. Ograniczenie to jest konieczne, poniewa\u017c w takim stanie nie mo\u017cna okre\u015bli\u0107 stanu tabel bazy danych.<\/p>\n<h5 id=\"uruchamianie-aktualizacji-danych-podczas-instalacji-aktualizacji-oprogramowania\" ><span class=\"ez-toc-section\" id=\"Uruchamianie_aktualizacji_danych_podczas_instalacji_aktualizacji_oprogramowania\"><\/span>Uruchamianie aktualizacji danych podczas instalacji aktualizacji oprogramowania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"7631\" data-end=\"7878\">Je\u017celi aplikacja jest zablokowana przez zadanie deweloperskie, aktualizacja danych nie mo\u017ce zosta\u0107 wykonana, poniewa\u017c status po wykonaniu nie jest zapisywany. W konsekwencji nie mo\u017cna stwierdzi\u0107, czy aktualizacja danych zosta\u0142a wykonana poprawnie.<\/p>\n<p data-start=\"7880\" data-end=\"8235\">Je\u017celi klasa Java lub bezpo\u015brednio u\u017cywana klasa Java jest zablokowana przez zadanie deweloperskie, aktualizacja danych r\u00f3wnie\u017c nie mo\u017ce zosta\u0107 wykonana. Wymagana wersja klasy Java znajduje si\u0119 w zadaniu deweloperskim, a nie w systemie plik\u00f3w. W efekcie zosta\u0142aby u\u017cyta wersja poprzednia i nie mo\u017cna zagwarantowa\u0107 poprawnego wykonania aktualizacji danych.<\/p>\n<h5 data-start=\"7880\" data-end=\"8235\" id=\"uruchamianie-aktualizacji-danych-w-aplikacji-zapytanie-o-aktualizacje-oprogramowania\" ><span class=\"ez-toc-section\" id=\"Uruchamianie_aktualizacji_danych_w_aplikacji_Zapytanie_o_aktualizacje_oprogramowania\"><\/span>Uruchamianie aktualizacji danych w aplikacji <em>Zapytanie o aktualizacje oprogramowania<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"8321\" data-end=\"8491\">Je\u017celi aplikacja, klasa Java lub bezpo\u015brednio u\u017cywane przez ni\u0105 klasy Java s\u0105 zablokowane przez aktualizacj\u0119 oprogramowania, aktualizacja danych nie mo\u017ce zosta\u0107 wykonana.<\/p>\n<p data-start=\"8493\" data-end=\"8869\">Je\u017celi aplikacja jest zablokowana przez zadanie deweloperskie, klasa Java oraz bezpo\u015brednio u\u017cywane klasy Java mog\u0105 by\u0107 zablokowane wy\u0142\u0105cznie w tym samym zadaniu deweloperskim. Tylko wtedy jest zagwarantowane, \u017ce podczas wykonania zostanie u\u017cyty w\u0142a\u015bciwy stan klas. Ponadto status wykonania nie jest zapisywany. S\u0142u\u017cy to u\u0142atwieniu prac deweloperskich nad aktualizacj\u0105 danych.<\/p>\n<p data-start=\"8871\" data-end=\"9098\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u017celi u\u017cywana klasa Java jest zablokowana przez zadanie deweloperskie, aktualizacja danych w tle mo\u017ce zosta\u0107 wykonana wy\u0142\u0105cznie natychmiast na bie\u017c\u0105cym SAS. U\u017cytkownik musi zapewni\u0107, \u017ce bie\u017c\u0105cy SAS u\u017cywa w\u0142a\u015bciwego stanu klas.<\/p>\n<h4 data-start=\"8871\" data-end=\"9098\" id=\"status-wykonania\" ><span class=\"ez-toc-section\" id=\"Status_wykonania\"><\/span>Status wykonania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"24\" data-end=\"252\">Po wykonaniu aktualizacji danych status wykonania informuje o powodzeniu lub niepowodzeniu wykonania. Status wykonania jest zapisywany i wy\u015bwietlany w aplikacji <em>Zapytanie o aktualizacje danych<\/em>.<\/p>\n<p data-start=\"254\" data-end=\"296\">Dost\u0119pne s\u0105 nast\u0119puj\u0105ce statusy wykonania:<\/p>\n<ul>\n<li data-start=\"254\" data-end=\"296\"><strong>State.SUCCESS<\/strong> &#8212; wykonano pomy\u015blnie: aktualizacja danych zosta\u0142a wykonana bez b\u0142\u0119d\u00f3w<\/li>\n<li data-start=\"254\" data-end=\"296\"><strong>State.ABORTED_WITH_ERROR<\/strong> &#8212; przerwano z b\u0142\u0119dem: podczas wykonywania aktualizacji danych wyst\u0105pi\u0142 b\u0142\u0105d. Proces zosta\u0142 przerwany. Aktualizacj\u0119 danych nale\u017cy uruchomi\u0107 ponownie.<\/li>\n<li data-start=\"254\" data-end=\"296\"><strong>State.PROCESSED_WITH_ERROR<\/strong> &#8212; wykonano z b\u0142\u0119dem: podczas wykonywania aktualizacji danych wyst\u0105pi\u0142 b\u0142\u0105d. Proces nie zosta\u0142 przerwany.<\/li>\n<li data-start=\"254\" data-end=\"296\"><strong>State.NOT_CALLED<\/strong> &#8212; jeszcze nie wywo\u0142ano (domy\u015blnie): aktualizacja danych nie zosta\u0142a wykonana<\/li>\n<li data-start=\"254\" data-end=\"296\"><strong>State.INTERNAL_ERROR<\/strong> &#8212; wewn\u0119trzny, nieobs\u0142u\u017cony b\u0142\u0105d<\/li>\n<\/ul>\n<h4 id=\"implementacja-aktualizacji-danych-w-tle\" ><span class=\"ez-toc-section\" id=\"Implementacja_aktualizacji_danych_w_tle\"><\/span>Implementacja aktualizacji danych w tle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"941\" data-end=\"1233\">Abstrakcyjna klasa <em>com.cisag.pgm.base.CisUpdateBatchApplication<\/em> jest klas\u0105 bazow\u0105 dla wszystkich aktualizacji danych w tle. Dla ka\u017cdej bazy danych wywo\u0142ywana jest metoda <em>execute<\/em>, w kt\u00f3rej wykonywane s\u0105 w\u0142a\u015bciwe dzia\u0142ania. Metoda <em>execute<\/em> jest abstrakcyjna i musi zosta\u0107 zaimplementowana.<\/p>\n<p data-start=\"1235\" data-end=\"1384\">W klasie bazowej dost\u0119pny jest obiekt <em>CisEnviroment<\/em>,\u00a0z kt\u00f3rego mo\u017cna korzysta\u0107 (<em>MessageManager<\/em>, <em>SystemManager<\/em>, <em>ObjectManager, TransactionManager<\/em>).<\/p>\n<p data-start=\"1386\" data-end=\"1623\">Podczas implementacji aktualizacji danych w tle nale\u017cy dok\u0142adnie sprawdzi\u0107, czy nie lepiej zrealizowa\u0107 jej jako r\u00f3wnoleg\u0142ej aktualizacji danych. Dalsze informacje znajduj\u0105 si\u0119 w rozdziale <em>Implementacja r\u00f3wnoleg\u0142ych aktualizacji danych<\/em>.<\/p>\n<h5 data-start=\"1386\" data-end=\"1623\" id=\"metody-logiki-w-api\" ><span class=\"ez-toc-section\" id=\"Metody_logiki_w_API\"><\/span>Metody logiki w API<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1386\" data-end=\"1623\"><em>protected abstract short execute();<\/em><\/p>\n<p data-start=\"1705\" data-end=\"1963\">W metodzie <em>execute<\/em> wykonywana jest aktualizacja danych. Je\u017celi g\u0142\u00f3wna encja biznesowa aktualizacji danych znajduje si\u0119 w bazie OLTP, w\u00f3wczas <em>execute <\/em>jest wywo\u0142ywane osobno dla ka\u017cdej bazy OLTP \u2014 ka\u017cdorazowo w odpowiedniej sesji.<\/p>\n<p data-start=\"1965\" data-end=\"2304\">W zwi\u0105zku z tym w implementacji metody <em>execute <\/em>mo\u017cna m.in. zak\u0142ada\u0107 istnienie transakcji typu dummy. Za pomoc\u0105 warto\u015bci zwracanej mo\u017cna przekaza\u0107 status wykonania (czy aktualizacja danych przebieg\u0142a pomy\u015blnie, czy wyst\u0105pi\u0142 b\u0142\u0105d). Metoda<em> protected <\/em><em>short getState( )<\/em> umo\u017cliwia odczyt dotychczasowego statusu wykonania aktualizacji danych.<\/p>\n<p data-start=\"2306\" data-end=\"2720\">Metoda <em>protected void setMultipleAllowed(short allowed)<\/em> ustawia status wywo\u0142ania aktualizacji danych. Pozwala to sterowa\u0107 tym, czy aktualizacja danych mo\u017ce zosta\u0107 uruchomiona jednokrotnie, czy wielokrotnie.<br data-start=\"2514\" data-end=\"2517\" \/>Przyk\u0142ad: je\u017celi aktualizacja danych zako\u0144czy si\u0119 powodzeniem, nie ma potrzeby uruchamiania jej ponownie. Je\u017celi jednak wyst\u0105pi b\u0142\u0105d, powinna istnie\u0107 mo\u017cliwo\u015b\u0107 ponownego uruchomienia aktualizacji danych.<\/p>\n<ul>\n<li data-start=\"2724\" data-end=\"2788\">Wielokrotne wywo\u0142anie (domy\u015blnie): <em>MultipleCalls.ALLOWED<\/em><\/li>\n<li data-start=\"2791\" data-end=\"2845\">Jednorazowe wywo\u0142anie: <em>MultipleCalls.NOT_ALLOWED<\/em><\/li>\n<\/ul>\n<p data-start=\"2847\" data-end=\"3344\">Metoda <em>protected void setParameterList(CisParameterList parameters)<\/em> umo\u017cliwia zapisanie informacji wykonawczych (runtime) aktualizacji danych. Zawarto\u015b\u0107 listy jest zapisywana. Dzi\u0119ki temu np. w przypadku b\u0142\u0119du mo\u017cna zapisa\u0107 w li\u015bcie parametr\u00f3w dane, kt\u00f3re przy ponownym uruchomieniu aktualizacji danych zostan\u0105 wczytane i przeanalizowane. Pozwala to np. okre\u015bli\u0107, w kt\u00f3rym miejscu nale\u017cy kontynuowa\u0107 aktualizacj\u0119 danych albo dla kt\u00f3rej bazy danych aktualizacja danych zako\u0144czy\u0142a si\u0119 powodzeniem.<\/p>\n<p data-start=\"3346\" data-end=\"3440\">Wcze\u015bniej zapisane dane mo\u017cna odczyta\u0107 metod\u0105 protected <em>CisParameterList getParameterList()<\/em>.<\/p>\n<h5 data-start=\"3346\" data-end=\"3440\" id=\"przykladowa-struktura-aktualizacji-danych-w-tle\" ><span class=\"ez-toc-section\" id=\"Przykladowa_struktura_aktualizacji_danych_w_tle\"><\/span>Przyk\u0142adowa struktura aktualizacji danych w tle<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><em>public class UPD.. extends CisUpdateBatchApplication {<\/em><br \/>\n<em>public UPD..() {<\/em><br \/>\n<em>}<\/em><br \/>\n<em>\/\/ Wykonywanie aktualizacji danych<\/em><br \/>\n<em>public short execute() {<\/em><br \/>\n<em>\/\/ Zainicjalizowa\u0107 status aktualizacji danych<\/em><br \/>\n<em>short result = STATE_SUCCESS;<\/em><br \/>\n<em>setMultipleAllowed( MULTICALL_NOT_ALLOWED );<\/em><br \/>\n<em>\/\/ Otworzy\u0107 transakcj\u0119<\/em><br \/>\n<em>byte[] tmGuid = tm.beginNew();<\/em><br \/>\n<em>try {<\/em><br \/>\n<em>\/\/ Kod aktualizacji<\/em><br \/>\n<em>\/\/ w przypadku b\u0142\u0119du:<\/em><br \/>\n<em>\/\/result = STATE.ABORTED_WITH_ERROR;<\/em><br \/>\n<em>\/\/lub STATE.PROCESSED_WITH_ERROR;<\/em><br \/>\n<em>\/\/setMultipleAllowed(MULTICALL_ALLOWED);<\/em><br \/>\n<em>\/\/koniec obs\u0142ugi b\u0142\u0119du<\/em><\/p>\n<p><em>tm.commit(tmGuid);<\/em><br \/>\n<em>} catch (RuntimeException ex) {<\/em><br \/>\n<em>tm.rollback(tmGuid);<\/em><br \/>\n<em>\/\/w zale\u017cno\u015bci od b\u0142\u0119du ustawi\u0107 odpowiedni status<\/em><br \/>\n<em>result = STATE_ABORTED_WITH_ERROR;<\/em><br \/>\n<em>\/\/lub STATE_PROCESSED_WITH_ERROR<\/em><br \/>\n<em>\/\/lub INTERNAL_ERROR;<\/em><br \/>\n<em>setMultipleAllowed(MULTICALL_ALLOWED);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>return result;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><\/p>\n<h4 id=\"implementacja-rownoleglych-aktualizacji-danych\" ><span class=\"ez-toc-section\" id=\"Implementacja_rownoleglych_aktualizacji_danych\"><\/span>Implementacja r\u00f3wnoleg\u0142ych aktualizacji danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"55\" data-end=\"307\">R\u00f3wnoleg\u0142a aktualizacja danych jest aktualizacj\u0105 danych w tle, kt\u00f3ra jest wykonywana w wielu w\u0105tkach. Dzi\u0119ki takiemu r\u00f3wnoleg\u0142emu wykonywaniu mo\u017cliwe jest lepsze wykorzystanie sprz\u0119tu, a czas wykonania aktualizacji danych mo\u017ce zosta\u0107 znacz\u0105co skr\u00f3cony.<\/p>\n<p data-start=\"309\" data-end=\"772\">R\u00f3wnoleg\u0142e aktualizacje danych szczeg\u00f3lnie dobrze nadaj\u0105 si\u0119 do jednakowych i niezale\u017cnych zmian w wielu rekordach danych. Kolejno\u015b\u0107 przetwarzania rekord\u00f3w danych w przypadku r\u00f3wnoleg\u0142ej aktualizacji danych nie mo\u017ce by\u0107 zagwarantowana. Je\u017celi istniej\u0105 zale\u017cno\u015bci pomi\u0119dzy modyfikowanymi rekordami danych lub kolejno\u015b\u0107 przetwarzania ma znaczenie, w\u00f3wczas realizacja jako r\u00f3wnoleg\u0142a aktualizacja danych mo\u017ce by\u0107 w pewnych okoliczno\u015bciach trudna albo nie mie\u0107 sensu.<\/p>\n<p data-start=\"844\" data-end=\"914\">R\u00f3wnoleg\u0142a aktualizacja danych jest wykonywana w nast\u0119puj\u0105cych fazach:<\/p>\n<ol>\n<li data-start=\"918\" data-end=\"958\">Podzia\u0142 danych na bloki (metoda <em>start()<\/em>)<\/li>\n<li data-start=\"962\" data-end=\"1012\">R\u00f3wnoleg\u0142e przetwarzanie blok\u00f3w (metoda <em>process()<\/em>)<\/li>\n<li data-start=\"1016\" data-end=\"1064\">Scalenie wynik\u00f3w przetwarzania (metoda<em> finish()<\/em>)<\/li>\n<li data-start=\"1068\" data-end=\"1108\">Zako\u0144czenie przetwarzania (metoda <em>end()<\/em>)<\/li>\n<\/ol>\n<p data-start=\"1110\" data-end=\"1251\">Od tych faz nie mo\u017cna odst\u0105pi\u0107 w implementacji. Mo\u017cna jednak dowolnie modyfikowa\u0107 dane zar\u00f3wno w metodzie<em> start()<\/em>, jak i w metodzie<em> finish()<\/em>.<\/p>\n<p data-start=\"1253\" data-end=\"1649\">Abstrakcyjna klasa <em>com.cisag.pgm.base.CisUpdateSubJobApplication<\/em> jest klas\u0105 bazow\u0105 dla wszystkich r\u00f3wnoleg\u0142ych aktualizacji danych. Klasa ta dziedziczy po klasie <em>com.cisag.pgm.base.CisUpdateBatchApplication<\/em>. Dzi\u0119ki temu wszystkie funkcje aktualizacji danych w tle s\u0105 dost\u0119pne r\u00f3wnie\u017c w r\u00f3wnoleg\u0142ej aktualizacji danych. W tym rozdziale opisano wy\u0142\u0105cznie specyfik\u0119 r\u00f3wnoleg\u0142ych aktualizacji danych.<\/p>\n<p data-start=\"1253\" data-end=\"1649\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Nale\u017cy pami\u0119ta\u0107, \u017ce dla ka\u017cdej fazy i ka\u017cdego w\u0105tku podczas r\u00f3wnoleg\u0142ego wykonywania tworzona jest osobna instancja aktualizacji danych. Nie wolno i nie jest mo\u017cliwe przekazywanie danych pomi\u0119dzy fazami i przetwarzaniem za pomoc\u0105 zmiennych instancji.<\/div><\/section><\/p>\n<p data-start=\"1253\" data-end=\"1649\">Za pomoc\u0105 metody <em>getParameterList()<\/em> mo\u017cna wymienia\u0107 dane pomi\u0119dzy metodami <em>start(), finish()<\/em> oraz <em>end()<\/em>. Nale\u017cy pami\u0119ta\u0107, \u017ce zawarto\u015b\u0107 listy parametr\u00f3w jest trwa\u0142a. Oznacza to, \u017ce lista parametr\u00f3w w metodzie <em>start()<\/em> nie musi by\u0107 pusta, lecz mo\u017ce zawiera\u0107 warto\u015bci z poprzedniego wykonania aktualizacji danych.<\/p>\n<h5 data-start=\"1253\" data-end=\"1649\" id=\"podzial-danych-na-bloki\" ><span class=\"ez-toc-section\" id=\"Podzial_danych_na_bloki\"><\/span>Podzia\u0142 danych na bloki<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1253\" data-end=\"1649\">Nale\u017cy nadpisa\u0107 metod\u0119 <em>start()<\/em>, aby podzieli\u0107 przetwarzane dane na mniejsze bloki. W zale\u017cno\u015bci od przypadku u\u017cycia trzeba dobra\u0107 odpowiedni spos\u00f3b podzia\u0142u danych. Metoda <em>void submitJob(CisUpdateSubJobParameter block<\/em>) s\u0142u\u017cy do przekazania bloku do przetwarzania. Do opisania zakresu bloku nale\u017cy u\u017cy\u0107 klasy <em>CisUpdateSubJobParameter<\/em>. W tej klasie metod\u0105 <em>getParameters()<\/em> mo\u017cna zapisa\u0107 dowolne dane w <em>CisParameterList<\/em>.<\/p>\n<p data-start=\"2693\" data-end=\"2976\">Dane nale\u017cy dzieli\u0107 na bloki o czasie wykonania wynosz\u0105cym co najmniej kilka sekund. Je\u017celi bloki maj\u0105 zbyt kr\u00f3tki czas wykonania, narzut zwi\u0105zany z zr\u00f3wnolegleniem zniweluje korzy\u015bci. Je\u017celi pojedyncze bloki maj\u0105 zbyt d\u0142ugi czas wykonania, korzy\u015b\u0107 z zr\u00f3wnoleglenia b\u0119dzie ograniczona.<\/p>\n<p data-start=\"2978\" data-end=\"3014\">Mo\u017cliwo\u015bci podzia\u0142u danych na bloki:<\/p>\n<ul>\n<li data-start=\"3017\" data-end=\"3316\"><strong data-start=\"3017\" data-end=\"3037\">Lista z GUID<\/strong> &#8212; lista parametr\u00f3w bloku zawiera list\u0119 GUID-\u00f3w instancji obiekt\u00f3w biznesowych, kt\u00f3re maj\u0105 zosta\u0107 zmienione. Listy w blokach maj\u0105 ograniczony rozmiar. Podzia\u0142 na listy GUID-\u00f3w jest \u0142atwy do zaimplementowania, ale w zale\u017cno\u015bci od liczby GUID-\u00f3w mo\u017ce powodowa\u0107 pewien narzut.<\/li>\n<li data-start=\"3319\" data-end=\"3611\"><strong data-start=\"3319\" data-end=\"3362\">Podzia\u0142 wed\u0142ug kryteri\u00f3w merytorycznych\u00a0<\/strong>&#8212; bloki mog\u0105 by\u0107 tworzone wed\u0142ug kryteri\u00f3w merytorycznych, np. rodzaj\u00f3w zlece\u0144, magazyn\u00f3w, organizacji itp. Podzia\u0142 wed\u0142ug kryterium merytorycznego mo\u017ce prowadzi\u0107 do bardzo nier\u00f3wnych rozmiar\u00f3w blok\u00f3w, np. gdy klient u\u017cywa tylko jednej organizacji.<\/li>\n<li data-start=\"3614\" data-end=\"3885\"><strong data-start=\"3614\" data-end=\"3669\">Podzia\u0142 wed\u0142ug przedzia\u0142\u00f3w czasowych, np. kwarta\u0142\u00f3w\u00a0<\/strong>&#8212; podzia\u0142 przetwarzania wed\u0142ug przedzia\u0142\u00f3w czasowych mo\u017ce by\u0107 szczeg\u00f3lnie sensowny w przypadku danych ruchu. Okresy szczytowe, takie jak np. sezon \u015bwi\u0105teczny, r\u00f3wnie\u017c mog\u0105 prowadzi\u0107 do nier\u00f3wnych rozmiar\u00f3w blok\u00f3w.<\/li>\n<\/ul>\n<p data-start=\"3887\" data-end=\"4094\">Warto\u015bci\u0105 zwracan\u0105 metody <em>start()<\/em> jest status wykonania. Ka\u017cda warto\u015b\u0107 inna ni\u017c <em>State.SUCCESS<\/em> przerywa dalsze przetwarzanie. Wyj\u0105tk\u00f3w zasadniczo nie nale\u017cy przechwytywa\u0107, lecz przekazywa\u0107 dalej.<\/p>\n<p data-start=\"4096\" data-end=\"4133\" data-is-last-node=\"\" data-is-only-node=\"\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad implementacji metody <em>start()<\/em><\/p>\n<p data-start=\"4096\" data-end=\"4133\" data-is-last-node=\"\" data-is-only-node=\"\"><em>short start() {<\/em><br \/>\n<em>CisResultSet rs=null;<\/em><br \/>\n<em>try {<\/em><br \/>\n<em>final int BLOCK_SIZE = 1000;<\/em><br \/>\n<em>CisList guids = new CisArrayList(BLOCK_SIZE);<\/em><br \/>\n<em>CisUpdateSubJobParameter block = new CisUpdateSubJobParameter();<\/em><br \/>\n<em>rs = om.getResultSet(&#8222;SELECT &#8230;&#8221;);<\/em><br \/>\n<em>while (rs.next()) {<\/em><br \/>\n<em>byte[] guid = rs.getGuid(1);<\/em><br \/>\n<em>guids.add(guid);<\/em><br \/>\n<em>if (guids.size()&gt;=BLOCK_SIZE) {<\/em><br \/>\n<em>block.getParameters().setCisList(&#8222;guids&#8221;, guids);<\/em><br \/>\n<em>submitJob(block);<\/em><br \/>\n<em>guids.clear();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><br \/>\n<em>if (guids.size()&gt;0) {<\/em><br \/>\n<em>block.getParameters().setCisList(&#8222;guids&#8221;, guids);<\/em><br \/>\n<em>submitJob(block);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>} catch (SQLException e) {<\/em><br \/>\n<em>throw new RuntimeException(e);<\/em><br \/>\n<em>}finally{<\/em><br \/>\n<em>if(rs!=null){<\/em><br \/>\n<em>rs.close();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><br \/>\n<em>return CisUpdateApplicationConstants.State.SUCCESS;<\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h5 data-start=\"4096\" data-end=\"4133\" id=\"rownolegle-przetwarzanie-blokow\" ><span class=\"ez-toc-section\" id=\"Rownolegle_przetwarzanie_blokow\"><\/span>R\u00f3wnoleg\u0142e przetwarzanie blok\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"42\" data-end=\"198\">Bloki, kt\u00f3re zosta\u0142y podzielone przez metod\u0119 <em>start(),<\/em> s\u0105 przetwarzane w metodzie <em>process()<\/em>. Zawarto\u015b\u0107 ka\u017cdego bloku jest opisana za pomoc\u0105 listy parametr\u00f3w.<\/p>\n<p data-start=\"200\" data-end=\"381\">Ka\u017cdy blok ma oddzielny status wykonania, kt\u00f3ry jest ustawiany przez warto\u015b\u0107 zwracan\u0105 metody <em>process()<\/em>. Ka\u017cda warto\u015b\u0107 zwracana inna ni\u017c <em>SUCCESS<\/em> przerywa dalsze przetwarzanie blok\u00f3w.<\/p>\n<p data-start=\"383\" data-end=\"660\">Lista parametr\u00f3w w klasie <em>CisUpdateSubJobParameter<\/em> mo\u017ce zosta\u0107 zmieniona w metodzie <em>process()<\/em>, aby przekaza\u0107 informacje do metody <em>finish()<\/em>. Za pomoc\u0105 tej listy parametr\u00f3w mo\u017cna na przyk\u0142ad przekaza\u0107, ile obiekt\u00f3w w danym bloku zosta\u0142o przetworzonych pomy\u015blnie, a ile z b\u0142\u0119dami.<\/p>\n<p data-start=\"383\" data-end=\"660\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad implementacji metody <em>process()<\/em>:<\/p>\n<p data-start=\"383\" data-end=\"660\"><em>short process(CisUpdateSubJobParameter x) {<\/em><br \/>\n<em>CisList guids = x.getParameters().getCisList(&#8222;guids&#8221;);<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>x.getParameters().setInt(\u201cobjects\u201c,objectCount);<\/em><br \/>\n<em>x.getParameters().setInt(\u201cerrors\u201c,errorCount);<\/em><br \/>\n<em>return CisUpdateApplicationConstants.State.SUCCESS;<\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h5 data-start=\"383\" data-end=\"660\" id=\"scalenie-wynikow-przetwarzania\" ><span class=\"ez-toc-section\" id=\"Scalenie_wynikow_przetwarzania\"><\/span>Scalenie wynik\u00f3w przetwarzania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"41\" data-end=\"545\">W metodzie<em> finish()<\/em> wyniki przetwarzania wszystkich blok\u00f3w s\u0105 scalane. Domy\u015blna implementacja tej metody ustala status aktualizacji danych na podstawie status\u00f3w przetwarzania poszczeg\u00f3lnych blok\u00f3w. Je\u017celi tylko jeden blok ma warto\u015b\u0107 inn\u0105 ni\u017c <em>SUCCESS<\/em>, metoda <em>finish()<\/em> przerywa dzia\u0142anie i zwraca pierwsz\u0105 warto\u015b\u0107 r\u00f3\u017cn\u0105 od <em>SUCCESS<\/em>. Warto\u015b\u0107 zwracana metody <em>finish()<\/em> staje si\u0119 statusem wykonania aktualizacji danych. Metoda <em>finish()<\/em> nie jest wywo\u0142ywana, je\u017celi metoda <em>start()<\/em> zwr\u00f3ci warto\u015b\u0107 inn\u0105 ni\u017c<em> SUCCESS<\/em>.<\/p>\n<p data-start=\"547\" data-end=\"1031\">Metod\u0119 <em>finish()<\/em> mo\u017cna nadpisa\u0107, aby zaimplementowa\u0107 rozszerzon\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w albo aby po r\u00f3wnoleg\u0142ym przetwarzaniu wykona\u0107 dalsze kroki aktualizacji danych. Do metody <em>finish()<\/em> przekazywane s\u0105 <em>CisUpdateSubJobParameter<\/em> dla wszystkich przetworzonych blok\u00f3w. Lista parametr\u00f3w bloku mo\u017ce zawiera\u0107 dodatkowe informacje z metody <em>process()<\/em>. W li\u015bcie parametr\u00f3w mo\u017ce by\u0107 na przyk\u0142ad podane, ile obiekt\u00f3w zosta\u0142o przetworzonych pomy\u015blnie, a ile z b\u0142\u0119dami w danym bloku przez metod\u0119 <em>process()<\/em>.<\/p>\n<h4 data-start=\"547\" data-end=\"1031\" id=\"zakonczenie-przetwarzania\" ><span class=\"ez-toc-section\" id=\"Zakonczenie_przetwarzania\"><\/span>Zako\u0144czenie przetwarzania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"547\" data-end=\"1031\">Metoda <em>end()<\/em> jest wywo\u0142ywana na ko\u0144cu przy ka\u017cdym wykonaniu aktualizacji danych. Metod\u0119 mo\u017cna nadpisa\u0107, aby w razie potrzeby posprz\u0105ta\u0107 dane tymczasowe. Nie mo\u017cna zagwarantowa\u0107, \u017ce <em>end()<\/em> zostanie zawsze wywo\u0142ana. Je\u017celi na przyk\u0142ad serwer aplikacji zostanie zatrzymany podczas wykonywania aktualizacji danych, w\u00f3wczas <em>end()<\/em> mo\u017ce ju\u017c nie zosta\u0107 wywo\u0142ana.<\/p>\n<h4 data-start=\"547\" data-end=\"1031\" id=\"implementacja-dialogowych-aktualizacji-danych\" ><span class=\"ez-toc-section\" id=\"Implementacja_dialogowych_aktualizacji_danych\"><\/span>Implementacja dialogowych aktualizacji danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1557\" data-end=\"2153\">Abstrakcyjna klasa <em>com.cisag.pgm.base.UpdateApplication<\/em> jest klas\u0105 bazow\u0105 dla wszystkich dialogowych aktualizacji danych. W tej klasie sterowany jest przebieg dialogowej aktualizacji danych. Ka\u017cda baza danych, na kt\u00f3rej ma zosta\u0107 uruchomiona aktualizacja danych, jest rozpatrywana osobno. Najpierw wywo\u0142ywana jest metoda <em>checkPreConditions<\/em> \u2014 tutaj sprawdzane jest, czy aktualizacja danych mo\u017ce zosta\u0107 wykonana na danej bazie danych. Po pomy\u015blnej weryfikacji wywo\u0142ywana jest metoda <em>execute<\/em>, w kt\u00f3rej wykonywane s\u0105 w\u0142a\u015bciwe dzia\u0142ania. S\u0105 to metody abstrakcyjne, kt\u00f3re musz\u0105 zosta\u0107 zaimplementowane.<\/p>\n<p data-start=\"2155\" data-end=\"2503\">Kolejnym elementem tej klasy bazowej jest prosta aplikacja interfejsu u\u017cytkownika, kt\u00f3ra zawiera przycisk uruchomienia na standardowym pasku narz\u0119dzi oraz opis aktualizacji danych (pomoc kontekstowa aplikacji). Interfejs mo\u017ce zosta\u0107 dowolnie rozszerzony. Jest to konieczne na przyk\u0142ad wtedy, gdy wymagane s\u0105 okre\u015blone dane wej\u015bciowe od u\u017cytkownika.<\/p>\n<p data-start=\"2505\" data-end=\"2651\" data-is-last-node=\"\" data-is-only-node=\"\">W klasie bazowej dost\u0119pny jest obiekt <em>CisEnviroment<\/em>, z kt\u00f3rego mo\u017cna korzysta\u0107 (<em>MessageManager, SystemManager, ObjectManager, TransactionManager<\/em>).<\/p>\n<h5 data-start=\"2505\" data-end=\"2651\" id=\"metody-logiki-w-api\" ><span class=\"ez-toc-section\" id=\"Metody_logiki_w_API-2\"><\/span>Metody logiki w API<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2505\" data-end=\"2651\" data-is-last-node=\"\" data-is-only-node=\"\"><em>protected abstract boolean checkPreConditions(byte[] databaseGuid)<\/em><\/p>\n<p data-start=\"2505\" data-end=\"2651\" data-is-last-node=\"\" data-is-only-node=\"\">W tej metodzie mo\u017cna sprawdzi\u0107 warunki wst\u0119pne, czy aktualizacja danych mo\u017ce zosta\u0107 wykonana na bie\u017c\u0105cej bazie danych. Przekazana GUID jest identyfikatorem GUID bazy danych. Wszystkie transakcje powinny by\u0107 otwierane z u\u017cyciem tej GUID, aby transakcja nie odwo\u0142ywa\u0142a si\u0119 za ka\u017cdym razem do aktywnej bazy OLTP. Przyk\u0142adowo, <em>tm.beginNew(databaseGuid)<\/em>. Tylko je\u017celi w tej metodzie spe\u0142nione s\u0105 wszystkie warunki, aktualizacja danych mo\u017ce zosta\u0107 wykonana.<\/p>\n<p data-start=\"2505\" data-end=\"2651\" data-is-last-node=\"\" data-is-only-node=\"\"><em>protected abstract short execute(byte[] databaseGuid)<\/em><\/p>\n<p data-start=\"550\" data-end=\"887\">W metodzie execute wykonywana jest aktualizacja danych. R\u00f3wnie\u017c tutaj wszystkie transakcje powinny by\u0107 otwierane z u\u017cyciem przekazanej GUID bazy danych. Za pomoc\u0105 warto\u015bci zwracanej mo\u017cna przekaza\u0107 status wykonania: czy aktualizacja danych przebieg\u0142a pomy\u015blnie, czy wyst\u0105pi\u0142 b\u0142\u0105d.<\/p>\n<p data-start=\"889\" data-end=\"972\">Status wykonania mo\u017cna ustawi\u0107 r\u00f3wnie\u017c metod\u0105 <em>protected void setState(short state)<\/em>.<\/p>\n<p data-start=\"974\" data-end=\"1064\">Metod\u0105 <em>protected short getState()<\/em> mo\u017cna odczyta\u0107 dotychczasowy status aktualizacji danych.<\/p>\n<p data-start=\"1066\" data-end=\"1469\">Metoda <em>protected void setMultipleAllowed(short allowed)<\/em> ustawia status wywo\u0142ania aktualizacji danych.<br data-start=\"1167\" data-end=\"1170\" \/>Pozwala to sterowa\u0107 tym, czy aktualizacja danych mo\u017ce zosta\u0107 uruchomiona jednorazowo czy wielokrotnie. Przyk\u0142adowo, je\u017celi aktualizacja danych zako\u0144czy si\u0119 powodzeniem, nie trzeba jej uruchamia\u0107 ponownie. Je\u017celi jednak wyst\u0105pi b\u0142\u0105d, powinna istnie\u0107 mo\u017cliwo\u015b\u0107 ponownego uruchomienia aktualizacji danych.<\/p>\n<ul>\n<li data-start=\"1473\" data-end=\"1527\">Wywo\u0142anie wielokrotne (domy\u015blnie): <em>MULTICALL_ALLOWED<\/em><\/li>\n<li data-start=\"1530\" data-end=\"1574\">Wywo\u0142anie jednorazowe: <em>MULTICALL_NOT_ALLOWED<\/em><\/li>\n<\/ul>\n<p data-start=\"1576\" data-end=\"2073\">Metoda <em>protected void setParameterList(CisParameterList parameters)<\/em> umo\u017cliwia zapisanie informacji wykonawczych aktualizacji danych. Zawarto\u015b\u0107 listy jest zapisywana. Dzi\u0119ki temu np. w przypadku b\u0142\u0119du mo\u017cna zapisa\u0107 w li\u015bcie parametr\u00f3w dane, kt\u00f3re przy ponownym uruchomieniu aktualizacji danych zostan\u0105 wczytane i przeanalizowane. Pozwala to m.in. okre\u015bli\u0107, w kt\u00f3rym miejscu nale\u017cy kontynuowa\u0107 aktualizacj\u0119 danych albo na kt\u00f3rej bazie danych aktualizacja danych zako\u0144czy\u0142a si\u0119 powodzeniem.<\/p>\n<p data-start=\"2075\" data-end=\"2167\">Wcze\u015bniej zapisane dane mo\u017cna odczyta\u0107 metod\u0105 <em>protected CisParameterList getParameterList()<\/em>.<\/p>\n<h5 data-start=\"2075\" data-end=\"2167\" id=\"metody-gui-w-api\" ><span class=\"ez-toc-section\" id=\"Metody_GUI_w_API\"><\/span>Metody GUI w API<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2202\" data-end=\"2378\"><em>protected void initUserInterface()<\/em><\/p>\n<p data-start=\"2202\" data-end=\"2378\">Dostosowanie\/rozszerzenie interfejsu u\u017cytkownika. Metoda klasy bazowej musi zosta\u0107 w ka\u017cdym przypadku wywo\u0142ana <em>(super.initUserInterface())<\/em>.<\/p>\n<p data-start=\"2380\" data-end=\"2504\"><em>protected void applyDefaults()<\/em><\/p>\n<p data-start=\"2380\" data-end=\"2504\">Przy rozszerzeniu interfejsu u\u017cytkownika mo\u017cna tutaj ustawi\u0107 okre\u015blone ustawienia domy\u015blne.<\/p>\n<p data-start=\"2506\" data-end=\"2750\"><em>protected void initCoolBar()<\/em><\/p>\n<p data-start=\"2506\" data-end=\"2750\">Przed dodaniem nowych akcji do standardowego paska narz\u0119dzi nale\u017cy wywo\u0142a\u0107 metod\u0119 klasy bazowej <em>(super.initCoolBar())<\/em>. Tylko wtedy jest zagwarantowane, \u017ce przycisk uruchomienia zostanie poprawnie zainicjalizowany.<\/p>\n<p data-start=\"2752\" data-end=\"2924\"><em>protected void dataFromUi()<\/em><br data-start=\"2779\" data-end=\"2782\" \/><em>protected void dataToUi()<\/em><\/p>\n<p data-start=\"2752\" data-end=\"2924\">Aktualizacja interfejsu. R\u00f3wnie\u017c tutaj nale\u017cy wywo\u0142a\u0107 metody klasy bazowej <em>(super.dataFromUi(), super.dataToUi())<\/em>.<\/p>\n<p data-start=\"2926\" data-end=\"3026\"><em>protected void validate()<\/em><\/p>\n<p data-start=\"2926\" data-end=\"3026\">Sprawdzenie wprowadzonych danych w dostosowanym interfejsie u\u017cytkownika.<\/p>\n<h5 data-start=\"2926\" data-end=\"3026\" id=\"przykladowa-struktura-dialogowej-aktualizacji-danych\" ><span class=\"ez-toc-section\" id=\"Przykladowa_struktura_dialogowej_aktualizacji_danych\"><\/span>Przyk\u0142adowa struktura dialogowej aktualizacji danych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><em>public class UPD.. extends UpdateApplication {<\/em><br \/>\n<em>public UPD..() {<\/em><br \/>\n<em>}<\/em><br \/>\n<em>\/\/ Sprawdzenia przed uruchomieniem aktualizacji danych na<\/em><br \/>\n<em>\/\/ konkretnej bazie danych<\/em><br \/>\n<em>protected boolean checkPreConditions(byte[] databaseGuid) {<\/em><br \/>\n<em>boolean result = true;<\/em><br \/>\n<em>\/\/ Otworzy\u0107 transakcj\u0119 na konkretnej bazie danych<\/em><br \/>\n<em>byte[] tmGuid = tm.beginNew(databaseGuid);<\/em><br \/>\n<em>try{<\/em><br \/>\n<em>\/\/ dalsze sprawdzenia<\/em><br \/>\n<em>result = true; \/\/result = false;<\/em><br \/>\n<em>} finally {<\/em><br \/>\n<em>tm.rollback(tmGuid);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>return result;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>\/\/ Wykonywanie aktualizacji danych na konkretnej bazie danych<\/em><br \/>\n<em>protected short execute(byte[] databaseGuid) {<\/em><br \/>\n<em>\/\/ Zainicjalizowa\u0107 status aktualizacji danych<\/em><br \/>\n<em>short result = STATE_SUCCESS;<\/em><br \/>\n<em>setMultipleAllowed( MULTICALL_NOT_ALLOWED );<\/em><br \/>\n<em>\/\/ Otworzy\u0107 transakcj\u0119 na konkretnej bazie danych<\/em><br \/>\n<em>byte[] tmGuid = tm.beginNew(databaseGuid);<\/em><br \/>\n<em>try {<\/em><br \/>\n<em>\/\/ Kod w\u0142a\u015bciwej aktualizacji<\/em><\/p>\n<p><em>\/\/ w przypadku b\u0142\u0119du w tym miejscu<\/em><br \/>\n<em>\/\/(np. nieoczekiwane warto\u015bci, zazwyczaj przyczyny merytoryczne):<\/em><br \/>\n<em>\/\/result = STATE_ABORTED_WITH_ERROR;<\/em><br \/>\n<em>\/\/lub STATE_PROCESSED_WITH_ERROR;<\/em><br \/>\n<em>\/\/setMultipleAllowed(MULTICALL_ALLOWED);<\/em><br \/>\n<em>\/\/tm.rollback(tmGuid);\/\/w zale\u017cno\u015bci od potrzeby<\/em><br \/>\n<em>\/\/koniec obs\u0142ugi b\u0142\u0119du dla tego przypadku.<\/em><\/p>\n<p><em>tm.commit(tmGuid);<\/em><br \/>\n<em>}catch (RuntimeException ex) {<\/em><br \/>\n<em>tm.rollback(tmGuid);<\/em><br \/>\n<em>\/\/w zale\u017cno\u015bci od wyst\u0119puj\u0105cego b\u0142\u0119du ustawi\u0107 odpowiedni status<\/em><br \/>\n<em>result = STATE_ABORTED_WITH_ERROR;<\/em><br \/>\n<em>\/\/lub STATE_PROCESSED_WITH_ERROR;<\/em><br \/>\n<em>setMultipleAlowed(MULTICALL_ALLOWED);<\/em><br \/>\n<em>\/\/lub MULTICALL_NOT_ALLOWED<\/em><br \/>\n<em>}<\/em><br \/>\n<em>return result;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-8684","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-obiekty-deweloperskie"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8684","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=8684"}],"version-history":[{"count":15,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8684\/revisions"}],"predecessor-version":[{"id":40923,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8684\/revisions\/40923"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=8684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}