{"id":9687,"date":"2025-08-08T09:21:16","date_gmt":"2025-08-08T07:21:16","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9687"},"modified":"2025-08-08T09:21:16","modified_gmt":"2025-08-08T07:21:16","slug":"podrecznik-referencyjny-uproszczona-wymiana-danych","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-uproszczona-wymiana-danych\/","title":{"rendered":"Podr\u0119cznik referencyjny: Uproszczona 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-uproszczona-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-uproszczona-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-uproszczona-wymiana-danych\/#Rozwoj\" >Rozw\u00f3j<\/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-uproszczona-wymiana-danych\/#Obiekty_aplikacji\" >Obiekty aplikacji<\/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-uproszczona-wymiana-danych\/#Kontroler\" >Kontroler<\/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-uproszczona-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-uproszczona-wymiana-danych\/#Rejestracja\" >Rejestracja<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-uproszczona-wymiana-danych\/#Struktura_zewnetrzna\" >Struktura zewn\u0119trzna<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-uproszczona-wymiana-danych\/#Obiekt_szablonu\" >Obiekt szablonu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-uproszczona-wymiana-danych\/#FormatLookUp\" >FormatLookUp<\/a><\/li><li class='ez-toc-page-1 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-uproszczona-wymiana-danych\/#Standardowe_rozwiazania\" >Standardowe rozwi\u0105zania<\/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-uproszczona-wymiana-danych\/#Ladowanie_dodatkowych_obiektow\" >\u0141adowanie dodatkowych obiekt\u00f3w<\/a><\/li><\/ul><\/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\/podrecznik-referencyjny-uproszczona-wymiana-danych\/#Kontrole\" >Kontrole<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-uproszczona-wymiana-danych\/#Anulowanie_lub_kontynuacja\" >Anulowanie lub kontynuacja<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p>W przypadku prostych jednostek biznesowych wymiana danych jest mo\u017cliwa bez dodatkowego nak\u0142adu pracy programistycznej, poniewa\u017c us\u0142uga integracji biznesowej (BIS) obs\u0142uguje generyczny import i eksport. W przypadku bardziej z\u0142o\u017conych zastosowa\u0144 nale\u017cy u\u017cy\u0107 klasycznej wymiany danych. Zapewnia ona najwi\u0119ksz\u0105 mo\u017cliw\u0105 elastyczno\u015b\u0107.<\/p>\n<p>Uproszczona wymiana danych k\u0142adzie wi\u0119kszy nacisk na szybko\u015b\u0107 wymiany danych. Typowym przyk\u0142adem u\u017cycia uproszczonej wymiany danych by\u0142oby np. okresowe przesy\u0142anie zawsze tych samych 10 atrybut\u00f3w obiektu biznesowego <em>Partner<\/em>. Wysoka pr\u0119dko\u015b\u0107 przesy\u0142ania wynika z zawsze takiej samej struktury danych.<\/p>\n<p>Niniejszy artyku\u0142 wyja\u015bnia podstawowe procedury implementacji kontrolera dla uproszczonej wymiany danych i zawiera wskaz\u00f3wki dotycz\u0105ce korzystania z odpowiedniego interfejsu programistycznego.<\/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 Javy, kt\u00f3ra realizuje import lub eksport jednostki biznesowej. W przypadku uproszczonej wymiany danych konkretny kontroler musi dziedziczy\u0107 z abstrakcyjnej klasy <em>com.cisag.pgm.bi.lite.LiteController<\/em>. Kontroler dostarcza model danych, kt\u00f3ry ma by\u0107 u\u017cywany do importu lub eksportu, a tym samym okre\u015bla zestaw obiekt\u00f3w, atrybut\u00f3w i relacji dost\u0119pnych dla jednostki biznesowej.<\/li>\n<li><strong>Obiekt zewn\u0119trzny<\/strong> &#8212; obiekt zewn\u0119trzy to obiekt deweloperski, kt\u00f3ry zawiera wybrane i ewentualnie ju\u017c rozwi\u0105zane atrybuty. W kontrolerze uproszczonej wymiany danych s\u0142u\u017cy on jako filtr, podobnie jak w klasycznym <em>Business Integration Service<\/em> (BIS). Poniewa\u017c jest to obiekt deweloperski, aby zmieni\u0107 filtr, nale\u017cy utworzy\u0107 now\u0105 wersj\u0119 tego obiektu.<\/li>\n<li><strong>ExternalValueNode<\/strong> &#8212; te zewn\u0119trzne w\u0119z\u0142y odwzorowuj\u0105 struktur\u0119 zewn\u0119trzn\u0105. Obiekt jest opakowaniem dla obiektu zewn\u0119trznego i dodatkowo zna struktur\u0119, tj. nadrz\u0119dne i podrz\u0119dne inne obiekty zewn\u0119trzne. Ta struktura jest tworzona poprzez rejestracje.<\/li>\n<li><strong>InternalValueNode<\/strong> &#8212; te wewn\u0119trzne w\u0119z\u0142y odwzorowuj\u0105 struktur\u0119 wewn\u0119trzn\u0105. Obiekt jest opakowaniem dla danego <em>CisObject<\/em>. Dodatkowo zna nadrz\u0119dne i podrz\u0119dne obiekty biznesowe. Ta struktura jest tworzona przez <em>ObjectInfo<\/em>.<\/li>\n<\/ul>\n<h3 id=\"rozwoj\" ><span class=\"ez-toc-section\" id=\"Rozwoj\"><\/span>Rozw\u00f3j<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Struktura okre\u015blona przez obiekt deweloperski typu<em> Obiekt zewn\u0119trzny<\/em> pozwala na blokowe odczytywanie i zapisywanie danych. Mo\u017ce to prowadzi\u0107 do znacznego wzrostu wydajno\u015bci w por\u00f3wnaniu z klasycznym <em>Business Integration Service<\/em> (BIS). Je\u015bli podczas tworzenia kontrolera dodatkowo b\u0119d\u0105 wykonywane pojedyncze dost\u0119py do bazy danych, zysk ten zostanie zniweczony. Dlatego nale\u017cy pami\u0119ta\u0107: je\u015bli konieczne s\u0105 pojedyncze dost\u0119py do bazy danych, jest to wskaz\u00f3wka, \u017ce wymagana jest elastyczno\u015b\u0107 klasycznego BIS. Uproszczona wymiana danych nie nadaje si\u0119 do tego.<\/p>\n<h4 id=\"obiekty-aplikacji\" ><span class=\"ez-toc-section\" id=\"Obiekty_aplikacji\"><\/span>Obiekty aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Warunkiem uproszczonego eksportu lub importu danych s\u0105 obiekty deweloperskie typu <em>Aplikacja<\/em>, dla kt\u00f3rych okre\u015blono typ aplikacji<em> Uproszczona wymiana danych<\/em> oraz szczeg\u00f3lne zastosowanie <em>Eksport<\/em> lub <em>Import<\/em>. Mog\u0105 one zosta\u0107 wybrane w aplikacjach <em>Eksport uproszczony<\/em>\u00a0lub <em>Import uproszczony<\/em>. Jako klas\u0119 Java nale\u017cy poda\u0107 kontroler.<\/p>\n<h4 id=\"kontroler\" ><span class=\"ez-toc-section\" id=\"Kontroler\"><\/span>Kontroler<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Kontroler to klasa Javy, kt\u00f3ra realizuje import i eksport dla okre\u015blonej jednostki biznesowej. Nale\u017cy pami\u0119ta\u0107 o nast\u0119puj\u0105cych kwestiach:<\/p>\n<ul>\n<li>Kontroler dla uproszczonej wymiany danych musi dziedziczy\u0107 z abstrakcyjnej klasy <em>com.cisag.pgm.bi.lite.LiteController<\/em><\/li>\n<li>Je\u015bli dla jednostki biznesowej maj\u0105 by\u0107 mo\u017cliwe 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 zdefiniowa\u0107 odmienne modele danych<\/li>\n<\/ul>\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. W przypadku uproszczonej wymiany danych <em>ObjectInfo<\/em> ma dwa zadania:<\/p>\n<ul>\n<li>Je\u015bli za pomoc\u0105 importu ma zosta\u0107 utworzony nowy obiekt, okre\u015bla si\u0119 ca\u0142kowit\u0105 liczb\u0119 obiekt\u00f3w biznesowych do utworzenia. W tym celu konieczna jest dodatkowa rejestracja obiektu szablonu.<\/li>\n<li>Je\u015bli chce si\u0119 zbudowa\u0107 bardziej z\u0142o\u017con\u0105 struktur\u0119 i po\u0142\u0105czy\u0107 kilka obiekt\u00f3w zewn\u0119trznych, po\u0142\u0105czenie odbywa si\u0119 za pomoc\u0105 relacji zdefiniowanej w <em>ObjectInfo<\/em><\/li>\n<\/ul>\n<p>Model danych BIS okre\u015bla struktur\u0119 importowanych lub eksportowanych danych.<\/p>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Zazwyczaj klasyczny BIS dla danej jednostki biznesowej ju\u017c istnieje. Klasyczny BIS r\u00f3wnie\u017c musi definiowa\u0107 <em>ObjectInfo. <\/em>Dlatego najpro\u015bciej jest u\u017cy\u0107 ju\u017c zdefiniowanego <em>ObjectInfo <\/em>r\u00f3wnie\u017c dla uproszczonej wymiany danych. Dalsze informacje, m.in. na temat specyfiki tworzenia <em>ObjectInfo, <\/em>mo\u017cna znale\u017a\u0107 w artykule <em>Podr\u0119cznik referencyjny: Wymiana danych<\/em>.<\/div><\/section>\n<h5 id=\"rejestracja\" ><span class=\"ez-toc-section\" id=\"Rejestracja\"><\/span>Rejestracja<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6 id=\"struktura-zewnetrzna\" ><span class=\"ez-toc-section\" id=\"Struktura_zewnetrzna\"><\/span>Struktura zewn\u0119trzna<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>W klasycznym BIS dost\u0119pne s\u0105 filtry, z kt\u00f3rych mo\u017cna wybra\u0107 u\u017cywane atrybuty. Uproszczona wymiana danych wymaga ustalonej struktury danych. To ustalenie odbywa si\u0119 za pomoc\u0105 obiektu zewn\u0119trznego.<\/p>\n<p>W konkretnej implementacji kontrolera dla uproszczonej wymiany danych nale\u017cy zmieni\u0107 abstrakcyjn\u0105 metod\u0119 <em>registerExternalInformation<\/em>. W niej trzeba zdefiniowa\u0107 okre\u015blone informacje dla uproszczonej wymiany danych.<\/p>\n<p>Przyk\u0142ad dla prostego przypadku tej metody:<\/p>\n<p><em>@Override <\/em><br \/>\n<em>protected boolean registerExternalInformation() { <\/em><br \/>\n<em>return registerExternalObjectByBusinessKey(ExternalItem.class); <\/em><br \/>\n<em>} <\/em><\/p>\n<p>W tym przyk\u0142adzie obiekt zewn\u0119trzny <em>ExternalItem <\/em>jest rejestrowany jako obiekt g\u0142\u00f3wny. Ten obiekt zewn\u0119trzny odnosi si\u0119 do obiektu biznesowego <em>Item<\/em>. Jednocze\u015bnie ustalono, \u017ce ma by\u0107 u\u017cywany <em>Business Key<\/em>.<\/p>\n<p>Do rejestracji obiektu g\u0142\u00f3wnego dost\u0119pne s\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li>registerExternalObjectByPrimaryKey<\/li>\n<li>registerExternalObjectByBusinessKey<\/li>\n<li>registerExternalObjectBySecondaryKey<\/li>\n<\/ul>\n<p>Zalecana jest rejestracja za pomoc\u0105 <em>Business Key<\/em>. W ramach jednego kontrolera mo\u017cna zarejestrowa\u0107 tylko jeden obiekt zewn\u0119trzny jako obiekt g\u0142\u00f3wny, co oznacza, \u017ce dok\u0142adnie jedna z tych metod musi zosta\u0107 wywo\u0142ana dok\u0142adnie raz.<\/p>\n<p>Mo\u017cna r\u00f3wnie\u017c budowa\u0107 bardziej z\u0142o\u017cone struktury zewn\u0119trzne. To, co jest mo\u017cliwe, jest z g\u00f3ry okre\u015blone przez ju\u017c zdefiniowane <em>ObjectInfo.<\/em><\/p>\n<p>Aby zarejestrowa\u0107 dodatkowe obiekty, mo\u017cna wykorzysta\u0107 nast\u0119puj\u0105c\u0105 sk\u0142adni\u0119:<\/p>\n<p><em>@Override <\/em><br \/>\n<em>protected boolean registerExternalInformation(){ <\/em><br \/>\n<em>boolean result = registerExternalObjectByBusinessKey(ExternalItem.class); <\/em><br \/>\n<em>AssociationDescriptor purchaseItemsAssociation = getObjectInfo().getAssociation(&#8222;PurchaseItems&#8221;); <\/em><br \/>\n<em>result &amp;= registerExternalChildByPri\u0002maryKey(ExternalItem.class,purchaseItemsAssociation , ExternalPurchaseItem.class); <\/em><br \/>\n<em>return result; <\/em><br \/>\n<em>} <\/em><\/p>\n<p>W tym przyk\u0142adzie najpierw, jak powy\u017cej, rejestrowany jest obiekt zewn\u0119trzny<em> ExternalItem<\/em>\u00a0za pomoc\u0105 <em>Business Key<\/em>. Mi\u0119dzy obiektami biznesowymi <em>Item<\/em> i <em>PurchaseItem<\/em> zdefiniowana jest relacja za pomoc\u0105 <em>ObjectInfo<\/em>. Mo\u017cna jej u\u017cy\u0107 do zarejestrowania obiektu zewn\u0119trznego <em>ExternalPurchaseItem<\/em> jako obiektu podrz\u0119dnego\u00a0obiektu zewn\u0119trznego<em> ExternalItem<\/em>.<\/p>\n<p>Obiekt zewn\u0119trzny <em>ExternalPurchaseItem<\/em> odnosi si\u0119 do obiektu biznesowego <em>PurchaseItem<\/em>. W tym przypadku rejestracja odbywa si\u0119 za pomoc\u0105 <em>PrimaryKey<\/em>. Relacja jest skierowana na <em>PrimaryKey<\/em> obiektu biznesowego <em>PurchaseItem<\/em>.<\/p>\n<p>Jako pierwszy parametr podawany jest obiekt zewn\u0119trzny nadrz\u0119dny, nast\u0119pnie relacja mi\u0119dzy obiektami, a na ko\u0144cu obiekt zewn\u0119trzny podrz\u0119dny. Obiekt nadrz\u0119dny musi by\u0107 ju\u017c zarejestrowany, aby m\u00f3c rejestrowa\u0107 dla niego obiekty podrz\u0119dne..<\/p>\n<p>Do rejestrowania obiekt\u00f3w podrz\u0119dnych dost\u0119pne s\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li>registerExternalChildByPrimaryKey<\/li>\n<li>registerExternalChildByBusinessKey<\/li>\n<li>registerExternalChildBySecondaryKey<\/li>\n<\/ul>\n<p>Za pomoc\u0105 tej metody mo\u017cna r\u00f3wnie\u017c rejestrowa\u0107 obiekty podrz\u0119dne dla zarejestrowanych ju\u017c obiekt\u00f3w podrz\u0119dnych.<\/p>\n<h6 id=\"obiekt-szablonu\" ><span class=\"ez-toc-section\" id=\"Obiekt_szablonu\"><\/span>Obiekt szablonu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Mo\u017cna dokona\u0107 kilku innych rejestracji. Najwa\u017cniejsza z nich to ta metoda <em>registerTemplateKey(byte[] key)<\/em>.<\/p>\n<p>Za jej pomoc\u0105 mo\u017cna wyr\u00f3\u017cni\u0107 obiekt biznesowy, kt\u00f3ry ma by\u0107 u\u017cywany jako szablon podczas importu. Struktura zewn\u0119trzna jest zazwyczaj tylko ma\u0142ym wycinkiem maksymalnej liczby obiekt\u00f3w i zawartych w nich atrybut\u00f3w, kt\u00f3re s\u0105 zdefiniowane za pomoc\u0105 <em>ObjectInfo<\/em>. Importowane s\u0105 tylko te dane, kt\u00f3re zosta\u0142y okre\u015blone za pomoc\u0105 struktury zewn\u0119trznej i u\u017cytych do tego obiekt\u00f3w zewn\u0119trznych. Zazwyczaj jest to jednak niewystarczaj\u0105ce.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Struktura zewn\u0119trzna zawiera tylko dane z obiekt\u00f3w biznesowych<em> Item<\/em> i <em>PurchaseItem<\/em>, przedstawione za pomoc\u0105 powi\u0105zanych obiekt\u00f3w zewn\u0119trznych.<\/p>\n<p>Aby m\u00f3c u\u017cy\u0107 artyku\u0142u, potrzebne s\u0105 jednak jeszcze dane ksi\u0119gowe. S\u0142u\u017cy do tego obiekt szablonu. Poniewa\u017c w tym przyk\u0142adzie<em> Item<\/em> jest obiektem g\u0142\u00f3wnym, u\u017cytkownik rejestruje artyku\u0142 jako obiekt szablonu. Je\u015bli podczas importu zostanie stwierdzone, \u017ce nie istnieje instancja dla tego artyku\u0142u, tworzona jest kopia obiektu szablonu, a dane zewn\u0119trzne s\u0105 przenoszone do tej kopii. Oczywi\u015bcie wszystkie unikalne klucze wszystkich tak skopiowanych obiekt\u00f3w musz\u0105 zosta\u0107 zmienione. Je\u015bli te atrybuty klucza s\u0105 typu danych <em>Guid<\/em>, dzieje si\u0119 to automatycznie. Wszystkie unikalne klucze wszystkich zaanga\u017cowanych obiekt\u00f3w biznesowych musz\u0105 zosta\u0107 zmienione w kopii obiektu szablonu, albo automatycznie, albo za pomoc\u0105 struktury zewn\u0119trznej. W przeciwnym razie nieuchronnie wyst\u0105pi\u0142by b\u0142\u0105d <em>DuplicateKeyViolation<\/em>.<\/div><\/section>\n<p><em>@Override <\/em><br \/>\n<em>protected boolean registerExternalInformation(){ <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>registerTemplateKey(Item.buildByNumberKey(&#8222;ABCDE&#8221;)); <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>}<\/em><\/p>\n<p>Je\u015bli podczas importu zostanie stwierdzone, \u017ce brakuje artyku\u0142u, kt\u00f3ry ma zosta\u0107 zaimportowany, artyku\u0142 <em>ABCDE<\/em> zostanie u\u017cyty jako szablon. Nale\u017cy organizacyjnie upewni\u0107 si\u0119, \u017ce artyku\u0142 <em>ABCDE<\/em> faktycznie istnieje. Technicznie tworzona jest kopia artyku\u0142u szablonowego. Obejmuje to wszystkie obiekty biznesowe podane w <em>ObjectInfo<\/em>.<\/p>\n<p>Mo\u017cna r\u00f3wnie\u017c zarejestrowa\u0107 kilka obiekt\u00f3w szablonowych, a nast\u0119pnie samodzielnie zdecydowa\u0107, kt\u00f3rego z nich u\u017cy\u0107 w konkretnym przypadku. W tym celu nale\u017cy zmieni\u0107 nast\u0119puj\u0105c\u0105 metod\u0119 <em>protected InternalValueNode getTemplate(ExternalValueNode vn<\/em>.<\/p>\n<p>Je\u015bli zarejestrowano tylko jeden obiekt szablonu, nie jest to konieczne. W takim przypadku zawsze zostanie zwr\u00f3cony ten jeden obiekt.<\/p>\n<p>Je\u015bli nie zarejestruje si\u0119 \u017cadnego obiektu szablonu, system nie b\u0119dzie m\u00f3g\u0142 tworzy\u0107 nowych obiekt\u00f3w za pomoc\u0105 importu. W takim przypadku w aplikacji <em>Import uproszczony<\/em>\u00a0pojawi si\u0119 odpowiedni komunikat ostrzegawczy.<\/p>\n<h6 id=\"formatlookup\" ><span class=\"ez-toc-section\" id=\"FormatLookUp\"><\/span>FormatLookUp<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Podobnie jak w klasycznym <em>Business Integration Service<\/em> (BIS), mo\u017cna zarejestrowa\u0107<em> FormatLookup<\/em> dla atrybutu. Jest to przydatne, na przyk\u0142ad, gdy wy\u015bwietlanie warto\u015bci atrybutu zale\u017cy od u\u017cywanego formatu pliku.<\/p>\n<h6 id=\"standardowe-rozwiazania\" ><span class=\"ez-toc-section\" id=\"Standardowe_rozwiazania\"><\/span>Standardowe rozwi\u0105zania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>W obiekcie deweloperskim typu <em>Obiekt zewn\u0119trzny<\/em> mo\u017cna zdefiniowa\u0107 rozwi\u0105zania. Obiekt zewn\u0119trzny zawiera atrybut, kt\u00f3ry w rzeczywisto\u015bci jest kluczem obcym. W obiekcie zewn\u0119trznym, za pomoc\u0105 relacji do obiektu biznesowego, mo\u017cna okre\u015bli\u0107, sk\u0105d pochodzi klucz obcy oraz czy i jak ma zosta\u0107 rozwi\u0105zany. Zazwyczaj klucz obcy to <em>PrimaryKey<\/em> obiektu docelowego. Jednak bardziej czytelny jest <em>BusinessKey<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Obiekt biznesowy <em>ItemCountryData<\/em> jest typu <em>Zale\u017cny<\/em> i nale\u017cy do obiektu biznesowego<em> Item<\/em>. Klucz g\u0142\u00f3wny obiektu zale\u017cnego jest dwucz\u0119\u015bciowy: jeden atrybut wskazuje na obiekt biznesowy <em>Item, <\/em>a drugi na obiekt biznesowy <em>Country. <\/em>W aplikacji artyku\u0142u ustalono, \u017ce istnieje og\u00f3lny rekord danych <em>ItemCountryData,<\/em> kt\u00f3ry jest wa\u017cny, je\u015bli nie istniej\u0105 specyficzne dane dla danego kraju. Ten og\u00f3lny rekord danych ma warto\u015b\u0107 klucza <em>ZEROGUID<\/em> dla atrybutu <em>country<\/em>. Brakuje jednak instancji obiektu biznesowego <em>Country <\/em>z kluczem <em>ZEROGUID. <\/em>W rezultacie rozwi\u0105zanie klucza obcego w tym przypadku zako\u0144czy\u0142oby si\u0119 niepowodzeniem.<\/div><\/section>\n<p>Je\u015bli zatem klucz nie mo\u017ce zosta\u0107 rozwi\u0105zany, automatycznie sprawdzane jest nast\u0119puj\u0105ce:<\/p>\n<ul>\n<li>Czy atrybut sam jest cz\u0119\u015bci\u0105 klucza g\u0142\u00f3wnego?<\/li>\n<li>Czy atrybut jest typu danych <em>guid<\/em>?<\/li>\n<li>Czy w przypadku eksportu warto\u015b\u0107 jest r\u00f3wna <em>ZEROGUID<\/em>?<\/li>\n<li>Czy w przypadku importu warto\u015bci\u0105 dla atrybutu <em>BusinessKey<\/em> jest pusty ci\u0105g znak\u00f3w lub<em> null<\/em> w pliku importu?<\/li>\n<\/ul>\n<p>Zar\u00f3wno w przypadku eksportu, jak i importu, konkretna instancja obiektu biznesowego <em>Country <\/em>nie ma znaczenia. Wymagane jest tylko rozwi\u0105zanie <em>PrimaryKey<\/em> na <em>BusinessKey<\/em>. Je\u015bli wi\u0119c powy\u017csze warunki s\u0105 spe\u0142nione, rozwi\u0105zanie jest wykonywane wewn\u0119trznie w pami\u0119ci, bez konkretnej instancji.<\/p>\n<p>Je\u015bli wyst\u0119puj\u0105 przypadki odbiegaj\u0105ce od tego wzorca, a mimo to ma nast\u0105pi\u0107 rozwi\u0105zanie klucza, mo\u017cna interweniowa\u0107 za pomoc\u0105 rejestracji <em>registerDefaultResolving<\/em>.<\/p>\n<p>Jako parametry nale\u017cy poda\u0107 obiekt zewn\u0119trzny, zdefiniowan\u0105 w nim nazw\u0119 narz\u0119dzia do rozwi\u0105zywania kluczy obcych, warto\u015b\u0107 atrybutu klucza obcego oraz warto\u015b\u0107 rozwi\u0105zuj\u0105c\u0105. Je\u015bli rekord danych odpowiada tym warunkom, do rozwi\u0105zania u\u017cywana jest ta rejestracja.<\/p>\n<p>W ten spos\u00f3b mo\u017cna r\u00f3wnie\u017c zmieni\u0107 opisane powy\u017cej standardowe zachowanie.<\/p>\n<p><em>@Override <\/em><br \/>\n<em>protected boolean registerExternalInformation(){ <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>registerDefaultResolving(ExternalItemCountryData.class, &#8222;country&#8221;, <\/em><br \/>\n<em>Guid.ZEROGUID, &#8222;ZEROGUIDSTRING&#8221;); <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>} <\/em><\/p>\n<p>W tym przypadku w obiekcie zewn\u0119trznym <em>ExternalItemCountryData <\/em>zostanie obs\u0142u\u017cone narz\u0119dzie do rozwi\u0105zywania kluczy obcych <em>country. <\/em>Je\u015bli konkretna warto\u015b\u0107 jest r\u00f3wna <em>ZEROGUID, <\/em>do eksportowanego pliku dla atrybutu rozwi\u0105zuj\u0105cego zostanie wpisana warto\u015b\u0107 <em>ZEROGUIDSTRING.<\/em><\/p>\n<p>W przypadku importu proces jest odwrotny: je\u015bli w importowanym pliku dla atrybutu rozwi\u0105zuj\u0105cego zostanie znaleziona warto\u015b\u0107 <em>ZEROGUIDSTRING, <\/em>zostanie przyj\u0119ta warto\u015b\u0107 <em>ZEROGUID <\/em>dla konkretnego atrybutu klucza obcego. W ten spos\u00f3b zmienia si\u0119 opisane powy\u017cej standardowe zachowanie.<\/p>\n<p>Dla bardziej z\u0142o\u017conych kluczy istnieje druga sygnatura. W niej warto\u015bci s\u0105 przekazywane jako dwie listy.<\/p>\n<h6 id=\"ladowanie-dodatkowych-obiektow\" ><span class=\"ez-toc-section\" id=\"Ladowanie_dodatkowych_obiektow\"><\/span>\u0141adowanie dodatkowych obiekt\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Zalet\u0105 wydajno\u015bciow\u0105 uproszczonej wymiany danych jest blokowe odczytywanie i zapisywanie danych. Je\u015bli konieczne jest przeprowadzenie kontroli sp\u00f3jno\u015bci importowanych danych i w tym celu potrzebne s\u0105 dane, kt\u00f3re nie znajduj\u0105 si\u0119 w plikach importu, mo\u017cna w ten spos\u00f3b zadba\u0107 o to, aby te dane r\u00f3wnie\u017c by\u0142y odczytywane blokowo.<\/p>\n<p><em>@Override <\/em><br \/>\n<em>protected boolean registerExternalInformation(){ <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>registerAdditionalObjectToBeLoaded(ItemAccountingData.class); <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>} <\/em><\/p>\n<p>W tym przyk\u0142adzie dane dotycz\u0105ce zaopatrzenia s\u0105 weryfikowane z danymi ksi\u0119gowymi. Jednocze\u015bnie dane ksi\u0119gowe nie s\u0105 cz\u0119\u015bci\u0105 importu. Warunkiem jest, aby \u017c\u0105dany obiekt biznesowy by\u0142 cz\u0119\u015bci\u0105 <em>ObjectInfo<\/em>.<\/p>\n<p>Technicznie ten rodzaj rejestracji nie jest konieczny, ale w pewnych okoliczno\u015bciach mo\u017cna w ten spos\u00f3b poprawi\u0107 wydajno\u015b\u0107.<\/p>\n<h5 id=\"kontrole\" ><span class=\"ez-toc-section\" id=\"Kontrole\"><\/span>Kontrole<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Implementuj\u0105c kontroler, u\u017cytkownik przejmuje odpowiedzialno\u015b\u0107 za sp\u00f3jno\u015b\u0107 importowanych danych. Niekt\u00f3re czysto techniczne kontrole s\u0105 przeprowadzane automatycznie. Je\u015bli zmieniane s\u0105 istniej\u0105ce dane poprzez import, unikalne klucze nie mog\u0105 by\u0107 zmieniane.<\/p>\n<p>Je\u015bli poprzez import zlecane jest systemowi utworzenie nowych danych, ma miejsce dok\u0142adnie odwrotna sytuacja. System automatycznie sprawdza, czy ka\u017cdy unikalny klucz zosta\u0142 zmieniony w stosunku do obiektu szablonu.<\/p>\n<p>Dzi\u0119ki zaimplementowaniu metod <em>validateImport<\/em> mo\u017cna przeprowadzi\u0107 dodatkowe kontrole. Je\u015bli u\u017cytkownik wykryje b\u0142\u0105d, mo\u017ce oznaczy\u0107 dane jako <em>invalid<\/em>.<\/p>\n<h5 id=\"anulowanie-lub-kontynuacja\" ><span class=\"ez-toc-section\" id=\"Anulowanie_lub_kontynuacja\"><\/span>Anulowanie lub kontynuacja<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dane s\u0105 przetwarzane blokowo. Je\u015bli w\u015br\u00f3d importowanych danych zostan\u0105 znalezione b\u0142\u0119dne rekordy, s\u0105 one zazwyczaj pomijane, a zapisywane s\u0105 tylko poprawne dane.<\/p>\n<p>Mo\u017cna jednak, zmieniaj\u0105c metod\u0119 <em>handleImportErrors<\/em> zdecydowa\u0107, czy proces ma zosta\u0107 przerwany, czy b\u0142\u0119dne rekordy maj\u0105 zosta\u0107 osobno zalogowane.<\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9687","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\/9687","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=9687"}],"version-history":[{"count":20,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9687\/revisions"}],"predecessor-version":[{"id":36369,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9687\/revisions\/36369"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}