{"id":9699,"date":"2025-04-24T12:24:56","date_gmt":"2025-04-24T10:24:56","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9699"},"modified":"2025-05-30T10:35:19","modified_gmt":"2025-05-30T08:35:19","slug":"podrecznik-referencji-aplikacje-typu-lista","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/","title":{"rendered":"Podr\u0119cznik referencyjny: Aplikacje typu Lista"},"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-referencji-aplikacje-typu-lista\/#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-referencji-aplikacje-typu-lista\/#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\/podrecznik-referencji-aplikacje-typu-lista\/#Zestaw_kolumn\" >Zestaw kolumn<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Mozliwosc_konfigurowania\" >Mo\u017cliwo\u015b\u0107 konfigurowania<\/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-referencji-aplikacje-typu-lista\/#Wyszukiwanie_szczegolowe\" >Wyszukiwanie szczeg\u00f3\u0142owe<\/a><\/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\/podrecznik-referencji-aplikacje-typu-lista\/#Model_programowania\" >Model programowania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wizualizacja\" >Wizualizacja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Filtr\" >Filtr<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Aplikacje_dzialajace_w_tle\" >Aplikacje dzia\u0142aj\u0105ce 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-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Eksport_i_uslugi_sieciowe_RESTful\" >Eksport i us\u0142ugi sieciowe RESTful<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Obiekty_deweloperskie\" >Obiekty deweloperskie<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Typy_obiektow_deweloperskich_Search_i_Search_extension\" >Typy obiekt\u00f3w deweloperskich Search i Search extension<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zakladka_FromWhere_Zapytanie_do_bazy_danych\" >Zak\u0142adka From\/Where: Zapytanie do bazy danych<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Klucze_obce\" >Klucze obce<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#REMOVABLE_JOIN\" >REMOVABLE JOIN<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Automatyczna_optymalizacja\" >Automatyczna optymalizacja<\/a><\/li><\/ul><\/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\/podrecznik-referencji-aplikacje-typu-lista\/#Zakladka_Atrybuty_Zestaw_kolumn\" >Zak\u0142adka Atrybuty: Zestaw kolumn<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Kolumna_Nazwa\" >Kolumna Nazwa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Kolumna_Wyrazenie\" >Kolumna Wyra\u017cenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zlozone_typy_danych\" >Z\u0142o\u017cone typy danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Wirtualnie\" >Pole wyboru: Wirtualnie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Obiekt_biznesowy\" >Pole wyboru: Obiekt biznesowy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Zaprogramowany_filtr\" >Pole wyboru: Zaprogramowany filtr<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Mozliwosc_filtrowania\" >Pole wyboru: Mo\u017cliwo\u015b\u0107 filtrowania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Mozliwe_sortowanie\" >Pole wyboru: Mo\u017cliwe sortowanie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Mozliwy_do_wyswietlenia\" >Pole wyboru: Mo\u017cliwy do wy\u015bwietlenia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pole_wyboru_Klucz_zwrotu\" >Pole wyboru: Klucz zwrotu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Logiczny_typ_danych\" >Logiczny typ danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zalecenia_dotyczace_zestawu_kolumn\" >Zalecenia dotycz\u0105ce zestawu kolumn<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Etykieta\" >Etykieta<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Znacznik_usuwania\" >Znacznik usuwania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zakladka_Uklady\" >Zak\u0142adka Uk\u0142ady<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zakladka_Ustawienia\" >Zak\u0142adka Ustawienia<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Hook\" >Hook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Baza_danych\" >Baza danych<\/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-36\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Typ_obiektu_deweloperskiego_Search_extension\" >Typ obiektu deweloperskiego Search extension<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Typ_obiektu_deweloperskiego_Application\" >Typ obiektu deweloperskiego Application<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Typ_obiektu_deweloperskiego_Application_extension\" >Typ obiektu deweloperskiego Application extension<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Typ_obiektu_deweloperskiego_Data_description\" >Typ obiektu deweloperskiego Data description<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Pelna_etykieta_i_pomoc_kontekstowa\" >Pe\u0142na etykieta i pomoc kontekstowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Factory\" >Factory<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Obiekty_biznesowe_proxy\" >Obiekty biznesowe proxy<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Obiekty_konfiguracyjne\" >Obiekty konfiguracyjne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Obiekty_repozytorium\" >Obiekty repozytorium<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Aktualizacja_danych\" >Aktualizacja danych<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Interfejsy_programowania_Java\" >Interfejsy programowania Java<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#CisCustomisableCockpit\" >CisCustomisableCockpit<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Metody_hook\" >Metody hook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Dalsze_metody\" >Dalsze metody<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Akcje_i_przetwarzanie_w_tle\" >Akcje i przetwarzanie w tle<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Rejestrowanie_akcji\" >Rejestrowanie akcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Przekazanie_parametrow_do_aplikacji_dzialajacej_w_tle\" >Przekazanie parametr\u00f3w do aplikacji dzia\u0142aj\u0105cej w tle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Zapytanie_ResultSet_w_aplikacji_dzialajacej_w_tle\" >Zapytanie ResultSet w aplikacji dzia\u0142aj\u0105cej w tle<\/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-54\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#AbstractOrderCockpit\" >AbstractOrderCockpit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#SearchView\" >SearchView<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#GridSearchSupport\" >GridSearchSupport<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Konfiguracja\" >Konfiguracja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Filtrowanie\" >Filtrowanie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wynik_wyszukiwania\" >Wynik wyszukiwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-60\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wybor\" >Wyb\u00f3r<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-61\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Filtrowanie_obiektow\" >Filtrowanie obiekt\u00f3w<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-62\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wartosci_domyslne\" >Warto\u015bci domy\u015blne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-63\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Przyklad\" >Przyk\u0142ad<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-64\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Manipulowanie_zapytaniem_do_bazy_danych\" >Manipulowanie zapytaniem 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-65\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wyszukiwanie_szczegolowe-2\" >Wyszukiwanie szczeg\u00f3\u0142owe<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-66\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Przyklad-2\" >Przyk\u0142ad<\/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-67\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Format\" >Format<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-68\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FormatFactory\" >FormatFactory<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-69\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FormatFactoryRegistry\" >FormatFactoryRegistry<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-70\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Kolumny_wirtualne\" >Kolumny wirtualne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-71\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Renderer\" >Renderer<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-72\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#RendererFactory\" >RendererFactory<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-73\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#RendererFactoryRegistry\" >RendererFactoryRegistry<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-74\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#TextRenderer\" >TextRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-75\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#IconRenderer\" >IconRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-76\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#LayeredIconRenderer\" >LayeredIconRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-77\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#ToolTipRenderer\" >ToolTipRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-78\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#URIRenderer\" >URIRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-79\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#VisualElementRenderer\" >VisualElementRenderer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-80\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Kolumny_wirtualne-2\" >Kolumny wirtualne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-81\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExpression\" >FilterExpression<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-82\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExpressionList\" >FilterExpressionList<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-83\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#SingleExpression\" >SingleExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-84\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#RangeExpression\" >RangeExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-85\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#InvalidExpression\" >InvalidExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-86\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#StringFilterExpressionList\" >StringFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-87\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#ByteFilterExpressionList_ShortFilterExpressionList_IntegerFilterExpressionList_LongFilterExpressionList_i_DecimalFilterExpressionList\" >ByteFilterExpressionList, ShortFilterExpressionList, IntegerFilterExpressionList, LongFilterExpressionList i DecimalFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-88\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#DateAndTimeFilterExpressionList\" >DateAndTimeFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-89\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#QuantityFilterExpressionList_DurationFilterExpressionList\" >QuantityFilterExpressionList, DurationFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-90\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#DomesticAmountFilterExpressionList_ForeignAmountFilterExpressionList\" >DomesticAmountFilterExpressionList, ForeignAmountFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-91\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#BinaryFilterExpressionList_GuidFilterExpressionList\" >BinaryFilterExpressionList, GuidFilterExpressionList<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-92\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#BooleanFilterExpressionList\" >BooleanFilterExpressionList<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-93\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#CompoundFilterExpression\" >CompoundFilterExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-94\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#DeleteStateFilterExpression\" >DeleteStateFilterExpression<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-95\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#ValueSetFilterExpression\" >ValueSetFilterExpression<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-96\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExpressionEditor\" >FilterExpressionEditor<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-97\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExpressionEditorFactory\" >FilterExpressionEditorFactory<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-98\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExpressionEditorFactoryRegistry\" >FilterExpressionEditorFactoryRegistry<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-99\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Kolumny_wirtualne-3\" >Kolumny wirtualne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-100\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#FilterExtension\" >FilterExtension<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-101\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#SearchHook\" >SearchHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-102\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#BusinessObjectRegistryHook\" >BusinessObjectRegistryHook<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-103\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#DataDescriptionFilter\" >DataDescriptionFilter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-104\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#DataDescriptionModification\" >DataDescriptionModification<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-105\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#RepositoryOnly\" >RepositoryOnly<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-106\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Ustawienia\" >Ustawienia<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-107\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Uprawnienia\" >Uprawnienia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-108\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Wlasciwosci\" >W\u0142a\u015bciwo\u015bci<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-109\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencji-aplikacje-typu-lista\/#Debugowanie\" >Debugowanie<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<div>Niniejszy podr\u0119cznik referencyjny opisuje podstawy techniczne i programowanie konfigurowalnych aplikacji typu <em>Lista.<\/em> Po kr\u00f3tkim wprowadzeniu wymieniono obiekty deweloperskie i interfejsy programowania, a w niekt\u00f3rych przypadkach zilustrowano je kr\u00f3tkimi przyk\u0142adami.<\/div>\n<div>Dzia\u0142anie aplikacji typu <em>Lista<\/em> opisano w artykule <em>Listy.<\/em><\/div>\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=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>Aplikacje typu <em>Lista<\/em> s\u0105 aplikacjami zapyta\u0144, kt\u00f3re mo\u017cna \u0142atwo i wygodnie dostosowywa\u0107 i rozszerza\u0107. Technologia listy mo\u017ce by\u0107 r\u00f3wnie\u017c wykorzystywana w innych konfigurowalnych aplikacjach, np. poprzez osadzenie komponentu interfejsu u\u017cytkownika <em>SearchView<\/em> jako edytora. Infrastruktura aplikacji typu <em>Lista<\/em> jest r\u00f3wnie\u017c wykorzystywana przez pozosta\u0142e us\u0142ugi.<\/div>\n<div>Og\u00f3lne informacje na temat list mo\u017cna znale\u017a\u0107 w niniejszych rozdzia\u0142ach:<\/div>\n<ul>\n<li><a href=\"#PRL1\"><strong>Zestaw kolumn<\/strong><\/a><\/li>\n<li><a href=\"#PRL2\"><strong>Mo\u017cliwo\u015b\u0107 konfigurowania<\/strong><\/a><\/li>\n<li><a href=\"#PRL3\"><strong>Wyszukiwanie szczeg\u00f3\u0142owe<\/strong><\/a><\/li>\n<li><a href=\"#PRL4\"><strong>Model programowania<\/strong><\/a><\/li>\n<li><a href=\"#PRL5\"><strong>Aplikacje dzia\u0142aj\u0105ce w tle<\/strong><\/a><\/li>\n<li><a href=\"#PRL6\"><strong>Eksport i us\u0142ugi sieciowe RESTful<\/strong><\/a><\/li>\n<\/ul>\n<h4 id=\"zestaw-kolumn\" ><span class=\"ez-toc-section\" id=\"Zestaw_kolumn\"><\/span>Zestaw kolumn<a id=\"PRL1\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Kluczow\u0105 cech\u0105 aplikacji typu <em>Lista<\/em> jest zestaw kolumn, z kt\u00f3rych u\u017cytkownicy mog\u0105 dowolnie tworzy\u0107 swoje widoki. Obejmuje to wykorzystanie kolumn na li\u015bcie wynik\u00f3w, jako p\u00f3l wyszukiwania w nag\u0142\u00f3wku oraz jako funkcji sortowania.<\/div>\n<div>Zestaw kolumn jest dostarczany w kilku etapach. Punktem wyj\u015bcia jest wyra\u017cenie OQL (klauzula <em>FROM<\/em>), w kt\u00f3rym wybrane obiekty biznesowe s\u0105 ze sob\u0105 powi\u0105zane. Atrybuty, kt\u00f3re maj\u0105 by\u0107 zawarte w zestawie kolumn, s\u0105 nast\u0119pnie wybierane z tych obiekt\u00f3w biznesowych. Oba s\u0105 zapisywane razem w obiektach deweloperskich <i>Search <\/i>i <em>Search extension<\/em>, przy czym dostarczany jest status dostawy dla zestawu kolumn.<\/div>\n<div>W systemie docelowym u\u017cytkownik mo\u017ce indywidualnie rozszerzy\u0107 lub zmniejszy\u0107 zestaw kolumn dla ka\u017cdej bazy danych, je\u015bli posiada niezb\u0119dne uprawnienia. Obiekty biznesowe zdefiniowane w obiekcie deweloperskim <i>Search <\/i>i w powi\u0105zanych obiektach deweloperskich typu <em>Search extension<\/em> s\u0105 do tego podstaw\u0105. Nie tylko wszystkie atrybuty tych obiekt\u00f3w biznesowych s\u0105 dost\u0119pne do wyboru, ale tak\u017ce atrybuty innych obiekt\u00f3w biznesowych, je\u015bli odpowiednie relacje 1:1 zostan\u0105 wprowadzone w aplikacji <em>Obiekty deweloperskie<\/em>. Relacje te mo\u017cna \u015bledzi\u0107 do dowolnej g\u0142\u0119boko\u015bci.<\/div>\n<div>Opr\u00f3cz zwyk\u0142ych atrybut\u00f3w, <em>Pola zdefiniowane przez u\u017cytkownika<\/em> (rozszerzenia encji) i atrybuty wirtualne, a tak\u017ce <em>Managed Supplements<\/em>\u00a0mog\u0105 by\u0107 r\u00f3wnie\u017c zawarte na li\u015bcie kolumn. Atrybuty wirtualne to atrybuty, kt\u00f3re nie nale\u017c\u0105 bezpo\u015brednio do obiektu biznesowego, ale mog\u0105 by\u0107 obliczane na podstawie atrybut\u00f3w obiekt\u00f3w biznesowych.<\/div>\n<h4 id=\"mozliwosc-konfigurowania\" ><span class=\"ez-toc-section\" id=\"Mozliwosc_konfigurowania\"><\/span>Mo\u017cliwo\u015b\u0107 konfigurowania<a id=\"PRL2\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Interfejs u\u017cytkownika aplikacji typu <em>Lista<\/em> mo\u017cna dostosowa\u0107 na wiele sposob\u00f3w (patrz artyku\u0142 <em>Listy).<\/em> Konfiguracje mo\u017cna zapisywa\u0107 na trzech poziomach: dla u\u017cytkownika, dla bazy danych OLTP lub w obiekcie deweloperskim <em>Application extension.<\/em> Nag\u0142\u00f3wki i obszary robocze s\u0105 edytowane razem. Dla obszaru roboczego mo\u017cna zapisa\u0107 dowoln\u0105 liczb\u0119 widok\u00f3w na poziom; dla nag\u0142\u00f3wka mo\u017cna zapisa\u0107 tylko jeden widok na uk\u0142ad.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przed dostarczeniem obiektu deweloperskiego typu <em>Application extension<\/em>\u00a0nale\u017cy zawsze upewni\u0107 si\u0119, \u017ce odpowiednie uk\u0142ady r\u00f3wnie\u017c zosta\u0142y w nim zapisane. Wyj\u0105tkiem s\u0105 wyszukiwania dla <em>SearchViews<\/em>, je\u015bli zosta\u0142y one skonfigurowane w taki spos\u00f3b, \u017ce ich uk\u0142ady s\u0105 zapisane w aplikacji.<\/div><\/section><\/div>\n<h4 id=\"wyszukiwanie-szczegolowe\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_szczegolowe\"><\/span>Wyszukiwanie szczeg\u00f3\u0142owe<a id=\"PRL3\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Wyszukiwanie szczeg\u00f3\u0142owe mo\u017cna zintegrowa\u0107 z aplikacjami typu <em>Lista,<\/em> umo\u017cliwiaj\u0105c u\u017cytkownikom wy\u015bwietlanie okre\u015blonych szczeg\u00f3\u0142owych informacji o wy\u015bwietlanych wierszach. Podobnie jak wyszukiwanie g\u0142\u00f3wne, wyszukiwanie szczeg\u00f3\u0142owe jest obiektem deweloperskim typu <em>Search.<\/em> Rola wyszukiwania w aplikacji typu <em>Lista<\/em> zale\u017cy od tego, w jaki spos\u00f3b wyszukiwania s\u0105 ze sob\u0105 powi\u0105zane. Kilka wyszukiwa\u0144 szczeg\u00f3\u0142owych mo\u017cna przypisa\u0107 do wyszukiwania g\u0142\u00f3wnego, a inne wyszukiwania szczeg\u00f3\u0142owe mo\u017cna przypisa\u0107 do wyszukiwania szczeg\u00f3\u0142owego (struktura drzewa).<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Wyszukiwania szczeg\u00f3\u0142owe mog\u0105 by\u0107 obecnie u\u017cywane tylko w aplikacjach typu <em>Lista,<\/em> ale nie w <em>SearchViews<\/em> lub us\u0142ugach REST.<\/div><\/section><\/div>\n<h4 id=\"model-programowania\" ><span class=\"ez-toc-section\" id=\"Model_programowania\"><\/span>Model programowania<a id=\"PRL4\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Rozw\u00f3j aplikacji typu <em>Lista<\/em> opiera si\u0119 g\u0142\u00f3wnie na dostarczaniu metadanych, takich jak zestaw kolumn za po\u015brednictwem obiektu deweloperskiego <i>Search <\/i>i powi\u0105zanych rozszerze\u0144 wyszukiwania.<\/div>\n<div>Podobnie jak w przypadku ka\u017cdej aplikacji, obiekt deweloperski typu <i>Application <\/i>i typu<em> Java class<\/em> s\u0105 r\u00f3wnie\u017c wymagane dla aplikacji typu <em>Lista.<\/em> W najprostszym przypadku, implementacja klasy Java zasadniczo polega na wyprowadzeniu specjalnej abstrakcyjnej klasy bazowej (patrz te rozdzia\u0142y: <em><a href=\"#PRL9\">CisCustomisableCockpit<\/a><\/em> i <a href=\"#PRL13\"><em>AbstractOrderCockpit<\/em><\/a>).<\/div>\n<h5 id=\"wizualizacja\" ><span class=\"ez-toc-section\" id=\"Wizualizacja\"><\/span>Wizualizacja<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Wizualizacja danych na li\u015bcie wynik\u00f3w jest delegowana przez infrastruktur\u0119 do specjalnych klas. Klasy u\u017cywane do wizualizacji s\u0105 okre\u015blane przez logiczny typ danych odpowiedniej kolumny. Odpowiednie klasy s\u0105 ju\u017c dostarczane przez infrastruktur\u0119 dla wszystkich standardowych typ\u00f3w danych. W zale\u017cno\u015bci od typu danych, infrastruktura wykorzystuje <em>Formatter (java.text.Format)<\/em> lub <em>Renderer (com.cisag.pgm.gui.Renderer).<\/em> Odpowiednie renderery i formatery s\u0105 tworzone za pomoc\u0105 specjalnych <em>Factory<\/em> (patrz te rozdzia\u0142y: <em><a href=\"#PRL26\">RendererFactory<\/a> <\/em>i <em><a href=\"#PRL24\">FormatFactory<\/a><\/em>). Wizualizacj\u0119 mo\u017cna dostosowa\u0107, implementuj\u0105c i rejestruj\u0105c w\u0142asne <em>Factory.<\/em><\/div>\n<h5 id=\"filtr\" ><span class=\"ez-toc-section\" id=\"Filtr\"><\/span>Filtr<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Aby zoptymalizowa\u0107 wyniki wyszukiwania, dla ka\u017cdej kolumny zestawu kolumn mo\u017cna u\u017cy\u0107 odpowiednich wyra\u017ce\u0144 filtruj\u0105cych. Programowo takie filtry s\u0105 reprezentowane przez podklasy klasy <em>Filter Expression<\/em> (patrz rozdzia\u0142 <a href=\"#PRL29\"><em>FilterExpression<\/em><\/a>). Do wy\u015bwietlania i edycji wyra\u017ce\u0144 filtruj\u0105cych w nag\u0142\u00f3wku listy wymagane s\u0105 specjalne edytory (patrz rozdzia\u0142 <a href=\"#PRL32\"><em>FilterExpressionEditor<\/em><\/a>)<em>.<\/em> Edytory te s\u0105 dostarczane za po\u015brednictwem odpowiednich klas (patrz rozdzia\u0142 <a href=\"#PRL33\"><em>FilterExpressionEditorFactory<\/em><\/a>). Logiczny typ danych odpowiedniej kolumny okre\u015bla, kt\u00f3re klasy musz\u0105 zosta\u0107 u\u017cyte. Odpowiednie klasy s\u0105 ju\u017c dostarczane przez infrastruktur\u0119 dla wszystkich standardowych typ\u00f3w danych. Wy\u015bwietlanie i edycj\u0119 wyra\u017ce\u0144 filtruj\u0105cych mo\u017cna dostosowa\u0107, implementuj\u0105c i rejestruj\u0105c w\u0142asne <em>Factory.<\/em><\/div>\n<h4 id=\"aplikacje-dzialajace-w-tle\" ><span class=\"ez-toc-section\" id=\"Aplikacje_dzialajace_w_tle\"><\/span>Aplikacje dzia\u0142aj\u0105ce w tle<a id=\"PRL5\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Wynik wyszukiwania z aplikacji typu <em>Lista<\/em> mo\u017ce zosta\u0107 przes\u0142any do aplikacji dzia\u0142aj\u0105cej w tle. U\u017cytkownik ma nast\u0119puj\u0105ce opcje:<\/div>\n<ul>\n<li>Obiekty wybrane w obszarze roboczym s\u0105 przenoszone do aplikacji dzia\u0142aj\u0105cej w tle<\/li>\n<li>W\u0142a\u015bciwo\u015bci wyszukiwania wprowadzone w nag\u0142\u00f3wku aplikacji typu <em>Lista<\/em> w momencie wywo\u0142ania akcji s\u0105 przenoszone do aplikacji dzia\u0142aj\u0105cej w tle, z kt\u00f3r\u0105 wykonywane jest zapytanie do bazy danych w momencie uruchomienia aplikacji dzia\u0142aj\u0105cej w tle. Wynik tego zapytania mo\u017ce r\u00f3\u017cni\u0107 si\u0119 od tego, kt\u00f3re zosta\u0142o ju\u017c wykonane w aplikacji. W zwi\u0105zku z tym, u\u017cytkownik niekoniecznie widzia\u0142 wcze\u015bniej wynik wyszukiwania, a liczba obiekt\u00f3w do przetworzenia mo\u017ce nie\u015bwiadomie skutkowa\u0107 niezamierzonym zakresem.<\/li>\n<\/ul>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli w nag\u0142\u00f3wku aplikacji typu <em>Lista<\/em> nie wprowadzono \u017cadnych cech wyszukiwania, przed wykonaniem odpowiedniej akcji wy\u015bwietlany jest komunikat ostrzegawczy. Wy\u015bwietlanie tego komunikatu ostrzegawczego mo\u017cna kontrolowa\u0107 za pomoc\u0105 nast\u0119puj\u0105cej w\u0142a\u015bciwo\u015bci: <em>com.cisag.pgm.services.batch.BatchJobSearch.suppressConfirmationDialog.<\/em><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<ul>\n<li>Zar\u00f3wno obiekty wybrane w obszarze roboczym, jak i charakterystyki wyszukiwania z nag\u0142\u00f3wka listy s\u0105 przesy\u0142ane do aplikacji dzia\u0142aj\u0105cej w tle. W czasie wykonywania aplikacji w tle wykonywane jest zapytanie do bazy danych z funkcjami wyszukiwania, ale w tym przypadku wszystkie obiekty wybrane w obszarze roboczym s\u0105 pomijane (lista negatywna).<\/li>\n<\/ul>\n<div>Ta parametryzacja jest transparentna dla aplikacji dzia\u0142aj\u0105cej w tle: otrzymuje ona <em>ResultSet<\/em> za po\u015brednictwem interfejsu, kt\u00f3ry dostarcza odpowiednio przefiltrowane obiekty.<\/div>\n<h5 id=\"eksport-i-uslugi-sieciowe-restful\" ><span class=\"ez-toc-section\" id=\"Eksport_i_uslugi_sieciowe_RESTful\"><\/span>Eksport i us\u0142ugi sieciowe RESTful<a id=\"PRL6\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Wy\u015bwietlane wiersze wynik\u00f3w mo\u017cna eksportowa\u0107 ze wszystkich aplikacji typu <em>Lista<\/em> (w tym <em>SearchView<\/em>), np. do pliku MS Excel lub PDF. Mo\u017cliwe jest r\u00f3wnie\u017c eksportowanie za po\u015brednictwem aplikacji dzia\u0142aj\u0105cej w tle. Aby m\u00f3c korzysta\u0107 z tej opcji w aplikacji typu <em>Lista,<\/em> musi by\u0107 ona po\u0142\u0105czona z us\u0142ug\u0105 sieciow\u0105 (<em>RESTful<\/em>) (patrz artyku\u0142 <em><a style=\"font-size: revert;\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejs-do-eksportu-z-aplikacji-typu-lista-za-pomoca-uslug-sieciowych-web-service-zgodnych-z-rest\/\" rel=\"bookmark\">Interfejs do eksportu z aplikacji typu Lista za pomoc\u0105 us\u0142ug sieciowych (web service) zgodnych z REST<\/a><\/em>).<\/div>\n<h3 id=\"obiekty-deweloperskie\" ><span class=\"ez-toc-section\" id=\"Obiekty_deweloperskie\"><\/span>Obiekty deweloperskie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>Ten rozdzia\u0142 opisuje definicje wymagane dla aplikacji typu <em>Lista<\/em> w odpowiednich typach obiekt\u00f3w deweloperskich.<\/div>\n<h4 id=\"typy-obiektow-deweloperskich-search-i-search-extension\" ><span class=\"ez-toc-section\" id=\"Typy_obiektow_deweloperskich_Search_i_Search_extension\"><\/span>Typy obiekt\u00f3w deweloperskich <em>Search <\/em>i <em>Search extension<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Obiekt deweloperski <i>Search <\/i>s\u0142u\u017cy do definiowania zapytania do bazy danych i zestawu kolumn listy lub wyszukiwania szczeg\u00f3\u0142owego. Wyszukiwania g\u0142\u00f3wne i szczeg\u00f3\u0142owe nie s\u0105 specjalnie oznaczone; zamiast tego relacja mi\u0119dzy dwoma wyszukiwaniami jest okre\u015blona w powi\u0105zanym kodzie aplikacji Java. Wyszukiwanie mo\u017ce by\u0107 zatem u\u017cywane jako wyszukiwanie g\u0142\u00f3wne w jednej aplikacji i jako wyszukiwanie szczeg\u00f3\u0142owe w innej.<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zapytanie do bazy danych oraz zestaw kolumn wyszukiwania i wyszukiwania szczeg\u00f3\u0142owego mo\u017cna rozszerzy\u0107 za pomoc\u0105 rozszerze\u0144 wyszukiwania.<\/div><\/section><\/div>\n<h5 id=\"zakladka-from-where-zapytanie-do-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Zakladka_FromWhere_Zapytanie_do_bazy_danych\"><\/span>Zak\u0142adka <em>From\/Where:<\/em> Zapytanie do bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Zak\u0142adka <em>From\/Where\u00a0<\/em>s\u0142u\u017cy do definiowania obiekt\u00f3w biznesowych zaanga\u017cowanych w wyszukiwanie i zdefiniowanie ich relacji dla zapytania do bazy danych.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">com.cisag.app.edu.obj.Book BOOK\n\u00a0 LEFT OUTER JOIN com.cisag.app.general.obj.Partner EMPLOYEE\n\u00a0 \u00a0 ON BOOK:employee = EMPLOYEE:guid<\/pre>\n<p><\/div><\/section><\/p>\n<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W miar\u0119 mo\u017cliwo\u015bci nale\u017cy przestrzega\u0107 znormalizowanej konwencji nazewnictwa dla u\u017cywanych alias\u00f3w. Zaleca si\u0119 stosowanie nazwy odpowiedniej relacji (je\u015bli jest dost\u0119pna).<\/div><\/section><\/div>\n<h6 id=\"klucze-obce\" ><span class=\"ez-toc-section\" id=\"Klucze_obce\"><\/span>Klucze obce<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Podczas tworzenia zapytania do bazy danych nale\u017cy zauwa\u017cy\u0107, \u017ce relacje klucza obcego s\u0105 wyra\u017anie opisane przez <em>JOIN,<\/em> dzi\u0119ki czemu atrybuty obiektu docelowego mog\u0105 zosta\u0107 przeniesione do zestawu kolumn i, je\u015bli to konieczne, r\u00f3wnie\u017c u\u017cyte jako \u0142\u0105cze (patrz rozdzia\u0142 <em>Pole wyboru: Obiekt biznesowy<\/em>).<\/div>\n<h6 id=\"removable-join\" ><span class=\"ez-toc-section\" id=\"REMOVABLE_JOIN\"><\/span><em>REMOVABLE JOIN<a id=\"PRL39\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>W czasie wykonywania, konkretne zapytanie do bazy danych wynika z faktycznie u\u017cywanych kolumn (wy\u015bwietlanie, filtrowanie i sortowanie). Nie tylko klauzule <em>SELECT, WHERE<\/em> i <em>ORDER BY<\/em> s\u0105 odpowiednio konfigurowane, ale tak\u017ce niepotrzebne <em>JOIN<\/em>\u00a0s\u0105 usuwane z klauzuli <em>FROM,<\/em> je\u015bli s\u0105 odpowiednio oznaczone. Aby oznaczy\u0107 <em>JOIN<\/em> jako usuwalny, przed <em>LEFT OUTER JOIN<\/em> nale\u017cy wstawi\u0107 dodatkowe s\u0142owo kluczowe <em>REMOVABLE.<\/em><\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT BOOK:code\n\u00a0 FROM com.cisag.app.edu.obj.Book BOOK\n\u00a0 REMOVABLE LEFT OUTER JOIN\n\u00a0 \u00a0 \u00a0com.cisag.app.general.obj.Partner EMPLOYEE\n\u00a0 \u00a0 ON BOOK:employee = EMPLOYEE:guid<\/pre>\n<\/div>\n<div>staje si\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT BOOK:code\n\u00a0 FROM com.cisag.app.edu.obj.Book BOOK<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W przypadku zestawu warto\u015bci, kt\u00f3rego zakres warto\u015bci zosta\u0142 ograniczony za pomoc\u0105 <em>Data description,<\/em> warunek ten jest automatycznie uwzgl\u0119dniany w klauzuli <em>WHERE,<\/em> nawet je\u015bli odpowiednia kolumna w aplikacji typu <em>Lista<\/em> nie jest u\u017cywana jako filtr. Z tego powodu <em>JOIN<\/em>\u00a0zawieraj\u0105ce takie kolumny nie mog\u0105 zosta\u0107 usuni\u0119te. Przy ograniczonym zakresie zestawu warto\u015bci nale\u017cy zatem zawsze sprawdzi\u0107, czy w bazie danych mog\u0105 by\u0107 faktycznie przechowywane inne warto\u015bci ni\u017c warto\u015bci ograniczone. Je\u015bli tak nie jest, powi\u0105zany atrybut obiektu biznesowego powinien by\u0107 oznaczony jako kompletny. Oznacza to, \u017ce klauzula <em>WHERE<\/em> nie musi by\u0107 rozszerzana (patrz rozdzia\u0142 <a href=\"#PRL31\"><em>BusinessObjectRegistryHook<\/em><\/a>).<\/div><\/section><\/div>\n<h6 id=\"automatyczna-optymalizacja\" ><span class=\"ez-toc-section\" id=\"Automatyczna_optymalizacja\"><\/span>Automatyczna optymalizacja<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Inn\u0105 opcj\u0105 optymalizacji jest zast\u0105pienie niekt\u00f3rych <em>JOIN<\/em> przez dost\u0119p do us\u0142ugi trwa\u0142o\u015bci. W takim przypadku <em>JOIN<\/em> i wszystkie atrybuty danego obiektu biznesowego s\u0105 usuwane podczas zapytania do bazy danych. Zamiast tego klucz podstawowy obiektu biznesowego jest zawarty w klauzuli <em>SELECT.<\/em> <em>Persistent service<\/em> jest nast\u0119pnie u\u017cywane do \u0142adowania obiekt\u00f3w biznesowych (blok po bloku) i okre\u015blania warto\u015bci \u017c\u0105danych atrybut\u00f3w.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT BOOK:code, EMPLOYEE:number\n\u00a0 FROM com.cisag.app.edu.obj.Book BOOK\n\u00a0 \u00a0 LEFT OUTER JOIN\n\u00a0 \u00a0 com.cisag.app.general.obj.Partner EMPLOYEE\n\u00a0 \u00a0 ON BOOK:employee = EMPLOYEE:guid<\/pre>\n<\/div>\n<div>staje si\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SELECT BOOK:code, BOOK:employee\n\u00a0 FROM com.cisag.app.edu.obj.Book BOOK<\/pre>\n<\/div>\n<div>plus dost\u0119p przez <em>Persistent service<\/em><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Partner partner = om.getObject(\n\u00a0 \u00a0 \u00a0 Partner.getPrimaryKey(rs.getGuid(2));\n\u00a0 String number = partner.getNumber();<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div>Zalety tej procedury polegaj\u0105 na w\u0142\u0105czeniu wsp\u00f3\u0142dzielonej pami\u0119ci podr\u0119cznej (szczeg\u00f3lnie w przypadku danych podstawowych) i zmniejszeniu z\u0142o\u017cono\u015bci zapytania do bazy danych. Istnieje jednak ryzyko, \u017ce wynik okre\u015blony w ten spos\u00f3b b\u0119dzie r\u00f3\u017cni\u0142 si\u0119 od wyniku niezoptymalizowanego zapytania. W zwi\u0105zku z tym, optymalizacja ta nie jest aktywowana automatycznie, ale musi by\u0107 aktywowana jawnie dla ka\u017cdego <em>JOIN<\/em> poprzez dodatkowe okre\u015blenie s\u0142owa kluczowego <em>REMOVEABLE.<\/em> W praktyce powy\u017csze ryzyko jest bardzo rzadko istotne, poniewa\u017c nawet w niezoptymalizowanym przypadku dane mog\u0105 ulec zmianie po ich odczytaniu z bazy danych. Ze wzgl\u0119du na wyra\u017ane korzy\u015bci, zaleca si\u0119, aby s\u0142owo kluczowe <em>REMOVEABLE<\/em> by\u0142o r\u00f3wnie\u017c okre\u015blone dla <em>(LEFT OUTER) JOIN<\/em>.<\/div>\n<div>Optymalizacja jest mo\u017cliwa tylko w przypadku niekt\u00f3rych typ\u00f3w <em>JOIN:<\/em> Mo\u017cliwe tylko w przypadku <em>LEFT OUTER JOIN<\/em>, a po\u0142\u0105czenie musi by\u0107 wykonane za pomoc\u0105 klucza g\u0142\u00f3wnego. Te warunki wst\u0119pne s\u0105 automatycznie sprawdzane, gdy wyszukiwanie jest zapisywane (sprawdzane) i w razie potrzeby wy\u015bwietlany jest komunikat o b\u0142\u0119dzie. W czasie wykonywania optymalizacja jest stosowana tylko wtedy, gdy atrybuty obiektu biznesowego s\u0105 u\u017cywane wy\u0142\u0105cznie do wy\u015bwietlania (tj. w klauzuli <em>SELECT).<\/em><\/div>\n<h5 id=\"zakladka-atrybuty-zestaw-kolumn\" ><span class=\"ez-toc-section\" id=\"Zakladka_Atrybuty_Zestaw_kolumn\"><\/span>Zak\u0142adka <em>Atrybuty:<\/em> Zestaw kolumn<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W aplikacji <em>Obiekty deweloperskie<\/em>, zar\u00f3wno dla typu <em>Search,<\/em> jak i typu<em> Search extension<\/em>, zestaw kolumn jest definiowany na li\u015bcie w obszarze roboczym w zak\u0142adce <em>Edytor<\/em> i znajduj\u0105cej si\u0119 pod ni\u0105 zak\u0142adce <em>Atrybuty<\/em> . Kolumny wymagane w aplikacji typu <em>Lista<\/em> musz\u0105 zosta\u0107 dodane do tej listy jako atrybuty wyszukiwania. Definicja atrybutu (kolumny) sk\u0142ada si\u0119 z nazwy atrybutu, wyra\u017cenia i innych parametr\u00f3w. Dost\u0119pne s\u0105 r\u00f3\u017cne typy kolumn: atrybuty regularne, kolumny obliczane i kolumny wirtualne.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zestaw kolumn powinien ju\u017c zawiera\u0107 wszystkie atrybuty, kt\u00f3re s\u0105 zwykle wymagane przez u\u017cytkownik\u00f3w. Nale\u017cy r\u00f3wnie\u017c wzi\u0105\u0107 pod uwag\u0119, \u017ce zestaw kolumn w systemie docelowym nie mo\u017ce zosta\u0107 rozszerzony zgodnie z wymaganiami. Dost\u0119pne s\u0105 tylko te obiekty biznesowe, kt\u00f3re zosta\u0142y jawnie zadeklarowane w klauzuli <em>FROM<\/em> lub do kt\u00f3rych mo\u017cna uzyska\u0107 dost\u0119p za po\u015brednictwem relacji (1:1) zdefiniowanych w aplikacji <em>Obiekty deweloperskie<\/em>.<\/div><\/section><\/div>\n<h6 id=\"kolumna-nazwa\" ><span class=\"ez-toc-section\" id=\"Kolumna_Nazwa\"><\/span>Kolumna <em>Nazwa<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Podczas przypisywania nazwy atrybutu nale\u017cy przestrzega\u0107 nast\u0119puj\u0105cych punkt\u00f3w:<\/div>\n<ul>\n<li>Nazwa musi by\u0107 unikalna w ramach wyszukiwania<\/li>\n<li>Nazwa s\u0142u\u017cy jako identyfikacja kolumny i jest r\u00f3wnie\u017c u\u017cywana poza w\u0142asnym obiektem deweloperskim, np. w interfejsach programowania oraz zapisanych uk\u0142adach i wzorcach wyszukiwania<\/li>\n<li>Aby m\u00f3c przenie\u015b\u0107 wyra\u017cenie filtru do aplikacji typu <em>Lista<\/em> jako parametr aplikacji, nazwa kolumny musi by\u0107 u\u017cywana jako nazwa parametru<\/li>\n<\/ul>\n<div><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Nazwy parametr\u00f3w aplikacji musz\u0105 zawsze zaczyna\u0107 si\u0119 wielk\u0105 liter\u0105, nazwy atrybut\u00f3w &#8211; ma\u0142\u0105 liter\u0105. R\u00f3\u017cnica ta jest automatycznie uwzgl\u0119dniana podczas por\u00f3wnywania.<\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Po zako\u0144czeniu wyszukiwania nie nale\u017cy ju\u017c usuwa\u0107 ani zmienia\u0107 nazw zdefiniowanych w nim atrybut\u00f3w. Usuni\u0119cie lub zmiana nazwy atrybut\u00f3w jest niezgodn\u0105 zmian\u0105 wyszukiwania i spowoduje, \u017ce wszelkie konfiguracje wyszukiwania i zadania przetwarzania oparte na starej wersji wyszukiwania b\u0119d\u0105 musia\u0142y zosta\u0107 odrzucone lub anulowane w systemie rzeczywistym.<\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div>Je\u015bli to mo\u017cliwe, nazwy powinny by\u0107 przypisywane zgodnie ze znormalizowanym schematem. W przypadku zwyk\u0142ych atrybut\u00f3w zaleca si\u0119 pobranie nazwy atrybutu z obiektu biznesowego i poprzedzenie jej aliasem obiektu biznesowego (ma\u0142e litery). W ten spos\u00f3b mo\u017cna \u0142atwo zapewni\u0107 unikalno\u015b\u0107 nazw, nawet je\u015bli obiekt biznesowy jest u\u017cywany wielokrotnie (przyk\u0142ady: <em>bookCode, employeeNumber).<\/em><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przycisk [<strong>Wyb\u00f3r atrybutu<\/strong>] na pasku przycisk\u00f3w listy mo\u017ce by\u0107 u\u017cyty do przeniesienia kilku atrybut\u00f3w z obiektu biznesowego (aliasu) do wyszukiwania w tym samym czasie. U\u017cytkownik mo\u017ce r\u00f3wnie\u017c okre\u015bli\u0107 \u017c\u0105dany prefiks.<\/div><\/section><\/div>\n<h6 id=\"kolumna-wyrazenie\" ><span class=\"ez-toc-section\" id=\"Kolumna_Wyrazenie\"><\/span>Kolumna <em>Wyra\u017cenie<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>W kolumnie <em>Wyra\u017cenie<\/em> na li\u015bcie atrybut\u00f3w nale\u017cy wprowadzi\u0107 jedn\u0105 z poni\u017cszych informacji:<\/div>\n<ul>\n<li>Odniesienie do atrybutu obiektu biznesowego (sk\u0142adnia: <em>ALIAS:Nazwa atrybutu<\/em>)<\/li>\n<li>Wyra\u017cenie obliczane przez baz\u0119 danych (patrz rozdzia\u0142 <a href=\"#PRL38\"><em>Kolumny obliczane<\/em><\/a>)<\/li>\n<li>Odniesienie do obiektu biznesowego (patrz rozdzia\u0142 <a href=\"#PRL8\"><em>Z\u0142o\u017cone typy danych<\/em><\/a>)<\/li>\n<li>Puste, je\u015bli dotyczy atrybutu wirtualnego (patrz rozdzia\u0142 <a href=\"#PRL7\"><em>Pole wyboru: Wirtualnie<\/em><\/a>)<\/li>\n<\/ul>\n<p><em>Kolumny obliczane<a id=\"PRL38\"><\/a><\/em><\/p>\n<div>Niekt\u00f3re funkcje (UPPER, AVG, MAX, MIN, SUM, COUNT) i operacje (*, \/, +, -) mog\u0105 by\u0107 r\u00f3wnie\u017c u\u017cywane jako wyra\u017cenie dla atrybutu.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">BO:a - BO:b\nBO:a + BO:b + BO:c\nSUM(BO:a) - SUM(BO:b)\nSUM(BO:a) - BO:b \/\/ niedost\u0119pne<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>Zalety:<\/div>\n<ul>\n<li>Funkcje agreguj\u0105ce cz\u0119sto mog\u0105 by\u0107 lepiej obliczane w bazie danych<\/li>\n<li>Proste obliczenia mog\u0105 by\u0107 wykonywane bez wirtualnych kolumn i nie wymagaj\u0105 specjalnych renderer\u00f3w<\/li>\n<li>Kolumny mog\u0105 by\u0107 filtrowane i sortowane w bazie danych (nie dotyczy funkcji agreguj\u0105cych)<\/li>\n<\/ul>\n<div>Ograniczenia:<\/div>\n<ul>\n<li>Atrybuty wirtualne i renderery s\u0105 nadal wymagane dla <em>Special Parts<\/em><\/li>\n<li>Baza danych mo\u017ce dawa\u0107 inne wyniki dla niekt\u00f3rych operacji ni\u017c wyspecjalizowane logiki w Comarch ERP Enterprise (np. regu\u0142y uruchamiania)<\/li>\n<li>D\u0142ugo\u015b\u0107 wyra\u017cenia jest ograniczona do 100 znak\u00f3w<\/li>\n<\/ul>\n<h6 id=\"zlozone-typy-danych\" ><span class=\"ez-toc-section\" id=\"Zlozone_typy_danych\"><\/span>Z\u0142o\u017cone typy danych<a id=\"PRL8\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p><em>Parts<\/em> lub ca\u0142e obiekty biznesowe mog\u0105 by\u0107 r\u00f3wnie\u017c zawarte w zestawie kolumn pod nast\u0119puj\u0105cymi warunkami:<\/p>\n<ul>\n<li>Do wizualizacji (obszar wy\u015bwietlania) wymagany jest odpowiedni <em>FormatFactory<\/em> lub <em>RendererFactory<\/em><\/li>\n<li>Filtrowanie i sortowanie jest mo\u017cliwe tylko z dodatkowymi (wirtualnymi) atrybutami (wyj\u0105tek: <em>Special parts<\/em>\u00a0s\u0105 oferowane przez system)<\/li>\n<li><em>Parts<\/em> s\u0105 wybierane w edytorze wyszukiwania jak zwyk\u0142e atrybuty<\/li>\n<li>W przypadku obiekt\u00f3w biznesowych w polu <em>Wyra\u017cenie<\/em> okre\u015bla si\u0119 tylko alias (bez nazwy atrybutu). Pole wyboru <em>Obiekt biznesowy<\/em> musi by\u0107 r\u00f3wnie\u017c aktywowane.<\/li>\n<\/ul>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zamiast wczytywa\u0107 ca\u0142e obiekty biznesowe, zazwyczaj korzystniej jest u\u017cy\u0107 tylko wymaganych atrybut\u00f3w (wirtualne kolumny).<\/div><\/section><\/div>\n<h6 id=\"pole-wyboru-wirtualnie\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Wirtualnie\"><\/span>Pole wyboru: <em>Wirtualnie<\/em><a id=\"PRL7\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Kilka atrybut\u00f3w mo\u017cna podsumowa\u0107 w ramach atrybutu wirtualnego i w ten spos\u00f3b wy\u015bwietli\u0107 jako pojedyncz\u0105 kolumn\u0119. Ta opcja jest przydatna, je\u015bli w interfejsie u\u017cytkownika ma by\u0107 wy\u015bwietlana tylko jedna kolumna, ale do wy\u015bwietlenia wymagane s\u0105 dane z kilku kolumn.<\/div>\n<div>Atrybut wirtualny musi by\u0107 oznaczony jako <em>Wirtualnie,<\/em> a pole <em>Wyra\u017cenie<\/em> musi pozosta\u0107 puste. Atrybuty nale\u017c\u0105ce do atrybutu wirtualnego musz\u0105 zaczyna\u0107 si\u0119 od nazwy atrybutu wirtualnego, po kt\u00f3rej nast\u0119puje kropka.<\/div>\n<div>Przyk\u0142ad (patrz <em>Status<\/em> w artykule<em> Lista: <a href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/lista-zamowienia-sprzedazy\/\">Zam\u00f3wienia sprzeda\u017cy<\/a><\/em>):<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 115px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Nazwa <\/strong><\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Wyra\u017cenie<\/strong><\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Wirtualnie<\/strong><\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Logiczny typ danych<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">vstatus<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">..SalesOrderStatus<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">vstatus.attr1<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">SO:attr2<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">vstatus.attr2<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">SO:attr2<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">&#8230;<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">&#8230;<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 25%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>Aby atrybut wirtualny m\u00f3g\u0142 by\u0107 wy\u015bwietlany w aplikacji typu <em>Lista,<\/em> nale\u017cy zapewni\u0107 odpowiedni <em>RendererFactory<\/em> i odpowiedni <em>FilterExpressionEditorFactory,<\/em> aby m\u00f3c u\u017cy\u0107 atrybutu jako filtra (patrz rozdzia\u0142y <em><a href=\"#PRL26\">RendererFactor<\/a>y<\/em><em>\u00a0<\/em>i <em><a href=\"#PRL33\">FilterExpressionEditorFactory<\/a>).<\/em> W tym celu nale\u017cy wprowadzi\u0107 logiczny typ danych w kolumnie <em>Logiczny typ danych<\/em> atrybutu, kt\u00f3ry jest powi\u0105zany z opisem danych, w kt\u00f3rym wprowadzane s\u0105 implementacje tych klas (patrz rozdzia\u0142: <a href=\"#PRL8\"><em>Typ obiektu deweloperskiego Data description<\/em><\/a>).<\/div>\n<div>Dla ka\u017cdego z atrybut\u00f3w podrz\u0119dnych mo\u017cna okre\u015bli\u0107, czy maj\u0105 one by\u0107 wy\u015bwietlane i mo\u017cliwe do filtrowania. Ustawienia te okre\u015blaj\u0105, kt\u00f3re z atrybut\u00f3w podrz\u0119dnych s\u0105 przekazywane do renderera lub <em>FilterExpressionEditor.<\/em> Je\u015bli atrybut wirtualny jest oznaczony jako mo\u017cliwy do filtrowania, w\u00f3wczas co najmniej jeden z atrybut\u00f3w podrz\u0119dnych musi by\u0107 r\u00f3wnie\u017c oznaczony jako mo\u017cliwy do filtrowania. To samo dotyczy atrybut\u00f3w oznaczonych jako wy\u015bwietlane.<\/div>\n<div>W przypadku sortowania atrybut\u00f3w wirtualnych obowi\u0105zuje nast\u0119puj\u0105ca zasada: je\u015bli atrybut wirtualny jest oznaczony jako sortowalny, w\u00f3wczas dok\u0142adnie jeden z podatrybut\u00f3w musi by\u0107 oznaczony jako sortowalny.<\/div>\n<h6 id=\"pole-wyboru-obiekt-biznesowy\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Obiekt_biznesowy\"><\/span>Pole wyboru: <em>Obiekt biznesowy<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Odznaczenie jako obiekt biznesowy okre\u015bla, \u017ce kolumna ma podobn\u0105 funkcjonalno\u015b\u0107 do <em>EntityField.<\/em> Atrybuty oznaczone w ten spos\u00f3b maj\u0105 menu kontekstowe i mog\u0105 by\u0107 u\u017cywane jako link. Menu kontekstowe i link zawsze odnosz\u0105 si\u0119 do obiektu biznesowego, do kt\u00f3rego nale\u017cy sam atrybut (zdefiniowany poprzez alias). Ka\u017cdy atrybut powinien otrzyma\u0107 takie oznaczenie, je\u015bli reprezentuje <em>klucz biznesowy<\/em> w\u0142asnego obiektu biznesowego.<\/div>\n<div>Aby zapewni\u0107 menu kontekstowe i linki r\u00f3wnie\u017c dla atrybut\u00f3w klucza obcego, wymagane jest inne podej\u015bcie. Pierwsz\u0105 (i preferowan\u0105) opcj\u0105 jest dodanie obiektu docelowego i atrybutu docelowego do zapytania bazy danych i zestawu kolumn (jawny <em>JOIN<\/em>). Je\u015bli <em>JOIN<\/em> nie jest mo\u017cliwy, dla atrybutu mo\u017cna zapisa\u0107 specjalny <em>URIRenderer<\/em>, kt\u00f3ry mo\u017ce obliczy\u0107 <em>URI<\/em> dla obiektu docelowego z klucza obcego (patrz rozdzia\u0142 <em>URIRenderer<\/em>).<\/div>\n<div>Odznaczanie jako obiekt biznesowy jest r\u00f3wnie\u017c konieczne, je\u015bli w kolumnie <em>Wyra\u017cenie<\/em> nie zostanie wprowadzony \u017caden atrybut obiektu biznesowego, a jedynie alias obiektu biznesowego. To ustawienie okre\u015bla, \u017ce ca\u0142y obiekt biznesowy jest odczytywany z bazy danych zamiast pojedynczego atrybutu.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W miar\u0119 mo\u017cliwo\u015bci nale\u017cy unika\u0107 u\u017cywania ca\u0142ych obiekt\u00f3w biznesowych ze wzgl\u0119du na nast\u0119puj\u0105ce wady: zwi\u0119ksza si\u0119 zapotrzebowanie na pami\u0119\u0107 i obci\u0105\u017cenie bazy danych. Takie kolumny wymagaj\u0105 dodatkowego dzia\u0142ania deweloperskiego (renderer) i ani filtrowanie, ani sortowanie nie jest dost\u0119pne dla u\u017cytkownika.<\/div><\/section><\/div>\n<h6 id=\"pole-wyboru-zaprogramowany-filtr\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Zaprogramowany_filtr\"><\/span>Pole wyboru: <em>Zaprogramowany filtr<a id=\"PRL20\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Filtrowanie mo\u017ce by\u0107 wykonywane nie tylko przez u\u017cytkownika, ale tak\u017ce przez programowanie. Za pomoc\u0105 pola wyboru <em>Zaprogramowany filtr<\/em> mo\u017cna skonfigurowa\u0107 kolumn\u0119 tak, aby filtrowanie by\u0142o mo\u017cliwe tylko przez programowanie. U\u017cytkownicy nie mog\u0105 ju\u017c wstawia\u0107 kolumn oznaczonych w ten spos\u00f3b jako pole wyszukiwania w nag\u0142\u00f3wku. G\u0142\u00f3wnymi przypadkami u\u017cycia definicji jako zaprogramowanego filtra s\u0105 implementacja uprawnie\u0144, konfiguracja ustawie\u0144 i \u0142\u0105czenie szczeg\u00f3\u0142owych wyszukiwa\u0144.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W wyszukiwaniu atrybutu obiektu biznesowego mo\u017cna r\u00f3wnie\u017c wprowadzi\u0107 kilka atrybut\u00f3w wyszukiwania. W ten spos\u00f3b, w razie potrzeby, mo\u017cna r\u00f3wnie\u017c po\u0142\u0105czy\u0107 ze sob\u0105 kilka filtr\u00f3w (<em>AND<\/em>).<\/div><\/section><\/div>\n<h6 id=\"pole-wyboru-mozliwosc-filtrowania\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Mozliwosc_filtrowania\"><\/span>Pole wyboru: <em>Mo\u017cliwo\u015b\u0107 filtrowania<a id=\"PRL23\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Tylko te kolumny, kt\u00f3re s\u0105 odznaczone jako mo\u017cliwe do filtrowania, mog\u0105 by\u0107 zawarte w nag\u0142\u00f3wku aplikacji typu <em>Lista.<\/em> Wszystkie kolumny, kt\u00f3re mog\u0105 by\u0107 wy\u015bwietlane, powinny by\u0107 r\u00f3wnie\u017c w\u0142\u0105czone do filtrowania, poniewa\u017c odpowiada to og\u00f3lnym oczekiwaniom u\u017cytkownik\u00f3w.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli atrybut wirtualny jest oznaczony jako mo\u017cliwy do filtrowania, w\u00f3wczas co najmniej jeden atrybut grupy musi by\u0107 oznaczony jako mo\u017cliwy do filtrowania. Ponadto, w atrybucie wirtualnym musi by\u0107 okre\u015blony logiczny typ danych z odpowiednim <em>FilterExpressionEditorFactory.<\/em><\/div><\/section><\/div>\n<h6 id=\"pole-wyboru-mozliwe-sortowanie\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Mozliwe_sortowanie\"><\/span>Pole wyboru: <em>Mo\u017cliwe sortowanie<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Aby kolumna w aplikacji typu <em>Lista<\/em> mog\u0142a by\u0107 u\u017cywana jako funkcja sortowania, musi by\u0107 oznaczona jako sortowalna. Wszystkie kolumny, kt\u00f3re mog\u0105 by\u0107 wy\u015bwietlane, powinny by\u0107 r\u00f3wnie\u017c w\u0142\u0105czone do sortowania. Ze wzgl\u0119du na to, \u017ce jednak sortowanie zawsze odbywa si\u0119 w bazie danych, w ka\u017cdym indywidualnym przypadku nale\u017cy sprawdzi\u0107, czy wynik b\u0119dzie naprawd\u0119 przydatny. Decyzja zale\u017cy przede wszystkim od typu danych kolumny.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli atrybut wirtualny jest odznaczony jako mo\u017cliwy do sortowania, w\u00f3wczas dok\u0142adnie jeden atrybut grupy musi by\u0107 oznaczony jako mo\u017cliwy do sortowania. Atrybut wirtualny jest sortowany zgodnie z tym atrybutem.<\/div><\/section><\/div>\n<h6 id=\"pole-wyboru-mozliwy-do-wyswietlenia\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Mozliwy_do_wyswietlenia\"><\/span>Pole wyboru: <em>Mo\u017cliwy do wy\u015bwietlenia<\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Aby kolumna mog\u0142a by\u0107 u\u017cywana na li\u015bcie wynik\u00f3w aplikacji typu <em>Lista,<\/em> musi by\u0107 oznaczona jako mo\u017cliwa do wy\u015bwietlenia.<\/div>\n<div>Kolumna odznaczona jako mo\u017cliwa do wy\u015bwietlenia powinna by\u0107 r\u00f3wnie\u017c zawsze oznaczona jako filtrowana i sortowana, je\u015bli to mo\u017cliwe. Dzi\u0119ki tym ustawieniom nag\u0142\u00f3wki kolumn mog\u0105 by\u0107 przeci\u0105gane i upuszczane bezpo\u015brednio do obszaru zapytania w celu filtrowania lub sortowania bezpo\u015brednio poprzez klikni\u0119cie nag\u0142\u00f3wka kolumny. Ze wzgl\u0119du na to, \u017ce dotyczy to wi\u0119kszo\u015bci kolumn, u\u017cytkownicy oczekuj\u0105 tej funkcjonalno\u015bci od wszystkich kolumn.<\/div>\n<div>Kolumny, kt\u00f3re zosta\u0142y uwzgl\u0119dnione w zestawie kolumn tylko ze wzgl\u0119d\u00f3w technicznych, takich jak klawisz powrotu lub zaprogramowane filtry, powinny by\u0107 oznaczone jako niewy\u015bwietlane.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli atrybut wirtualny jest oznaczony jako mo\u017cliwy do wy\u015bwietlenia, co najmniej jeden atrybut grupy musi by\u0107 oznaczony jako wy\u015bwietlany. Ponadto, dla atrybutu wirtualnego musi by\u0107 zapisany logiczny typ danych z odpowiednim <em>FormatFactory<\/em> lub <em>RendererFactory.<\/div><\/section><\/em><\/div>\n<h6 id=\"pole-wyboru-klucz-zwrotu\" ><span class=\"ez-toc-section\" id=\"Pole_wyboru_Klucz_zwrotu\"><\/span>Pole wyboru:<em> Klucz zwrotu<a id=\"PRL19\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Odznaczenie jako klucz zwrotu s\u0142u\u017cy do jednoznacznej identyfikacji zestawu danych (wiersza wynik\u00f3w). Z regu\u0142y jest to jeden lub wi\u0119cej identyfikator\u00f3w <em>GUID,<\/em> kt\u00f3re tworz\u0105 klucz podstawowy obiektu biznesowego. Podczas, gdy wszystkie inne atrybuty s\u0105 \u0142adowane z bazy danych tylko wtedy, gdy s\u0105 faktycznie u\u017cywane w widoku, atrybuty oznaczone jako klucze zwrotu s\u0105 zawsze \u0142adowane. Odznaczenie jako klucz zwrotny jest zatem konieczne r\u00f3wnie\u017c wtedy, gdy poszczeg\u00f3lne warto\u015bci atrybut\u00f3w musz\u0105 by\u0107 dost\u0119pne w interfejsie u\u017cytkownika niezale\u017cnie od ich u\u017cycia. Przyk\u0142adami tego s\u0105<\/div>\n<ul>\n<li>transfer i dost\u0119p z przetwarzania w tle<\/li>\n<li>atrybuty do \u0142\u0105czenia szczeg\u00f3\u0142owych wyszukiwa\u0144<\/li>\n<li>atrybuty, kt\u00f3re s\u0105 sprawdzane podczas analizy wybranych lub zaznaczonych wierszy<\/li>\n<\/ul>\n<div>W wi\u0119kszo\u015bci przypadk\u00f3w jednak klucz podstawowy jednostki biznesowej jest wystarczaj\u0105cy dla wszystkich tych zastosowa\u0144, wi\u0119c tylko bardzo rzadko inne atrybuty musz\u0105 by\u0107 oznaczone jako klucze zwrotu.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Atrybuty oznaczone jako klucze zwrotu s\u0105 zazwyczaj atrybutami technicznymi (np. <em>GUID),<\/em> kt\u00f3re powinny by\u0107 niewidoczne dla u\u017cytkownik\u00f3w. Takie atrybuty techniczne nie powinny by\u0107 zatem oznaczane jako wy\u015bwietlane, filtrowane lub sortowane.<\/div><\/section><\/div>\n<h6 id=\"logiczny-typ-danych\" ><span class=\"ez-toc-section\" id=\"Logiczny_typ_danych\"><\/span>Logiczny typ danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Infrastruktura wymaga pewnych metadanych dla ka\u017cdego atrybutu, takich jak typ danych, etykieta i ewentualnie specjalne <em>Factory.<\/em> Wymagane metadane s\u0105 dostarczane przez logiczny typ danych i powi\u0105zany opis danych. W przypadku atrybut\u00f3w wyszukiwania, kt\u00f3re bezpo\u015brednio odwo\u0142uj\u0105 si\u0119 do atrybutu z obiektu biznesowego, logiczny typ danych i opis danych s\u0105 pobierane z atrybutu obiektu biznesowego. Odpowiedni logiczny typ danych musi zosta\u0107 wprowadzony dla wszystkich innych typ\u00f3w atrybut\u00f3w, tj. atrybut\u00f3w wirtualnych, atrybut\u00f3w wyliczanych i obiekt\u00f3w biznesowych. Logiczny typ danych musi by\u0107 powi\u0105zany z opisem danych, kt\u00f3ry definiuje etykiet\u0119 i niezb\u0119dne czynniki dla atrybutu (patrz ten rozdzia\u0142: <a href=\"#PRL8\"><em>Typ obiektu deweloperskiego Data description<\/em><\/a>).<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Logiczny typ danych pobrany z atrybutu obiektu biznesowego jest pomijany poprzez wyra\u017ane okre\u015blenie innego logicznego typu danych. Mo\u017ce to by\u0107 konieczne, je\u015bli logiczny typ danych okre\u015blony dla atrybutu obiektu biznesowego nie ma po\u017c\u0105danej unikalnej etykiety lub po\u017c\u0105danych fabryk. Je\u015bli jednak wyra\u017anie okre\u015blono inny logiczny typ danych, nale\u017cy zadba\u0107 o to, aby prymitywny typ danych pozosta\u0142 niezmieniony.<\/div><\/section><\/div>\n<h6 id=\"zalecenia-dotyczace-zestawu-kolumn\" ><span class=\"ez-toc-section\" id=\"Zalecenia_dotyczace_zestawu_kolumn\"><\/span>Zalecenia dotycz\u0105ce zestawu kolumn<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<h6 id=\"etykieta\" ><span class=\"ez-toc-section\" id=\"Etykieta\"><\/span>Etykieta<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Aby u\u017cytkownicy mogli identyfikowa\u0107 i u\u017cywa\u0107 kolumn z list kolumn bez pomy\u0142ek, oznaczenia (etykiety) powinny si\u0119 od siebie r\u00f3\u017cni\u0107. Ze wzgl\u0119du na to, \u017ce etykieta jest definiowana za pomoc\u0105 logicznego typu danych, mo\u017ce by\u0107 konieczne okre\u015blenie alternatywnych logicznych typ\u00f3w danych dla niekt\u00f3rych kolumn, tak aby m\u00f3c nada\u0107 tym kolumnom unikalne nazwy.<\/div>\n<h6 id=\"znacznik-usuwania\" ><span class=\"ez-toc-section\" id=\"Znacznik_usuwania\"><\/span>Znacznik usuwania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Podobnie jak ka\u017cda inna kolumna, znacznik usuwania musi zosta\u0107 jawnie dodany do zestawu kolumn. Atrybut <em>updateInfo.deleteTime<\/em> musi by\u0107 wybrany z odpowiedniego obiektu biznesowego. Dla nazwy kolumny nale\u017cy u\u017cy\u0107 konwencji <em>&lt;alias&gt;UpdateInfoDeleteState.<\/em><\/div>\n<div>Logicznym typem danych powinien by\u0107 <em>com.cisag.pgm.datatype.DeleteState<\/em> lub typ danych pochodny od niego. Odpowiednie <em>Renderer<\/em> i <em>FilterExpressionEditorFactory<\/em> s\u0105 automatycznie dostarczane za po\u015brednictwem powi\u0105zanego <em>Data description,<\/em> tak aby zwyk\u0142a wizualizacja i filtrowanie by\u0142y u\u017cywane dla znacznik\u00f3w usuwania.<\/div>\n<h5 id=\"zakladka-uklady\" ><span class=\"ez-toc-section\" id=\"Zakladka_Uklady\"><\/span>Zak\u0142adka <em>Uk\u0142ady<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Uk\u0142ady aplikacji typu <em>Lista<\/em> s\u0105 zapisywane w rozszerzeniach aplikacji. Uk\u0142ady w wyszukiwaniach s\u0105 u\u017cywane tylko wtedy, gdy nie ma odpowiedniego uk\u0142adu w rozszerzeniu aplikacji.<\/div>\n<div>Uk\u0142ady <em>SearchViews<\/em> s\u0105 nadal zapisywane w wyszukiwaniach, je\u015bli s\u0105 odpowiednio ustawione.<\/div>\n<div>Wszystkie uk\u0142ady zapisane bezpo\u015brednio w tym obiekcie deweloperskim s\u0105 wymienione w zak\u0142adce <em>Uk\u0142ady.<\/em> Wy\u015bwietlanie s\u0142u\u017cy g\u0142\u00f3wnie do sprawdzania, edycja odbywa si\u0119 bezpo\u015brednio w <em>SearchView.<\/em> Aby m\u00f3c edytowa\u0107 zapisane uk\u0142ady za pomoc\u0105 <em>SearchView,<\/em> ten obiekt deweloperski musi najpierw zosta\u0107 w\u0142\u0105czony do zadania deweloperskiego przez programist\u0119.<\/div>\n<div>Aby <em>SearchView<\/em> m\u00f3g\u0142 by\u0107 natychmiast u\u017cywany przez u\u017cytkownik\u00f3w, nag\u0142\u00f3wek i co najmniej jeden widok dla obszaru roboczego powinny by\u0107 zapisane w wyszukiwaniu. W razie potrzeby pola nag\u0142\u00f3wka powinny mie\u0107 warto\u015bci domy\u015blne, kt\u00f3re s\u0105 u\u017cyteczne dla u\u017cytkownika i powoduj\u0105 najni\u017csze mo\u017cliwe wykorzystanie bazy danych.<\/div>\n<h5 id=\"zakladka-ustawienia\" ><span class=\"ez-toc-section\" id=\"Zakladka_Ustawienia\"><\/span>Zak\u0142adka <em>Ustawienia<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6 id=\"hook\" ><span class=\"ez-toc-section\" id=\"Hook\"><\/span>Hook<a id=\"PRL10\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>W polu <em>Hook<\/em> mo\u017cna zarejestrowa\u0107 Java class implementuj\u0105c\u0105 interfejs <em>com.cisag.pgm.search.SearchHook.<\/em> Klasa ta mo\u017ce by\u0107 u\u017cywana do manipulowania zapytaniem do bazy danych przed jego wykonaniem (patrz rozdzia\u0142 <em><a href=\"#PRL36\">SearchHook<\/a>).<\/em><\/div>\n<div>Nazw\u0119 klasy obiektu biznesowego mo\u017cna wprowadzi\u0107 w polu<em> Obiekt bazowy<\/em>. Gdy wywo\u0142ywana jest metoda <em>init<\/em> dla hook, odpowiedni obiekt klasy jest przekazywany jako parametr.<\/div>\n<div>Implementacja <em>SearchHook<\/em> jest alternatyw\u0105 dla zmiany metody <em>preSearch<\/em> (patrz rozdzia\u0142y <a href=\"#PRL9\"><em>CisCustomisableCockpit<\/em><\/a> i <em><a href=\"#PRL14\">SearchView<\/a>).<\/em> Jest to szczeg\u00f3lnie przydatne, je\u015bli wyszukiwanie jest u\u017cywane nie tylko przez pojedyncz\u0105 implementacj\u0119 <em>CisCustomisableCockpit,<\/em> ale powinno by\u0107 r\u00f3wnie\u017c u\u017cyteczne np. jako us\u0142uga <em>REST.<\/em><\/div>\n<h6 id=\"baza-danych\" ><span class=\"ez-toc-section\" id=\"Baza_danych\"><\/span>Baza danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Aktywuj\u0105c pole wyboru <em>Distinct,<\/em> zapytanie do bazy danych mo\u017cna rozszerzy\u0107 o s\u0142owo kluczowe <em>DISTINCT.<\/em> Podczas korzystania z tego s\u0142owa kluczowego nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na nast\u0119puj\u0105ce kwestie:<\/div>\n<ul>\n<li>Zestaw kolumn zawiera ju\u017c jeden lub wi\u0119cej atrybut\u00f3w, kt\u00f3re razem zapewniaj\u0105 unikaln\u0105 identyfikacj\u0119 obiektu (np. klucz podstawowy obiektu biznesowego). Te atrybuty oznaczone jako <em>klucz zwrotu<\/em> w zestawie kolumn s\u0105 zawsze zawarte w klauzuli <em>SELECT.<\/em> Ze wzgl\u0119du na unikalno\u015b\u0107 klucza zwrotu, \u017cadne zduplikowane obiekty nie mog\u0105 wyst\u0105pi\u0107 w wyniku, a dodatkowe <em>DISTINCT<\/em> tylko niepotrzebnie obci\u0105\u017cy\u0142oby baz\u0119 danych.<\/li>\n<li>Je\u015bli to mo\u017cliwe, relacje<em> Do-N<\/em> powinny by\u0107 zlecane wyszukiwaniom szczeg\u00f3\u0142owym<\/li>\n<li>W klauzuli <em>SELECT<\/em> automatycznie uwzgl\u0119dniany jest nie tylko klucz zwrotu, ale tak\u017ce wszystkie w\u0142a\u015bciwo\u015bci sortowania i grupowania. Wynik zale\u017cy zatem r\u00f3wnie\u017c od tego, czy i kt\u00f3re kolumny s\u0105 u\u017cywane do sortowania i grupowania.<\/li>\n<\/ul>\n<h4 id=\"typ-obiektu-deweloperskiego-search-extension\" ><span class=\"ez-toc-section\" id=\"Typ_obiektu_deweloperskiego_Search_extension\"><\/span>Typ obiektu deweloperskiego <em>Search extension<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Rozszerzenia wyszukiwania rozszerzaj\u0105 zestaw kolumn i klauzul\u0119 <em>FROM<\/em> przywo\u0142anego wyszukiwania. Dla jednego wyszukiwania mo\u017ce istnie\u0107 kilka rozszerze\u0144 wyszukiwania. W systemie tworzenia aplikacji mo\u017cna utworzy\u0107 rozszerzenie wyszukiwania dla wyszukiwania w ka\u017cdej aplikacji. W standardowym systemie deweloperskim dla wyszukiwania mo\u017cna utworzy\u0107 tylko jedno rozszerzenie wyszukiwania na prefiks deweloperski. Rozszerzenia wyszukiwania s\u0105 powi\u0105zane tylko z wyszukiwaniem. Nie mo\u017cna tworzy\u0107 mi\u0119dzy nimi \u017cadnych relacji.<\/div>\n<div>Rozszerzenia klauzul <em>FROM<\/em> wszystkich rozszerze\u0144 wyszukiwania s\u0105 do\u0142\u0105czane do klauzuli <em>FROM<\/em> wyszukiwania za pomoc\u0105 <em>REMOVABLE LEFT OUTER JOIN<\/em>. Atrybuty s\u0105 dodawane do listy kolumn. Unikalno\u015b\u0107 atrybut\u00f3w jest osi\u0105gana poprzez poprzedzenie ich prefiksem deweloperskim i nazw\u0105 aplikacji.<\/div>\n<div>Po scaleniu wyszukiwanie zachowuje si\u0119 tak, jakby wszystko zosta\u0142o zdefiniowane w samym wyszukiwaniu.<\/div>\n<h4 id=\"typ-obiektu-deweloperskiego-application\" ><span class=\"ez-toc-section\" id=\"Typ_obiektu_deweloperskiego_Application\"><\/span>Typ obiektu deweloperskiego <em>Application<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>W przypadku aplikacji typu <em>Lista<\/em> (<em>CisCustomisableCockpit<\/em>) w polu <em>Szczeg\u00f3lne zastosowanie<\/em> nale\u017cy wybra\u0107 pozycj\u0119 <em>Lista,<\/em> a w polu <em>Szukanie<\/em> wpisa\u0107 pe\u0142n\u0105 nazw\u0119 obiektu deweloperskiego. Wprowadzenie wyszukiwania jest wa\u017cne, aby zestaw kolumn wyszukiwania m\u00f3g\u0142 by\u0107 automatycznie u\u017cywany jako definicja parametru dla aplikacji. Eliminuje to r\u00f3wnie\u017c konieczno\u015b\u0107 zmiany metody <em>getDefaultCockpitSearchName()<\/em> w klasie <em>CisCustomisableCockpit<\/em> (patrz rozdzia\u0142 <a href=\"#PRL9\"><em>CisCustomisableCockpit<\/em><\/a>).<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Aby w\u0142\u0105czy\u0107 rozszerzony eksport w aplikacji typu <em>Lista<\/em> (patrz rozdzia\u0142 <em>Eksport i us\u0142uga webservice RESTful<\/em>), nale\u017cy r\u00f3wnie\u017c utworzy\u0107 aplikacj\u0119 typu<em> Us\u0142uga sieciowa<\/em> (specjalne zastosowanie: <em>Us\u0142uga REST<\/em>). W takim przypadku obiekt deweloperski <i>Search <\/i>musi zosta\u0107 wprowadzony zar\u00f3wno w aplikacji dla aplikacji typu <em>Lista,<\/em> jak i w aplikacji dla us\u0142ugi sieciowej.<\/div><\/section><\/div>\n<h4 id=\"typ-obiektu-deweloperskiego-application-extension\" ><span class=\"ez-toc-section\" id=\"Typ_obiektu_deweloperskiego_Application_extension\"><\/span>Typ obiektu deweloperskiego <em>Application extension<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Uk\u0142ady aplikacji typu <em>Lista<\/em> s\u0105 zapisywane w rozszerzeniach aplikacji. Dla jednej aplikacji mo\u017ce istnie\u0107 kilka rozszerze\u0144 aplikacji, przy czym dla ka\u017cdego prefiksu deweloperskiego mo\u017ce istnie\u0107 tylko jedno rozszerzenie, a w systemach deweloperskich aplikacji &#8211; jedna aplikacja.<\/div>\n<div>\u00a0<\/div>\n<div>Przyk\u0142ad dla prefiksu deweloperskiego:<\/div>\n<div>Aplikacja: com.cisag.app.general.ui.MyApplication<\/div>\n<div>Rozszerzenia aplikacji:<\/div>\n<div>com.cisag.app.general.ui.MyFirstApplicationExtension<\/div>\n<div>com.bdv.app.general.ui.BranchApplicationExtension<\/div>\n<div>____________________________________________<\/div>\n<div>Przyk\u0142ad systemu tworzenia aplikacji:<\/div>\n<div>Aplikacja: com.sem.ext.app.abc.ui.MyApplication<\/div>\n<div>Rozszerzenia aplikacji:<\/div>\n<div>com.sem.ext.app.abc.ui.MyFirstApplicationExtension<\/div>\n<div>com.sem.ext.app.def.ui.MySecondApplicationExtension<\/div>\n<div>com.cdv.app.general.ui.CustomerApplicationExtension<\/div>\n<div>Uk\u0142ady s\u0105 zarz\u0105dzane w aplikacjach typu <em>Lista.<\/em><\/div>\n<h4 id=\"typ-obiektu-deweloperskiego-data-description\" ><span class=\"ez-toc-section\" id=\"Typ_obiektu_deweloperskiego_Data_description\"><\/span>Typ obiektu deweloperskiego <em>Data description<a id=\"PRL8\"><\/a><\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Metadane kolumny pochodz\u0105 z logicznego typu danych i powi\u0105zanego <em>Data description<\/em> (w razie potrzeby przez dziedziczenie). W przypadku kolumn, kt\u00f3re bezpo\u015brednio odwo\u0142uj\u0105 si\u0119 do atrybutu obiektu biznesowego, przyjmowany jest logiczny typ danych atrybutu. Alternatywnie, kolumnie mo\u017cna r\u00f3wnie\u017c przypisa\u0107 specjalny logiczny typ danych. Specjalny logiczny typ danych musi by\u0107 przypisany do kolumn wirtualnych, kolumn obliczanych i obiekt\u00f3w biznesowych.<\/div>\n<div>Nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci <em>Data description<\/em> s\u0105 oceniane przez aplikacje typu <em>Lista:<\/em><\/div>\n<ul>\n<li><em>Pe\u0142na etykieta i pomoc kontekstowa<\/em><\/li>\n<li><em>FormatFactory<\/em><\/li>\n<li><em>RendererFactory<\/em><\/li>\n<li><em>FilterExpressionEditorFactory<\/em><\/li>\n<li><em>DataDescriptionFilter<\/em><\/li>\n<li><em>Typ zawarto\u015bci (dla string\u00f3w)<\/em><\/li>\n<\/ul>\n<h5 id=\"pelna-etykieta-i-pomoc-kontekstowa\" ><span class=\"ez-toc-section\" id=\"Pelna_etykieta_i_pomoc_kontekstowa\"><\/span>Pe\u0142na etykieta i pomoc kontekstowa<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W opisie danych rozr\u00f3\u017cnia si\u0119 <em>Etykiet\u0119<\/em> i Pe\u0142n\u0105 <em>etykiet\u0119.<\/em> W ten spos\u00f3b mo\u017cna zapewni\u0107 dwa r\u00f3\u017cne oznaczenia dla atrybutu z tylko jednym opisem danych. Przyk\u0142adowo, etykieta dla atrybutu <em>Opis<\/em> obiektu biznesowego <em>Artyku\u0142<\/em> to tylko <em>Opis,<\/em> pe\u0142na etykieta to <em>Opis artyku\u0142u<\/em>. Podczas, gdy inne aplikacje u\u017cywaj\u0105 etykiety, aplikacje typu <em>Lista<\/em> u\u017cywaj\u0105 pe\u0142nej etykiety. Je\u015bli w opisie danych nie ma pe\u0142nej etykiety, zamiast niej u\u017cywana jest etykieta.<\/div>\n<div>W opisie danych mo\u017cna r\u00f3wnie\u017c wprowadzi\u0107 drugi tekst dla pomocy kontekstowej. <em>Bezpo\u015brednia pomoc dla pe\u0142nej etykiety<\/em> jest u\u017cywana w aplikacjach typu <em>Lista.<\/em><\/div>\n<h5 id=\"factory\" ><span class=\"ez-toc-section\" id=\"Factory\"><\/span><em>Factory<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Odpowiednie fabryki s\u0105 dostarczane przez infrastruktur\u0119 dla wszystkich prymitywnych typ\u00f3w danych i <em>Special Parts.<\/em> Dla wszystkich innych typ\u00f3w danych, a w szczeg\u00f3lno\u015bci dla kolumn wirtualnych, kolumn wyliczanych i obiekt\u00f3w biznesowych, nale\u017cy zaimplementowa\u0107 odpowiednie <em>Factory<\/em> i okre\u015bli\u0107 je w opisie danych.<\/div>\n<div>Je\u015bli kolumna jest wy\u015bwietlana, nale\u017cy zapewni\u0107 <em>FormatFactory<\/em> lub <em>RendererFactory.<\/em> Dla atrybut\u00f3w, kt\u00f3re mog\u0105 by\u0107 filtrowane, wymagana jest <em>FilterExpressionEditorFactory.<\/em><\/div>\n<h4 id=\"obiekty-biznesowe-proxy\" ><span class=\"ez-toc-section\" id=\"Obiekty_biznesowe_proxy\"><\/span>Obiekty biznesowe proxy<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Wyszukiwania s\u0105 u\u017cywane w aplikacjach typu <em>Lista.<\/em> W niekt\u00f3rych przypadkach przydatne mo\u017ce by\u0107 u\u017cycie informacji z repozytorium lub bazy danych konfiguracji w wyszukiwaniu. Przyk\u0142adowo, informacje te mog\u0105 by\u0107 wykorzystane do poinformowania u\u017cytkownika, o tym kto utworzy\u0142 lub ostatnio zmieni\u0142 obiekt. Wy\u015bwietlanie wersji u\u017cywanego obiektu deweloperskiego jest bardziej istotne z technicznego punktu widzenia.<\/div>\n<div>Ze wzgl\u0119d\u00f3w technicznych nie jest mo\u017cliwe <em>JOIN<\/em> poprzez obiekty biznesowe z r\u00f3\u017cnych baz danych. W zwi\u0105zku z tym, dost\u0119pne s\u0105 obiekty biznesowe proxy. <em>Obiekty biznesowe proxy<\/em> s\u0105 substytutami obiekt\u00f3w biznesowych z bazy danych repozytorium i bazy danych konfiguracji w bazie danych OLTP.<\/div>\n<div>Obiekty te mog\u0105 by\u0107 aktualizowane w bazie danych OLTP za pomoc\u0105 aktualizacji danych. \u017badna logika nie mo\u017ce by\u0107 oparta na obiektach biznesowych proxy. S\u0105 one u\u017cywane wy\u0142\u0105cznie do wizualizacji w aplikacjach typu <em>Lista.<\/em><\/div>\n<div>Ze wzgl\u0119du na to, \u017ce obiekty biznesowe proxy nie s\u0105 u\u017cywane z wyj\u0105tkiem bardziej technicznych analiz, dane niekoniecznie musz\u0105 by\u0107 wype\u0142nione. W zwi\u0105zku z tym, ka\u017cde u\u017cycie w wyszukiwaniu powinno by\u0107 scharakteryzowane jako <em>REMOVABLE LEFT OUTER JOIN<\/em> (patrz rozdzia\u0142 <a href=\"#PRL39\"><em>REMOVABLE JOIN<\/em><\/a>).<\/div>\n<div>Obiekty biznesowe proxy maj\u0105 ten sam klucz podstawowy, co ich odpowiedniki. S\u0105 one r\u00f3wnie\u017c zredukowane do niekt\u00f3rych atrybut\u00f3w istotnych dla wy\u015bwietlania.<\/div>\n<h5 id=\"obiekty-konfiguracyjne\" ><span class=\"ez-toc-section\" id=\"Obiekty_konfiguracyjne\"><\/span>Obiekty konfiguracyjne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>\n<p>Namespace: com.cisag.sys.configuration.obj<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset; height: 90px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\"><strong>Oryginalny<\/strong><\/td>\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\"><strong>Proxy<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\">User<\/td>\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\">ProxyUser<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\">UserGroup<\/td>\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 23px; text-align: center;\" scope=\"rowgroup\">ProxyUserGroup<\/td>\n<\/tr>\n<tr style=\"height: 21px;\">\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 21px; text-align: center;\" scope=\"rowgroup\">UserGroupAssignment\u00a0<\/td>\n<td style=\"width: 50%; border-color: #000000; background-color: #ffffff; border-style: outset; height: 21px; text-align: center;\" scope=\"rowgroup\">ProxyUserGroupAssignment<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h5 id=\"obiekty-repozytorium\" ><span class=\"ez-toc-section\" id=\"Obiekty_repozytorium\"><\/span>Obiekty repozytorium<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Namespace: com.cisag.sys.repository.internal.obj<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 69px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Oryginalny<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Proxy<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">ObjectDirEntr<\/td>\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">ProxyObjectDirEntry<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Version\u00a0<\/td>\n<td style=\"width: 50%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">ProxyVersion<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h5 id=\"aktualizacja-danych\" ><span class=\"ez-toc-section\" id=\"Aktualizacja_danych\"><\/span>Aktualizacja danych<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Obiekty biznesowe proxy mo\u017cna aktualizowa\u0107 za pomoc\u0105 aplikacji<em> Aktualizacja obiekt\u00f3w biznesowych proxy<\/em> (com.cisag.sys.update.log.UPDProxyBOs). Aplikacja ta jest powtarzaln\u0105 aktualizacj\u0105 danych.<\/div>\n<h3 id=\"interfejsy-programowania-java\" ><span class=\"ez-toc-section\" id=\"Interfejsy_programowania_Java\"><\/span>Interfejsy programowania Java<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>W tym rozdziale opisano klasy Java istotne dla aplikacji typu <em>Lista.<\/em> Dalsze informacje na temat poszczeg\u00f3lnych metod mo\u017cna r\u00f3wnie\u017c znale\u017a\u0107 w <em>JavaDoc<\/em> odpowiednich klas.<\/div>\n<h4 id=\"ciscustomisablecockpit\" ><span class=\"ez-toc-section\" id=\"CisCustomisableCockpit\"><\/span>CisCustomisableCockpit<a id=\"PRL9\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Wszystkie aplikacje typu <em>Lista<\/em> musz\u0105 wywodzi\u0107 si\u0119 z nast\u0119puj\u0105cej abstrakcyjnej klasy bazowej:<\/div>\n<div>com.cisag.pgm.base.CisCustomisableCockpit<\/div>\n<div>\u00a0<\/div>\n<div>Klasa ta rozszerza poni\u017csz\u0105 klas\u0119 i oferuje r\u00f3\u017cne metody hook i szablon\u00f3w, kt\u00f3re mog\u0105 by\u0107 zmieniane przez konkretne podklasy:<\/div>\n<div>com.cisag.pgm.base.CisUiApplication<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Klasa <em>AbstractOrderCockpit<\/em> zapewnia specjaln\u0105 podklas\u0119 do implementacji aplikacji typu Lista zwi\u0105zanych z dokumentami, co upraszcza i standaryzuje rozw\u00f3j tych aplikacji\u00a0(patrz rozdzia\u0142 <em><a href=\"#PRL13\">AbstractOrderCockpit<\/a>).<\/div><\/section><\/em><\/div>\n<h5 id=\"metody-hook\" ><span class=\"ez-toc-section\" id=\"Metody_hook\"><\/span>Metody hook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Poni\u017csze metody s\u0105 wywo\u0142ywane przez infrastruktur\u0119 dla okre\u015blonych zdarze\u0144 lub w okre\u015blonym czasie. Zmieniaj\u0105c te metody, aplikacja typu <em>Lista<\/em> mo\u017ce dostosowa\u0107 i uzupe\u0142ni\u0107 standardow\u0105 funkcjonalno\u015b\u0107.<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 557px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda\u00a0<\/strong><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 35.4762%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getSearchContext()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Aplikacje typu <em>Lista<\/em> musz\u0105 zmieni\u0107 t\u0119 metod\u0119, aby odpowiedni kontekst wyszukiwania by\u0142 dost\u0119pny dla p\u00f3l wyszukiwania.<\/td>\n<\/tr>\n<tr style=\"height: 187px;\">\n<td style=\"width: 35.4762%; height: 187px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em><del>getDefaultCockpitSearchName()<\/del><\/em><\/td>\n<td style=\"width: 64.5238%; height: 187px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>@Odrzucony od V5R0M0-PD-03<\/div>\n<div>Od V5R0M0-PD-03 aplikacja typu <em>Lista<\/em> jest powi\u0105zana z wyszukiwaniem bezpo\u015brednio w obiekcie deweloperskim <em>Application.<\/em> W zwi\u0105zku z tym, zmiana tej metody jest konieczna tylko wtedy, gdy w aplikacji nie wprowadzono \u017cadnego wyszukiwania. W takim przypadku nale\u017cy zwr\u00f3ci\u0107 w pe\u0142ni kwalifikowan\u0105 nazw\u0119 wyszukiwania.<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 35.4762%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>preInit()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Jest wywo\u0142ywana raz przed rozpocz\u0119ciem wewn\u0119trznego inicjalizacji.<\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 35.4762%; height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>postInit()<a id=\"PRL11\"><\/a><\/em><\/td>\n<td style=\"width: 64.5238%; height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Jest wywo\u0142ywana raz po zako\u0144czeniu wewn\u0119trznej inicjalizacji. Aplikacje typu <em>Lista<\/em> powinny zmieni\u0107 t\u0119 metod\u0119, aby wykona\u0107 w\u0142asne inicjalizacje (np. zarejestrowa\u0107 akcje do przetwarzania w tle, patrz rozdzia\u0142 <a href=\"#PRL12\"><em>Rejestrowanie akcji<\/em><\/a>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>preSearch()<a id=\"PRL37\"><\/a><\/em><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Jest wywo\u0142ywana przed wykonaniem wyszukiwania w bazie danych. Aplikacje typu <em>Lista<\/em> mog\u0105 zmieni\u0107 t\u0119 metod\u0119, aby zmieni\u0107 kryteria wyszukiwania (np. ustawi\u0107 warto\u015bci dla zaprogramowanych filtr\u00f3w).<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zamiast zmiany tej metody mo\u017cna r\u00f3wnie\u017c zarejestrowa\u0107 implementacj\u0119 <em>com.cisag.pgm.search.SearchHook<\/em> w obiekcie deweloperskim <em>Search<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL10\">Hook<\/a>).<\/em> Ta procedura jest szczeg\u00f3lnie zalecana, je\u015bli wyszukiwanie mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywane w innym kontek\u015bcie.<\/div><\/section>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>postSearch()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Jest wywo\u0142ywana po przeprowadzeniu wyszukiwania w bazie danych. Aplikacje typu <em>Lista<\/em> mog\u0105 zmieni\u0107 t\u0119 metod\u0119, aby reagowa\u0107 na informacje z wyniku wyszukiwania.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>validateFilter()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Aplikacje typu <em>Lista<\/em> mog\u0105 zmieni\u0107 t\u0119 metod\u0119, aby zaimplementowa\u0107 dodatkowe sprawdzanie filtr\u00f3w. Filtry s\u0105 automatycznie sprawdzane przed wykonaniem wyszukiwania.<\/div>\n<div>\u00a0<\/div>\n<div>U\u017cytkownicy mog\u0105 to sprawdzi\u0107, wybieraj\u0105c przycisk [<strong>Weryfikuj<\/strong>].<\/div>\n<div>Programi\u015bci mog\u0105 wywo\u0142a\u0107 metod\u0119 <em>validateFilter()<\/em> w klasie <em>GridSearchSupport,<\/em> aby zainicjowa\u0107 sprawdzanie (patrz rozdzia\u0142 <em><a href=\"#PRL15\">GridSearchSupport<\/a>).<\/em><\/div>\n<div>Metoda musi zwraca\u0107 warto\u015b\u0107 <em>true,<\/em> je\u015bli podczas sprawdzania nie wykryto \u017cadnych b\u0142\u0119d\u00f3w. Je\u015bli b\u0142\u0119dy zosta\u0142y wykryte, metoda musi zwr\u00f3ci\u0107 <em>false<\/em> i wcze\u015bniej wys\u0142a\u0107 odpowiednie komunikaty za pomoc\u0105 <em>GridSearchSupport#sendMessage().<\/em><\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>clearResult()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Jest wywo\u0142ywana po usuni\u0119ciu wyniku wyszukiwania. Aplikacje typu <em>Lista<\/em> mog\u0105 zmieni\u0107 t\u0119 metod\u0119, aby reagowa\u0107 na zmiany wyniku wyszukiwania. Wynik wyszukiwania jest automatycznie usuwany przed ka\u017cdym nowym wyszukiwaniem.<\/div>\n<div>\u00a0<\/div>\n<div>U\u017cytkownicy mog\u0105 wyczy\u015bci\u0107 wynik wyszukiwania, klikaj\u0105c przycisk [<strong>Nowy<\/strong>].<\/div>\n<div>Programi\u015bci mog\u0105 wywo\u0142a\u0107 metod\u0119<em> clearResult()<\/em> w klasie <em>GridSearchSupport<\/em>, aby wyczy\u015bci\u0107 wynik wyszukiwania (patrz rozdzia\u0142 <a href=\"#PRL15\"><em>GridSearchSupport<\/em><\/a>).<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.4762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>resetFilter()<\/em><\/td>\n<td style=\"width: 64.5238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Jest wywo\u0142ywana po zresetowaniu wszystkich filtr\u00f3w do ich warto\u015bci domy\u015blnych. Aplikacje typu <em>Lista<\/em> mog\u0105 zmieni\u0107 t\u0119 metod\u0119, aby ustawi\u0107 w\u0142asne warto\u015bci domy\u015blne, ale oryginalne warto\u015bci domy\u015blne nie powinny by\u0107 zmieniane. Filtry s\u0105 inicjowane automatycznie tylko za pomoc\u0105 akcji [<strong>Otw\u00f3rz puste<\/strong>].<\/p>\n<div>U\u017cytkownicy mog\u0105 wyczy\u015bci\u0107 wynik wyszukiwania, klikaj\u0105c przycisk [<strong>Nowy<\/strong>].<\/div>\n<div>Programi\u015bci mog\u0105 wywo\u0142a\u0107 metod\u0119<em> clearResult()<\/em> w klasie <em>GridSearchSupport<\/em>, aby wyczy\u015bci\u0107 wynik wyszukiwania (patrz rozdzia\u0142 <a href=\"#PRL15\"><em>GridSearchSupport<\/em><\/a>).<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<h5 id=\"dalsze-metody\" ><span class=\"ez-toc-section\" id=\"Dalsze_metody\"><\/span>Dalsze metody<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>\n<table style=\"height: 347px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 36.1904%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda\u00a0<\/strong><\/td>\n<td style=\"width: 63.8096%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 36.1904%; height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">setExecuteActions(List&lt;Action&gt;)<\/td>\n<td style=\"width: 63.8096%; height: 116px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Wszystkie akcje zarejestrowane za pomoc\u0105 tej metody s\u0105 podsumowywane na standardowym pasku przycisku w przycisku menu [<strong>Wybierz akcj\u0119<\/strong>] powszechnie u\u017cywanym w aplikacji typu <em>Lista<\/em>. Metoda ta powinna zosta\u0107 wywo\u0142ana raz podczas inicjalizacji aplikacji (patrz metoda <a href=\"#PRL11\">postInit()<\/a>).<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 36.1904%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">load(boolean record)<\/td>\n<td style=\"width: 63.8096%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Metoda ta mo\u017ce by\u0107 u\u017cywana do wyzwalania otwierania (aktualizacji) obiekt\u00f3w bezpo\u015brednio poprzez programowanie.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 36.1904%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">refreshUi()<\/td>\n<td style=\"width: 63.8096%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Za pomoc\u0105 tej metody mo\u017cna od\u015bwie\u017cy\u0107 wy\u015bwietlane wyniki bez ponownego otwierania obiekt\u00f3w.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 36.1904%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">getGridSearchSupport()<\/td>\n<td style=\"width: 63.8096%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Metoda ta zwraca instancj\u0119 klasy <em>GridSearchSupport,<\/em> kt\u00f3ra umo\u017cliwia rozszerzony dost\u0119p do konfiguracji i kontroli. (Patrz rozdzia\u0142: <a href=\"#PRL15\"><em>GridSearchSupport<\/em><\/a>).<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 36.1904%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">getBatchApplicationParameters()<\/td>\n<td style=\"width: 63.8096%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Wyszukuje obiekty, kt\u00f3re musz\u0105 zosta\u0107 przekazane do przetwarzania w tle.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h5 id=\"akcje-i-przetwarzanie-w-tle\" ><span class=\"ez-toc-section\" id=\"Akcje_i_przetwarzanie_w_tle\"><\/span>Akcje i przetwarzanie w tle<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Operacje masowe powinny by\u0107 zawsze implementowane jako aplikacja dzia\u0142aj\u0105ca w tle i nie powinny by\u0107 wykonywane w oknie dialogowym. Jest to jedyny spos\u00f3b, aby zapewni\u0107, \u017ce nie wyst\u0105pi\u0105 problemy z zapotrzebowaniem na pami\u0119\u0107 i \u017ce u\u017cytkownik nie b\u0119dzie musia\u0142 czeka\u0107 zbyt d\u0142ugo, a\u017c system b\u0119dzie ponownie gotowy do wprowadzania danych. Ponadto, tylko aplikacje dzia\u0142aj\u0105ce w tle pozwalaj\u0105 na przetwarzanie wszystkich obiekt\u00f3w pasuj\u0105cych do kryterium wyszukiwania, podczas gdy wyb\u00f3r jest ograniczony do maksymalnej liczby obiekt\u00f3w (np. 1000).<\/div>\n<div>Poni\u017csze fragmenty kodu pokazuj\u0105, w jaki spos\u00f3b rejestrowane s\u0105 akcje niestandardowe, tak aby<\/div>\n<ul>\n<li>by\u0142y do\u0142\u0105czane do przycisku akcji na standardowym pasku przycisk\u00f3w<\/li>\n<li>bie\u017c\u0105ce kryteria wyszukiwania i wyb\u00f3r u\u017cytkownika by\u0142y przesy\u0142ane jako parametry do aplikacji dzia\u0142aj\u0105cej w tle, a parametry te by\u0142y u\u017cywane w aplikacji dzia\u0142aj\u0105cej w tle do iteracji po wybranych obiektach<\/li>\n<\/ul>\n<div>Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale<em> Aplikacje dzia\u0142aj\u0105ce w tle<\/em>.<\/div>\n<h6 id=\"rejestrowanie-akcji\" ><span class=\"ez-toc-section\" id=\"Rejestrowanie_akcji\"><\/span>Rejestrowanie akcji<a id=\"PRL12\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">@Override\nprotected void postInit() {\n\u00a0 Action action1 = new Action(...);\n\u00a0 Action action2 = new Action(...);\n\u00a0 List&lt;Action&gt; actions = new ArrayList&lt;Action&gt;();\n\u00a0 actions.add(testBatch1Action);\n\u00a0 actions.add(testBatch2Action);\n\u00a0 setExecuteActions(actions);\n}<\/pre>\n<\/div>\n<h6 id=\"przekazanie-parametrow-do-aplikacji-dzialajacej-w-tle\" ><span class=\"ez-toc-section\" id=\"Przekazanie_parametrow_do_aplikacji_dzialajacej_w_tle\"><\/span>Przekazanie parametr\u00f3w do aplikacji dzia\u0142aj\u0105cej w tle<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">protected void performAction(Action action) {\n\u00a0 switch (action.getId());\n\u00a0 case ...\n\u00a0 \u00a0 CisBatchJob batch = ...\n\u00a0 \u00a0 CisParameterList params = getBatchApplicationParameters();\n\u00a0 \u00a0 batch.setParameters(params);\n\u00a0 \u00a0 :\n:\n}\n<\/pre>\n<\/div>\n<h6 id=\"zapytanie-resultset-w-aplikacji-dzialajacej-w-tle\" ><span class=\"ez-toc-section\" id=\"Zapytanie_ResultSet_w_aplikacji_dzialajacej_w_tle\"><\/span>Zapytanie ResultSet w aplikacji dzia\u0142aj\u0105cej w tle<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public CisParameterList run(int action, CisParameterList parms) {\n\u00a0 CisBatchJobSearchStatement stmt =\n\u00a0 \u00a0 \u00a0 om.getBatchJobSearchStatement(parms);\n\u00a0 CisResultSet rs = stmt.execute();\n\u00a0 int position = stmt.getResultPosition(\"bookGuid\");\n\u00a0 try {\n\u00a0 \u00a0 while (rs.next()) {\n\u00a0 \u00a0 \u00a0 byte[] guid = rs.getGuid(position);\n\u00a0 \u00a0 \u00a0 \u00a0 :\n\u00a0 \u00a0 }\n\u00a0 } catch (SQLException ex) {\n\u00a0 \u00a0 throw new RuntimeException(ex);\n\u00a0 } finally {\n\u00a0 \u00a0 rs.close();\n\u00a0 }\n:\n}<\/pre>\n<\/div>\n<h4 id=\"abstractordercockpit\" ><span class=\"ez-toc-section\" id=\"AbstractOrderCockpit\"><\/span>AbstractOrderCockpit<a id=\"PRL13\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Aplikacje typu <em>Lista<\/em> dla <em>dokument\u00f3w<\/em> (np. zam\u00f3wie\u0144, zapyta\u0144, faktur itp.) powinny u\u017cywa\u0107 tej klasy jako podstawy:<\/div>\n<div>com.cisag.app.general.cockpit.ui.AbstractOrderCockpit<\/div>\n<div>Klasa ta zapewnia specjalne wsparcie dla nast\u0119puj\u0105cych funkcji:<\/div>\n<ul>\n<li><strong>Baza i pozycje<\/strong><\/li>\n<li><strong>\u0141a\u0144cuch dokument\u00f3w powi\u0105zanych<\/strong><\/li>\n<li><strong>Uprawnienia (uprawnienia do tre\u015bci)<\/strong><\/li>\n<li><strong>Znacznik usuwania<\/strong><\/li>\n<li><strong>SearchContext<\/strong><\/li>\n<li><strong>Wyszukiwanie szczeg\u00f3\u0142owe<\/strong><\/li>\n<\/ul>\n<div>Przyk\u0142adami u\u017cycia tej klasy s\u0105 implementacje dla nast\u0119puj\u0105cych aplikacji typu <em>Lista:<\/em><\/div>\n<ul>\n<li><em>com.cisag.app.sales.cockpit.ui.CustomerProposalCockpitBase<\/em><\/li>\n<li><em>com.cisag.app.sales.cockpit.ui.CustomerProposalCockpitDetail<\/em><\/li>\n<li><em>com.cisag.app.purchasing.cockpit.ui.RequestForProposalCockpitBase<\/em><\/li>\n<\/ul>\n<h4 id=\"searchview\" ><span class=\"ez-toc-section\" id=\"SearchView\"><\/span>SearchView<a id=\"PRL14\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Klasa <em>com.cisag.pgm.search.gui.SearchView<\/em> mo\u017ce by\u0107 u\u017cywana do integracji funkcjonalno\u015bci aplikacji typu <em>Lista<\/em> jako komponentu w innych aplikacjach. Interfejs i u\u017cycie tej klasy s\u0105 por\u00f3wnywalne do klasy <em>CisCustomisableCockpit<\/em> z nast\u0119puj\u0105cymi r\u00f3\u017cnicami i rozszerzeniami:<\/div>\n<ul>\n<li>Klasa reprezentuje konkretn\u0105 klas\u0119, kt\u00f3ra mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywana bezpo\u015brednio, tj. bez wyprowadzania oddzielnej klasy. Derywacja jest konieczna tylko wtedy, gdy metody takie jak <em>preSearch()<\/em> maj\u0105 zosta\u0107 zmienione.<\/li>\n<li>Link do powi\u0105zanego obiektu deweloperskiego <em>Search<\/em> jest tworzony przez wywo\u0142anie tej metody: <em>init(String searchName)<\/em><\/li>\n<li>Do przypisania tytu\u0142u do komponentu mo\u017cna u\u017cy\u0107 nast\u0119puj\u0105cych metod: <em>setTitle(String)<\/em> i <em>setTitleFrom(&#8230;)<\/em><\/li>\n<li>Nale\u017cy u\u017cy\u0107 nast\u0119puj\u0105cej metody, aby okre\u015bli\u0107, czy komponent zapewnia zakres zapyta\u0144: <em>setAllowFilter(boolean)<\/em><\/li>\n<li>Szczeg\u00f3\u0142owe wyszukiwania nie s\u0105 oferowane<\/li>\n<li>Nast\u0119puj\u0105ca metoda mo\u017ce by\u0107 u\u017cyta do kontrolowania, gdzie przechowywane s\u0105 widoki (uk\u0142ady) zdefiniowane dla tego komponentu: <em>should.setStorageLocation(StorageLocation)<\/em><\/li>\n<li>Te warto\u015bci s\u0105 dost\u0119pne do wyboru:\n<ul>\n<li><em>StorageLocation.SEARCH &#8212;<\/em> jest warto\u015bci\u0105 domy\u015bln\u0105 i oznacza, \u017ce widoki s\u0105 zapisywane w odniesieniu do obiektu deweloperskiego <em>Search.<\/em> W tym przypadku zapisane widoki s\u0105 wsp\u00f3\u0142dzielone przez wszystkie aplikacje typu <em>Lista<\/em> i <em>SearchViews,<\/em> kt\u00f3re odnosz\u0105 si\u0119 do tego samego obiektu deweloperskiego <em>Search.<\/em><\/li>\n<li>StorageLocation.APPLICATION. &#8212; <em>SearchViews,<\/em> kt\u00f3re s\u0105 u\u017cywane jako edytor w aplikacji z konfigurowalnym interfejsem u\u017cytkownika, mog\u0105 alternatywnie u\u017cywa\u0107 warto\u015bci <em>StorageLocation.APPLICATION.<\/em> W takim przypadku widoki s\u0105 przechowywane jako cz\u0119\u015b\u0107 odpowiednich widok\u00f3w aplikacji i s\u0105 niezale\u017cne od innych zastosowa\u0144 obiektu deweloperskiego <em>Search.<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4 id=\"gridsearchsupport\" ><span class=\"ez-toc-section\" id=\"GridSearchSupport\"><\/span>GridSearchSupport<a id=\"PRL15\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Interfejs <em>com.cisag.pgm.search.gui.GridSearchSupport<\/em> umo\u017cliwia konfiguracj\u0119 wyszukiwania i odpytywanie wynik\u00f3w wyszukiwania i wyboru.<\/div>\n<h6 id=\"konfiguracja\" ><span class=\"ez-toc-section\" id=\"Konfiguracja\"><\/span>Konfiguracja<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 322px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getSearch()<\/em><\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Wyszukuje w pe\u0142ni kwalifikowan\u0105 nazw\u0119 bie\u017c\u0105cego wyszukiwania g\u0142\u00f3wnego.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>setSearch(String)<\/em><\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia ponown\u0105 inicjalizacj\u0119 z nowym wyszukiwaniem.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>addDetailSearch(&#8230;)<\/em><\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Dodaje kolejne wyszukiwanie szczeg\u00f3\u0142owe (patrz rozdzia\u0142 <a href=\"#PRL22\"><em>Wyszukiwanie szczeg\u00f3\u0142owe<\/em><\/a>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>addHeaderElement(VisualElement)<\/em><\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Dodaje <em>VisualElement<\/em> do paska narz\u0119dzi nad list\u0105 wynik\u00f3w.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getShowFilterPanel()<\/em><\/div>\n<div><em>setShowFilterPanel()<\/em><\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Okre\u015bla, czy wy\u015bwietlany jest nag\u0142\u00f3wek<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>isMultipleRowSelectionEnabled()<\/em><\/div>\n<div><em>setMultipleRowSelectionEnabled()<\/em><\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Okre\u015bla, czy dozwolony jest wielokrotny wyb\u00f3r. Ustawienie dotyczy tylko wyszukiwania g\u0142\u00f3wnego. Je\u015bli wyb\u00f3r wielokrotny jest w\u0142\u0105czony, na pocz\u0105tku ka\u017cdego wiersza wy\u015bwietlane jest pole wyboru, kt\u00f3rego u\u017cytkownik mo\u017ce u\u017cy\u0107 do wybrania poszczeg\u00f3lnych wierszy.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getAllowEditFilterExpression()<\/em><\/div>\n<div><em>setAllowEditFilterExpression()<\/em><\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Okre\u015bla, czy u\u017cytkownicy mog\u0105 zmienia\u0107 wyra\u017cenie filtru dla okre\u015blonej kolumny.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getDoubleClickAction()<\/em><\/div>\n<div><em>setDoubleClickAction()<\/em><\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia rejestracj\u0119 akcji, kt\u00f3ra jest wykonywana po dwukrotnym klikni\u0119ciu wiersza.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getRendererFactory()<\/em><\/div>\n<div><em>setRendererFactory()<\/em><\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia zmian\u0119 <em>RendererFactory<\/em> okre\u015blonego za pomoc\u0105 logicznego typu danych dla okre\u015blonej kolumny.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 32.9762%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>\n<div><em>getFilterExpressionEditorFactory()<\/em><\/div>\n<div><em>setFilterExpressionEditorFactory()<\/em><\/div>\n<\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia zmian\u0119 <em>FilterExpressionEditorFactory<\/em> okre\u015blonego za pomoc\u0105 logicznego typu danych dla okre\u015blonej kolumny.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 32.9762%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>\n<div><em>getSearchContextProvider()<\/em><\/div>\n<div><em>setSearchContextProvider()<\/em><\/div>\n<\/div>\n<\/td>\n<td style=\"width: 67.0238%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Umo\u017cliwia zmian\u0119 <em>SearchContextProvider<\/em> dla wyszukiwania.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"><em>SearchContextProvider<\/em> jest zwykle dostarczany przez aplikacj\u0119 (poprzez implementacj\u0119 tego interfejsu).<\/div><\/section>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<h6 id=\"filtrowanie\" ><span class=\"ez-toc-section\" id=\"Filtrowanie\"><\/span>Filtrowanie<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<table style=\"height: 208px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 34.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 65.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 34.1667%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getFilterExpression()<\/em><\/div>\n<div><em>setFilterExpression()<\/em><\/div>\n<\/td>\n<td style=\"width: 65.8333%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia odczyt lub ustawienie wyra\u017ce\u0144 filtruj\u0105cych dla okre\u015blonej kolumny.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 34.1667%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>getFilterExtension()<\/em><\/div>\n<div><em>setFilterExtension()<\/em><\/div>\n<\/td>\n<td style=\"width: 65.8333%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia odczyt lub ustawienie specjalnych rozszerze\u0144 filtr\u00f3w dla wyszukiwania g\u0142\u00f3wnego lub okre\u015blonego wyszukiwania szczeg\u00f3\u0142owego (patrz rozdzia\u0142 <a href=\"#PRL35\"><em>FilterExtension<\/em><\/a>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 34.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>resetFilter()<a id=\"PRL21\"><\/a><\/em><\/td>\n<td style=\"width: 65.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Resetuje wszystkie wyra\u017cenia filtra do warto\u015bci domy\u015blnych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Warto\u015bci domy\u015blne s\u0105 definiowane poprzez widok dla obszaru filtra. Ponadto metoda hook o tej samej nazwie jest wywo\u0142ywana w klasie <em>CisCustomisableCockpit,<\/em> kt\u00f3ra w razie potrzeby mo\u017ce wprowadzi\u0107 dalsze zmiany w wyra\u017ceniach filtra. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#PRL9\">CisCustomisableCockpit.<\/a><\/div><\/section><\/em><\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 34.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>\u00a0<\/div>\n<div><em>validateFilter()<\/em><\/div>\n<\/td>\n<td style=\"width: 65.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Sprawdza wszystkie wyra\u017cenia filtru pod k\u0105tem poprawno\u015bci sk\u0142adniowej.<\/p>\n<p><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Warto\u015bci domy\u015blne s\u0105 definiowane poprzez widok dla obszaru filtra. Ponadto metoda hook o tej samej nazwie jest wywo\u0142ywana w klasie <em>CisCustomisableCockpit,<\/em> kt\u00f3ra w razie potrzeby mo\u017ce wprowadzi\u0107 dalsze zmiany w wyra\u017ceniach filtra. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#PRL9\">CisCustomisableCockpit.<\/a><\/div><\/section><\/em><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 34.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>sendMessage(CisMessage, String&#8230;) <\/em><\/td>\n<td style=\"width: 65.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Umo\u017cliwia wysy\u0142anie wiadomo\u015bci dla jednej lub wi\u0119cej kolumn. Tej metody nale\u017cy u\u017cy\u0107, je\u015bli maj\u0105 by\u0107 wysy\u0142ane komunikaty z niestandardowej implementacji funkcji <em>validateFilter().<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<h6 id=\"wynik-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Wynik_wyszukiwania\"><\/span>Wynik wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<table style=\"height: 209px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.3571%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 64.6429%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.3571%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>clearResult()<\/em><\/td>\n<td style=\"width: 64.6429%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Usuwa list\u0119 wynik\u00f3w.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.3571%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getRowCount()<\/em><\/td>\n<td style=\"width: 64.6429%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Zwraca liczb\u0119 znalezionych obiekt\u00f3w (tylko wyszukiwanie g\u0142\u00f3wne).<\/td>\n<\/tr>\n<tr style=\"height: 140px;\">\n<td style=\"width: 35.3571%; height: 140px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getBatchApplicationParameters()<\/em><\/td>\n<td style=\"width: 64.6429%; height: 140px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Zwraca obiekty, kt\u00f3re musz\u0105 zosta\u0107 przekazane do przetwarzania w tle.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Klasa <em>CisCustomisableCockpit<\/em> wywo\u0142uje t\u0119 metod\u0119 wewn\u0119trznie i zwraca ten sam wynik. Zobacz ten rozdzia\u0142: <em><a href=\"#PRL9\">CisCustomisableCockpit<\/a>.<\/em> <\/div><\/section><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h6 id=\"wybor\" ><span class=\"ez-toc-section\" id=\"Wybor\"><\/span>Wyb\u00f3r<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<table style=\"height: 523px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 64.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>clearSelection()<\/em><\/td>\n<td style=\"width: 64.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Resetuje bie\u017c\u0105cy wyb\u00f3r.<\/td>\n<\/tr>\n<tr style=\"height: 174px;\">\n<td style=\"width: 35.8333%; height: 174px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>selectAll()<\/em><\/td>\n<td style=\"width: 64.1667%; height: 174px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Wybiera wszystkie wy\u015bwietlane obiekty g\u0142\u00f3wnego wyszukiwania.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli wielokrotny wyb\u00f3r nie jest dozwolony, metoda nie ma \u017cadnego efektu.<\/div><\/section>\n<div>\u00a0<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 35.8333%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getFocusedDetailSearch()\u00a0<\/em><\/td>\n<td style=\"width: 64.1667%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Zwraca nazw\u0119 (alias) wyszukiwania szczeg\u00f3\u0142owego, kt\u00f3re nale\u017cy do aktualnie zogniskowanego wiersza. Metoda zwraca warto\u015b\u0107 null, je\u015bli fokus znajduje si\u0119 w g\u0142\u00f3wnym wyszukiwaniu.<\/td>\n<\/tr>\n<tr style=\"height: 187px;\">\n<td style=\"width: 35.8333%; height: 187px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getFocusedRowData(String&#8230;)<\/em><\/td>\n<td style=\"width: 64.1667%; height: 187px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Zwraca warto\u015bci okre\u015blonych kolumn dla aktualnie zogniskowanego wiersza.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Okre\u015blone kolumny musz\u0105 by\u0107 zgodne z aktualnie skoncentrowanym wyszukiwaniem (patrz: getFocusedDetailSearch()) i by\u0107 oznaczone jako <em>Klucz zwrotu<\/em> w obiekcie deweloperskim <em>Search<\/em> (patrz rozdzia\u0142 <a href=\"#PRL19\"><em>Pole wyboru: Klucz zwrotu<\/em><\/a>).<\/div><\/section><\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><em>getSelectedRowCount()<\/em><\/div>\n<\/td>\n<td style=\"width: 64.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Zwraca liczb\u0119 aktualnie wybranych obiekt\u00f3w.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Wyb\u00f3r zawsze odnosi si\u0119 do g\u0142\u00f3wnego wyszukiwania. Je\u015bli wielokrotny wyb\u00f3r nie jest dozwolony dla g\u0142\u00f3wnego wyszukiwania, wyb\u00f3r zawsze odpowiada aktualnie zogniskowanemu wierszowi.<\/div><\/section>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 35.8333%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>getSelectedRowData(String&#8230;) <\/em><\/td>\n<td style=\"width: 64.1667%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p>Zwraca warto\u015bci okre\u015blonych kolumn dla aktualnie wybranych wierszy.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Wyb\u00f3r zawsze odnosi si\u0119 do g\u0142\u00f3wnego wyszukiwania. Okre\u015blone kolumny musz\u0105 by\u0107 oznaczone jako <em>Klucz zwrotu<\/em> w obiekcie deweloperskim <em>Search<\/em> (patrz rozdzia\u0142 <a href=\"#PRL19\"><em>Pole wyboru: Klucz zwrotu<\/em><\/a>).<\/div><\/section>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dla wszystkich metod klasy <em>GridSearchSupport,<\/em> kt\u00f3re oczekuj\u0105 nazwy kolumny jako parametru, nazwa kolumny musi zosta\u0107 rozszerzona o prefiks wyszukiwania szczeg\u00f3\u0142owego, je\u015bli nazwa kolumny odnosi si\u0119 do wyszukiwania szczeg\u00f3\u0142owego. Przyk\u0142ad: detail:guid<\/div><\/section><\/div>\n<h5 id=\"filtrowanie-obiektow\" ><span class=\"ez-toc-section\" id=\"Filtrowanie_obiektow\"><\/span>Filtrowanie obiekt\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Obiekty mog\u0105 by\u0107 filtrowane zar\u00f3wno przez u\u017cytkownika, jak i przez aplikacj\u0119. Kolumny, kt\u00f3re maj\u0105 by\u0107 u\u017cywane wy\u0142\u0105cznie przez aplikacj\u0119 do filtrowania, musz\u0105 by\u0107 oznaczone jako<em> Zaprogramowane filtry<\/em> w wyszukiwaniu (patrz rozdzia\u0142 <a href=\"#PRL20\"><em>Pole wyboru: Zaprogramowany filtr<\/em><\/a>).<\/div>\n<h6 id=\"wartosci-domyslne\" ><span class=\"ez-toc-section\" id=\"Wartosci_domyslne\"><\/span>Warto\u015bci domy\u015blne<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Je\u015bli to mo\u017cliwe, warto\u015bci domy\u015blne dla filtr\u00f3w powinny by\u0107 zawsze definiowane i zapisywane za po\u015brednictwem nag\u0142\u00f3wka, a nie programowane w aplikacji, poniewa\u017c zaprogramowane warto\u015bci domy\u015blne mog\u0105 kolidowa\u0107 z nag\u0142\u00f3wkami i wzorcami zdefiniowanymi przez u\u017cytkownika. Aplikacja nie powinna zmienia\u0107 istniej\u0105cych warto\u015bci domy\u015blnych.<\/div>\n<h6 id=\"przyklad\" ><span class=\"ez-toc-section\" id=\"Przyklad\"><\/span>Przyk\u0142ad<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">@Overwrite\nprotected void resetFilter() {\n\u00a0 \/\/ Inicjalizacja z zapisanymi warto\u015bciami\n\u00a0 super.resetFilter();\n\u00a0 GridSearchSupport gss = getGridSearchSupport();\n\u00a0 \/\/ Nie zmieniaj ju\u017c zdefiniowanych warto\u015bci\n\u00a0 if (gss.getFilterExpression(\"partnerNumber\") == null) {\n\u00a0 \u00a0 gss.setFilterExpression(\"partnerNumber\",\n\u00a0 \u00a0 \u00a0 \u00a0 StringFilterExpressionList.create(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"com.cisag.app.edu:CockpitEmployeeNumber.lt\", \"A*\");\n\u00a0 }\n}<\/pre>\n<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Warto\u015bci domy\u015blne powinny by\u0107 zawsze ustawiane za pomoc\u0105 metody <em>resetFilter<\/em> klasy <em>CisCustomizableCockpit<\/em> lub <em>SearchView,<\/em> aby u\u017cytkownicy mogli je rozpozna\u0107 jako takie i zmieni\u0107 warto\u015bci domy\u015blne (patrz metoda <a href=\"#PRL21\"><em>resetFilter()<\/em><\/a>).<\/div>\n<div>Zalecane jest r\u00f3wnie\u017c zapisanie nag\u0142\u00f3wka z obiektem deweloperskim <em>Search,<\/em> kt\u00f3ry zawiera odpowiednie warto\u015bci domy\u015blne. Warto\u015bci domy\u015blne powinny by\u0107 u\u017cyteczne dla u\u017cytkownika i powodowa\u0107 jak najmniejsze wykorzystanie bazy danych.<\/div><\/section><\/div>\n<h6 id=\"manipulowanie-zapytaniem-do-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Manipulowanie_zapytaniem_do_bazy_danych\"><\/span>Manipulowanie zapytaniem do bazy danych<a id=\"PRL36\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Spe\u0142nienie pewnych wymaga\u0144 wymaga ukierunkowanej manipulacji zapytaniem do bazy danych. Wymagania te obejmuj\u0105 np. egzekwowanie uprawnie\u0144 lub wyszukiwanie wyra\u017cenia w kilku kolumnach <em>(Po\u0142\u0105czenie OR).<\/em><\/div>\n<div>W prostych przypadkach takie wymagania mo\u017cna ju\u017c rozwi\u0105za\u0107 za pomoc\u0105 kolumn oznaczonych jako <em>Zaprogramowane filtry<\/em> (patrz rozdzia\u0142 <a href=\"#PRL20\"><em>Pole wyboru: Zaprogramowany filtr<\/em><\/a>). Wyra\u017cenie filtru mo\u017cna r\u00f3wnie\u017c zdefiniowa\u0107 w celu wdro\u017cenia bardziej z\u0142o\u017conych wymaga\u0144 (patrz sekcja <em><a href=\"#PRL35\">FilterExtension<\/a>).<\/em><\/div>\n<div>Podczas ustawiania zaprogramowanych filtr\u00f3w lub <em>FilterExtension<\/em> wa\u017cne jest, kiedy dostarczany jest ko\u0144cowy wynik zapytania do bazy danych. Aplikacje maj\u0105 nast\u0119puj\u0105ce mo\u017cliwo\u015bci manipulowania zapytaniem do bazy danych we w\u0142a\u015bciwym czasie:<\/div>\n<ul>\n<li>Zmiana metody <em>preSearch()<\/em> klasy <em>CisCustomisableCockpit<\/em> (lub <em>SearchView)<\/em><\/li>\n<li>Implementacja <em>SearchHook<\/em><\/li>\n<\/ul>\n<div>Implementacja <em>SearchHook<\/em>\u00a0ma t\u0119 zalet\u0119, \u017ce funkcjonalno\u015b\u0107 w niej zlecona dotyczy wszystkich u\u017cytkownik\u00f3w obiektu deweloperskiego <em>Search.<\/em><\/div>\n<h5 id=\"wyszukiwanie-szczegolowe\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_szczegolowe-2\"><\/span>Wyszukiwanie szczeg\u00f3\u0142owe<a id=\"PRL22\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Dowolna liczba wyszukiwa\u0144 szczeg\u00f3\u0142owych mo\u017ce by\u0107 powi\u0105zana z wyszukiwaniem g\u0142\u00f3wnym, a dowolna liczba innych wyszukiwa\u0144 szczeg\u00f3\u0142owych mo\u017ce by\u0107 powi\u0105zana z ka\u017cdym wyszukiwaniem szczeg\u00f3\u0142owym. Ten typ po\u0142\u0105czenia mo\u017ce by\u0107 kontynuowany na dowolnej liczbie poziom\u00f3w.<\/div>\n<div>W praktyce jednak ca\u0142kowita liczba szczeg\u00f3\u0142owych wyszukiwa\u0144 nie powinna przekracza\u0107 pi\u0119ciu, poniewa\u017c ka\u017cde szczeg\u00f3\u0142owe wyszukiwanie wymaga dodatkowego miejsca w nag\u0142\u00f3wku i obszarze roboczym aplikacji typu <em>Lista.<\/em> Co wi\u0119cej, ka\u017cde wyszukiwanie szczeg\u00f3\u0142owe dodatkowo obci\u0105\u017ca baz\u0119 danych, poniewa\u017c w przypadku wyszukiwania szczeg\u00f3\u0142owego nale\u017cy wykona\u0107 dodatkowe zapytanie do bazy danych dla ka\u017cdego obiektu w wyszukiwaniu wy\u017cszego poziomu. Wyszukiwanie g\u0142\u00f3wne z tylko jednym wyszukiwaniem szczeg\u00f3\u0142owym wymaga zatem ju\u017c <em>1+N<\/em> zapyta\u0144 do bazy danych, gdzie <em>N<\/em> to liczba znalezionych obiekt\u00f3w. Wyszukiwanie g\u0142\u00f3wne z <em>M<\/em> r\u00f3wnoleg\u0142ymi wyszukiwaniami szczeg\u00f3\u0142owymi wymaga zatem<em> 1+NM<\/em> zapyta\u0144 do bazy danych. Liczba zapyta\u0144 do bazy danych wzrasta jeszcze bardziej w przypadku zagnie\u017cd\u017conych wyszukiwa\u0144 szczeg\u00f3\u0142owych. Nale\u017cy zatem unika\u0107 stosowania wi\u0119cej ni\u017c jednego poziomu szczeg\u00f3\u0142owo\u015bci.<\/div>\n<div>Zapytanie do bazy danych i zestaw kolumn wyszukiwania szczeg\u00f3\u0142owego s\u0105 definiowane za pomoc\u0105 oddzielnych obiekt\u00f3w deweloperskich typu <em>Search.<\/em> Po\u0142\u0105czenie mi\u0119dzy wyszukiwaniem g\u0142\u00f3wnym a wyszukiwaniem szczeg\u00f3\u0142owym jest tworzone za pomoc\u0105 metody <em>addDetailSearch()<\/em> klasy <em>GridSearchSupport:<\/em><\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">GridSearchSupport.addDetailSearch(\n String parent, \/\/ tylko dla wyszukiwania szczeg\u00f3\u0142owego\n String alias,\n String searchName,\n Action action,\n String[] parentColumnNames,\n String[] detailColumnNames)<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Parametr<\/strong><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>parent <\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Alias wyszukiwania <em>parent<\/em> musi by\u0107 zawsze okre\u015blony jako nadrz\u0119dny. Je\u015bli wyszukiwanie szczeg\u00f3\u0142owe jest po\u0142\u0105czone bezpo\u015brednio z wyszukiwaniem g\u0142\u00f3wnym, nale\u017cy u\u017cy\u0107 warto\u015bci null dla <em>parent.<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>alias <\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Unikalny alias musi by\u0107 przypisany do ka\u017cdego dodanego wyszukiwania szczeg\u00f3\u0142owego.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>searchName <\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">W pe\u0142ni kwalifikowana nazwa powi\u0105zanego obiektu deweloperskiego <em>Search<\/em> musi by\u0107 wprowadzona jako <em>searchName.<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>action <\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Jako akcj\u0119 nale\u017cy przekaza\u0107 instancj\u0119 <em>com.cisag.pgm.gui.Action<\/em>, kt\u00f3ra zapewnia tekst dla przycisku do pokazywania i ukrywania wyszukiwania szczeg\u00f3\u0142owego.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>parentColumnNames<\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Jako <em>parentColumnNames<\/em> nale\u017cy przekaza\u0107 tablic\u0119 z nazwami kolumn z wyszukiwania nadrz\u0119dnego, za po\u015brednictwem kt\u00f3rych ma zosta\u0107 utworzone \u0142\u0105cze do wyszukiwania szczeg\u00f3\u0142owego. Okre\u015blone kolumny musz\u0105 by\u0107 oznaczone jako <em>klucz zwrotu<\/em> w wyszukiwaniu nadrz\u0119dnym (patrz rozdzia\u0142 <a href=\"#PRL19\"><em>Pole wyboru: Klucz zwrotu<\/em><\/a>).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 34.4048%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>detailColumnNames<\/em><\/td>\n<td style=\"width: 65.5952%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Tablica z nazwami kolumn z wyszukiwania szczeg\u00f3\u0142owego ma zosta\u0107 przekazana jako <em>detailColumnNames,<\/em> za po\u015brednictwem kt\u00f3rej ma nast\u0105pi\u0107 po\u0142\u0105czenie z wyszukiwaniem nadrz\u0119dnym. Okre\u015blone kolumny musz\u0105 by\u0107 oznaczone jako klucz zwrotu w wyszukiwaniu szczeg\u00f3\u0142owym (patrz rozdzia\u0142 <a href=\"#PRL19\"><em>Pole wyboru: Klucz zwrotu<\/em><\/a>). Ponadto, okre\u015blone kolumny musz\u0105 by\u0107 oznaczone jako mo\u017cliwe do filtrowania w wyszukiwaniu szczeg\u00f3\u0142owym (patrz ten rozdzia\u0142: Pole wyboru: <a href=\"#PRL23\">Mo\u017cliwo\u015b\u0107 filtrowania<\/a>), a tak\u017ce powinny by\u0107 oznaczone jako <em>Zaprogramowane filtry<\/em> (patrz rozdzia\u0142 <a href=\"#PRL20\"><em>Pole wyboru: Zaprogramowany filtr<\/em><\/a>)<\/div>\n<div>Liczba i typy danych okre\u015blonych kolumn musz\u0105 by\u0107 zgodne z liczb\u0105 i typami danych kolumn okre\u015blonych w <em>parentColumnNames.<\/em><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<h6 id=\"przyklad\" ><span class=\"ez-toc-section\" id=\"Przyklad-2\"><\/span>Przyk\u0142ad<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Poni\u017cszy przyk\u0142ad przedstawia wyszukiwanie g\u0142\u00f3wne, kt\u00f3re jest powi\u0105zane z wyszukiwaniem szczeg\u00f3\u0142owym. To szczeg\u00f3\u0142owe wyszukiwanie jest nast\u0119pnie powi\u0105zane z innym szczeg\u00f3\u0142owym wyszukiwaniem.<\/div>\n<div>\u00a0<\/div>\n<div>Wyszukiwanie g\u0142\u00f3wne (com.example.search.Main):<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Nazwa<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Wy\u015bwietlanie<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Zaprogramowany filtr<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Mo\u017cliwo\u015b\u0107 filtrowania<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Klucz zwrotu<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>guid <\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>M:guid<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>code<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>M:name<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em> M:description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>Wyszukiwanie szczeg\u00f3\u0142owe 1 (com.example.search.Detail):<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Nazwa<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Wy\u015bwietlanie<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Zaprogramowany filtr<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Mo\u017cliwo\u015b\u0107 filtrowania<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Klucz zwrotu<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>guid <\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>D:guid<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>parent<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>D:parent<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\"><em>code<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\"><em>D:name<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em> D:description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>Wyszukiwanie szczeg\u00f3\u0142owe 2 (com.example.search.Subdetail):<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Nazwa<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Wy\u015bwietlanie<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Zaprogramowany filtr<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Mo\u017cliwo\u015b\u0107 filtrowania<\/strong><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Klucz zwrotu<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>guid <\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>S:guid<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>parent<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>S:parent<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">X<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\"><em>code<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\"><em>S:name<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>S:description<\/em><\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<td style=\"width: 20%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\u00a0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>Kod:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Action a1 = new Action(0, \"com.example.search.DetailAction1\");\nAction a2 = new Action(0, \"com.example.search.DetailAction2\");\nString[] parentColumnNames = {\"guid\"};\nString[] detailColumnNames = {\"parent\"};\nGridSearchSupport gss = getGridSearchSupport();\ngss.addDetailSearch(null, \"D1\",\n \"com.example.search.Detail\", a1,\n parentColumnNames, detailColumnNames);\ngss.addDetailSearch(\"D1\", \"D2\",\n \"com.example.search.Subdetail\", a2,\n parentColumnNames, detailColumnNames); <\/pre>\n<\/div>\n<h4 id=\"format\" ><span class=\"ez-toc-section\" id=\"Format\"><\/span>Format<a id=\"PRL25\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Klasa abstrakcyjna <em>java.text.Format<\/em> jest u\u017cywana do konwersji obiekt\u00f3w na (ewentualnie specyficzn\u0105 dla j\u0119zyka i regionu) reprezentacj\u0119 tekstow\u0105 (formatowanie) oraz do konwersji takich tekst\u00f3w z powrotem na obiekty (parsowanie). Konkretne podklasy musz\u0105 implementowa\u0107 co najmniej dwie poni\u017csze metody:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public StringBuffer format(Object obj, StringBuffer toAppendTo,\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0FieldPosition pos);\npublic Object parseObject(String source, ParsePosition pos);<\/pre>\n<\/div>\n<div>Infrastruktura aplikacji typu <em>Lista<\/em> wykorzystuje podklasy klasy <em>Format<\/em> do wizualizacji danych w obszarze wy\u015bwietlania, do eksportu (PDF\/MS Excel), a tak\u017ce dla niekt\u00f3rych <em>FilterExpressionEditors.<\/em> Klasa <em>FormatFactory<\/em> jest odpowiedzialna za tworzenie instancji formatu, kt\u00f3rych implementacja musi by\u0107 zarejestrowana w opisie danych odpowiedniej kolumny (patrz sekcja <em><a href=\"#PRL24\">FormatFactory<\/a>).<\/em><\/div>\n<div>Niemniej jednak, implementacje oparte na formatach nie s\u0105 generalnie u\u017cywane dla wszystkich typ\u00f3w danych, ale tylko wtedy, gdy reprezentacja tekstowa jest u\u017cyteczna i po\u017c\u0105dana dla danego typu danych. W przeciwnym razie u\u017cywane s\u0105 renderery lub bardziej wyspecjalizowane edytory <em>FilterExpressionEditors. Factory<\/em> przechowywane dla logicznego typu danych decyduj\u0105, kt\u00f3ra implementacja jest u\u017cywana dla kolumny.<\/div>\n<h5 id=\"formatfactory\" ><span class=\"ez-toc-section\" id=\"FormatFactory\"><\/span>FormatFactory<a id=\"PRL24\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Instancje klasy <em>Format<\/em> s\u0105 tworzone przez infrastruktur\u0119 aplikacj\u0119 typu <em>Lista<\/em> przy u\u017cyciu specjalnych<em> Klas Factory<\/em>. <em>Klasy Factory<\/em> musz\u0105 implementowa\u0107 interfejs <em>com.cisag.pgm.gui.FormatFactory<\/em> i posiada\u0107 domy\u015blny konstruktor. Interfejs definiuje nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public Format createFormat(DataDescription dataDescription);\n<\/pre>\n<p><span style=\"color: initial;\">Konkretne klasy implementuj\u0105ce ten interfejs powinny wykorzystywa\u0107 informacje z przekazanego <em>Data description<\/em> do parametryzacji tworzonej instancji klas <em>Format.<\/em><\/span><\/p>\n<\/div>\n<div><em>FormatFactory<\/em> jest rejestrowany poprzez wprowadzenie jego w pe\u0142ni kwalifikowanej nazwy klasy w opisie danych dla logicznego typu danych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Nie tylko <em>FormatFactory,<\/em> ale tak\u017ce <em>RendererFactory<\/em> mo\u017ce by\u0107 zarejestrowany dla logicznego typu danych (lub<em> Data description<\/em>) (patrz rozdzia\u0142 <em><a href=\"#PRL26\">RendererFactor<\/a>y<\/em>)<em>.<\/em> Je\u015bli zar\u00f3wno <em>FormatFactory,<\/em> jak i <em>RendererFactory<\/em> zosta\u0142y zarejestrowane dla logicznego typu danych, <em>FormatFactory<\/em> jest ignorowany. Dotyczy to r\u00f3wnie\u017c sytuacji, gdy fabryki zosta\u0142y zarejestrowane na r\u00f3\u017cnych poziomach hierarchii.<\/div><\/section><\/div>\n<h5 id=\"formatfactoryregistry\" ><span class=\"ez-toc-section\" id=\"FormatFactoryRegistry\"><\/span>FormatFactoryRegistry<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.gui.FormatFactoryRegistry<\/em> mo\u017ce by\u0107 u\u017cywana do tworzenia odpowiednich instancji <em>Format<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL25\">Format)<\/a><\/em> lub <em>FormatFactory<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL24\">FormatFactory<\/a>)<\/em> dla logicznego typu danych. Logiczny typ danych mo\u017cna okre\u015bli\u0107 za pomoc\u0105 w pe\u0142ni kwalifikowanej \u015bcie\u017cki lub identyfikatora GUID. Podczas rozwi\u0105zywania klasa przeszukuje \u0142a\u0144cuch dziedziczenia logicznego typu danych a\u017c do g\u0142\u00f3wnego typu danych. Pierwszy znaleziony <em>FormatFactory<\/em> jest zwracany i u\u017cywany do utworzenia instancji formatu. Je\u015bli nie ma rejestru dla logicznego typu danych, zwracane jest zero.<\/div>\n<div><em>FormatFactory<\/em> dla prawie wszystkich prymitywnych typ\u00f3w danych oraz dla wszystkich warto\u015bci czasu i daty s\u0105 zarejestrowane w <em>FormatFactoryRegistry.<\/em><\/div>\n<div>FormatFactoryRegistry jest u\u017cywany w szczeg\u00f3lno\u015bci przez sam\u0105 infrastruktur\u0119 aplikacji typu <em>Lista.<\/em> Mo\u017cna go r\u00f3wnie\u017c wykorzysta\u0107 np. do ponownego u\u017cycia istniej\u0105cej implementacji w oddzielnej <em>FormatFactory<\/em> (delegacja).<\/div>\n<h5 id=\"kolumny-wirtualne\" ><span class=\"ez-toc-section\" id=\"Kolumny_wirtualne\"><\/span>Kolumny wirtualne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W przypadku kolumn wirtualnych (patrz rozdzia\u0142 <a href=\"#PRL7\"><em>Pole wyboru: Wirtualnie<\/em><\/a>), warto\u015bci atrybut\u00f3w s\u0105 przekazywane do formatyzatora jako <em>java.util.Map,<\/em> przy czym wzgl\u0119dne nazwy podatrybut\u00f3w s\u0105 u\u017cywane jako klucze.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Wirtualna kolumna o nazwie <em>vattr<\/em> ma dwa podatrybuty <em>vattr.attr1<\/em> i <em>vattr.attr2,<\/em> a wszystkie atrybuty s\u0105 oznaczone jako mo\u017cliwe do wy\u015bwietlenia. W formatterze warto\u015bci tych atrybut\u00f3w podrz\u0119dnych powinny by\u0107 dost\u0119pne w nast\u0119puj\u0105cy spos\u00f3b:<\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public public StringBuffer format(Object value,\n\u00a0 \u00a0 StringBuffer toAppendTo, FieldPosition pos) {\n\u00a0 if (value instanceof Map) {\n\u00a0 \u00a0 Map values = (Map) value;\n\u00a0 \u00a0 Object attr1 = values.get(\"attr1\");\n\u00a0 \u00a0 Object attr2 = values.get(\"attr2\");\n\u00a0 \u00a0 ...\n\u00a0 }\n\u00a0 return toAppendTo;\n}\n<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><em><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Map<\/em> zawiera tylko podatrybuty oznaczone jako mo\u017cliwe do wy\u015bwietlenia. Warto\u015bci atrybut\u00f3w mog\u0105 r\u00f3wnie\u017c wynosi\u0107 <em>null.<\/div><\/section><\/em><\/div>\n<h4 id=\"renderer\" ><span class=\"ez-toc-section\" id=\"Renderer\"><\/span>Renderer<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Je\u015bli wizualizacja jako tekst nie jest wystarczaj\u0105ca lub klasa <em>Format<\/em> nie mo\u017ce by\u0107 u\u017cyta z innych powod\u00f3w, mo\u017cna zaimplementowa\u0107 specjalny <em>Renderer.<\/em> W przeciwie\u0144stwie do klasy <em>Format,<\/em> renderery mog\u0105 by\u0107 u\u017cywane do tworzenia nie tylko reprezentacji tekstowych, ale tak\u017ce ikon, podpowiedzi, link\u00f3w <em>(URI)<\/em> i instancji klasy <em>VisualElement.<\/em> Ka\u017cdy z tych typ\u00f3w wizualizacji opiera si\u0119 na w\u0142asnym interfejsie. Konkretne implementacje renderera mog\u0105 r\u00f3wnie\u017c \u0142\u0105czy\u0107 te interfejsy, je\u015bli jest to wymagane (np. <em>IconRenderer<\/em> w po\u0142\u0105czeniu z <em>ToolTipRenderer).<\/em><\/div>\n<div>Klasa <em>RendererFactory<\/em> (patrz rozdzia\u0142: <em><a href=\"#PRL26\">RendererFactory<\/a>)<\/em> jest odpowiedzialna za tworzenie instancji renderera, kt\u00f3rych implementacja musi by\u0107 zarejestrowana w opisie danych odpowiedniej kolumny.<\/div>\n<h5 id=\"rendererfactory\" ><span class=\"ez-toc-section\" id=\"RendererFactory\"><\/span>RendererFactory<a id=\"PRL26\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Instancje renderer\u00f3w s\u0105 zawsze tworzone przez infrastruktur\u0119 aplikacji typu <em>Lista<\/em> za po\u015brednictwem specjalnych Klas <em>Factory.<\/em> Klasy <em>Factory<\/em> musz\u0105 implementowa\u0107 interfejs <em>com.cisag.pgm.gui.RendererFactory<\/em> i posiada\u0107 domy\u015blny konstruktor. Interfejs definiuje nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public Renderer createRenderer(byte[] guid,\n\u00a0 \u00a0 DataDescription dataDescription)\n<\/pre>\n<p><span style=\"color: initial;\">Konkretne klasy implementuj\u0105ce ten interfejs powinny wykorzystywa\u0107 informacje z przekazanego<em> Data description<\/em> do parametryzacji tworzonej instancji <em>Renderera.<\/em><\/span><\/p>\n<\/div>\n<div><em>RendererFactory<\/em> jest rejestrowany poprzez wprowadzenie jego w pe\u0142ni kwalifikowanej nazwy klasy w opisie danych dla logicznego typu danych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dla logicznego typu danych (lub <em>Data description<\/em>) mo\u017cna zarejestrowa\u0107 nie tylko <em>RenderFactory,<\/em> ale tak\u017ce <em>FormatFactory<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL24\">FormatFactory<\/a><\/em>). Je\u015bli zar\u00f3wno <em>RendererFactory,<\/em> jak i FormatFactory zosta\u0142y zarejestrowane dla logicznego typu danych, <em>FormatFactory<\/em> jest ignorowany. Dotyczy to r\u00f3wnie\u017c sytuacji, gdy <em>Factory<\/em> zosta\u0142y zarejestrowane na r\u00f3\u017cnych poziomach hierarchii.<\/div><\/section><\/div>\n<h5 id=\"rendererfactoryregistry\" ><span class=\"ez-toc-section\" id=\"RendererFactoryRegistry\"><\/span>RendererFactoryRegistry<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.gui.RendererFactoryRegistry<\/em> mo\u017ce by\u0107 u\u017cywana do tworzenia odpowiednich instancji <em>RendererFactory<\/em> dla logicznego typu danych. Podczas rozwi\u0105zywania, klasa przeszukuje \u0142a\u0144cuch dziedziczenia logicznego typu danych a\u017c do g\u0142\u00f3wnego typu danych. Zwracany jest pierwszy znaleziony <em>RendererFactory.<\/em> Je\u015bli nie ma rejestracji dla logicznego typu danych, zwracane jest zero.<\/div>\n<div>Specjalne <em>RendererFactory<\/em> dla podstawowego typu danych <em>Boolean,<\/em> znacznika usuwania (<em>com.cisag.pgm.datatype.DeleteState<\/em>) i <em>User-GUID<\/em> s\u0105 zarejestrowane w <em>RendererFactoryRegistry.<\/em><\/div>\n<div><em>RendererFactoryRegistry<\/em> jest u\u017cywany w szczeg\u00f3lno\u015bci przez sam\u0105 infrastruktur\u0119 aplikacji typu <em>Lista.<\/em> Mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywany, np. do ponownego wykorzystania istniej\u0105cej implementacji w oddzielnej <em>RendererFactory <\/em>(delegacja).<\/div>\n<h5 id=\"textrenderer\" ><span class=\"ez-toc-section\" id=\"TextRenderer\"><\/span>TextRenderer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Podobnie jak klasa <em>Format,<\/em> interfejs <em>com.cisag.pgm.gui.Renderer.TextRenderer<\/em> umo\u017cliwia konwersj\u0119 obiektu na reprezentacj\u0119 tekstow\u0105. Je\u015bli wystarczaj\u0105ca jest czysta reprezentacja tekstowa, mo\u017cna r\u00f3wnie\u017c zaimplementowa\u0107 odpowiedni\u0105 klas\u0119 formatu zamiast <em>TextRenderer.<\/em><\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public String getText(Object value);<\/pre>\n<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class SimpleTextRendererFactory\n\u00a0 \u00a0 implementuje RendererFactory {\n\u00a0 public Renderer createRenderer(byte[] guid,\n\u00a0 \u00a0 \u00a0 DataDescription dataDescription) {\n\u00a0 \u00a0 return new SimpleTextRenderer();\n\u00a0 }\n\u00a0 private class SimpleTextRenderer\n\u00a0 \u00a0 \u00a0 implementuje Renderer.TextRenderer {\n\u00a0 \u00a0 public String getText(Object value) {\n\u00a0 \u00a0 \u00a0 if (value != null) {\n\u00a0 \u00a0 \u00a0 \u00a0 return String.valueOf(value);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 return null;\n\u00a0 \u00a0 }\n\u00a0 }\n}<br \/><br \/><\/div><\/section><\/pre>\n<\/div>\n<h5 id=\"iconrenderer\" ><span class=\"ez-toc-section\" id=\"IconRenderer\"><\/span>IconRenderer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Interfejs <em>com.cisag.pgm.gui.Renderer.IconRenderer<\/em> umo\u017cliwia konwersj\u0119 obiektu na instancj\u0119 <em>com.cisag.pgm.gui.Icon.<\/em><\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public Icon getIcon(Object value);<\/pre>\n<p><span style=\"color: initial;\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/span><\/p>\n<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class DocumentKindRendererFactory\n\u00a0 \u00a0 implementuje RendererFactory {\n\u00a0 private final Icon iconDocument = Icon.getIcon(...);\n\u00a0 private final Icon iconNote = Icon.getIcon(...);\n\u00a0 public Renderer createRenderer(byte[] guid,\n\u00a0 \u00a0 \u00a0 DataDescription dataDescription) {\n\u00a0 \u00a0 return new DocumentKindRenderer();\n\u00a0 }\n\u00a0 private class DocumentKindRenderer\n\u00a0 \u00a0 \u00a0 implementuje Renderer.IconRenderer {\n\u00a0 \u00a0 public Icon getIcon(Object value) {\n\u00a0 \u00a0 \u00a0 if (value != null) {\n\u00a0 \u00a0 \u00a0 \u00a0 switch ((Short) value) {\n\u00a0 \u00a0 \u00a0 \u00a0 case DocumentKinds.DOCUMENT:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return iconDocument;\n\u00a0 \u00a0 \u00a0 \u00a0 case DocumentKinds.NOTE:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return iconNote;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 return null;\n\u00a0 \u00a0 }\n\u00a0 }\n}<br \/><br \/><\/div><\/section><\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Reprezentacja tekstowa jest r\u00f3wnie\u017c wymagana dla ka\u017cdej kolumny w celu wy\u015bwietlenia nag\u0142\u00f3wk\u00f3w grup i eksportu. <em>IconRenderer<\/em> powinien by\u0107 zatem po\u0142\u0105czony z <em>ToolTipRenderer<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL27\">ToolTipRenderer<\/a>).<\/div><\/section><\/em><\/div>\n<h5 id=\"layerediconrenderer\" ><span class=\"ez-toc-section\" id=\"LayeredIconRenderer\"><\/span>LayeredIconRenderer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Interfejs <em>com.cisag.pgm.gui.Renderer.LayeredIconRenderer<\/em> umo\u017cliwia przekszta\u0142cenie obiektu w tablic\u0119 instancji <em>com.cisag.pgm.gui.Icon,<\/em> kt\u00f3re s\u0105 nak\u0142adane jedna na drug\u0105 podczas wizualizacji. Podczas korzystania z cz\u0119\u015bciowo przezroczystych ikon, np. r\u00f3\u017cne cz\u0119\u015bciowe ikony stanu mog\u0105 by\u0107 \u0142\u0105czone w celu utworzenia og\u00f3lnej ikony stanu.<\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public Icon[] getIcons(Object value);<\/pre>\n<\/div>\n<div><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Reprezentacja tekstowa jest r\u00f3wnie\u017c wymagana dla ka\u017cdej kolumny do wy\u015bwietlania nag\u0142\u00f3wk\u00f3w grup i do eksportu. W zwi\u0105zku z tym, <em>LayerdIconRenderer<\/em> powinien by\u0107 po\u0142\u0105czony z <em>ToolTipRenderer<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL27\">ToolTipRenderer<\/a>).<\/div><\/section><\/em><\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">\u0141adowanie i renderowanie wielu ikon mo\u017ce pogorszy\u0107 wydajno\u015b\u0107 przegl\u0105darki.<\/div><\/section><\/div>\n<h5 id=\"tooltiprenderer\" ><span class=\"ez-toc-section\" id=\"ToolTipRenderer\"><\/span>ToolTipRenderer<a id=\"PRL27\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Interfejs <em>com.cisag.pgm.gui.Renderer.ToolTipRenderer<\/em> umo\u017cliwia konwersj\u0119 obiektu na tekst wy\u015bwietlany jako podpowied\u017a w aplikacji typu <em>Lista.<\/em><\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public Icon[] getIcons(Object value);<\/pre>\n<\/div>\n<h5 id=\"urirenderer\" ><span class=\"ez-toc-section\" id=\"URIRenderer\"><\/span>URIRenderer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Interfejs <em>com.cisag.pgm.gui.Renderer.URIRenderer<\/em> umo\u017cliwia konwersj\u0119 obiektu na <em>URI.<\/em> Te <em>URI<\/em> s\u0105 nast\u0119pnie wy\u015bwietlane jako linki znajduj\u0105ce si\u0119 w aplikacji typu <em>Lista.<\/em> W przypadku identyfikator\u00f3w <em>URI,<\/em> kt\u00f3re identyfikuj\u0105 jednostk\u0119 biznesow\u0105, aplikacja zapewnia r\u00f3wnie\u017c zwyk\u0142e menu kontekstowe dla tej jednostki.<\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public URI getUri(Object value);<\/pre>\n<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public URI getUri(Object value) {\n\u00a0 if (value != null) {\n\u00a0 \u00a0 CisObject obj = ... \/\/ przekonwertuj parametr \"value\" na CisObject\n\u00a0 \u00a0 BusinessEntityLink link = LinkUtili-ty.createBusinessEntityLink(\n\u00a0 \u00a0 \u00a0 \u00a0 LinkUtility.DEFAULT_FLAGS, env.getDatabaseGuid(), o);\n\u00a0 \u00a0 if (link != null) {\n\u00a0 \u00a0 \u00a0 return URI.create(LinkUtility.toUrlString(link));\n\u00a0 \u00a0 }\n\u00a0 }\n\u00a0 return null;\n}<br \/><br \/><\/div><\/section><\/pre>\n<\/div>\n<h5 id=\"visualelementrenderer\" ><span class=\"ez-toc-section\" id=\"VisualElementRenderer\"><\/span>VisualElementRenderer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Interfejs <em>com.cisag.pgm.gui.Renderer.VisualElementRenderer<\/em> umo\u017cliwia konwersj\u0119 obiektu na instancj\u0119 <em>om.cisag.pgm.gui.VisualElement.<\/em><\/div>\n<div>Konkretne klasy musz\u0105 implementowa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public VisualElement getVisualElement(Object value);<\/pre>\n<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Korzystanie z <em>VisualElementRenderers<\/em> wi\u0105\u017ce si\u0119 z wieloma wadami. G\u0142\u00f3wn\u0105 wad\u0105 jest wi\u0119ksze zu\u017cycie zasob\u00f3w, zar\u00f3wno na serwerze, jak i w przegl\u0105darce. Ponadto eksport danych (PDF, Excel, REST) nie jest oferowany. <em>VisualElementRenderer<\/em> nie mo\u017ce by\u0107 \u0142\u0105czony z innymi rendererami. <em>VisualElementRenderers<\/em> nie mog\u0105 by\u0107 u\u017cywane do interakcji, tj. linki, menu kontekstowe itp. nie dzia\u0142aj\u0105.<\/div><\/section><\/div>\n<h5 id=\"kolumny-wirtualne\" ><span class=\"ez-toc-section\" id=\"Kolumny_wirtualne-2\"><\/span>Kolumny wirtualne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W przypadku kolumn wirtualnych (patrz rozdzia\u0142 <a href=\"#PRL7\"><em>Pole wyboru: Wirtualnie<\/em><\/a>), warto\u015bci atrybut\u00f3w s\u0105 przesy\u0142ane do renderera jako <em>java.util.Map,<\/em> przy czym wzgl\u0119dne nazwy podatrybut\u00f3w s\u0105 u\u017cywane jako klucze.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Wirtualna kolumna o nazwie <em>vattr<\/em> ma dwa podatrybuty <em>vattr.attr1<\/em> i <em>vattr.attr2,<\/em> a wszystkie atrybuty s\u0105 oznaczone jako mo\u017cliwe do wy\u015bwietlenia. W formatterze warto\u015bci tych atrybut\u00f3w podrz\u0119dnych powinny by\u0107 dost\u0119pne w nast\u0119puj\u0105cy spos\u00f3b:<\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public String getText(Object value) {\n\u00a0 if (value instanceof Map) {\n\u00a0 \u00a0 Map values = (Map) value;\n\u00a0 \u00a0 Object attr1 = values.get(\"attr1\");\n\u00a0 \u00a0 Object attr2 = values.get(\"attr2\");\n\u00a0 \u00a0 ...\n\u00a0 \u00a0 return ...\n\u00a0 }\n\u00a0 return null;\n}\n<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><em><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Map<\/em> zawiera tylko podatrybuty oznaczone jako mo\u017cliwe do wy\u015bwietlenia. Warto\u015bciami atrybut\u00f3w mog\u0105 by\u0107 r\u00f3wnie\u017c warto\u015bci <em>null.<\/div><\/section><\/em><\/div>\n<h4 id=\"filterexpression\" ><span class=\"ez-toc-section\" id=\"FilterExpression\"><\/span>FilterExpression<a id=\"PRL29\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Wszystkie wyra\u017cenia filtruj\u0105ce s\u0105 oparte na abstrakcyjnej i og\u00f3lnej klasie bazowej <em>com.cisag.pgm.search.filter.FilterExpression&lt;T&gt;<\/em>. Pakiet <em>com.cisag.pgm.search.filter<\/em> zapewnia konkretne podklasy dla wszystkich odpowiednich logicznych typ\u00f3w danych. Ka\u017cda z tych podklas ma odpowiednie statyczne metody <em>Factory,<\/em> kt\u00f3re mog\u0105 by\u0107 u\u017cywane do tworzenia instancji.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Podczas tworzenia wyra\u017ce\u0144 filtruj\u0105cych nale\u017cy zawsze okre\u015bli\u0107 logiczny typ danych, przy czym okre\u015blony typ danych musi by\u0107 zgodny z typem danych kolumny, do kt\u00f3rej odnosi si\u0119 wyra\u017cenie filtruj\u0105ce.<\/div><\/section><\/div>\n<h5 id=\"filterexpressionlist\" ><span class=\"ez-toc-section\" id=\"FilterExpressionList\"><\/span>FilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa generyczna <em>com.cisag.pgm.search.filter.FilterExpressionList&lt;T&gt;<\/em> s\u0142u\u017cy jako wsp\u00f3lna klasa bazowa dla prawie wszystkich typ\u00f3w danych, kt\u00f3rych wyra\u017cenia filtruj\u0105ce mog\u0105 sk\u0142ada\u0107 si\u0119 z pojedynczych wyra\u017ce\u0144 oddzielonych przecinkami. Niemniej jednak, zamiast oddzielonej przecinkami listy ci\u0105g\u00f3w znak\u00f3w, klasa opiera si\u0119 na <em>java.util.List<\/em> z elementami typu <em>Expression&lt;T&gt;.<\/em> Typ <em>Expression&lt;T&gt;<\/em> jest r\u00f3wnie\u017c og\u00f3lnym wewn\u0119trznym interfejsem klasy <em>FilterExpressionList.<\/em> Klasy <em>SingleExpression&lt;T&gt;, RangeExpression&lt;T&gt;<\/em> i <em>InvalidExpression&lt;T&gt;,<\/em> kt\u00f3re s\u0105 generycznymi klasami wewn\u0119trznymi <em>FilterExpressionList,<\/em> s\u0105 dost\u0119pne jako konkretne implementacje tych interfejs\u00f3w.<\/div>\n<h6 id=\"singleexpression\" ><span class=\"ez-toc-section\" id=\"SingleExpression\"><\/span>SingleExpression<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasa <em>SingleExpression<\/em> s\u0142u\u017cy do reprezentowania wyra\u017ce\u0144 filtruj\u0105cych, kt\u00f3re sk\u0142adaj\u0105 si\u0119 z operatora por\u00f3wnania i warto\u015bci. Mo\u017cliwe operatory por\u00f3wnania s\u0105 zdefiniowane przez typ <em>ExpressionType:<\/em><\/div>\n<ul>\n<li>EQUALS<\/li>\n<li>UNEQUAL (&lt;&gt;)<\/li>\n<li>LESS (&lt;)<\/li>\n<li>GREATER (&gt;)<\/li>\n<li>\u00a0LESS_EQUAL (&lt;=)<\/li>\n<li>GREATHER_EQUAL (&gt;=)<\/li>\n<\/ul>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Niekt\u00f3re z wymienionych operator\u00f3w por\u00f3wnania nie s\u0105 dozwolone dla wszystkich typ\u00f3w danych.<\/div><\/section><\/div>\n<h6 id=\"rangeexpression\" ><span class=\"ez-toc-section\" id=\"RangeExpression\"><\/span>RangeExpression<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasa <em>RangeExpression<\/em> s\u0142u\u017cy do reprezentowania zakres\u00f3w warto\u015bci. Zakres warto\u015bci jest definiowany przez doln\u0105 i g\u00f3rn\u0105 warto\u015b\u0107, przy czym jednej z tych warto\u015bci mo\u017ce brakowa\u0107 (przedzia\u0142 otwarty). Dolna warto\u015b\u0107 (je\u015bli wyst\u0119puje) jest zawsze \u0142\u0105czna, g\u00f3rna warto\u015b\u0107 (je\u015bli wyst\u0119puje) mo\u017ce by\u0107 \u0142\u0105czna lub wy\u0142\u0105czna (w zale\u017cno\u015bci od odpowiedniego typu danych).<\/div>\n<h6 id=\"invalidexpression\" ><span class=\"ez-toc-section\" id=\"InvalidExpression\"><\/span>InvalidExpression<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Nieprawid\u0142owe wyra\u017cenia filtra s\u0105 reprezentowane przez klas\u0119 <em>InvalidExpression.<\/em> Zawiera ona nieprawid\u0142ow\u0105 warto\u015b\u0107 jako ci\u0105g znak\u00f3w i (opcjonalnie) list\u0119 komunikat\u00f3w <em>(CisMessage).<\/em> Takie instancje s\u0105 zwykle tworzone, je\u015bli dane wej\u015bciowe u\u017cytkownika lub przes\u0142ane ci\u0105gi znak\u00f3w nie mog\u0105 zosta\u0107 przetworzone na prawid\u0142owe wyra\u017cenie filtruj\u0105ce.<\/div>\n<h6 id=\"stringfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"StringFilterExpressionList\"><\/span>StringFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasa <em>com.cisag.pgm.search.filter.StringFilterExpressionList<\/em> jest konkretn\u0105 podklas\u0105 <em>FilterExpressionList<\/em> i opisuje wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na \u0142a\u0144cuchach lub tekstach. Klasa ma r\u00f3\u017cne statyczne metody fabryczne, kt\u00f3re mog\u0105 by\u0107 u\u017cywane do tworzenia instancji tej klasy.<\/div>\n<h6 id=\"bytefilterexpressionlist-shortfilterexpressionlist-integerfilterexpressionlist-longfilterexpressionlist-i-decimalfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"ByteFilterExpressionList_ShortFilterExpressionList_IntegerFilterExpressionList_LongFilterExpressionList_i_DecimalFilterExpressionList\"><\/span>ByteFilterExpressionList, ShortFilterExpressionList, IntegerFilterExpressionList, LongFilterExpressionList i DecimalFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Nast\u0119puj\u0105ce klasy z pakietu <em>com.cisag.pgm.search.filter<\/em> s\u0105 konkretnymi podklasami <em>FilterExpressionList<\/em> i opisuj\u0105 wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na bajtach, szortach, intach, longach lub CisDecimal:<\/div>\n<ul>\n<li><em>ByteFilterExpressionList<\/em><\/li>\n<li><em>ShortFilterExpressionList<\/em><\/li>\n<li><em>IntegerFilterExpressionList<\/em><\/li>\n<li><em>LongFilterExpressionList<\/em><\/li>\n<li><em>DecimalFilterExpressionList<\/em><\/li>\n<\/ul>\n<div>Ka\u017cda z powy\u017cszych klas posiada r\u00f3\u017cne statyczne metody fabryczne, kt\u00f3re mog\u0105 by\u0107 u\u017cywane do tworzenia instancji tych klas.<\/div>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<div>Wyszukiwanie dok\u0142adnej warto\u015bci:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression expr =\n\u00a0 \u00a0 \u00a0 IntegerFilterExpressionList.create(path, 1);<\/pre>\n<\/div>\n<div>Wyszukiwanie wielu dok\u0142adnych warto\u015bci:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression expr =\n\u00a0 \u00a0 \u00a0 IntegerFilterExpressionList.create(path, 1, 3, 5);<\/pre>\n<\/div>\n<div>Wyszukiwanie zakresu:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression expr =\n\u00a0 \u00a0 \u00a0 IntegerFilterExpressionList.createRange(path, 1, 9);<\/pre>\n<\/div>\n<div>Wyszukiwanie zakresu bez g\u00f3rnego limitu:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression expr =\n\u00a0 \u00a0 \u00a0 IntegerFilterExpressionList.createRange(path, 1, null);<\/pre>\n<\/div>\n<div>Wyszukiwanie warto\u015bci<em> Nie r\u00f3wnych 0:<\/em><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression expr = IntegerFilterExpressionList.create(path,\n IntegerFilterExpressionList.createSingleExpression(\n ExpressionType.UNEQUAL, 0\n<\/pre>\n<p class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"><\/div><\/section>\n<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Klasa <em>ValueSetFilterExpression<\/em> jest dost\u0119pna dla zestaw\u00f3w warto\u015bci, kt\u00f3re s\u0105 r\u00f3wnie\u017c mapowane jako kr\u00f3tkie w bazie danych (patrz rozdzia\u0142 <em><a href=\"#PRL30\">ValueSetFilterExpression<\/a>).<\/em><\/div>\n<div>Float i double nie s\u0105 oferowane.<\/div><\/section><\/div>\n<h6 id=\"dateandtimefilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"DateAndTimeFilterExpressionList\"><\/span>DateAndTimeFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasa <em>com.cisag.pgm.search.filter.DateAndTimeFilterExpressionList<\/em> jest konkretn\u0105 podklas\u0105 <em>FilterExpressionList<\/em> i opisuje wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na warto\u015bciach daty lub punktach w czasie.<\/div>\n<div>Klasa <em>DateAndTimeFilterExpressionList<\/em> ma r\u00f3\u017cne statyczne metody fabryczne, kt\u00f3re mog\u0105 by\u0107 u\u017cywane do tworzenia instancji tej klasy. Warto\u015bci czasu i daty mog\u0105 by\u0107 okre\u015blone jako znormalizowana reprezentacja \u0142a\u0144cuchowa lub przy u\u017cyciu instancji <em>com.cisag.pgm.search.filter.DateAndTimeValue.<\/em> W obu przypadkach mo\u017cna u\u017cywa\u0107 zar\u00f3wno konkretnych, jak i symbolicznych warto\u015bci (np. <em>dzisiaj).<\/em> Wszystkie specyfikacje daty i czasu s\u0105 zawsze powi\u0105zane z <em>CisCalendar,<\/em> kt\u00f3ry mo\u017ce by\u0107 przekazywany jawnie w metodach fabrycznych, je\u015bli jest to wymagane. Bez wyra\u017anej specyfikacji, <em>CisCalendar<\/em> jest okre\u015blany wewn\u0119trznie poprzez:\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisEnvironment.getInstance().getContext().getCisCalendar()<\/pre>\n<\/div>\n<h6 id=\"quantityfilterexpressionlist-durationfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"QuantityFilterExpressionList_DurationFilterExpressionList\"><\/span>QuantityFilterExpressionList, DurationFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasy <em>com.cisag.pgm.search.filter.QuantityFilterExpressionList<\/em> i <em>com.cisag.pgm.search.filter.DurationFilterExpressionList<\/em> s\u0105 konkretnymi podklasami <em>FilterExpressionList<\/em> i opisuj\u0105 wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na warto\u015bciach ilo\u015bciowych lub przedzia\u0142ach czasowych.<\/div>\n<div>Ka\u017cda z klas posiada statyczn\u0105 metod\u0119 <em>Factory,<\/em> kt\u00f3ra mo\u017ce by\u0107 u\u017cyta do tworzenia instancji tych klas. Metoda <em>Factory<\/em> oczekuje jako parametr listy <em>Expression&lt;CisDecimal&gt;<\/em> i identyfikatora <em>GUID<\/em> ilo\u015bci lub jednostki czasu. Niezb\u0119dne listy <em>Expression&lt;CisDecimal&gt;<\/em> mog\u0105 by\u0107 generowane przy u\u017cyciu r\u00f3\u017cnych statycznych metod <em>Factory.<\/em><\/div>\n<h6 id=\"domesticamountfilterexpressionlist-foreignamountfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"DomesticAmountFilterExpressionList_ForeignAmountFilterExpressionList\"><\/span>DomesticAmountFilterExpressionList, ForeignAmountFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasy <em>com.cisag.pgm.search.filter.DomesticAmountFilterExpressionList<\/em> i <em>com.cisag.pgm.search.filter.ForeignAmountFilterExpressionList<\/em> s\u0105 konkretnymi podklasami <em>FilterExpressionList<\/em> i opisuj\u0105 wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na kwotach w walucie krajowej lub obcej.<\/div>\n<div>Ka\u017cda z klas posiada statyczn\u0105 metod\u0119 fabryczn\u0105, kt\u00f3ra mo\u017ce by\u0107 u\u017cyta do tworzenia instancji tych klas. Metoda <em>Factory<\/em> oczekuje listy <em>Expression&lt;CisDecimal&gt;<\/em> i identyfikatora <em>GUID<\/em> jednostki waluty jako parametr\u00f3w. Metoda <em>Factory<\/em> dla <em>DomesticAmountFilterExpressionList<\/em> r\u00f3wnie\u017c wymaga identyfikatora <em>GUID<\/em> jednostki organizacyjnej. Niezb\u0119dne listy <em>Expression&lt;CisDecimal&gt;<\/em> mog\u0105 by\u0107 generowane za pomoc\u0105 r\u00f3\u017cnych statycznych metod <em>Factory.<\/em><\/div>\n<h6 id=\"binaryfilterexpressionlist-guidfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"BinaryFilterExpressionList_GuidFilterExpressionList\"><\/span>BinaryFilterExpressionList, GuidFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasy <em>com.cisag.pgm.search.filter.BinaryFilterExpressionList<\/em> i <em>com.cisag.pgm.search.filter.GuidFilterExpressionList<\/em> s\u0105 konkretnymi podklasami <em>FilterExpressionList<\/em> i opisuj\u0105 wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczne typy danych s\u0105 oparte na danych binarnych lub identyfikatorach <em>GUID.<\/em> Ka\u017cda z klas ma r\u00f3\u017cne statyczne metody <em>Factory,<\/em> kt\u00f3re mog\u0105 by\u0107 u\u017cywane do tworzenia instancji tych klas.<\/div>\n<h6 id=\"booleanfilterexpressionlist\" ><span class=\"ez-toc-section\" id=\"BooleanFilterExpressionList\"><\/span>BooleanFilterExpressionList<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>Klasa <em>com.cisag.pgm.search.filter.BooleanFilterExpressionList<\/em> jest konkretn\u0105 podklas\u0105 <em>FilterExpressionList<\/em> i opisuje wyra\u017cenia filtruj\u0105ce dla kolumn, kt\u00f3rych logiczny typ danych jest oparty na liczbach logicznych. Klasa posiada statyczn\u0105 metod\u0119 <em>Factory,<\/em> kt\u00f3ra mo\u017ce by\u0107 u\u017cywana do tworzenia instancji tej klasy.<\/div>\n<h5 id=\"compoundfilterexpression\" ><span class=\"ez-toc-section\" id=\"CompoundFilterExpression\"><\/span>CompoundFilterExpression<a id=\"PRL34\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.search.filter.CompoundFilterExpression<\/em> jest wymagana do filtrowania kolumn wirtualnych (patrz rozdzia\u0142 <a href=\"#PRL7\"><em>Pole wyboru: Wirtualnie<\/em><\/a>). W przypadku kolumn wirtualnych filtrowanie zawsze odbywa si\u0119 na podstawie atrybut\u00f3w podrz\u0119dnych oznaczonych jako mo\u017cliwe do filtrowania. Dla ka\u017cdego podatrybutu, kt\u00f3ry ma by\u0107 filtrowany, nale\u017cy utworzy\u0107 <em>FilterExpression<\/em> pasuj\u0105ce do typu danych podatrybutu. Za pomoc\u0105 klasy <em>CompoundFilterExpression<\/em> poszczeg\u00f3lne <em>FilterExpression<\/em> s\u0105 \u0142\u0105czone w jedno <em>FilterExpression.<\/em> Aby to zrobi\u0107, poszczeg\u00f3lne <em>FilterExpression<\/em> musz\u0105 najpierw zosta\u0107 podsumowane w <em>java.util.Map,<\/em> przy czym wzgl\u0119dne nazwy podatrybut\u00f3w maj\u0105 by\u0107 u\u017cywane jako klucze.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExpression attr1 = ....\nFilterExpression attr2 = ...\nMap&lt;String, FilterExpression&gt; map =\n\u00a0 \u00a0 new HashMap&lt;String, FilterExpression&gt;();\nmap.put(\"attr1\", attr1);\nmap.put(\"\nFilterExpression attr1 = \u2026\nFilterExpression attr2 = \u2026\nMap&lt;String, FilterExpression&gt; map =\n new HashMap&lt;String, FilterExpression&gt;();\nmap.put(\"attr1\", attr1);\nmap.put(\"attr2\", attr2);\nString path = \u2026\nFilterExpression vattr =\n CompoundFilterExpression.create(path, map);<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div><\/div><\/section><\/div>\n<h5 id=\"deletestatefilterexpression\" ><span class=\"ez-toc-section\" id=\"DeleteStateFilterExpression\"><\/span>DeleteStateFilterExpression<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.search.filter.DeleteStateFilterExpression<\/em> s\u0142u\u017cy do filtrowania obiekt\u00f3w ze znacznikami usuwania (patrz rozdzia\u0142 <em>Znaczniki usuwania<\/em>). Obiekty ze znacznikiem usuwania mo\u017cna rozpozna\u0107 po warto\u015bci atrybutu <em>updateInfo.deleteTime.<\/em> Wszystkie obiekty, dla kt\u00f3rych ten atrybut zawiera prawid\u0142owy czas, s\u0105 rozpoznawane jako oznaczone do usuni\u0119cia.<\/div>\n<div>Poniewa\u017c atrybut <em>updateInfo.deleteTime<\/em> zawiera znacznik czasu, wyra\u017cenie filtruj\u0105ce dla tego atrybutu powinno by\u0107 oparte na klasie <em>com.cisag.pgm.search.filter.DateAndTimeFilterExpressionList.<\/em> Aby upro\u015bci\u0107 filtrowanie wed\u0142ug znacznika usuwania, wprowadzono r\u00f3wnie\u017c klas\u0119 <em>DeleteStateFilterExpression,<\/em> kt\u00f3ra mo\u017ce by\u0107 u\u017cywana w podobny spos\u00f3b jak <em>ValueSetFilterExpression<\/em> dla zestaw\u00f3w warto\u015bci.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">String path = \"com.cisag.pgm.objsearch:DeleteState.lt\";\nFilterExpression expression =\n\u00a0 \u00a0 DeleteStateFilterExpression.create(path,\n\u00a0 \u00a0 \u00a0 \u00a0 DeleteStateFilterExpression.MARKED_FOR_DELETION);<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div><\/div><\/section><\/div>\n<h5 id=\"valuesetfilterexpression\" ><span class=\"ez-toc-section\" id=\"ValueSetFilterExpression\"><\/span>ValueSetFilterExpression<a id=\"PRL30\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.search.filter.ValueSetFilterExpression<\/em> jest specjaln\u0105 podklas\u0105 <em>FilterExpression<\/em> do filtrowania zestaw\u00f3w warto\u015bci. Klasa posiada metod\u0119 <em>Factory,<\/em> kt\u00f3ra mo\u017ce by\u0107 u\u017cyta do utworzenia instancji klasy poprzez wyliczenie kr\u00f3tkich warto\u015bci.<\/div>\n<div>Wyra\u017cenie filtruj\u0105ce ze wszystkimi mo\u017cliwymi warto\u015bciami jest r\u00f3wnowa\u017cne wyszukiwaniu bez warunk\u00f3w, tj. u\u017cyciu warto\u015bci <em>null<\/em> jako wyra\u017cenia filtruj\u0105cego. Nale\u017cy jednak zauwa\u017cy\u0107, \u017ce zestawy warto\u015bci, kt\u00f3rych warto\u015bci zosta\u0142y zredukowane za pomoc\u0105 <em>Data description<\/em>, s\u0105 traktowane specjalnie: aby zapewni\u0107, \u017ce tylko warto\u015bci okre\u015blone w opisie danych s\u0105 odczytywane przez baz\u0119 danych, te okre\u015blone warto\u015bci s\u0105 automatycznie uwzgl\u0119dniane w klauzuli <em>WHERE<\/em> zapytania do bazy danych. Je\u015bli jednak zostanie zapewnione, \u017ce tylko warto\u015bci okre\u015blone w opisie danych mog\u0105 faktycznie wyst\u0105pi\u0107 w danej kolumnie, w\u00f3wczas dana kolumna powinna zosta\u0107 oznaczona jako kompletna za pomoc\u0105 hook <em>BusinessObjectRegistryHook<\/em> (patrz rozdzia\u0142 <em><a href=\"#PRL31\">BusinessObjectRegistryHook<\/a><\/em>). W tym przypadku pozwala to unikn\u0105\u0107 niepotrzebnego i kosztownego rozszerzenia klauzuli <em>WHERE<\/em>.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad 1: Filtrowanie kolumny <em>bookFormat<\/em> dla warto\u015bci <em>Format.CD<\/em> lub <em>Format.DVD<\/em><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import com.cisag.app.edu.Format;\n...\nFilterExpression expr = ValueSetFilterExpression.create(\n\u00a0 \u00a0 \"com.cisag.app.edu:Format.lt\", Format.CD, Format.DVD);\ngridSearchSupport.setFilterExpression(\"bookFormat\", expr);<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div><\/div><\/section><\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad 2: Wyszukiwanie bez warunku <em>(Wszystkie)<\/em><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">gridSearchSupport.setFilterExpression(\"bookFormat\", null);<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli warto\u015bci <em>ValueSet<\/em> zosta\u0142y ograniczone za pomoc\u0105 <em>Data description,<\/em> w\u00f3wczas wszystkie warto\u015bci okre\u015blone w opisie danych s\u0105 automatycznie uwzgl\u0119dniane w klauzuli <em>WHERE<\/em> zapytania do bazy danych.<\/div><\/section><\/div>\n<h4 id=\"filterexpressioneditor\" ><span class=\"ez-toc-section\" id=\"FilterExpressionEditor\"><\/span>FilterExpressionEditor<a id=\"PRL32\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div><em>FilterExpressionEditor<\/em> jest wymagany do wy\u015bwietlania lub edycji wyra\u017cenia filtruj\u0105cego w aplikacji typu <em>Lista. FilterExpressionEditors<\/em> to klasy, kt\u00f3re implementuj\u0105 interfejs <em>com.cisag.pgm.search.gui.FilterExpressionEditor&lt;T&gt;<\/em> i s\u0105 tworzone za po\u015brednictwem <em>FilterExpressionEditorFactory<\/em> (patrz rozdzia\u0142 <a href=\"#PRL33\"><em>FilterExpressionEditorFactory<\/em><\/a>).<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 257px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 30.2381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 69.7619%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 118px;\">\n<td style=\"width: 30.2381%; height: 118px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<p><em>VisualElement <\/em><\/p>\n<p><em>getVisualElement()<\/em><\/p>\n<\/td>\n<td style=\"width: 69.7619%; height: 118px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Zwraca <em>VisualElement<\/em> dostarczony przez edytor. Metoda ta jest wywo\u0142ywana przez infrastruktur\u0119 aplikacji typu <em>Lista,<\/em> a dostarczony element jest nast\u0119pnie dodawany do nag\u0142\u00f3wka tego typu aplikacji.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 30.2381%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>void initVisualElement()<\/em><\/td>\n<td style=\"width: 69.7619%; height: 70px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Ta metoda mo\u017ce by\u0107 u\u017cyta przez edytor do zainicjowania dostarczonego elementu. Infrastruktura aplikacji typu <em>Lista<\/em> wywo\u0142uje t\u0119 metod\u0119 bezpo\u015brednio po dodaniu elementu dostarczonego przez edytor.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 30.2381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>T getValue();<\/em><\/td>\n<td style=\"width: 69.7619%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Zadaniem <em>getValue()<\/em> jest konwersja aktualnie wy\u015bwietlanej warto\u015bci dostarczonego elementu <em>VisualElement<\/em> na instancj\u0119 <em>FilterExpression,<\/em> kt\u00f3ra odpowiada typowi danych powi\u0105zanej kolumny (patrz ten rozdzia\u0142: <em><a href=\"#PRL29\">FilterExpression<\/a><\/em>).\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Metoda musi zwr\u00f3ci\u0107 warto\u015b\u0107 <em>null,<\/em> je\u015bli w dostarczonym <em>VisualElement<\/em> nie wprowadzono \u017cadnego filtra lub wybrano opcj\u0119 <em>Wszystkie.<\/em><\/div><\/section><\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 30.2381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>setValue (T value);<\/em><\/td>\n<td style=\"width: 69.7619%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><span style=\"color: initial;\">Zadaniem metody <em>setValue()<\/em> jest wy\u015bwietlenie przekazanego <em>FilterExpression<\/em> w dostarczonym <em>VisualElement<\/em> (patrz ten rozdzia\u0142: <em><a href=\"#PRL29\">FilterExpression<\/a><\/em><em>).<\/em><\/span><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Warto\u015b\u0107 zero jest r\u00f3wnowa\u017cna warto\u015bci <em>Brak<\/em> lub <em>Wszystkie.<\/div><\/section><\/em><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Implementacje metod <em>getValue()<\/em> i <em>setValue()<\/em> musz\u0105 by\u0107 skoordynowane w taki spos\u00f3b, aby:<\/div>\n<div>1. wywo\u0142anie <em>editor.getValue()<\/em> po wywo\u0142aniu <em>editor.setValue(X)<\/em> zwraca\u0142o <em>FilterExpression<\/em> r\u00f3wne <em>X<\/em>, o ile u\u017cytkownik nie zmieni\u0142 w mi\u0119dzyczasie wyra\u017cenia filtruj\u0105cego,<\/div>\n<div>2. wywo\u0142anie <em>editor.setValue(X)<\/em> z wyra\u017ceniem filtruj\u0105cym <em>X<\/em>, kt\u00f3re zosta\u0142o okre\u015blone w pewnym momencie wcze\u015bniej za pomoc\u0105 <em>X = editor.getValue(),<\/em> prowadzi do tej samej wizualizacji, co w momencie wywo\u0142ania <em>editor.getValue().<\/em><\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Poni\u017cszy przyk\u0142ad pokazuje implementacj\u0119 dla <em>FilterExpressionEditor<\/em> dla kolumn, kt\u00f3re s\u0105 oparte na (arbitralnym) zestawie warto\u015bci, a tak\u017ce implementacj\u0119 powi\u0105zanego <em>FilterExpressionEditorFactory.<\/em> Oddzielna implementacja dla zestaw\u00f3w warto\u015bci nie jest jednak wymagana, poniewa\u017c odpowiednia implementacja jest ju\u017c zapewniona przez infrastruktur\u0119.<\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">package com.example;\nimport com.cisag.pgm.datatype.Guid;\nimport com.cisag.pgm.dialogue.model.DataDescription;\nimport com.cisag.pgm.dialogue.model.DefaultDataDescription;\nimport com.cisag.pgm.gui.ValueSetField;\nimport com.cisag.pgm.gui.VisualElement;\nimport com.cisag.pgm.search.filter.ValueSetFilterExpression;\nimport com.cisag.pgm.search.gui.FilterExpressionEditor;\nimport com.cisag.pgm.search.gui.FilterExpressionEditorFactory;\npublic class ValueSetFilterExpressionEditorFactory implements\n\u00a0 FilterExpressionEditorFactory {\n\u00a0 public ValueSetFilterExpressionEditorFactory() {\n\u00a0 }\n\u00a0 public FilterExpressionEditor createFilterExpressionEditor(\n\u00a0 \u00a0 \u00a0 byte[] guid, DataDescription dataDescription) {\n\u00a0 \u00a0 return new ValueSetFilterExpressionEditor(guid,\n\u00a0 \u00a0 \u00a0 \u00a0 dataDescription);\n\u00a0 }\n\u00a0 private class ValueSetFilterExpressionEditor implements\n\u00a0 \u00a0 \u00a0 FilterExpressionEditor&lt;ValueSetFilterExpression&gt; {\n\u00a0 \u00a0 private final String path;\n\u00a0 \u00a0 private final ValueSetField field;\n\u00a0 \u00a0 private ValueSetFilterExpressionEditor(byte[] guid,\n\u00a0 \u00a0 \u00a0 \u00a0 DataDescription dataDescription) {\n\u00a0 \u00a0 \u00a0 this.path =\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (String) dataDescription.getValue(DataDescription.PATH);\n\u00a0 \u00a0 \u00a0 field = new ValueSetField(Guid.toHexString(guid),\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 dataDescription);\n\u00a0 \u00a0 \u00a0 field.setSelectionMode(true);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 public VisualElement getVisualElement() {\n\u00a0 \u00a0 \u00a0 return field;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 public void initVisualElement() {\n\u00a0 \u00a0 }\n\u00a0 \u00a0 public ValueSetFilterExpression getValue() {\n\u00a0 \u00a0 \u00a0 short[] values = (short[]) field.getSelection();\n\u00a0 \u00a0 \u00a0 if ( values != null &amp;&amp; values.length &gt; 0 ) {\n\u00a0 \u00a0 \u00a0 \u00a0 boolean allEntriesSelected = false;\n\u00a0 \u00a0 \u00a0 \u00a0 short[] entries = field.getEntries();\n\u00a0 \u00a0 \u00a0 \u00a0 if (entries != null &amp;&amp; entries.length == values.length) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 allEntriesSelected = true;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for (int i = 0; i &lt; values.length; i++) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 boolean found = false;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for (int j = 0; j &lt; entries.length; j++) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (values[i] == entries[j]) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 found = true;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (!found) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 allEntriesSelected = false;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 if (!allEntriesSelected) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return ValueSetFilterExpression.create(path, values);\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 return null;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 public void setValue(ValueSetFilterExpression value) {\n\u00a0 \u00a0 \u00a0 if (value != null) {\n\u00a0 \u00a0 \u00a0 \u00a0 short[] values = value.getSelection();\n\u00a0 \u00a0 \u00a0 \u00a0 field.setSelection(values);\n\u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 field.setSelection(new short[0]);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 }\n}<\/pre>\n<p><\/div><\/section><\/p>\n<\/div>\n<h5 id=\"filterexpressioneditorfactory\" ><span class=\"ez-toc-section\" id=\"FilterExpressionEditorFactory\"><\/span>FilterExpressionEditorFactory<a id=\"PRL33\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Instancje <em>FilterExpressionEditor<\/em> s\u0105 zawsze generowane przez infrastruktur\u0119 aplikacji typu <em>Lista<\/em> za po\u015brednictwem specjalnych klas <em>Factory.<\/em> Klasy <em>Factory<\/em> musz\u0105 implementowa\u0107 interfejs <em>com.cisag.pgm.search.gui.FilterExpressionEditorFactory<\/em> i mie\u0107 domy\u015blny konstruktor. Interfejs definiuje nast\u0119puj\u0105c\u0105 metod\u0119:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public FilterExpressionEditor createFilterExpressionEditor(\n\u00a0 \u00a0 byte[] guid, DataDescription dataDescription)<\/pre>\n<\/div>\n<div>Konkretne klasy, kt\u00f3re implementuj\u0105 ten interfejs, powinny wykorzystywa\u0107 informacje z przekazanego opisu danych, aby odpowiednio sparametryzowa\u0107 utworzon\u0105 instancj\u0119 <em>FilterExpressionEditor.<\/em><\/div>\n<div><em>FilterExpressionEditorFactory<\/em> jest rejestrowany poprzez wprowadzenie jego w pe\u0142ni kwalifikowanej nazwy klasy w <em>Data description<\/em> dla logicznego typu danych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Og\u00f3lne implementacje s\u0105 dostarczane przez infrastruktur\u0119 aplikacji typu <em>Lista<\/em> dla wszystkich prymitywnych typ\u00f3w danych i <em>Special-Parts<\/em>. Odpowiednie <em>FilterExpressionEditorFactories<\/em> musz\u0105 by\u0107 zapewnione dla wszystkich innych typ\u00f3w danych, tj. wirtualnych kolumn, obiekt\u00f3w biznesowych i <em>Parts,<\/em> je\u015bli odpowiednia kolumna zosta\u0142a oznaczona jako mo\u017cliwa do filtrowania w obiekcie deweloperskim <em>Search<\/em> (patrz sekcja <em><a href=\"#PRL23\">Pole wyboru:<\/a> <a href=\"#PRL23\">Mo\u017cliwo\u015b\u0107 filtrowania<\/a><\/em>) i jednocze\u015bnie nie ma to wp\u0142ywu na zaprogramowany filtr (patrz sekcja <a href=\"#PRL20\"><em>Pole wyboru: Zaprogramowany filtr<\/em><\/a>).<\/div><\/section><\/div>\n<h5 id=\"filterexpressioneditorfactoryregistry\" ><span class=\"ez-toc-section\" id=\"FilterExpressionEditorFactoryRegistry\"><\/span>FilterExpressionEditorFactoryRegistry<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.search.gui.FilterExpressionEditorFactoryRegistry<\/em> mo\u017ce by\u0107 u\u017cywana do tworzenia odpowiednich instancji <em>FilterExpressionEditorfactory<\/em> dla logicznego typu danych. Podczas rozwi\u0105zywania klasa przeszukuje \u0142a\u0144cuch dziedziczenia logicznego typu danych a\u017c do g\u0142\u00f3wnego typu danych. Zwracany jest pierwszy znaleziony <em>FilterExpressionEditorFactory.<\/em> Je\u015bli nie ma rejestracji dla logicznego typu danych, wyszukiwane jest <em>null.<\/em><\/div>\n<div><em>FilterExpressionEditorFactoryRegistry<\/em> jest u\u017cywany w szczeg\u00f3lno\u015bci przez sam\u0105 infrastruktur\u0119 aplikacji typu <em>Lista.<\/em> Mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywany, np. do ponownego wykorzystania istniej\u0105cej implementacji w oddzielnym <em>FilterExpressionEditorFactory<\/em> (delegacja).<\/div>\n<h5 id=\"kolumny-wirtualne\" ><span class=\"ez-toc-section\" id=\"Kolumny_wirtualne-3\"><\/span>Kolumny wirtualne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W przypadku kolumn wirtualnych (patrz sekcja <a href=\"#PRL7\"><em>Pole wyboru: Wirtualnie<\/em><\/a>), wyra\u017cenia filtruj\u0105ce s\u0105 zawsze wymieniane z <em>FilterExpressionEditor<\/em> za po\u015brednictwem instancji <em>CompoundFilterExpression,<\/em> przy czym wzgl\u0119dne nazwy podatrybut\u00f3w s\u0105 u\u017cywane jako klucze (patrz sekcja <em><a href=\"#PRL34\">CompoundFilterExpression<\/a>).<\/em><\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>Wirtualna kolumna o nazwie <em>vattr<\/em> ma dwa podatrybuty <em>vattr.attr1<\/em> i <em>vattr.attr2.<\/em> Podatrybut <em>attr1<\/em> jest oparty na zestawie warto\u015bci <em>com.example.ValueSet1,<\/em> a podatrybut <em>attr2<\/em> jest oparty na zestawie warto\u015bci <em>com.example.ValueSet2.<\/em> Ponadto oba podatrybuty s\u0105 oznaczone jako filtrowalne w obiekcie deweloperskim <em>Search. FilterExpressionEditor<\/em> dla tej wirtualnej kolumny m\u00f3g\u0142by wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">package com.example;\nimport com.cisag.pgm.datatype.Guid;\nimport com.cisag.pgm.dialogue.model.DataDescription;\nimport com.cisag.pgm.gui.MultiValueSetField;\nimport com.cisag.pgm.gui.VisualElement;\nimport com.cisag.pgm.search.filter.CompoundFilterExpression;\nimport com.cisag.pgm.search.filter.FilterExpression;\nimport com.cisag.pgm.search.filter.ValueSetFilterExpression;\nimport com.cisag.pgm.search.gui.FilterExpressionEditor;\nimport java.util.HashMap;\nimport java.util.Map;\npublic class VAttrFilterExpressionEditor\n\u00a0 \u00a0 implementuje FilterExpressionEditor&lt;\n\u00a0 \u00a0 \u00a0 \u00a0 CompoundFilterExpression&lt;FilterExpression&lt;?&gt;&gt; {\n\u00a0 private final String path;\n\u00a0 private final MultiValueSetField field;\n\u00a0 public VAttrFilterExpressionEditor(byte[] guid,\n\u00a0 \u00a0 \u00a0 DataDescription dataDescription) {\n\u00a0 \u00a0 this.path = (String)\n\u00a0 \u00a0 \u00a0 \u00a0 dataDescription.getValue(DataDescription.PATH);\n\u00a0 \u00a0 this.field =\n\u00a0 \u00a0 \u00a0 \u00a0 new MultiValueSetField(Guid.toHexString(guid), path);\n\u00a0 }\n\u00a0 public VisualElement getVisualElement() {\n\u00a0 \u00a0 return field;\n\u00a0 }\n\u00a0 public void initVisualElement() {\n\u00a0 \u00a0 field.addValueSet(\"com.example:ValueSet1.lt\");\n\u00a0 \u00a0 field.addValueSet(\"com.example:ValueSet2.lt\");\n\u00a0 }\n\u00a0 public CompoundFilterExpression&lt;FilterExpression&lt;?&gt;&gt; getValue() {\n\u00a0 \u00a0 short[][] selection = field.getValue();\n\u00a0 \u00a0 if (selection != null &amp;&amp; selection.length &gt; 0) {\n\u00a0 \u00a0 \u00a0 Map&lt;String, FilterExpression&lt;?&gt;&gt; map =\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 new HashMap&lt;String, FilterExpression&lt;?&gt;&gt;();\n\u00a0 \u00a0 \u00a0 if (selection[0] != null &amp;&amp; selection[0].length &gt; 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 map.put(\"attr1\", ValueSetFilterExpression.create(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"com.example:ValueSet1.lt\", selection[0]);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 if (selection[1] != null &amp;&amp; selection[1].length &gt; 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 map.put(\"attr2\", ValueSetFilterExpression.create(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"com.example:ValueSet2.lt\", selection[1]);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 return CompoundFilterExpression.create(path, map);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 return null;\n\u00a0 }\n\u00a0 public void setValue(\n\u00a0 \u00a0 \u00a0 CompoundFilterExpression&lt;FilterExpression&lt;?&gt;&gt; value) {\n\u00a0 \u00a0 if (value != null) {\n\u00a0 \u00a0 \u00a0 short[][] selection = new short[2][];\n\u00a0 \u00a0 \u00a0 ValueSetFilterExpression expr1 =\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (ValueSetFilterExpression) value.getExpression(\"attr1\");\n\u00a0 \u00a0 \u00a0 if (expr1 != null) {\n\u00a0 \u00a0 \u00a0 \u00a0 selection[0] = expr1.getSelection();\n\u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 selection[0] = ... \/\/ TODO doda\u0107 wszystkie warto\u015bci VS1\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 ValueSetFilterExpression expr2 =\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (ValueSetFilterExpression) value.getExpression(\"attr2\");\n\u00a0 \u00a0 \u00a0 if (expr2 != null) {\n\u00a0 \u00a0 \u00a0 \u00a0 selection[1] = expr2.getSelection();\n\u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 selection[1] = ... \/\/ TODO doda\u0107 wszystkie warto\u015bci VS2\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 field.setValue(selection);\n\u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 field.setValue(null);\n\u00a0 \u00a0 }\n\u00a0 }\n}<\/pre>\n<p><\/div><\/section><\/p>\n<\/div>\n<h4 id=\"filterextension\" ><span class=\"ez-toc-section\" id=\"FilterExtension\"><\/span>FilterExtension<a id=\"PRL35\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Klauzula WHERE zapytania wyszukiwania jest kompilowana generycznie z wyra\u017ce\u0144 filtruj\u0105cych zdefiniowanych za pomoc\u0105 funkcji <em>setFilterExpression(),<\/em> przy czym wyra\u017cenia filtruj\u0105ce s\u0105 ze sob\u0105 po\u0142\u0105czone za pomoc\u0105 funkcji <em>AND.<\/em> Dodatkowo, klauzula <em>WHERE<\/em> mo\u017ce zosta\u0107 rozszerzona o wyra\u017cenie logiczne OQL (po\u0142\u0105czone z og\u00f3ln\u0105 cz\u0119\u015bci\u0105 klauzuli <em>WHERE).<\/em> Rozszerzenie to mo\u017cna ustawi\u0107 za pomoc\u0105 metody <em>setFilterExtension()<\/em> klas <em>GridSearchSupport<\/em> lub <em>SearchInterface<\/em> (patrz sekcje <em><a href=\"#PRL15\">GridSearchSupport<\/a><\/em> i <em><a href=\"#PRL36\">SearchHook<\/a>).<\/em> Wyra\u017cenie logiczne OQL musi zosta\u0107 przekazane do metody <em>setFiterExtension()<\/em> jako instancja klasy <em>com.cisag.pgm.search.filter.FilterExtension.<\/em><\/div>\n<div>W ramach wyra\u017cenia OQL mo\u017cna uzyska\u0107 dost\u0119p zar\u00f3wno do ustawionych wyra\u017ce\u0144 filtruj\u0105cych, jak i atrybut\u00f3w obiekt\u00f3w biznesowych zdefiniowanych w wyszukiwaniu.<\/div>\n<div>Aby uzyska\u0107 dost\u0119p do wyra\u017cenia filtru kolumny w wyra\u017ceniu OQL, odpowiednia nazwa kolumny musi by\u0107 umieszczona w nawiasach klamrowych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">new FilterExtension(\"{attr1} OR {attr2}\");<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div>U\u017cycie wyra\u017cenia filtruj\u0105cego w <em>FilterExtension<\/em> automatycznie prowadzi do usuni\u0119cia go z og\u00f3lnej cz\u0119\u015bci klauzuli <em>WHERE.<\/em> Przyk\u0142adowo, gdyby cz\u0119\u015b\u0107 og\u00f3lna w powy\u017cszym przyk\u0142adzie sk\u0142ada\u0142a si\u0119 z wyra\u017ce\u0144 filtruj\u0105cych dla <em>attr1, attr2<\/em> i <em>attr3,<\/em> w\u00f3wczas tylko <em>attr3<\/em> pozosta\u0142oby w cz\u0119\u015bci og\u00f3lnej, a ca\u0142a klauzula <em>WHERE<\/em> wygl\u0105da\u0142aby nast\u0119puj\u0105co: <em>({attr3}) AND ({attr1} OR {attr2}).<\/em><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Tylko wyra\u017cenia filtruj\u0105ce, kt\u00f3re maj\u0105 warto\u015b\u0107 niezerow\u0105, mog\u0105 by\u0107 u\u017cywane w wyra\u017ceniu OQL.<\/div>\n<div>Notacja<em> {attr}<\/em> odwo\u0142uje si\u0119 nie tylko do nazwy kolumny lub wyra\u017cenia filtruj\u0105cego, ale tak\u017ce do pe\u0142nego logicznego wyra\u017cenia OQL (wygenerowanego na podstawie zdefiniowanego wyra\u017cenia filtruj\u0105cego i metadanych kolumny).<\/div>\n<div>Aby uzyska\u0107 dost\u0119p do atrybutu obiektu biznesowego zdefiniowanego w wyszukiwaniu w wyra\u017ceniu OQL, nale\u017cy u\u017cy\u0107 zapisu <em>alias:attributeName,<\/em> przy czym alias dla obiektu biznesowego zdefiniowanego w wyszukiwaniu ma by\u0107 u\u017cywany jako alias.<\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">new FilterExtension(\"book:employee is not null\");<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div>Ponadto w wyra\u017ceniu OQL mo\u017cna u\u017cy\u0107 nazwanych parametr\u00f3w, kt\u00f3rych warto\u015bci mo\u017cna nast\u0119pnie ustawi\u0107 za pomoc\u0105 metod <em>FilterExpression<\/em> zwi\u0105zanych z typem. W wyra\u017ceniu OQL u\u017cywane nazwy parametr\u00f3w musz\u0105 by\u0107 umieszczone w nawiasach klamrowych.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">FilterExtension ext =\n\u00a0 \u00a0 new FilterExtension (\"book:employee = {paramEmploy-eeGuid}\");\next.setGuid(\"paramEmployeeGuid\",\n\u00a0 \u00a0 partnerLogic.getCurrentPartnerGuid());\n<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Nazwy parametr\u00f3w mog\u0105 by\u0107 dowolnie definiowane. Nale\u017cy jednak unika\u0107 konflikt\u00f3w z nazwami kolumn. Zalecamy stosowanie odpowiednich konwencji nazewnictwa dla parametr\u00f3w i kolumn, aby zasadniczo unikn\u0105\u0107 konflikt\u00f3w nazw.<\/div>\n<div>Wa\u017cne jest r\u00f3wnie\u017c, aby warto\u015bci by\u0142y faktycznie ustawione dla u\u017cywanych nazw parametr\u00f3w.<\/div><\/section><\/div>\n<h4 id=\"searchhook\" ><span class=\"ez-toc-section\" id=\"SearchHook\"><\/span>SearchHook<a id=\"PRL36\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Zapytaniem do bazy danych mo\u017cna manipulowa\u0107 przed jego wykonaniem (patrz rozdzia\u0142 <a href=\"#PRL36\"><em>Manipulowanie zapytaniem do bazy danych<\/em><\/a>). Manipulacji tej mo\u017cna dokona\u0107 poprzez zmian\u0119 metody <em>preSearch()<\/em> (patrz: <em><a href=\"#PRL37\">preSearch<\/a>)<\/em> lub poprzez implementacj\u0119 <em>SearchHook. SearchHook<\/em> to Java class, kt\u00f3ra wywodzi si\u0119 z abstrakcyjnej klasy bazowej <em>com.cisag.pgm.search.SearchHook<\/em> i w kt\u00f3rej obiekt deweloperski <em>Search<\/em> jest wprowadzany jako hook.<\/div>\n<div>Klasa bazowa <em>com.cisag.pgm.search.SearchHook<\/em> jest zgodna z tym samym wzorcem, co klasa <em>com.cisag.pgm.objsearch.SearchHook<\/em> (klasa bazowa dla wyszukiwania OQL), tj. konkretne podklasy definiuj\u0105 w swoim konstruktorze, kt\u00f3re hook faktycznie implementuj\u0105. Obecnie jednak klasa bazowa definiuje tylko jeden taki hook: <em>PRE_SEARCH<\/em> oraz powi\u0105zan\u0105 z nim metod\u0119 <em>preSearch(SearchInterface).<\/em> Wewn\u0119trzny interfejs <em>SearchInterface<\/em> s\u0142u\u017cy jako opakowanie dla bie\u017c\u0105cego zapytania do bazy danych i umo\u017cliwia wysy\u0142anie zapyta\u0144 i ustawianie wyra\u017ce\u0144 filtruj\u0105cych oraz <em>FilterExtension.<\/em><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class BookSearchHook extends SearchHook {\n\u00a0 public BookSearchHook() {\n\u00a0 \u00a0 this(0, 0);\n\u00a0 }\n\u00a0 protected BookSearchHook(int activeHooks, intactiveHooks) {\n\u00a0 \u00a0 super(activeHooks|PRE_SEARCH, inactiveHooks);\n\u00a0 }\n\u00a0 @Override\n\u00a0 public void preSearch(SearchInterface si) {\n\u00a0 \u00a0 super.preSearch(si);\n\u00a0 \u00a0 PartnerLogic partnerLogic = PartnerLogic.getInstance();\n\u00a0 \u00a0 FilterExtension ext =\n\u00a0 \u00a0 \u00a0 \u00a0 new FilterExtension(\"book:employee = {paramEmployeeGuid}\");\n\u00a0 \u00a0 ext.setGuid(\"paramEmployeeGuid\",\n\u00a0 \u00a0 \u00a0 \u00a0 partnerLogic.getCurrentPartnerGuid());\n\u00a0 \u00a0 si.setFilterExtension(ext);\n\u00a0 }\n}<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div>Implementacja <em>SearchHook<\/em> mo\u017ce by\u0107 r\u00f3wnie\u017c zarejestrowana jako hook dla wi\u0119cej ni\u017c jednego wyszukiwania. W takim przypadku implementacja powinna r\u00f3wnie\u017c zmieni\u0107 metod\u0119 <em>init<\/em> klasy bazowej, tak aby mia\u0142a dost\u0119p do nazwy wyszukiwania i obiektu bazowego wyszukiwania. Odpowiedni obiekt bazowy musi by\u0107 przechowywany z odpowiednim wyszukiwaniem (patrz rozdzia\u0142 <em><a href=\"#PRL10\">Hook<\/a><\/em><em>).<\/em><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W przypadku wyszukiwania, <em>SearchHook<\/em> i zmiana metody <em>preSearch()<\/em> (patrz: <a href=\"#PRL36\"><em>preSearch<\/em><\/a>) z <em>CisCustomisableCockpit<\/em> (patrz: <em><a href=\"#PRL9\">CisCustomisableCockpit<\/a><\/em> ) lub <em>SearchView<\/em> (patrz: <em><a href=\"#PRL14\">SearchView<\/a><\/em>) nie powinny by\u0107 \u0142\u0105czone ze sob\u0105, je\u015bli to mo\u017cliwe, poniewa\u017c w przeciwnym razie istnieje ryzyko, \u017ce jedna implementacja nieumy\u015blnie zignoruje ustawienia drugiej implementacji.<\/div><\/section><\/div>\n<h4 id=\"businessobjectregistryhook\" ><span class=\"ez-toc-section\" id=\"BusinessObjectRegistryHook\"><\/span>BusinessObjectRegistryHook<a id=\"PRL31\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Je\u015bli warto\u015bci zestawu warto\u015bci s\u0105 ograniczone przez opis danych, prowadzi to do bardziej z\u0142o\u017conych zapyta\u0144 do bazy danych, poniewa\u017c w tym przypadku wszystkie warto\u015bci zdefiniowane w opisie danych s\u0105 automatycznie uwzgl\u0119dniane w klauzuli <em>WHERE<\/em> zapytania do bazy danych (patrz rozdzia\u0142 <em><a href=\"#PRL30\">ValueSetFilterExpression<\/a><\/em><em>).<\/em> Dzieje si\u0119 tak r\u00f3wnie\u017c w przypadku, gdy kolumna nie jest u\u017cywana jako filtr. Je\u015bli upewniono si\u0119, \u017ce tylko warto\u015bci okre\u015blone w opisie danych mog\u0105 faktycznie wyst\u0105pi\u0107 w danej kolumnie, dana kolumna powinna zosta\u0107 oznaczona jako kompletna za po\u015brednictwem hook <em>com.cisag.pgm.appserver.hook.BusinessObjectRegistryHook<\/em> jako kompletna. W tym przypadku pozwala to unikn\u0105\u0107 niepotrzebnego rozszerzania klauzuli <em>WHERE<\/em>.<\/div>\n<div>Aby oznaczy\u0107 zestaw warto\u015bci jako kompletny, nale\u017cy wywo\u0142a\u0107 jedn\u0105 z metod <em>registerValueSetComplete<\/em> w metodzie <em>initialise()<\/em> implementacji hook.<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\u00a0<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class BusinessObjectRegistryHookImpl\n\u00a0 \u00a0 implementuje BusinessObjectRegistryHook {\n\u00a0 public BusinessObjectRegistryHookImpl() {\n\u00a0 }\n\u00a0 public void initialise(BusinessObjectRegistry registry) {\n\u00a0 \u00a0 registry.registerValueSetComplete(\n\u00a0 \u00a0 \u00a0 \u00a0 SalesOrderDetail.class, \"accountOriginType\");\n\u00a0 }\n}<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Etykietowanie zawsze odnosi si\u0119 do konkretnego atrybutu obiektu biznesowego, a nie og\u00f3lnie do logicznego typu danych lub<em> Data description.<\/em><\/div>\n<div>Hook mo\u017ce by\u0107 u\u017cywany tylko do wp\u0142ywania na atrybuty, kt\u00f3re nale\u017c\u0105 do tej samej przestrzeni nazw co hook.<\/div><\/section><\/div>\n<h5 id=\"datadescriptionfilter\" ><span class=\"ez-toc-section\" id=\"DataDescriptionFilter\"><\/span>DataDescriptionFilter<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>DataDescriptionFilter<\/em> mo\u017ce by\u0107 u\u017cyta do zmiany pewnych w\u0142a\u015bciwo\u015bci opisu danych w czasie wykonywania. Przyk\u0142adowo, <em>DataDescriptionFilter<\/em> mo\u017ce by\u0107 u\u017cywany do kontrolowania widoczno\u015bci kolumny w zale\u017cno\u015bci od funkcji lub ustawienia konfiguracji.<\/div>\n<div>Aby zarejestrowa\u0107 <em>DataDescriptionFilter<\/em> dla logicznego typu danych, w pe\u0142ni kwalifikowana nazwa klasy, kt\u00f3ra implementuje nast\u0119puj\u0105cy interfejs, musi by\u0107 przechowywana w powi\u0105zanym opisie danych:<\/div>\n<div><em>com.cisag.pgm.datatype.DataDescriptionFilter<\/em><\/div>\n<div>Interfejs ten definiuje metod\u0119 <em>getModification(),<\/em> kt\u00f3ra musi zwraca\u0107 odpowiednio skonfigurowan\u0105 instancj\u0119 <em>DataDescriptionModification<\/em> (patrz sekcja <em><a href=\"#PRL37\">DataDescriptionModification<\/a>).<\/em><\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class ExampleDataDescriptionFilter\n\u00a0 \u00a0 implements DataDescriptionFilter {\n\u00a0 public DataDescriptionModification getModification(\n\u00a0 \u00a0 \u00a0 DataDescription dataDescription) {\n\u00a0 \u00a0 CisSystemManager sm =\n\u00a0 \u00a0 \u00a0 \u00a0 CisEnvironment.getInstance().getSystemManager();\n\u00a0 \u00a0 if (sm.isAvailable(\"com.example.Example\")) {\n\u00a0 \u00a0 \u00a0 return DataDescriptionModification.UNMODIFIED;\n\u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 return DataDescriptionModification.EXCLUDED;\n\u00a0 \u00a0 }\n}<\/pre>\n<\/div>\n<div><\/div><\/section><\/div>\n<div>\u00a0<\/div>\n<div><em>DataDescriptionFilter<\/em> s\u0105 oceniane nie tylko przez aplikacje typu <em>Lista,<\/em> ale maj\u0105 r\u00f3wnie\u017c zastosowanie do atrybut\u00f3w <em>Widoki obiekt\u00f3w<\/em> w konfigurowalnych aplikacjach.<\/div>\n<h5 id=\"datadescriptionmodification\" ><span class=\"ez-toc-section\" id=\"DataDescriptionModification\"><\/span>DataDescriptionModification<a id=\"PRL37\"><\/a><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>Klasa <em>com.cisag.pgm.datatype.DataDescriptionModification<\/em> opisuje zmiany, kt\u00f3re nale\u017cy wprowadzi\u0107 w opisie danych. Instancje <em>DataDescriptionModification<\/em> mo\u017cna tworzy\u0107 i konfigurowa\u0107 za pomoc\u0105 statycznej metody Factory <em>getInstance(Flags)<\/em>. Klasa zapewnia r\u00f3wnie\u017c cz\u0119sto wymagane konfiguracje jako sta\u0142e statyczne.<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 184px; width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Warto\u015b\u0107<\/strong><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Sta\u0142a<\/strong><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 26.6666%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>UNMODIFIED <\/em><\/td>\n<td style=\"width: 27.7381%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>UNMODIFIED <\/em><\/td>\n<td style=\"width: 45.5952%; height: 46px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Bez zmian. Obowi\u0105zuj\u0105 ustawienia zdefiniowane w opisie danych.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>HIDDEN <\/em><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>HIDDEN <\/em><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Atrybut lub kolumna nie jest wy\u015bwietlana w interfejsie u\u017cytkownika.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>DISABLED <\/em><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>DISABLED <\/em><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Atrybut lub kolumna s\u0105 wy\u015bwietlane jako nieaktywne w interfejsie u\u017cytkownika.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>READ_ONLY<\/em><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>READ_ONLY<\/em><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Atrybutu lub kolumny nie mo\u017cna zmieni\u0107 w interfejsie u\u017cytkownika.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>REQUIRED <\/em><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>REQUIRED <\/em><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Dla atrybutu wymagany jest wpis.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 26.6666%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>EXCLUDED <\/em><\/td>\n<td style=\"width: 27.7381%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><em>EXCLUDED <\/em><\/td>\n<td style=\"width: 45.5952%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Podobnie jak <em>HIDDEN,<\/em> ale z tym znaczeniem, \u017ce dany atrybut jest og\u00f3lnie niedost\u0119pny, podczas gdy w przypadku <em>HIDDEN<\/em> tylko wy\u015bwietlanie jest wy\u0142\u0105czone.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Tylko warto\u015bci <em>UNMODIFIED<\/em> i <em>EXCLUDED<\/em> (lub <em>HIDDEN)<\/em> s\u0105 wa\u017cne dla aplikacji typu <em>Lista.<\/em> Wszystkie inne warto\u015bci s\u0105 istotne tylko dla kontrolowania atrybut\u00f3w w widokach obiekt\u00f3w lub konfigurowanej aplikacji.<\/div><\/section><\/div>\n<h5 id=\"repositoryonly\" ><span class=\"ez-toc-section\" id=\"RepositoryOnly\"><\/span>RepositoryOnly<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div>W przypadku <em>DataDescriptionFilters<\/em> system zawsze zak\u0142ada, \u017ce wymagaj\u0105 one kontekstu z baz\u0105 danych OLTP i dlatego wywo\u0142uje je tylko wtedy, gdy taki kontekst faktycznie istnieje. Je\u015bli nie ma kontekstu z baz\u0105 danych OLTP, filtr jest ignorowany. Niemniej jednak, <em>DataDescriptionFilter<\/em> mo\u017ce r\u00f3wnie\u017c implementowa\u0107 interfejs <em>RepositoryOnly,<\/em> je\u015bli nie wymaga kontekstu z baz\u0105 danych OLTP i chce by\u0107 wywo\u0142ywany nawet wtedy, gdy nie istnieje kontekst z baz\u0105 danych OLTP.<\/div>\n<div>\u00a0<\/div>\n<div><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Mo\u017ce wyst\u0105pi\u0107 przypadek, w kt\u00f3rym nie istnieje kontekst z baz\u0105 danych OLTP, np. je\u015bli serwer aplikacji jest uruchamiany bez baz danych OLTP (instalacja aktualizacji oprogramowania) lub u\u017cytkownik loguje si\u0119 bez bazy danych OLTP.<\/div><\/section><\/div>\n<h3 id=\"ustawienia\" ><span class=\"ez-toc-section\" id=\"Ustawienia\"><\/span>Ustawienia<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"uprawnienia\" ><span class=\"ez-toc-section\" id=\"Uprawnienia\"><\/span>Uprawnienia<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Poni\u017csze <em>Capability<\/em> dotycz\u0105 aplikacji typu <em>Lista<\/em> (w tym <em>SearchView):<\/em><\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"width: 100%; border-collapse: collapse; border-color: #000000; background-color: #ffffff; border-style: outset; height: 185px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 47.7381%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 23px;\" scope=\"rowgroup\"><strong>Capability<\/strong><\/td>\n<td style=\"width: 52.2619%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 23px;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 47.7381%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 70px;\" scope=\"rowgroup\">com.cisag.sys.objsearch.IgnoreSearchTimeout<\/td>\n<td style=\"width: 52.2619%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 70px;\" scope=\"rowgroup\">U\u017cytkownik mo\u017ce r\u00f3wnie\u017c wykona\u0107 wyszukiwanie, je\u015bli jego czas wykonania przekracza okre\u015blon\u0105 warto\u015b\u0107 maksymaln\u0105 (warto\u015b\u0107 domy\u015blna: 1 minuta).<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 47.7381%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\">com.cisag.sys.search.ChangeSettingsForAllUsers<\/td>\n<td style=\"width: 52.2619%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\">U\u017cytkownik mo\u017ce tworzy\u0107, zmienia\u0107 i usuwa\u0107 widoki na poziomie bazy danych.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 47.7381%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\">com.cisag.sys.search.ChangeMetadata<\/td>\n<td style=\"width: 52.2619%; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center; height: 46px;\" scope=\"rowgroup\">U\u017cytkownik mo\u017ce rozszerzy\u0107 lub zmniejszy\u0107 zestaw kolumn.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h4 id=\"wlasciwosci\" ><span class=\"ez-toc-section\" id=\"Wlasciwosci\"><\/span>W\u0142a\u015bciwo\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div>Na standardowe zachowanie aplikacji typu <em>Lista<\/em> mo\u017cna wp\u0142ywa\u0107 za pomoc\u0105 nast\u0119puj\u0105cych w\u0142a\u015bciwo\u015bci:<\/div>\n<div>\u00a0<\/div>\n<div>\n<table style=\"height: 138px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>W\u0142a\u015bciwo\u015b\u0107<\/strong><\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\"><strong>Obja\u015bnienie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>com.cisag.pgm.search.gui.GridSearchSupport.<\/em><\/div>\n<div><em>defaultBufferSize<\/em><\/div>\n<\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>Maksymalna liczba rekord\u00f3w danych wy\u015bwietlanych jako wynik w aplikacji typu <em>Lista.<\/em><\/div>\n<div>Domy\u015bln\u0105 warto\u015bci\u0105 dla liczby obiekt\u00f3w jest 1000. Warto\u015bci wi\u0119ksze ni\u017c 1000 powinny by\u0107 u\u017cywane tylko wtedy, gdy serwer aplikacji ma wystarczaj\u0105ce zasoby, tj. procesory i pami\u0119\u0107 g\u0142\u00f3wn\u0105, aby obs\u0142u\u017cy\u0107 dodatkowe obci\u0105\u017cenie.<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>com.cisag.pgm.search.gui.GridSearchSupport.<\/em><\/div>\n<div><em>asynchBufferSize<\/em><\/div>\n<\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Maksymalna liczba obiekt\u00f3w otwieranych podczas <em>Aktualizuj (w tle)<\/em>. Domy\u015blna warto\u015b\u0107 liczby obiekt\u00f3w to 100000.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>com.cisag.pgm.search.<\/em><\/div>\n<div><em>gui.GridSearchSupport.maximumDetailRows<\/em><\/div>\n<\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Maksymalna liczba obiekt\u00f3w danych szczeg\u00f3\u0142owych, kt\u00f3re s\u0105 otwierane na obiekt g\u0142\u00f3wny. Domy\u015bln\u0105 warto\u015bci\u0105 liczby obiekt\u00f3w jest 10.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div>\u00a0<\/div>\n<div><em>com.cisag.pgm.gui.DefaultExportLimit<\/em><\/div>\n<\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Maksymalna liczba obiekt\u00f3w, kt\u00f3re mo\u017ce wyeksportowa\u0107 u\u017cytkownik bez uprawnie\u0144 administratora. Warto\u015b\u0107 domy\u015blna to 231-1, ale nie wi\u0119cej ni\u017c warto\u015b\u0107 <em>MaximumExportLimit.<\/em><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 46.3095%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">\n<div><em>com.cisag.pgm.gui.<\/em><\/div>\n<div><em>MaximumExportLimit<\/em><\/div>\n<\/td>\n<td style=\"width: 53.6905%; height: 23px; border-color: #000000; background-color: #ffffff; border-style: outset; text-align: center;\" scope=\"rowgroup\">Maksymalna liczba obiekt\u00f3w, kt\u00f3re mo\u017cna wyeksportowa\u0107 z aplikacji typu <em>Lista<\/em> (niezale\u017cnie od uprawnie\u0144 u\u017cytkownika). Warto\u015b\u0107 domy\u015blna to 231-1.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div>\u00a0<\/div>\n<h6 id=\"debugowanie\" ><span class=\"ez-toc-section\" id=\"Debugowanie\"><\/span>Debugowanie<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<div>W celu analizy zapyta\u0144 do bazy danych, dodatkowe informacje mog\u0105 by\u0107 wy\u015bwietlane na konsoli za pomoc\u0105 narz\u0119dzia wiersza polece\u0144 <em>Debugowanie klas<\/em> (<em>dbgcls<\/em>):<\/div>\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dbgcls -class:com.cisag.sys.kernel.caching.CisComplexOqlCache<\/pre>\n<\/div>\n<div>Wi\u0119cej informacji na temat tego narz\u0119dzia mo\u017cna znale\u017a\u0107 w dokumentacji: <em>Debugowanie klas<\/em>.<\/div>\n\n\n<p><\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9699","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\/9699","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=9699"}],"version-history":[{"count":28,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9699\/revisions"}],"predecessor-version":[{"id":32075,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9699\/revisions\/32075"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}