{"id":9685,"date":"2025-08-19T09:39:25","date_gmt":"2025-08-19T07:39:25","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9685"},"modified":"2025-08-19T09:39:26","modified_gmt":"2025-08-19T07:39:26","slug":"podrecznik-referencyjny-wymiana-danych","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/","title":{"rendered":"Podr\u0119cznik referencyjny: Wymiana 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\/podrecznik-referencyjny-wymiana-danych\/#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\/podrecznik-referencyjny-wymiana-danych\/#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\/podrecznik-referencyjny-wymiana-danych\/#Rozwoj_kontrolerow\" >Rozw\u00f3j kontroler\u00f3w<\/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\/podrecznik-referencyjny-wymiana-danych\/#Kontroler_BIS\" >Kontroler BIS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Budowa_modelu_BIS\" >Budowa modelu BIS<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#ObjectInfo\" >ObjectInfo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#DataViewBIS\" >DataViewBIS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Eksport_i_import\" >Eksport i import<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Przebieg_eksportu\" >Przebieg eksportu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Przebieg_importu\" >Przebieg importu<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Wczytywanie_obiektu\" >Wczytywanie obiektu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Walidacje_i_obsluga_bledow\" >Walidacje i obs\u0142uga b\u0142\u0119d\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Obsluga_obiektow_zaleznych\" >Obs\u0142uga obiekt\u00f3w zale\u017cnych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Zapisywanie_do_bazy_danych\" >Zapisywanie do bazy danych<\/a><\/li><\/ul><\/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\/podrecznik-referencyjny-wymiana-danych\/#Uzycie_klasy_DefaultSerializer\" >U\u017cycie klasy DefaultSerializer<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Zapisywanie_obiektu\" >Zapisywanie obiektu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Wczytywanie_obiektu-2\" >Wczytywanie obiektu<\/a><\/li><\/ul><\/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\/podrecznik-referencyjny-wymiana-danych\/#Hooki_BIS\" >Hooki BIS<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Modyfikowanie_modelu_danych_BIS\" >Modyfikowanie modelu danych BIS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Zastepowanie_AttributeDescriptor\" >Zast\u0119powanie AttributeDescriptor<\/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\/podrecznik-referencyjny-wymiana-danych\/#Dodawanie_obiektow_zaleznych\" >Dodawanie obiekt\u00f3w zale\u017cnych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Rejestr_BIS\" >Rejestr BIS<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Kontroler\" >Kontroler<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Wyszukiwanie_OQL\" >Wyszukiwanie OQL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wymiana-danych\/#Aplikacje_korygujace\" >Aplikacje koryguj\u0105ce<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p>Dla prostych jednostek biznesowych wymiana danych jest mo\u017cliwa bez dodatkowego nak\u0142adu pracy programistycznej, poniewa\u017c us\u0142uga Business Integration Service (BIS) obs\u0142uguje generyczny import i eksport. Jednak w wielu przypadkach spotykanych w praktyce, stworzenie kontrolera jest celowe i konieczne, aby jednostka biznesowa mog\u0142a by\u0107 dost\u0119pna do wymiany danych.<\/p>\n<p>Niniejszy artyku\u0142 wyja\u015bnia podstawowe procedury implementacji kontrolera oraz zawiera wskaz\u00f3wki dotycz\u0105ce korzystania z odpowiedniego API udost\u0119pnianego w tym celu przez Comarch ERP Enterprise.<\/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>Programi\u015bci aplikacji<\/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<ul>\n<li><strong>Kontroler<\/strong> &#8212; kontroler to klasa Java, kt\u00f3ra realizuje import lub eksport podmiotu biznesowego. Powi\u0105zane interfejsy to interfejsy Java: <em>com.cisag.pgm.bi.ImportController<\/em> i <em>com.cisag.pgm.bi.ExportController<\/em>. Kontroler dostarcza model danych, kt\u00f3ry ma by\u0107 u\u017cywany do importu lub eksportu, a tym samym okre\u015bla ilo\u015b\u0107 obiekt\u00f3w, atrybut\u00f3w i relacji dost\u0119pnych dla jednostki biznesowej. Model danych mo\u017ce by\u0107 r\u00f3\u017cny dla importu i eksportu. W przypadku prostych jednostek biznesowych import lub eksport mo\u017ce odbywa\u0107 si\u0119 r\u00f3wnie\u017c bez istniej\u0105cego kontrolera, czyli generycznie.<\/li>\n<li><strong>Aplikacja koryguj\u0105ca<\/strong> &#8212; aplikacja koryguj\u0105ca to aplikacja dialogowa, kt\u00f3ra jest u\u017cywana do interaktywnej obr\u00f3bki prostych plik\u00f3w z b\u0142\u0119dami w systemie Comarch ERP Enterprise. Dla jednej jednostki biznesowej mo\u017ce istnie\u0107 jedna lub kilka aplikacji koryguj\u0105cych. Zasadniczo, aplikacja koryguj\u0105ca jest odpowiedni\u0105 aplikacj\u0105 nale\u017c\u0105c\u0105 do danej jednostki biznesowej (np. aplikacja <em>Partnerzy<\/em> dla jednostki biznesowej <em>com.cisag.app.general.obj.Partner<\/em>), kt\u00f3ra jest otwierana w specjalnym trybie. W tym trybie instancje jednostki biznesowej z pliku z b\u0142\u0119dami mo\u017cna otwiera\u0107 pojedynczo, interaktywnie edytowa\u0107 i zapisywa\u0107.<\/li>\n<\/ul>\n<h3 id=\"rozwoj-kontrolerow\" ><span class=\"ez-toc-section\" id=\"Rozwoj_kontrolerow\"><\/span>Rozw\u00f3j kontroler\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"kontroler-bis\" ><span class=\"ez-toc-section\" id=\"Kontroler_BIS\"><\/span>Kontroler BIS<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Kontroler to klasa Java, kt\u00f3ra realizuje import i eksport dla okre\u015blonej jednostki biznesowej. Ta klasa Java musi implementowa\u0107 jeden lub oba z poni\u017cszych interfejs\u00f3w:<\/p>\n<ul>\n<li>Kontroler, kt\u00f3ry ma wspiera\u0107 eksport, implementuje interfejs <em>com.cisag.pgm.bi.ExportController<\/em><\/li>\n<li>Kontroler, kt\u00f3ry ma wspiera\u0107 import, implementuje interfejs <em>com.cisag.pgm.bi.ImportController<\/em><\/li>\n<li>Kontroler, kt\u00f3ry ma wspiera\u0107 zar\u00f3wno eksport, jak i import, implementuje oba interfejsy<\/li>\n<li>Je\u015bli dla jednostki biznesowej ma by\u0107 wspierany eksport i import, ale import ma obejmowa\u0107 tylko wycinek modelu danych eksportu, nale\u017cy zaimplementowa\u0107 kontroler importu i eksportu w dw\u00f3ch r\u00f3\u017cnych klasach, aby m\u00f3c poda\u0107 odmienne modele danych<\/li>\n<\/ul>\n<p>Klasy Java, kt\u00f3re implementuj\u0105 te interfejsy, musz\u0105 zosta\u0107 zarejestrowane jako kontrolery. Rejestracja ta jest opisana w dalszej cz\u0119\u015bci artyku\u0142u.<\/p>\n<h4 id=\"budowa-modelu-bis\" ><span class=\"ez-toc-section\" id=\"Budowa_modelu_BIS\"><\/span>Budowa modelu BIS<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"objectinfo\" ><span class=\"ez-toc-section\" id=\"ObjectInfo\"><\/span>ObjectInfo<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ka\u017cdy kontroler definiuje model danych BIS, kt\u00f3ry jest u\u017cywany podczas importu lub eksportu. Model danych BIS okre\u015bla struktur\u0119 importowanych i eksportowanych danych.<\/p>\n<p>Kontroler definiuje sw\u00f3j model danych BIS poprzez implementacj\u0119 metody ObjectInfo <em>getObjectInfo()<\/em>.<\/p>\n<p>Dla definicji modelu danych BIS, kontrolery zazwyczaj stosuj\u0105 strategi\u0119 budowania modelu danych w oparciu o opis obiektu biznesowego w bazie danych repozytorium, w jak najwi\u0119kszym mo\u017cliwym stopniu. Mo\u017cna to osi\u0105gn\u0105\u0107 dla jednostki biznesowej poprzez u\u017cycie klasy<\/p>\n<p><em>CisObjectInfo info= new CisObjectInfo(&lt;BusinessObject&gt;.class);<\/em><\/p>\n<p>Ten <em>ObjectInfo<\/em> mo\u017ce zosta\u0107 nast\u0119pnie zmodyfikowany. Mo\u017cliwe jest usuwanie atrybut\u00f3w lub relacji, przekszta\u0142canie relacji, kt\u00f3re nie s\u0105 <em>Dependent<\/em>, w relacje <em>Dependent<\/em>, rejestrowanie nowych deskryptor\u00f3w oraz zmiana kolejno\u015bci atrybut\u00f3w lub relacji. Metody do tego celu s\u0105 zdefiniowane w nadklasie <em>com.cisag.pgm.bi.model.DefaultObjectInfo<\/em> klasy <em>CisObjectInfo<\/em>.<\/p>\n<p>Poni\u017cej znajduj\u0105 si\u0119 informacje, kt\u00f3re nale\u017cy wzi\u0105\u0107 pod uwag\u0119 podczas tworzenia lub modyfikowania modelu danych BIS:<\/p>\n<ul>\n<li>Niepotrzebne atrybuty i relacje powinny bezwzgl\u0119dnie zosta\u0107 usuni\u0119te z modelu danych. Dzi\u0119ki temu model danych staje si\u0119 mniejszy i \u0142atwiejszy do zrozumienia. Przyk\u0142adowo, u\u017cycie klasy <em>CisObjectInfo<\/em> cz\u0119sto tworzy wsteczne relacje z obiektu zale\u017cnego (<em>Dependent<\/em>) do obiektu g\u0142\u00f3wnego. Nie s\u0105 one potrzebne przez BIS i dlatego powinny zosta\u0107 usuni\u0119te.<\/li>\n<li>Ka\u017cda p\u00f3\u017aniejsza zmiana w <em>ObjectInfo<\/em> jest zmian\u0105 w modelu danych BIS i musi zosta\u0107 zweryfikowana pod k\u0105tem kompatybilno\u015bci z poprzednim stanem modelu danych. Dotyczy to r\u00f3wnie\u017c zmian w obiektach biznesowych.<\/li>\n<\/ul>\n<h5 id=\"dataviewbis\" ><span class=\"ez-toc-section\" id=\"DataViewBIS\"><\/span>DataViewBIS<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><em>DataViewBIS<\/em> to dodatek do w\u0119z\u0142a <em>ObjectInfo<\/em>, kt\u00f3ry umo\u017cliwia rozszerzenie kontrolera o hooki BIS zale\u017cne od kontrolera.<\/p>\n<p>W tym celu w\u0119ze\u0142 mo\u017cna wyposa\u017cy\u0107 w <em>DataViewBIS<\/em> w nast\u0119puj\u0105cy spos\u00f3b: <em>DataViewBIS.create( info);<\/em><\/p>\n<p><em>DataViewBIS<\/em> musi by\u0107 r\u00f3wnie\u017c uwzgl\u0119dniony w przetwarzaniu eksportu lub importu kontrolera. Nale\u017cy r\u00f3wnie\u017c wzi\u0105\u0107 pod uwag\u0119 wskaz\u00f3wki zawarte w kolejnych sekcjach.<\/p>\n<h4 id=\"eksport-i-import\" ><span class=\"ez-toc-section\" id=\"Eksport_i_import\"><\/span>Eksport i import<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"przebieg-eksportu\" ><span class=\"ez-toc-section\" id=\"Przebieg_eksportu\"><\/span>Przebieg eksportu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W procesie eksportu instancje jednostki biznesowej do wyeksportowania s\u0105 okre\u015blane przez wybrane ograniczenie, kt\u00f3re nast\u0119puje za pomoc\u0105 wyszukiwania OQL lub instrukcji OQL.<\/p>\n<p>Dla eksportu ka\u017cdej instancji obiektu biznesowego wywo\u0142ywana jest metoda kontrolera:<\/p>\n<p><em>boolean process(Target target, Object obj) <\/em><\/p>\n<p>Za pomoc\u0105 parametru <em>target<\/em> przekazywany jest obiekt docelowy (interfejs <em>com.cisag.pgm.bi.Target<\/em>), za pomoc\u0105 kt\u00f3rego mo\u017cna zapisywa\u0107 dane do pliku docelowego. W parametrze <em>obj<\/em> przekazywana jest instancja g\u0142\u00f3wnego obiektu, w kt\u00f3rej atrybuty klucza g\u0142\u00f3wnego i klucza biznesowego s\u0105 ju\u017c wype\u0142nione. Za pomoc\u0105 warto\u015bci w tych atrybutach, kontroler musi otworzy\u0107 instancj\u0119 jednostki biznesowej. Warto\u015bci atrybut\u00f3w, kt\u00f3re nie s\u0105 kluczami, s\u0105 niezdefiniowane i nie powinny by\u0107 u\u017cywane.<\/p>\n<p>Implementacja metody <em>process()\u00a0<\/em>w kontrolerze musi zapisa\u0107 wszystkie obiekty, kt\u00f3re nale\u017c\u0105 do instancji jednostki biznesowej, do przekazanego <em>target. <\/em>W tym celu u\u017cywana jest instancja klasy <em>DefaultSerializer<\/em> (<em>com.cisag.pgm.bi.helper.DefaultSerializer<\/em>).<\/p>\n<p>Przetwarzanie, kt\u00f3re kontroler musi wykona\u0107 w ramach wywo\u0142ania metody <em>process()<\/em>, jest zgodne ze wzorcem przedstawionym w poni\u017cszym kodzie \u017ar\u00f3d\u0142owym Java. Zak\u0142ada si\u0119 przy tym, \u017ce kontroler utworzy\u0142 instancj\u0119 <em>serializer <\/em>klasy <em>DefaultSerializer, <\/em>a obiekty <em>target<\/em> i <em>obj<\/em> s\u0105 parametrami metody <em>process().<\/em><\/p>\n<p><em>CisObject loadedObject; <\/em><\/p>\n<p><em>Map lodedObjectNLS; <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Otwarcie obiektu i jego danych NLS za pomoc\u0105 CisObjectManager.<\/span> <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Warto\u015bci atrybut\u00f3w klucza s\u0105 zawarte w parametrze obj.<\/span> &#8230; <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Zapisanie obiektu.<\/span> <\/em><\/p>\n<p><em>serializer.write(target, loadedObject, lodedObjectNLS);<\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ Przej\u015bcie przez relacje zale\u017cne (Dependent) filtru.<\/span> <\/em><\/p>\n<p><em>AssociationDescriptor[] assocs = target.getAssociations(); <\/em><\/p>\n<p><em><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; assocs.length; i++) { <\/em><\/p>\n<p><em>AssociationDescriptor assoc = assocs[i]; <\/em><\/p>\n<p><em><span class=\"hljs-keyword\">if<\/span> (DEPENDENT1.equals(assoc.getName())) { <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Zapisanie relacji zale\u017cnej (Dependent).<\/span> <\/em><\/p>\n<p><em>Iterator it = &#8230; <\/em><\/p>\n<p><em><span class=\"hljs-keyword\">while<\/span> (it.hasNext()) { <\/em><\/p>\n<p><em>Object childObj = it.next(); <\/em><\/p>\n<p><em>Map childNLS = &#8230; <\/em><\/p>\n<p><em>Target child = target.child(DEPENDENT1); <\/em><\/p>\n<p><em>serializer.write(child, childObj, childNLS); <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Tutaj ewentualnie zapisa\u0107 podrz\u0119dne obiekty zale\u017cne (Dependents).<\/span> } <\/em><\/p>\n<p><em>} <\/em><\/p>\n<p><em><span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (&#8230;) { &#8230;. } <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ Tutaj zapisa\u0107 nast\u0119pn\u0105 relacj\u0119 zale\u017cn\u0105 (Dependent).<\/span> <\/em><\/p>\n<p><em>}<\/em><\/p>\n<p>Oto co nale\u017cy wzi\u0105\u0107 pod uwag\u0119:<\/p>\n<ul>\n<li>Najpierw kontroler musi zapisa\u0107 obiekt g\u0142\u00f3wny, a nast\u0119pnie obiekty zale\u017cne, o ile model danych BIS jednostki biznesowej zawiera obiekty zale\u017cne<\/li>\n<li>Dla wsparcia eksportu wieloj\u0119zycznego musz\u0105 by\u0107 dostarczone instancje klasy <em>NLSData<\/em><\/li>\n<li>U\u017cycie klasy <em>DefaultSerializer<\/em> jest opisane w osobnym rozdziale<\/li>\n<li>Proste relacje do obiekt\u00f3w niezale\u017cnych nie mog\u0105 by\u0107 zapisywane przez sam kontroler, poniewa\u017c jest to ju\u017c obs\u0142ugiwane przez klas\u0119 <em>DefaultSerializer<\/em><\/li>\n<\/ul>\n<p>Szczeg\u00f3lnie w przypadku relacji zale\u017cnych nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na:<\/p>\n<ul>\n<li>Zale\u017cno\u015bci typu <em>Dependent <\/em>musz\u0105 by\u0107 zawsze zapisywane w tej samej kolejno\u015bci, w jakiej wyst\u0119puj\u0105 w modelu danych kontrolera, i mog\u0105 by\u0107 zapisane tylko wtedy, gdy zosta\u0142y wybrane w filtrze. Oba te warunki s\u0105 spe\u0142niane przez p\u0119tl\u0119<em> for<\/em>.<\/li>\n<li>W przypadku zale\u017cno\u015bci wielokrotnych, poszczeg\u00f3lne instancje s\u0105 zapisywane jedna po drugiej. Kontroler okre\u015bla kolejno\u015b\u0107, w jakiej instancje <em>Dependent <\/em>pojawi\u0105 si\u0119 w pliku docelowym. Jest to osi\u0105gane dzi\u0119ki p\u0119tli <em>while<\/em>.<\/li>\n<li>Dla ka\u017cdej instancji <em>Dependent <\/em>przeznaczonej do zapisu, nale\u017cy utworzy\u0107 now\u0105 instancj\u0119 obiektu <em>Target<\/em> za pomoc\u0105 metody <em>child()<\/em><\/li>\n<li>Je\u015bli obiekt <em>Dependent <\/em>sam ma podrz\u0119dne obiekty <em>Dependent,<\/em> nale\u017cy je zapisa\u0107 po wywo\u0142aniu metody <em>serializer.write()<\/em> dla obiektu <em>Dependent<\/em><\/li>\n<\/ul>\n<p><b>Wsparcie dla Hook\u00f3w:<\/b><\/p>\n<ul>\n<li>Je\u015bli istnieje obiekt <em>DataViewBIS<\/em>, nale\u017cy ustawi\u0107 widok obiektu do wyeksportowania jako warto\u015b\u0107 kontekstow\u0105 w obiekcie <em>DataViewBIS<\/em>. Przyk\u0142ad mo\u017cna znale\u017a\u0107 w klasie<em> SingleObjectEntityController.<\/em><\/li>\n<li>Je\u015bli istnieje obiekt <em>DataViewBIS<\/em>\u00a0i ma by\u0107 wspierany <em>DependentAssociationHook<\/em>, przetwarzanie obiekt\u00f3w <em>Dependent <\/em>musi by\u0107 wywo\u0142ane na klasie <em>DataViewBIS <\/em>(metody <em>isExtensionDependent()<\/em> i <em>processDependentExport()<\/em>). Przyk\u0142ad r\u00f3wnie\u017c znajduje si\u0119 w <em>SingleObjectEntityController.<\/em><\/li>\n<\/ul>\n<h5 id=\"przebieg-importu\" ><span class=\"ez-toc-section\" id=\"Przebieg_importu\"><\/span>Przebieg importu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W procesie importu, dla ka\u017cdej instancji jednostki biznesowej do zaimportowania z pliku \u017ar\u00f3d\u0142owego, wywo\u0142ywana jest metoda <em>boolean process(Source source)<\/em> w kontrolerze. Z parametrem <em>source<\/em> przekazywany jest obiekt \u017ar\u00f3d\u0142owy (interfejs <em>com.cisag.pgm.bi.Source<\/em>), kt\u00f3ry zawiera dane instancji jednostki biznesowej do zaimportowania.<\/p>\n<p>Kontroler musi najpierw wczyta\u0107 obiekty zawarte w obiekcie \u017ar\u00f3d\u0142owym, a nast\u0119pnie je zweryfikowa\u0107. Podobnie jak w przypadku eksportu, najpierw wczytywany jest obiekt g\u0142\u00f3wny, a nast\u0119pnie obiekty zale\u017cne (<em>Dependents<\/em>). Je\u015bli ca\u0142a instancja jednostki biznesowej zosta\u0142a pomy\u015blnie zweryfikowana, jest zapisywana w bazie danych. Nale\u017cy pami\u0119ta\u0107, \u017ce dok\u0142adny przebieg zale\u017cy r\u00f3wnie\u017c od samej jednostki biznesowej.<\/p>\n<p>Zasady dotycz\u0105ce rozszerzalno\u015bci kontrolera za pomoc\u0105 hook\u00f3w s\u0105 takie same jak w przypadku eksportu.<\/p>\n<p>Przyk\u0142ad implementacji metody <em>boolean process(Source source)<\/em> znajduje si\u0119 w kodzie \u017ar\u00f3d\u0142owym Java w klasie <em>com.cisag.app.general.log.SingleObjectEntityController<\/em>.<\/p>\n<h6 id=\"wczytywanie-obiektu\" ><span class=\"ez-toc-section\" id=\"Wczytywanie_obiektu\"><\/span>Wczytywanie obiektu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Og\u00f3lny przebieg wczytywania obiektu jest nast\u0119puj\u0105cy:<\/p>\n<ol start=\"1\">\n<li>Kontroler posiada lub tworzy przej\u015bciow\u0105, pust\u0105 instancj\u0119 podklasy klasy <em>CisObject<\/em>\u00a0dla wczytywanego obiektu.<\/li>\n<li>Za pomoc\u0105 instancji klasy <em>DefaultSerializer <\/em>dane z instancji interfejsu<em> Source<\/em> s\u0105 wczytywane do obiektu w celu uzyskania atrybut\u00f3w klucza.<\/li>\n<li>Kontroler musi teraz ustali\u0107, czy import dotyczy nowego obiektu, czy aktualizacji. Je\u015bli jest to aktualizacja, wczytuje dotychczasowe dane z bazy danych.<\/li>\n<li>Za pomoc\u0105 instancji klasy <em>DefaultSerializer <\/em>dane z instancji interfejsu <em>Source <\/em>s\u0105 ponownie wczytywane do obiektu, aby uzyska\u0107 dane, kt\u00f3re maj\u0105 zosta\u0107 zmienione przez import. Obiekt osi\u0105gn\u0105\u0142 teraz stan, kt\u00f3ry zostanie p\u00f3\u017aniej zapisany w bazie danych.<\/li>\n<\/ol>\n<p>U\u017cycie klasy <em>DefaultSerializer<\/em>\u00a0jest dok\u0142adniej wyja\u015bnione w rozdziale 4.3.3.<\/p>\n<p>Nale\u017cy przy tym wzi\u0105\u0107 pod uwag\u0119 nast\u0119puj\u0105ce kwestie:<\/p>\n<ul>\n<li>Nale\u017cy uwzgl\u0119dni\u0107 tryb importu, kt\u00f3ry jest okre\u015blony przez instancj\u0119 interfejsu <em>Source. <\/em>W zale\u017cno\u015bci od trybu, na przyk\u0142ad, niedozwolone jest tworzenie nowych obiekt\u00f3w lub przeprowadzanie aktualizacji. Tryb importu jest odpytywany za pomoc\u0105 metody <em>int Source.getMode()<\/em>, a sta\u0142e dla r\u00f3\u017cnych tryb\u00f3w importu s\u0105 zdefiniowane w klasie <em>com.cisag.pgm.bi.Mode<\/em>.<\/li>\n<li>Po dwukrotnym wczytaniu obiektu, dla nowo tworzonego obiektu, dla wszystkich atrybut\u00f3w wieloj\u0119zycznych musi zosta\u0107 wywo\u0142ana metoda <em>NLSData.applyDefaults( CisObject obj )<\/em>. W ten spos\u00f3b j\u0119zyki, kt\u00f3re nie zosta\u0142y podane, w atrybutach wieloj\u0119zycznych s\u0105 wst\u0119pnie wype\u0142niane podan\u0105 warto\u015bci\u0105 z innego j\u0119zyka. Dla wieloj\u0119zycznego atrybutu instancji <em>obj<\/em> podklasy klasy <em>CisObject <\/em>oraz instancji <em>nlsData<\/em> klasy <em>NLSData<\/em>, przebieg jest nast\u0119puj\u0105cy:<\/li>\n<\/ul>\n<p><em>if (!obj.is_persistent()) { <\/em><br \/><em>nlsData.applyDefaults( obj); <\/em><br \/><em>} <\/em><\/p>\n<ul>\n<li>Je\u015bli tryb importu przewiduje usuni\u0119cie obiektu lub instancji jednostki biznesowej, krok 4 nie jest konieczny.<\/li>\n<\/ul>\n<h6 id=\"walidacje-i-obsluga-bledow\" ><span class=\"ez-toc-section\" id=\"Walidacje_i_obsluga_bledow\"><\/span>Walidacje i obs\u0142uga b\u0142\u0119d\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Podczas importu nale\u017cy bezwzgl\u0119dnie przeprowadzi\u0107 pe\u0142n\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w. Jest to odpowiedzialno\u015b\u0107 kontrolera importu.<\/p>\n<p>Nale\u017cy wykona\u0107 nast\u0119puj\u0105ce walidacje:<\/p>\n<ul>\n<li>Je\u015bli po wywo\u0142aniu metody klasy <em>DefaultSerializer <\/em>kolejka komunikat\u00f3w programu zawiera b\u0142\u0105d lub niepotwierdzone ostrze\u017cenie, oznacza to b\u0142\u0105d importu<\/li>\n<li>Je\u015bli nie mo\u017cna przeprowadzi\u0107 operacji zgodnej z trybem importu, oznacza to b\u0142\u0105d importu. W takim przypadku kontroler musi dodatkowo wys\u0142a\u0107 komunikat o b\u0142\u0119dzie.<\/li>\n<li>Po wczytaniu obiektu przez klas\u0119 <em>DefaultSerializer <\/em>nale\u017cy wykona\u0107 krok <em>Verify<\/em>. Ten krok realizuje dodatkowe walidacje, kt\u00f3re s\u0105 okre\u015blone przez implementacje <em>AttributeDescriptor<\/em>.\u00a0Je\u015bli ten krok zako\u0144czy si\u0119 niepowodzeniem, oznacza to b\u0142\u0105d importu.<\/li>\n<li>Nast\u0119pnie nale\u017cy wywo\u0142a\u0107 walidacj\u0119 specyficzn\u0105 dla jednostki biznesowej (<em>Validation<\/em>). S\u0105 to walidacje, kt\u00f3re s\u0105 r\u00f3wnie\u017c przeprowadzane podczas zapisu w odpowiedniej aplikacji dialogowej. Ta walidacja, w zale\u017cno\u015bci od kontrolera, odnosi si\u0119 albo do ca\u0142ej jednostki biznesowej, albo do poszczeg\u00f3lnych obiekt\u00f3w. Je\u015bli wywo\u0142anie walidacji zako\u0144czy si\u0119 niepowodzeniem, oznacza to b\u0142\u0105d importu.<\/li>\n<\/ul>\n<p>Je\u015bli kt\u00f3rakolwiek z tych walidacji zako\u0144czy si\u0119 niepowodzeniem, obiekt \u017ar\u00f3d\u0142owy przekazany w parametrze <em>source<\/em> musi zosta\u0107 oznaczony jako b\u0142\u0119dny poprzez wywo\u0142anie metody <em>invalidate()<\/em>, a nast\u0119pnie import musi zosta\u0107 przerwany przez opuszczenie metody <em>process(Source)<\/em> z warto\u015bci\u0105 zwracan\u0105 <em>false<\/em> i odpowiednimi komunikatami o b\u0142\u0119dach w kolejce komunikat\u00f3w programu.<\/p>\n<p>Tylko wtedy, gdy te walidacje zako\u0144cz\u0105 si\u0119 sukcesem, instancja jednostki biznesowej mo\u017ce zosta\u0107 zapisana w bazie danych.<\/p>\n<h6 id=\"obsluga-obiektow-zaleznych\" ><span class=\"ez-toc-section\" id=\"Obsluga_obiektow_zaleznych\"><\/span>Obs\u0142uga obiekt\u00f3w zale\u017cnych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Po wczytaniu i zweryfikowaniu obiektu g\u0142\u00f3wnego (ale ewentualnie przed wywo\u0142aniem walidacji, wi\u0119cej informacji na ten temat znajduje si\u0119 w sekcji <em>Walidacje i obs\u0142uga b\u0142\u0119d\u00f3w<\/em>), nale\u017cy wczyta\u0107 i zweryfikowa\u0107 obiekty zale\u017cne. Przyk\u0142ad z\u0142o\u017conej jednostki biznesowej z wieloma obiektami zale\u017cnymi znajduje si\u0119 w klasie <em>com.cisag.app.general.item.log.ImportExport<\/em> w metodzie <em>void process(BaseItemEntity base, Target target)<\/em>.<\/p>\n<h6 id=\"zapisywanie-do-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Zapisywanie_do_bazy_danych\"><\/span>Zapisywanie do bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zapisywanie instancji jednostek biznesowych do zaimportowania mo\u017ce odbywa\u0107 si\u0119 pojedynczo lub blokowo. W obu przypadkach implementacja jest realizowana przez kontroler. Pojedyncze zapisywanie instancji jest \u0142atwiejsze do zrealizowania, natomiast zapisywanie blokowe pozwala osi\u0105gn\u0105\u0107 lepsz\u0105 wydajno\u015b\u0107 przy imporcie du\u017cych ilo\u015bci danych.<\/p>\n<p>Dopiero podczas zapisywania do bazy danych u\u017cywane s\u0105 nietrwa\u0142e instancje podklasy klasy <em>CisObject<\/em>.<\/p>\n<ul>\n<li><strong>Zapisywanie pojedyncze<\/strong> &#8212; instancja jednostki biznesowej jest zawsze zapisywana pojedynczo na ko\u0144cu wywo\u0142anej metody <em>process( Source)<\/em> w kontrolerze importu. W tym celu musi by\u0107 u\u017cyta oddzielna transakcja.<\/li>\n<li><strong>Zapisywanie blokowe<\/strong> &#8212; w przypadku zapisywania blokowego, ka\u017cda instancja jednostki biznesowej jest przetwarzana w odpowiednim wywo\u0142aniu metody <em>process()<\/em>, jak opisano powy\u017cej, ale nie jest jeszcze zapisywana do bazy danych. Zamiast tego, kontroler zbiera dane do zapisania i zapisuje je dopiero, gdy zgromadzi wystarczaj\u0105co du\u017c\u0105 liczb\u0119 obiekt\u00f3w. Aby zapisa\u0107 blok instancji, kontroler musi otworzy\u0107 now\u0105 transakcj\u0119 najwy\u017cszego poziomu. Nale\u017cy przy tym pami\u0119ta\u0107, \u017ce kontroler musi najpierw usun\u0105\u0107 wszystkie instancje przeznaczone do usuni\u0119cia, zanim zapisze instancje do utworzenia lub aktualizacji.<\/li>\n<\/ul>\n<h5 id=\"uzycie-klasy-defaultserializer\" ><span class=\"ez-toc-section\" id=\"Uzycie_klasy_DefaultSerializer\"><\/span>U\u017cycie klasy DefaultSerializer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Za pomoc\u0105 klasy <em>DefaultSerializer <\/em>pojedyncze obiekty Java s\u0105 zapisywane w obiekcie docelowym (interfejs <em>Target<\/em>) lub wczytywane z obiektu \u017ar\u00f3d\u0142owego (interfejs <em>Source<\/em>) do obiektu Java.<\/p>\n<p>Klasa <em>DefaultSerializer <\/em>zawiera wsparcie dla wieloj\u0119zycznego eksportu wieloj\u0119zycznych atrybut\u00f3w typu String. Nale\u017cy pami\u0119ta\u0107, \u017ce kontroler nigdy nie musi rozr\u00f3\u017cnia\u0107, czy przeprowadza eksport jednoj\u0119zyczny, czy wieloj\u0119zyczny. Zamiast tego zawsze udost\u0119pnia dodatkowe dane potrzebne do eksportu wieloj\u0119zycznego.<\/p>\n<h6 id=\"zapisywanie-obiektu\" ><span class=\"ez-toc-section\" id=\"Zapisywanie_obiektu\"><\/span>Zapisywanie obiektu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Do zapisywania obiektu podczas eksportu dost\u0119pne s\u0105 nast\u0119puj\u0105ce dwie sygnatury metody <em>write()<\/em>:<\/p>\n<p><em>void write(Target target, Object obj, Map&lt;String,NLSData&gt; nlsDatas) <\/em><br \/><em>void write(Target target, Object obj) <\/em><\/p>\n<p>Za pomoc\u0105 tych metod przekazany obiekt<em> obj<\/em> jest zapisywany w przekazanym obiekcie docelowym <em>target<\/em>.<\/p>\n<p>Je\u015bli zapisywany obiekt zawiera wieloj\u0119zyczne atrybuty typu String, a kontroler wspiera eksport wieloj\u0119zyczny, nale\u017cy u\u017cy\u0107 pierwszej sygnatury. W takim przypadku parametr <em>map<\/em> zawiera dla ka\u017cdego wieloj\u0119zycznego atrybutu typu String instancj\u0119 klasy <em>NLSData<\/em> (<em>com.cisag.pgm.datatype.NLSData<\/em>). Instancje klasy <em>NLSData <\/em>musz\u0105 by\u0107 w tym momencie wype\u0142nione.<\/p>\n<p>Je\u015bli zapisywany obiekt nie zawiera wieloj\u0119zycznych atrybut\u00f3w typu String lub eksport wieloj\u0119zyczny nie jest wspierany, u\u017cywana jest druga sygnatura.<\/p>\n<p>Wywo\u0142anie jednej z sygnatur metody <em>write()<\/em> zapisuje obiekt oraz proste relacje do obiekt\u00f3w niezale\u017cnych tego obiektu, ale nie zapisuje pozosta\u0142ych relacji.<\/p>\n<h6 id=\"wczytywanie-obiektu\" ><span class=\"ez-toc-section\" id=\"Wczytywanie_obiektu-2\"><\/span>Wczytywanie obiektu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Do wczytywania obiektu podczas importu dost\u0119pne s\u0105 dwie sygnatury metody <em>read()<\/em>:<\/p>\n<p><em>void read(Source source, Object obj, Map&lt;String,NLSData&gt; nlsDatas) <\/em><br \/><em>void read(Source source, Object obj)<\/em><\/p>\n<p>Za pomoc\u0105 tych metod dane obiektu s\u0105 wczytywane z przekazanego obiektu \u017ar\u00f3d\u0142owego<em> source<\/em> do przekazanego obiektu <em>obj<\/em>. Dla parametru <em>obj <\/em>powinna by\u0107 u\u017cyta odpowiednia przej\u015bciowa instancja podklasy <em>CisObject<\/em>.<\/p>\n<p>Je\u015bli wczytywany obiekt zawiera wieloj\u0119zyczne atrybuty typu String, a kontroler wspiera eksport wieloj\u0119zyczny, nale\u017cy u\u017cy\u0107 pierwszej sygnatury. W tym przypadku kontroler musi dodatkowo przekaza\u0107 instancj\u0119 interfejsu <em>java.util.Map<\/em>, kt\u00f3ra dla ka\u017cdego wieloj\u0119zycznego atrybutu typu String tego obiektu zawiera instancj\u0119 klasy <em>NLSData (com.cisag.pgm.datatype.NLSData<\/em>). Te instancje klasy <em>NLSData <\/em>nie musz\u0105 by\u0107 wype\u0142nione. Wieloj\u0119zyczne atrybuty s\u0105 wczytywane do obiektu <em>obj <\/em>w j\u0119zyku sesji, a w pozosta\u0142ych j\u0119zykach do powi\u0105zanej instancji klasy <em>NLSData<\/em>.<\/p>\n<p>Dolna sygnatura jest u\u017cywana, je\u015bli obiekt nie zawiera wieloj\u0119zycznych atrybut\u00f3w typu String lub gdy import wieloj\u0119zyczny nie jest wspierany przez kontroler.<\/p>\n<p>Dodatkowo, dolna sygnatura mo\u017ce by\u0107 u\u017cyta r\u00f3wnie\u017c w imporcie wieloj\u0119zycznym, gdy ma zosta\u0107 wczytana tylko identyfikacja obiektu. W trybie j\u0119zykowym<em> Wieloj\u0119zyczny<\/em>\u00a0atrybuty wieloj\u0119zyczne nie s\u0105 jednak w tym przypadku wczytywane. Dzi\u0119ki tej mo\u017cliwo\u015bci nie trzeba dostarcza\u0107 instancji klasy <em>NLSData,<\/em>\u00a0je\u015bli identyfikacja obiektu nie jest jeszcze znana.<\/p>\n<h4 id=\"hooki-bis\" ><span class=\"ez-toc-section\" id=\"Hooki_BIS\"><\/span>Hooki BIS<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Dla prostych jednostek biznesowych wymiana danych jest mo\u017cliwa bez dodatkowego nak\u0142adu pracy programistycznej, poniewa\u017c us\u0142uga Business Integration Service (BIS) obs\u0142uguje generyczny import i eksport. Jednak w wielu przypadkach spotykanych w praktyce, stworzenie kontrolera jest celowe i konieczne, aby jednostka biznesowa mog\u0142a by\u0107 dost\u0119pna do wymiany danych.<\/p>\n<p>Niniejszy artyku\u0142 wyja\u015bnia podstawowe procedury implementacji kontrolera oraz zawiera wskaz\u00f3wki dotycz\u0105ce korzystania z odpowiedniego API udost\u0119pnianego w tym celu przez Comarch ERP Enterprise.<\/p>\n<h5 id=\"modyfikowanie-modelu-danych-bis\" ><span class=\"ez-toc-section\" id=\"Modyfikowanie_modelu_danych_BIS\"><\/span>Modyfikowanie modelu danych BIS<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><em>ObjectInfoExtensionHook<\/em> oferuje mo\u017cliwo\u015b\u0107 usuwania atrybut\u00f3w i relacji z <em>ObjectInfo<\/em>, dodawania nowych atrybut\u00f3w lub zast\u0119powania <em>AttributeDescriptor<\/em>. Implementacja hook z systemu deweloperskiego mo\u017ce zmienia\u0107 tylko w\u0142asne atrybuty (atrybuty z w\u0142asnym prefiksem deweloperskim lub dowolne atrybuty wewn\u0105trz z\u0142o\u017conych atrybut\u00f3w z w\u0142asnym prefiksem deweloperskim).<\/p>\n<p>Implementacja hooka wp\u0142ywa na wszystkie kontrolery BIS i oddzia\u0142uje na w\u0119z\u0142y modelu danych BIS typu konkretnego obiektu biznesowego, kt\u00f3ry jest podany jako ograniczenie hooka. Hook jest wywo\u0142ywany zar\u00f3wno dla otoczki jednostki biznesowej, jak i dla relacji zewn\u0119trznych; implementacja hooka mo\u017ce w ka\u017cdym przypadku sprawdzi\u0107, czy modyfikowany w\u0119ze\u0142 modelu danych BIS nale\u017cy do otoczki jednostki biznesowej, czy jest relacj\u0105 zewn\u0119trzn\u0105.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Poprzez implementacj\u0119 hook contract\u00a0 <em>com.cisag.app.bi.log.PartnerTaxIdentificationNumberAttributeDescriptor<\/em> w w\u0119z\u0142ach obiektu biznesowego <em>Partner<\/em> zostaje wstawiony wirtualny atrybut.<\/div><\/section>\n<p>Atrybuty i relacje w obiektach<em> Part <\/em>obiektu biznesowego r\u00f3wnie\u017c mog\u0105 by\u0107 zmieniane. Nie jest jednak mo\u017cliwe nawigowanie do podrz\u0119dnych obiekt\u00f3w biznesowych. W tym celu nale\u017cy u\u017cy\u0107 w\u0142asnej implementacji hooka.<\/p>\n<p>Relacje <em>Dependent<\/em> nie mog\u0105 by\u0107 dodawane za pomoc\u0105 tego hooka, a jedynie za pomoc\u0105 <em>DependentAssociationHook<\/em>.<\/p>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Wskaz\u00f3wka dla wieloj\u0119zycznych atrybut\u00f3w typu String z rozszerze\u0144 obiekt\u00f3w biznesowych: W relacjach zewn\u0119trznych atrybuty te s\u0105 automatycznie wspierane przez BIS. Je\u015bli jednak znajduj\u0105 si\u0119 one wewn\u0105trz jednostki biznesowej, to wymagane jest albo generyczne wsparcie wszystkich wieloj\u0119zycznych atrybut\u00f3w typu String w kontrolerze, albo kontroler musi zosta\u0107 zaadaptowany. Hook nie mo\u017ce by\u0107 w tym przypadku u\u017cyty.<\/div><\/section>\n<p>Ten sam cel ma <em>DataViewBISHook<\/em>, kt\u00f3ry jest jednak zale\u017cny od kontrolera. W przeciwie\u0144stwie do <em>ObjectInfoExtensionHook<\/em>, wp\u0142ywa on tylko na jeden konkretny kontroler BIS i mo\u017ce dzia\u0142a\u0107 wy\u0142\u0105cznie na obiektach z otoczki jednostki biznesowej. Oferuje jednak dost\u0119p do zmiennych kontekstowych, kt\u00f3re s\u0105 ustawiane przez kontroler.<\/p>\n<p><em>DataViewBISHook<\/em> musi by\u0107 okre\u015blony poprzez ograniczenie hooka na w\u0119\u017ale modelu danych BIS, kt\u00f3ry musi by\u0107 wyposa\u017cony w <em>DataViewBIS<\/em>.<\/p>\n<p>Dost\u0119pno\u015b\u0107 zmiennych kontekstowych zale\u017cy od kontrolera. Zazwyczaj kontroler udost\u0119pnia widok obiektu jako zmienn\u0105 kontekstow\u0105, kt\u00f3rej w\u0119ze\u0142 zosta\u0142 wyposa\u017cony w <em>DataViewBIS<\/em>.<\/p>\n<h5 id=\"zastepowanie-attributedescriptor\" ><span class=\"ez-toc-section\" id=\"Zastepowanie_AttributeDescriptor\"><\/span>Zast\u0119powanie AttributeDescriptor<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Za pomoc\u0105 hooka <em>BISRegistryHook <\/em>mo\u017cna zarejestrowa\u0107 <em>AttributeDescriptor<\/em> dla logicznego typu danych w rejestrze BIS. <em>AttributeDescriptor<\/em> jest wtedy u\u017cywany dla wszystkich atrybut\u00f3w danego logicznego typu danych. Logiczny typ danych musi pochodzi\u0107 z tego samego systemu deweloperskiego, co implementacja hooka.<\/p>\n<p>Ten hook odpowiada metodzie <em>registerAttributeDescriptors(Map&lt;String, String&gt;)<\/em> klasy Java <em>BIS-Registry<\/em>,\u00a0ale pozwala unikn\u0105\u0107 konflikt\u00f3w podczas wgrywania aktualizacji oprogramowania.<\/p>\n<h5 id=\"dodawanie-obiektow-zaleznych\" ><span class=\"ez-toc-section\" id=\"Dodawanie_obiektow_zaleznych\"><\/span>Dodawanie obiekt\u00f3w zale\u017cnych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Za pomoc\u0105 <em>DependentAssociationHook<\/em> mo\u017cna doda\u0107 obiekt zale\u017cny (<em>Dependent<\/em>) do modelu danych BIS kontrolera, o ile kontroler to wspiera. Obiekty zale\u017cne mog\u0105 by\u0107 jednak dodawane tylko do w\u0119z\u0142\u00f3w, kt\u00f3rych<em> ObjectInfo<\/em> zosta\u0142o wyposa\u017cone w <em>DataViewBIS<\/em>.<\/p>\n<p>Ka\u017cda implementacja tego hooka tworzy obiekt zale\u017cny, ustala jego nazw\u0119, krotno\u015b\u0107 i <em>ObjectInfo.<\/em> Zawiera metody do zapisywania i wczytywania obiektu zale\u017cnego. U\u017cycie hooka jest udokumentowane w Javadoc klasy <em>com.cisag.pgm.bi.hook.DependentAssociationHook<\/em>.<\/p>\n<p><em>DependentAssociationHook<\/em> transportuje dane mi\u0119dzy stanowym hookiem a plikiem eksportu\/importu. Do wczytywania, walidacji i zapisywania obiektu zale\u017cnego wymagany jest hook na poziomie jednostki biznesowej oraz implementacja hooka.<\/p>\n<h4 id=\"rejestr-bis\" ><span class=\"ez-toc-section\" id=\"Rejestr_BIS\"><\/span>Rejestr BIS<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Rejestr BIS zawiera kontrolery oraz inne obiekty deweloperskie, kt\u00f3re s\u0105 u\u017cywane przez kontrolery. W tym celu rejestr BIS jest podzielony na grupy, kt\u00f3re s\u0105 przedstawione w poni\u017cszej tabeli.<\/p>\n<p>Grupy rejestr\u00f3w, w kt\u00f3rych obiekty deweloperskie s\u0105 rejestrowane z obiektem biznesowym jako kluczem, s\u0105 rejestrowane w typie obiektu deweloperskiego dodatku do opisu obiektu. W innych przypadkach do rejestracji s\u0142u\u017cy hook.<\/p>\n<p>Ponadto, obiekty deweloperskie mo\u017cna rejestrowa\u0107 w klasie Java rejestru <em>com.cisag.app.bi.Registry<\/em>. Rejestracja w obiekcie deweloperskim ma jednak pierwsze\u0144stwo przed klas\u0105 Java rejestru, kt\u00f3ra w Comarch ERP Enterprise 5.0 powinna by\u0107 u\u017cywana tylko wtedy, gdy nie ma innej mo\u017cliwo\u015bci.<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 207px;\">\n<tbody>\n<tr style=\"height: 46px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><strong>Grupa rejestru<\/strong><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><strong>Rejestracja w obiekcie deweloperskim<\/strong><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><strong>Rejestracja w klasie Java<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Kontroler<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodatek do opisu obiektu (nie dotyczy obiekt\u00f3w importu <em>Part<\/em>)<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\n<p>Dotyczy obiekt\u00f3w importu Part. Inaczej deprecated<\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Aplikacje koryguj\u0105ce<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodatek do opisu obiektu<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">deprecated<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wyszukiwania OQL<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodatek do opisu obiektu<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">deprecated<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Validation<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodatek do opisu obiektu<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">deprecated<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">AttributeDescriptor<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Hook <em>BISRegistryHook<\/em><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tak<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">FormatLookup<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\u00a0<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tak<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Resolver<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodatek do opisu obiektu<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">deprecated<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Rejestracja w obiekcie deweloperskim zapobiega konfliktom spowodowanym aktualizacjami oprogramowania, takim jakie wyst\u0119puj\u0105 w przypadku scentralizowanej klasy Java rejestru. W obr\u0119bie aplikacji mo\u017cliwa jest tylko rejestracja w obiekcie deweloperskim.<\/p>\n<p>Do migracji z klasy Java rejestru do obiektu deweloperskiego typu dodatku do opisu obiektu mo\u017cna u\u017cy\u0107 polecenia toolshell <em>crtoda<\/em>.<\/p>\n<p>W kolejnych sekcjach niekt\u00f3re grupy rejestr\u00f3w zosta\u0142y opisane dok\u0142adniej. Opis dodatku do opisu obiektu jako typu obiektu deweloperskiego znajduje si\u0119 w artykule <em>Obiekty deweloperskie<\/em>.<\/p>\n<h5 id=\"kontroler\" ><span class=\"ez-toc-section\" id=\"Kontroler\"><\/span>Kontroler<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Implementacje kontroler\u00f3w musz\u0105 by\u0107 zarejestrowane, aby mog\u0142y by\u0107 u\u017cywane przez BIS. W tym przypadku nale\u017cy rozr\u00f3\u017cni\u0107 eksport i import.<\/p>\n<p>W obiekcie deweloperskim typu dodatek do opisu obiektu podaje si\u0119 kontroler eksportu i kontroler importu oddzielnie, nawet je\u015bli jest to ta sama klasa implementacyjna. Nazwa dodatku do opisu obiektu jest zasadniczo taka sama jak nazwa obiektu biznesowego, kt\u00f3ry jest eksportowany lub importowany przez kontroler.<\/p>\n<p>W klasie Java rejestru istniej\u0105 nast\u0119puj\u0105ce mo\u017cliwo\u015bci: w metodzie<\/p>\n<p><em>public static void registerControllers(Map&lt;String,String&gt; ctrls)<\/em><\/p>\n<p>mo\u017cna rejestrowa\u0107 kontrolery, je\u015bli istnieje tylko kontroler eksportu, tylko kontroler importu, lub je\u015bli oba kontrolery s\u0105 zaimplementowane w tej samej klasie.<\/p>\n<p><em>public static void registerExportControllers(Map&lt;String,String&gt;<\/em><em>eCtrls) <\/em><br \/><em>public static void registerImportControllers(Map&lt;String,String&gt;<\/em><em>iCtrls) <\/em><\/p>\n<p>mo\u017cna r\u00f3wnie\u017c rejestrowa\u0107 kontrolery, kt\u00f3re dla danego podmiotu biznesowego s\u0105 zaimplementowane w dw\u00f3ch oddzielnych klasach.<\/p>\n<p>Aby dokona\u0107 rejestracji, nale\u017cy doda\u0107 wpis do przekazanej instancji <em>java.util.Map<\/em>, gdzie kluczem jest nazwa jednostki biznesowej, a warto\u015bci\u0105 nazwa klasy kontrolera.<\/p>\n<h5 id=\"wyszukiwanie-oql\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_OQL\"><\/span>Wyszukiwanie OQL<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dla jednostki biznesowej mo\u017cna rejestrowa\u0107 wyszukiwania OQL, kt\u00f3re s\u0105 dost\u0119pne do zaw\u0119\u017cania kryteri\u00f3w podczas eksportu. Zarejestrowane wyszukiwania s\u0105 dost\u0119pne w aplikacji <em>Eksport danych<\/em> na zak\u0142adce <em>Ograniczenia<\/em>.<\/p>\n<p>Je\u015bli dla jednostki biznesowej nie zarejestrowano wyszukiwa\u0144 OQL, BIS samodzielnie okre\u015bla pasuj\u0105ce wyszukiwania OQL. Zaleca si\u0119 jednak rejestrowanie wyszukiwa\u0144 OQL.<\/p>\n<h5 id=\"aplikacje-korygujace\" ><span class=\"ez-toc-section\" id=\"Aplikacje_korygujace\"><\/span>Aplikacje koryguj\u0105ce<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Mo\u017cna zarejestrowa\u0107 aplikacj\u0119 koryguj\u0105c\u0105 dla jednostki biznesowej. Je\u015bli dla danej jednostki nie zarejestrowano \u017cadnej aplikacji koryguj\u0105cej, BIS samodzielnie okre\u015bla mo\u017cliwe aplikacje koryguj\u0105ce na podstawie parametr\u00f3w istniej\u0105cych aplikacji dialogowych. Zaleca si\u0119 jednak rejestrowanie aplikacji koryguj\u0105cej, poniewa\u017c w wi\u0119kszo\u015bci przypadk\u00f3w automatyczne wyszukiwanie znajduje r\u00f3wnie\u017c aplikacje, kt\u00f3re nie mog\u0105 by\u0107 u\u017cywane jako aplikacje koryguj\u0105ce.<\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9685","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-podreczniki-referencji"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9685","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=9685"}],"version-history":[{"count":29,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9685\/revisions"}],"predecessor-version":[{"id":36927,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9685\/revisions\/36927"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}