{"id":9697,"date":"2025-09-08T11:28:37","date_gmt":"2025-09-08T09:28:37","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9697"},"modified":"2025-09-08T11:28:39","modified_gmt":"2025-09-08T09:28:39","slug":"podrecznik-referencyjny-wyszukiwanie","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/","title":{"rendered":"Podr\u0119cznik referencyjny: Wyszukiwanie"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#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-referencyjny-wyszukiwanie\/#Zastosowanie_wyszukiwania\" >Zastosowanie wyszukiwania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Pomoc_wyszukiwania_wartosci\" >Pomoc wyszukiwania warto\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wyszukiwanie_specyficzne_dla_aplikacji_w_naglowku_aplikacji\" >Wyszukiwanie specyficzne dla aplikacji w nag\u0142\u00f3wku aplikacji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Aplikacje_typu_lista\" >Aplikacje typu lista<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Przebieg_pomocy_wyszukiwania_wartosci\" >Przebieg pomocy wyszukiwania warto\u015bci<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wykonanie_wyszukiwania\" >Wykonanie wyszukiwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Przygotowania\" >Przygotowania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wstepne_wyszukiwanie\" >Wst\u0119pne wyszukiwanie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wizualizacja_jako_wyszukiwanie_w_oknie_dialogowym\" >Wizualizacja jako wyszukiwanie w oknie dialogowym<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wizualizacja_jako_lista_wyboru\" >Wizualizacja jako lista wyboru<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Przejecie_wynikow\" >Przej\u0119cie wynik\u00f3w<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wyszukiwanie_standardowe\" >Wyszukiwanie standardowe<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wyszukiwanie_specyficzne_dla_aplikacji_w_naglowku\" >Wyszukiwanie specyficzne dla aplikacji w nag\u0142\u00f3wku<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Przejmowanie_wartosci_do_aplikacji\" >Przejmowanie warto\u015bci do aplikacji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Cele_operacji_Drag_Drop\" >Cele operacji Drag&amp;Drop<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Obiekty_zalezne_od_czasu\" >Obiekty zale\u017cne od czasu<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchManager\" >SearchManager<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchManager_w_pakiecie_comcisagpgmdialog\" >SearchManager w pakiecie com.cisag.pgm.dialog<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchManager_w_pakiecie_comcisagpgmobjsearch\" >SearchManager w pakiecie com.cisag.pgm.objsearch<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchResultHandler\" >SearchResultHandler<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#DefaultSearchManager\" >DefaultSearchManager<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#BaseGuiSearchManager\" >BaseGuiSearchManager<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Implementacja_wlasnego_SearchManager\" >Implementacja w\u0142asnego SearchManager<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wyswietlanie_wielu_widokow_lub_wyszukiwan_w_wyszukiwaniu_dialogowym\" >Wy\u015bwietlanie wielu widok\u00f3w lub wyszukiwa\u0144 w wyszukiwaniu dialogowym<\/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-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchViews_i_lista_wyboru\" >SearchViews i lista wyboru<\/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-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchIterator\" >SearchIterator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Pola_cech_wyszukiwania\" >Pola cech wyszukiwania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Mozliwosci_wprowadzania_w_polach_cech_wyszukiwania\" >Mo\u017cliwo\u015bci wprowadzania w polach cech wyszukiwania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Hooki\" >Hooki<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchHook\" >SearchHook<\/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-referencyjny-wyszukiwanie\/#SearchIteratorHook\" >SearchIteratorHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SelectionFieldHook\" >SelectionFieldHook<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SimpleEntityFields_i_GuidSelection\" >SimpleEntityFields i GuidSelection<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#ExecuteHook\" >ExecuteHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#ResultHooks\" >ResultHooks<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#ResultChangeContentHook\" >ResultChangeContentHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#ResultFilterHook\" >ResultFilterHook<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#VisualisationHooks\" >VisualisationHooks<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#VisualisationColumnHook\" >VisualisationColumnHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#VisualisationListHook\" >VisualisationListHook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#VisualisationTableHook\" >VisualisationTableHook<\/a><\/li><\/ul><\/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-referencyjny-wyszukiwanie\/#Przestawienie_InterfaceHooks_na_abstrakcyjna_klase_SearchHook\" >Przestawienie InterfaceHooks na abstrakcyjn\u0105 klas\u0119 SearchHook<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Dane_wykonywania_wyszukiwania\" >Dane wykonywania wyszukiwania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Zachowania_specjalne\" >Zachowania specjalne<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Identyfikacja_i_oznaczenie\" >Identyfikacja i oznaczenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Znacznik_usuwania\" >Znacznik usuwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Niewidoczny\" >Niewidoczny<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Kontekst_wyszukiwania\" >Kontekst wyszukiwania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Ustawienia_w_definicjach_wyszukiwania\" >Ustawienia w definicjach wyszukiwania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Interfejsy\" >Interfejsy<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchContextProvider\" >SearchContextProvider<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchContext\" >SearchContext<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchContextData\" >SearchContextData<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Klasa_pomocnicza_SearchContextUtility\" >Klasa pomocnicza SearchContextUtility<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Kolejnosc_ustalania\" >Kolejno\u015b\u0107 ustalania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Kontekst_wyszukiwania_w_wyszukiwaniu_nawigatora_zaleznym_od_aplikacji\" >Kontekst wyszukiwania w wyszukiwaniu nawigatora zale\u017cnym od aplikacji<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Czesci_specjalne\" >Cz\u0119\u015bci specjalne<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-60\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#DomesticAmount\" >DomesticAmount<\/a><\/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-referencyjny-wyszukiwanie\/#ForeignAmount_Quantity_Duration\" >ForeignAmount, Quantity, Duration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-62\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#StorageLocation_RLB_Row-Level-Bin\" >StorageLocation_RLB (Row-Level-Bin)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-63\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Duration\" >Duration<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-64\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Valueset_%E2%80%93_wartosci_0\" >Valueset &#8211; warto\u015bci 0<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-65\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Powod_dodawania_wartosci_null\" >Pow\u00f3d dodawania warto\u015bci null<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-66\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wznawianie_wyszukiwan\" >Wznawianie wyszukiwa\u0144<\/a><\/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-referencyjny-wyszukiwanie\/#Sortowania\" >Sortowania<\/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-referencyjny-wyszukiwanie\/#Metadane\" >Metadane<\/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-referencyjny-wyszukiwanie\/#Dialog_sortowania\" >Dialog sortowania<\/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-referencyjny-wyszukiwanie\/#Kolejnosc_sortowania_w_bazie_danych_i_Comarch_ERP_Enterprise\" >Kolejno\u015b\u0107 sortowania w bazie danych i Comarch ERP Enterprise<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-71\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SortOrderAction\" >SortOrderAction<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-72\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wielkosc_liter\" >Wielko\u015b\u0107 liter<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-73\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Ustawienia_rejestru_CaseSensitivityRegistry\" >Ustawienia rejestru CaseSensitivityRegistry<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-74\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#SearchActions\" >SearchActions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-75\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Buforowanie_wynikow_wyszukiwania_w_pamieci_podrecznej\" >Buforowanie wynik\u00f3w wyszukiwania w pami\u0119ci podr\u0119cznej<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-76\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wstepne_wypelnianie_danych\" >Wst\u0119pne wype\u0142nianie danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-77\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Debugowanie\" >Debugowanie<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-78\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wyswietlanie_OQL_na_konsoli\" >Wy\u015bwietlanie OQL na konsoli<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-79\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Zmiana_maksymalnej_liczby_rekordow\" >Zmiana maksymalnej liczby rekord\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-80\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-wyszukiwanie\/#Wydajnosc\" >Wydajno\u015b\u0107<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p>W Comarch ERP Enterprise, wyszukiwania umo\u017cliwiaj\u0105 kontrolowane znajdowanie obiekt\u00f3w w bazie danych. Dla u\u017cytkownika, wyszukiwania pojawiaj\u0105 si\u0119 jako narz\u0119dzie pomocnicze w formie pomocy warto\u015bci dla p\u00f3l oraz jako wyszukiwania specyficzne dla aplikacji w obszarze nawigacji. Ponadto, wyszukiwania s\u0105 r\u00f3wnie\u017c u\u017cywane w aplikacjach, np. w aplikacjach typu lista.<\/p>\n<p>Ten artyku\u0142 wyja\u015bnia, co dzieje si\u0119 pod powierzchni\u0105, jak przebiega proces wyszukiwania oraz jakie mo\u017cliwo\u015bci ingerencji ma programista. Odnosi si\u0119 tak\u017ce do przypadk\u00f3w specjalnych, np. cz\u0119\u015bci specjalnych, ponownego uruchamiania itd.<\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Programi\u015bci<\/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<h4 id=\"zastosowanie-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Zastosowanie_wyszukiwania\"><\/span>Zastosowanie wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wyszukiwania w Comarch ERP Enterprise s\u0105 oferowane w r\u00f3\u017cnych miejscach i w r\u00f3\u017cnych formach.<\/p>\n<h5 id=\"pomoc-wyszukiwania-wartosci\" ><span class=\"ez-toc-section\" id=\"Pomoc_wyszukiwania_wartosci\"><\/span>Pomoc wyszukiwania warto\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Pomoc wyszukiwania warto\u015bci jest przedstawiana jako lista wyboru lub okno dialogowe wyszukiwania.<\/p>\n<p>Lista wyboru jest zawsze wizualizowana bezpo\u015brednio przy polu, dla kt\u00f3rego zosta\u0142a wywo\u0142ana. Wynik wyszukiwania mo\u017ce by\u0107 zaw\u0119\u017cony przez tre\u015b\u0107 pola. Lista wyboru zawiera od 2 do 60 pozycji. W zale\u017cno\u015bci od ustawie\u0144 mo\u017cna wybra\u0107 jedn\u0105 lub wi\u0119cej pozycji i przenie\u015b\u0107 je do wywo\u0142uj\u0105cego pola.<\/p>\n<p>W oknie dialogowym wyszukiwania wynik mo\u017ce by\u0107 zaw\u0119\u017cony przez wprowadzenie wielu kryteri\u00f3w wyszukiwania. Okno dialogowe wyszukiwania jest podzielone na nag\u0142\u00f3wek i obszar roboczy. W nag\u0142\u00f3wku mo\u017cna wprowadzi\u0107 wspomniane kryteria. Kryteria te mo\u017cna tak\u017ce zapisa\u0107 jako wzorce wyszukiwania i wykorzystywa\u0107 je p\u00f3\u017aniej. Obszar roboczy zawiera list\u0119 wszystkich znalezionych element\u00f3w. W zale\u017cno\u015bci od ustawie\u0144, mo\u017cna wybra\u0107 jeden lub wi\u0119cej element\u00f3w z wynik\u00f3w wyszukiwania i przenie\u015b\u0107 je do wywo\u0142uj\u0105cego pola.<\/p>\n<h5 id=\"wyszukiwanie-specyficzne-dla-aplikacji-w-naglowku-aplikacji\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_specyficzne_dla_aplikacji_w_naglowku_aplikacji\"><\/span>Wyszukiwanie specyficzne dla aplikacji w nag\u0142\u00f3wku aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W nag\u0142\u00f3wku znajduje si\u0119 zak\u0142adka <em>Wyszukiwania<\/em>. Zawarto\u015b\u0107 tej zak\u0142adki zale\u017cy od aktualnej aplikacji. Poprzez pole wyboru mo\u017cna wybiera\u0107 r\u00f3\u017cne wyszukiwania. Prezentacja wyszukiwania w tej zak\u0142adce jest zbli\u017cona do okna dialogowego wyszukiwania. Poniewa\u017c szeroko\u015b\u0107 wyszukiwania jest mocno ograniczona, nazwy p\u00f3l w nag\u0142\u00f3wku aplikacji s\u0105 wy\u015bwietlane nad swoimi polami.<\/p>\n<h5 id=\"aplikacje-typu-lista\" ><span class=\"ez-toc-section\" id=\"Aplikacje_typu_lista\"><\/span>Aplikacje typu lista<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Do wyszukiwania obiekt\u00f3w rozwijane s\u0105 r\u00f3wnie\u017c aplikacje do zapyta\u0144. Z mo\u017cliwo\u015bci wyszukiwania oferowanych w Comarch ERP Enterprise, tutaj wykorzystywane s\u0105 jedynie czyste operacje wyszukiwania. Projekt i struktura wyszukiwania nie podlegaj\u0105 \u017cadnym ograniczeniom. Aplikacje do zapyta\u0144 nie b\u0119d\u0105 dalej omawiane w tym artykule.<\/p>\n<h4 id=\"przebieg-pomocy-wyszukiwania-wartosci\" ><span class=\"ez-toc-section\" id=\"Przebieg_pomocy_wyszukiwania_wartosci\"><\/span>Przebieg pomocy wyszukiwania warto\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Przebieg pomocy wyszukiwania warto\u015bci odbywa si\u0119 zasadniczo w czterech krokach: przygotowanie, wst\u0119pne wyszukiwanie, wizualizacja i przej\u0119cie wyniku. Najpierw wyszukiwanie jest przygotowywane poprzez za\u0142adowanie metadanych i inicjalizacj\u0119 danych czasu dzia\u0142ania. W zale\u017cno\u015bci od sposobu uruchomienia i danych wprowadzonych przez u\u017cytkownika, mo\u017ce zosta\u0107 wykonane wst\u0119pne wyszukiwanie. Je\u015bli wst\u0119pne wyszukiwanie zwr\u00f3ci dok\u0142adnie jeden wynik, jest on od razu przenoszony do pola. W pozosta\u0142ych przypadkach wy\u015bwietlana jest wizualizacja (lista wyboru lub okno dialogowe). W li\u015bcie wyboru u\u017cytkownik mo\u017ce wybra\u0107 jedn\u0105 z wy\u015bwietlanych warto\u015bci i przenie\u015b\u0107 j\u0105 do pola. W oknie dialogowym wyszukiwania wynik mo\u017cna dodatkowo zaw\u0119zi\u0107, wprowadzaj\u0105c kryteria wyszukiwania, a nast\u0119pnie przenie\u015b\u0107 do pola.<\/p>\n<p>W przypadku p\u00f3l wielowarto\u015bciowych, w obu wizualizacjach mo\u017cliwe jest wybranie i przej\u0119cie wi\u0119cej ni\u017c jednego rekordu.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dost\u0119pne mo\u017cliwo\u015bci ingerencji s\u0105 tylko wspomniane w opisie przebiegu. Dok\u0142adniejsze informacje na ich temat znajduj\u0105 si\u0119 w kolejnych rozdzia\u0142ach tego artyku\u0142u.<\/div><\/section>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przedstawione\u00a0grafiki wykorzystuj\u0105 r\u00f3\u017cne kolory do wyja\u015bnienia pewnych aspekt\u00f3w: przebieg jest w kolorze pomara\u0144czowym. Hooki\u00a0s\u0105 na niebieskim tle. Pozosta\u0142e klasy znajduj\u0105 si\u0119 na zielonym tle.<\/div><\/section>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-36204 aligncenter\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_1-1.png\" alt=\"\" width=\"161\" height=\"281\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_1-1.png 161w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_1-1-29x50.png 29w\" sizes=\"auto, (max-width: 161px) 100vw, 161px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Przegl\u0105d przebiegu pomocy wyszukiwania warto\u015bci<\/em><\/p>\n<h5 id=\"wykonanie-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Wykonanie_wyszukiwania\"><\/span>Wykonanie wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W kolejnych rozdzia\u0142ach, w niekt\u00f3rych diagramach, pojawia si\u0119 poj\u0119cie <em>wykonanie wyszukiwania<\/em>. Kryje si\u0119 za tym nast\u0119puj\u0105cy przebieg:<\/p>\n<p>W danych czasu dzia\u0142ania zarejestrowany jest <em>SearchIterator<\/em>. Jest on parametryzowany kryteriami wyszukiwania. Kryteria te mog\u0105 pochodzi\u0107 np. z danych czasu dzia\u0142ania lub z dialogu wyszukiwania.<\/p>\n<p>Nast\u0119pnie wyszukiwanie jest wykonywane. Wykonanie wyszukiwania mo\u017ce by\u0107 modyfikowane za pomoc\u0105 <em>ExecuteHook<\/em>.<\/p>\n<p>Nie wszystkie dane s\u0105 odczytywane z bazy danych naraz. Zamiast tego, dane s\u0105 udost\u0119pniane w blokach po 60 rekord\u00f3w ka\u017cdy. Otrzymane rekordy mog\u0105 by\u0107 modyfikowane lub usuwane za pomoc\u0105 <em>ResultHooks<\/em>, a tak\u017ce mo\u017cna tworzy\u0107 nowe rekordy i dodawa\u0107 je do bloku danych. Je\u015bli liczba rekord\u00f3w z powodu hook\u00f3w spadnie poni\u017cej 60, a jednocze\u015bnie dost\u0119pne s\u0105 kolejne rekordy w iteratorze, odczytywane jest kolejne 60 rekord\u00f3w, aby uzyska\u0107 co najmniej 60 rekord\u00f3w.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36207 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_2.png\" alt=\"\" width=\"561\" height=\"621\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_2.png 561w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_2-271x300.png 271w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_2-45x50.png 45w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_2-320x354.png 320w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Przebieg wyszukiwania<\/em><\/p>\n<h5 id=\"przygotowania\" ><span class=\"ez-toc-section\" id=\"Przygotowania\"><\/span>Przygotowania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Podczas uruchamiania aplikacji, dla wszystkich p\u00f3l, kt\u00f3re wykorzystuj\u0105 wyszukiwanie, inicjowane s\u0105 zarejestrowane <em>SearchManager<\/em>. Zazwyczaj jest to klasa <em>DefaultSearchManager.<\/em><\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli zamiast <em>DefaultSearchManager <\/em>zostanie u\u017cyta w\u0142asna implementacja <em>SearchManager, <\/em>to ta implementacja b\u0119dzie decydowa\u0107 o dalszym zachowaniu wyszukiwania. Poni\u017csze wyja\u015bnienia dotycz\u0105 zatem u\u017cycia <em>DefaultSearchManager.<\/em> Je\u015bli deweloper dziedziczy po <em>DefaultSearchManager <\/em>i nadpisuje tylko oznaczone metody, mo\u017cna za\u0142o\u017cy\u0107, \u017ce opis b\u0119dzie r\u00f3wnie\u017c odpowiedni dla tej klasy.<\/div><\/section>\n<p>Gdy tylko wyszukiwanie zostanie wywo\u0142ane dla elementu wizualnego (<em>VisualElement<\/em>), w <em>SearchManager<\/em> wywo\u0142ywana jest metoda <em>searchValueFor<\/em>.<\/p>\n<p>Z bazy danych repozytorium tworzone s\u0105 dane czasu dzia\u0142ania dla wyszukiwania. Atrybuty wyszukiwania mog\u0105 by\u0107 przy tym wst\u0119pnie wype\u0142nione za pomoc\u0105 w\u0142asnego <em>SearchManager.<\/em><\/p>\n<p>Nast\u0119pnie tworzony jest <em>SearchIterator<\/em>. Zazwyczaj jest to <em>CisSearchIterator<\/em>. Iterator jest dodawany do danych czasu dzia\u0142ania. Poprzez implementacj\u0119 <em>SearchIteratorHooks<\/em> mo\u017cna pod\u0142\u0105czy\u0107 w\u0142asn\u0105 implementacj\u0119 <em>SearchIterator<\/em>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36212 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_3.png\" alt=\"\" width=\"401\" height=\"441\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_3.png 401w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_3-273x300.png 273w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_3-45x50.png 45w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_3-320x352.png 320w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Odczytanie danych wej\u015bciowych i przygotowanie wyszukiwania z podaniem hook\u00f3w<\/em><\/p>\n<h5 id=\"wstepne-wyszukiwanie\" ><span class=\"ez-toc-section\" id=\"Wstepne_wyszukiwanie\"><\/span>Wst\u0119pne wyszukiwanie<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wyszukiwanie OQL jest definiowane w bazie danych repozytorium. Dla dalszej analizy szczeg\u00f3lnie interesuj\u0105ce s\u0105 trzy ustawienia: wy\u015bwietlanie, identyfikacja specjalnego zachowania i nazwa specjalnego zachowania.<\/p>\n<p>W wyszukiwaniu okre\u015blony jest typ wy\u015bwietlania. Mo\u017cliwe warto\u015bci to <em>Okno dialogowe <\/em>i <em>ComboBox<\/em>. Wraz z tym ustawieniem, zachowuje si\u0119 oczekiwana ilo\u015b\u0107 danych. Je\u015bli jest mniejsza ni\u017c 60 rekord\u00f3w danych, nale\u017cy wybra\u0107 <em>ComboBox<\/em>. Od 60 rekord\u00f3w danych nale\u017cy wybra\u0107 ustawienie <em>Okno dialogowe<\/em>. Ponadto, w przypadku ustawienia <em>ComboBox<\/em>, wyszukiwanie jest gwarantowane, tzn. po otwarciu pomocniczej listy warto\u015bci u\u017cytkownikowi zawsze oferowany jest wyb\u00f3r, bez konieczno\u015bci jakiegokolwiek ograniczenia wyniku lub aktywnego rozpocz\u0119cia wyszukiwania. W przypadku ustawienia <em>Okno dialogowe<\/em> nie mo\u017cna tego zrobi\u0107, poniewa\u017c nie da si\u0119 oszacowa\u0107, w jakim stopniu wykonanie wyszukiwania obci\u0105\u017cy system.<\/p>\n<p>Dwa atrybuty wyszukiwania mo\u017cna opatrzy\u0107 specjalnym zachowaniem <em>Identyfikacja<\/em> i <em>Nazwa<\/em>. Jednocze\u015bnie atrybuty te musz\u0105 by\u0107 wprowadzone jako cecha wyszukiwania, warto\u015b\u0107 wy\u015bwietlana i warto\u015b\u0107 zwracana. Je\u015bli podane s\u0105 oba specjalne zachowania, pomocnicza lista warto\u015bci mo\u017ce by\u0107 ograniczona z pola wprowadzania.<\/p>\n<p>Wyszukiwanie mo\u017cna uruchomi\u0107 za pomoc\u0105 r\u00f3\u017cnych skr\u00f3t\u00f3w klawiaturowych lub klikaj\u0105c na symbol pomocniczej listy warto\u015bci w polu.<\/p>\n<p>Rozr\u00f3\u017cnia si\u0119 cztery r\u00f3\u017cne typy uruchomienia:<\/p>\n<ul>\n<li>Wyszukiwanie po identyfikacji<\/li>\n<li>Wyszukiwanie po nazwie<\/li>\n<li>Rozszerzone wyszukiwanie po identyfikacji<\/li>\n<li>Rozszerzone wyszukiwanie po nazwie<\/li>\n<\/ul>\n<p>Poni\u017csza tabela zawiera list\u0119 skr\u00f3t\u00f3w klawiaturowych i dzia\u0142a\u0144 mysz\u0105 dla ka\u017cdego typu uruchomienia.<\/p>\n<table style=\"border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; width: 100%; height: 425px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Typ uruchomienia<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Skr\u00f3t klawiszowy\/Mysz<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 133px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 133px;\">Wyszukiwanie do identyfikacji<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 133px;\">\n<ul>\n<li>ALT + strza\u0142ka w g\u00f3r\u0119<\/li>\n<li>Klikni\u0119cie mysz\u0105 na symbol pomocniczej listy warto\u015bci<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 133px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 133px;\">Wyszukiwanie po nazwie<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 133px;\">\n<ul>\n<li>CTRL + ALT + strza\u0142ka w g\u00f3r\u0119<\/li>\n<li>CTRL + klikni\u0119cie mysz\u0105 na symbol pomocniczej listy warto\u015bci<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 68px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 68px;\">Rozszerzone wyszukiwanie po identyfikacji<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 68px;\">\n<ul>\n<li>ALT + strza\u0142ka w d\u00f3\u0142<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 68px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 68px;\">Rozszerzone wyszukiwanie po nazwie<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 68px;\">\n<ul>\n<li>CTRL + ALT + strza\u0142ka w d\u00f3\u0142<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Je\u015bli w metadanych nie ma atrybutu ze specjalnym zachowaniem Nazwa, w obu wyszukiwaniach po nazwie zostanie wykonane wyszukiwanie po identyfikacji. Je\u015bli w metadanych nie ma r\u00f3wnie\u017c atrybutu oznaczonego specjalnym zachowaniem Identyfikacja, to wst\u0119pne wyszukiwanie jest pomijane i wyszukiwanie jest wizualizowane.<\/p>\n<p><strong>Wyszukiwanie po identyfikacji i nazwie<\/strong><\/p>\n<p>W przypadku wyszukiwania po identyfikacji i nazwie wst\u0119pne wyszukiwanie jest przeprowadzane tylko wtedy, gdy zawarto\u015b\u0107 pola zawiera symbol wieloznaczny * lub ? lub gdy w metadanych wyszukiwania wpisano <em>ComboBox<\/em>. W zale\u017cno\u015bci od ustawienia do wizualizacji u\u017cywana jest lista wyboru lub okno dialogowe wyszukiwania. Okno dialogowe wyszukiwania jest r\u00f3wnie\u017c u\u017cywane, gdy ustawienia w metadanych s\u0105 ustawione na <em>ComboBox<\/em>, a ilo\u015b\u0107 danych jest wi\u0119ksza ni\u017c 59.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36230 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4.png\" alt=\"\" width=\"701\" height=\"721\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4.png 701w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4-292x300.png 292w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4-50x50.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4-600x617.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_4-320x329.png 320w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Wyszukiwanie po identyfikacji i nazwie<\/em><\/p>\n<p><strong>Rozszerzone wyszukiwanie po identyfikacji i nazwie<\/strong><\/p>\n<p>Rozszerzone wyszukiwanie po identyfikacji i nazwie ma dwuetapowe wst\u0119pne wyszukiwanie. Najpierw system pr\u00f3buje znale\u017a\u0107 rekord danych pasuj\u0105cy do danych wprowadzonych przez u\u017cytkownika. Je\u015bli to si\u0119 nie uda, w wyszukiwaniu po identyfikacji do wprowadzonych danych dodawany jest symbol wieloznaczny *\u00a0na ko\u0144cu, a w wyszukiwaniu po nazwie \u2013 symbol wieloznaczny *\u00a0na pocz\u0105tku i na ko\u0144cu, po czym wyszukiwanie jest wykonywane ponownie.<\/p>\n<p>W przypadku pola, kt\u00f3re nie jest puste, wyb\u00f3r wizualizacji zale\u017cy wy\u0142\u0105cznie od liczby rekord\u00f3w danych. Poni\u017cej sze\u015b\u0107dziesi\u0119ciu rekord\u00f3w wy\u015bwietlana jest lista wyboru, a od sze\u015b\u0107dziesi\u0119ciu \u2013 okno dialogowe wyszukiwania. W przypadku pustego pola, do wizualizacji ponownie wykorzystywane s\u0105 ustawienia z metadanych.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-37586 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5.png\" alt=\"\" width=\"711\" height=\"941\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5.png 711w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5-227x300.png 227w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5-38x50.png 38w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5-600x794.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_-Wyszukiwania_5-320x424.png 320w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Rozszerzone wyszukiwanie po identyfikacji i nazwie<\/em><\/p>\n<h5 id=\"wizualizacja-jako-wyszukiwanie-w-oknie-dialogowym\" ><span class=\"ez-toc-section\" id=\"Wizualizacja_jako_wyszukiwanie_w_oknie_dialogowym\"><\/span>Wizualizacja jako wyszukiwanie w oknie dialogowym<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Okno dialogowe sk\u0142ada si\u0119 z dw\u00f3ch obszar\u00f3w: nag\u0142\u00f3wka i obszaru roboczego.<\/p>\n<p>W nag\u0142\u00f3wku znajduj\u0105 si\u0119 odpowiednie pola, w zale\u017cno\u015bci od typ\u00f3w danych atrybut\u00f3w. Za pomoc\u0105 <em>SelectionFieldHook<\/em> mo\u017cna zmieni\u0107 w\u0142a\u015bciwo\u015bci u\u017cywanych p\u00f3l. Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 u\u017cycia w\u0142asnych p\u00f3l zamiast tych proponowanych.<\/p>\n<p>W obszarze roboczym do wy\u015bwietlania wynik\u00f3w wyszukiwania u\u017cywany jest <em>Grid-Control<\/em>. Nazwy kolumn s\u0105 nadawane na podstawie metadanych. R\u00f3wnie\u017c tutaj deweloper ma kilka mo\u017cliwo\u015bci ingerencji. Za pomoc\u0105 <em>VisualisationHooks<\/em> mo\u017cna manipulowa\u0107 wy\u015bwietlaniem lub wymieni\u0107 je na list\u0119.<\/p>\n<p>Ewentualne istniej\u0105ce predefiniowane warto\u015bci dla p\u00f3l kryteri\u00f3w wyszukiwania s\u0105 odczytywane i ustawiane z danych wykonania wyszukiwania. U\u017cytkownik ma teraz mo\u017cliwo\u015b\u0107 zaw\u0119\u017cenia wyszukiwania poprzez wpisanie kryteri\u00f3w.<\/p>\n<p>Wyszukiwanie jest wykonywane na podstawie kryteri\u00f3w wyszukiwania.<\/p>\n<p>Otrzymane rekordy danych s\u0105 wy\u015bwietlane w obszarze wy\u015bwietlania. U\u017cytkownik ma teraz kilka mo\u017cliwo\u015bci. Mo\u017ce zmieni\u0107 wyszukiwanie, wprowadzaj\u0105c inne kryteria, i uruchomi\u0107 je ponownie. Mo\u017ce r\u00f3wnie\u017c za\u0142adowa\u0107 kolejne rekordy, je\u015bli znaleziono ich wi\u0119cej ni\u017c 60. Ponadto istnieje mo\u017cliwo\u015b\u0107 zapisania u\u017cytych kryteri\u00f3w wyszukiwania i sortowania jako wzorca zapytania.<\/p>\n<p>Gdy u\u017cytkownik znajdzie szukany rekord lub rekordy, musi je wybra\u0107. Nast\u0119pnie, je\u015bli naci\u015bnie przycisk przeznaczony do zatwierdzenia, wybrane rekordy danych zostan\u0105 zapisane w danych wykonania, a okno dialogowe zostanie zamkni\u0119te.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36254 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_6.png\" alt=\"\" width=\"442\" height=\"521\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_6.png 442w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_6-255x300.png 255w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_6-42x50.png 42w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_6-320x377.png 320w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Przebieg wy\u015bwietlania okna dialogowego wyszukiwania z mo\u017cliwo\u015bciami ingerencji<\/em><\/p>\n<h5 id=\"wizualizacja-jako-lista-wyboru\" ><span class=\"ez-toc-section\" id=\"Wizualizacja_jako_lista_wyboru\"><\/span>Wizualizacja jako lista wyboru<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W wizualizacji jako lista wyboru nale\u017cy rozr\u00f3\u017cni\u0107 wyb\u00f3r pojedynczy i wielokrotny. W przypadku wyboru pojedynczego zazwyczaj wy\u015bwietlana jest <em>ComboBox<\/em> w polu. Jest ona podzielona na maksymalnie dwie kolumny. Lewa kolumna zawiera warto\u015bci z atrybutu zwracanego, kt\u00f3ry jest oznaczony jako <em>Identyfikacja<\/em>. Prawa kolumna zawiera warto\u015bci z atrybutu zwracanego, kt\u00f3ry jest oznaczony jako <em>Nazwa<\/em>. Je\u015bli nie podano <em>Nazwy<\/em>, ta kolumna nie jest wy\u015bwietlana. U\u017cytkownik mo\u017ce teraz wybra\u0107 \u017c\u0105dany rekord danych za pomoc\u0105 klawiatury lub myszy. <em>ComboBox<\/em> zamyka si\u0119, a wybrany rekord danych zostaje zapisany w danych wykonania.<\/p>\n<p>W przypadku wyboru wielokrotnego, zamiast prostej <em>ComboBox<\/em> wy\u015bwietlane jest okno pop-up z list\u0105 i dwoma przyciskami. Na li\u015bcie mo\u017cna wybra\u0107 wiele warto\u015bci. Je\u015bli u\u017cytkownik nast\u0119pnie naci\u015bnie przycisk przeznaczony do zatwierdzenia, wybrane rekordy danych zostan\u0105 zapisane w danych wykonania, a okno pop-up zostanie zamkni\u0119te.<\/p>\n<p>Je\u015bli w wyszukiwaniu podano <em>ListViewCreator-Hook<\/em>, zamiast <em>ComboBox<\/em> zawsze wy\u015bwietlane jest okno pop-up z list\u0105.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36256 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7.png\" alt=\"\" width=\"361\" height=\"361\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7.png 361w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7-300x300.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7-150x150.png 150w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7-50x50.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7-60x60.png 60w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_7-320x320.png 320w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Wy\u015bwietlanie okien pop-up z mo\u017cliwo\u015bciami ingerencji<\/em><\/p>\n<h5 id=\"przejecie-wynikow\" ><span class=\"ez-toc-section\" id=\"Przejecie_wynikow\"><\/span>Przej\u0119cie wynik\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ostatnim punktem w procesie wyszukiwania jest przej\u0119cie wynik\u00f3w. W tym miejscu deweloper mo\u017ce zmodyfikowa\u0107 wynik wybrany przez u\u017cytkownika, nadpisuj\u0105c metod\u0119 <em>takeValue<\/em>\u00a0w <em>SearchManager<\/em>.<\/p>\n<p>W grupie wyboru (<em>SelectionGroup<\/em>) aplikacji pola mog\u0105 by\u0107 oznaczone jako <em>Key<\/em> lub<em> Key with load<\/em>. Je\u015bli pole jest typu <em>Key with load<\/em>, po wprowadzeniu warto\u015bci w polu, aplikacja jest proszona o wy\u015bwietlenie tego rekordu danych.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-36270 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_8.png\" alt=\"\" width=\"361\" height=\"201\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_8.png 361w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_8-300x167.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_8-50x28.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/08\/Podrecznik_referencyjny_Wyszukiwania_8-320x178.png 320w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Przej\u0119cie wynik\u00f3w z mo\u017cliwo\u015bci\u0105 ingerencji<\/em><\/p>\n<h4 id=\"wyszukiwanie-standardowe\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_standardowe\"><\/span>Wyszukiwanie standardowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Szczeg\u00f3lnym przypadkiem listy wyboru jest wyszukiwanie standardowe. Dla wyszukiwania standardowego nie istniej\u0105 metadane w bazie danych repozytorium. Z definicji wyszukiwanie wy\u015bwietla w wynikach tylko dwie kolumny. Zestaw wynik\u00f3w jest predefiniowany przez program. Wy\u015bwietlanie zawsze odbywa si\u0119 na li\u015bcie wyboru, a zestaw wynik\u00f3w nie jest ograniczony do 60 wierszy. Okno dialogowe nie jest wy\u015bwietlane, nawet je\u015bli jest wi\u0119cej ni\u017c 60 wierszy. Sortowanie rekord\u00f3w powinno odbywa\u0107 si\u0119 za pomoc\u0105 komparatora specyficznego dla bazy danych, kt\u00f3ry mo\u017cna pobra\u0107 z <em>TransactionManager<\/em> za pomoc\u0105 metody <em>getComparator<\/em>.<\/p>\n<p>Do wyszukiwania standardowego konieczne jest zaimplementowanie klasy pochodnej od <em>DefaultSearchManager<\/em>. W tej klasie nale\u017cy nadpisa\u0107 metod\u0119 <em>getResultList<\/em>. Wewn\u0105trz tej metody lista wynik\u00f3w musi by\u0107 zbudowana w formie obiekt\u00f3w <em>CisListPartMutable<\/em>. Dane dla dw\u00f3ch kolumn wyszukiwania s\u0105 przechowywane w obiektach <em>CisListPartMutable<\/em> pod sta\u0142ymi nazwami <em>DEFAULT_CODE_NAME<\/em> i <em>DEFAULT_DESCRIPTION_NAME<\/em>.<\/p>\n<p><em>class MyDefaultSearchManager extends DefaultSearchManager { <\/em><br \/>\n<em>List searchData = &#8230;; <\/em><br \/>\n<em>public List getResultList(SearchInfo searchInfo) { <\/em><br \/>\n<em>List result = new ArrayList(); <\/em><br \/>\n<em>Iterator iterator = searchData.iterator(); <\/em><br \/>\n<em>while (iterator.hasNext()){ <\/em><br \/>\n<em>MyValue value = (MyValue) iterator.next(); <\/em><br \/>\n<em>CisListPartMutable entry = <\/em><br \/>\n<em>new CisListPartMutable(); <\/em><br \/>\n<em>entry.setObject( <\/em><br \/>\n<em>DefaultSearchManager.DEFAULT_CODE_NAME, <\/em><br \/>\n<em>value.getName()); <\/em><br \/>\n<em>entry.setObject( <\/em><br \/>\n<em>DefaultSearchManager.DEFAULT_DESCRIPTION_NAME, <\/em><br \/>\n<em>value.getExpression()); <\/em><br \/>\n<em>result.add(entry); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>return result; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><\/p>\n<p>Dla pola, kt\u00f3re ma u\u017cywa\u0107 wyszukiwania standardowego, nale\u017cy zdefiniowa\u0107 nazw\u0119 wyszukiwania z okre\u015blon\u0105 warto\u015bci\u0105 i zarejestrowa\u0107 <em>SearchManager.<\/em><\/p>\n<p><em>MyDefaultSearchManager mySearchManager = <\/em><br \/>\n<em>new MyDefaultSearchManager(); <\/em><br \/>\n<em>myFld.setSearchName(DefaultSearchManager.EMPTY_SEARCH_DEFINITION); <\/em><br \/>\n<em>myFld.setSearchManager(mySearchManager);<\/em><\/p>\n<h4 id=\"wyszukiwanie-specyficzne-dla-aplikacji-w-naglowku\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_specyficzne_dla_aplikacji_w_naglowku\"><\/span>Wyszukiwanie specyficzne dla aplikacji w nag\u0142\u00f3wku<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>W nag\u0142\u00f3wku aplikacji znajduje si\u0119 zak\u0142adka dla wyszukiwa\u0144 specyficznych dla aplikacji. Zawarto\u015b\u0107 tej zak\u0142adki zale\u017cy od aktualnej aplikacji. Zak\u0142adka mo\u017ce zawiera\u0107 kilka wyszukiwa\u0144, kt\u00f3re mo\u017cna wybra\u0107 za pomoc\u0105 pola wyboru.<\/p>\n<p>Widok pojedynczego wyszukiwania odpowiada widokowi dialogowemu, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce dost\u0119pna przestrze\u0144 jest mniejsza. Powoduje to, \u017ce nazwy p\u00f3l znajduj\u0105 si\u0119 nad polami, a w szczeg\u00f3lnych przypadkach pojedyncze pola mog\u0105 zajmowa\u0107 dwie kolumny.<\/p>\n<p>To, kt\u00f3re wyszukiwania maj\u0105 by\u0107 wy\u015bwietlane, jest okre\u015blane w aplikacji poprzez podanie ka\u017cdej u\u017cywanej nazwy wyszukiwania wraz z jej w pe\u0142ni kwalifikowan\u0105 nazw\u0105. Ten wyb\u00f3r wyszukiwa\u0144 mo\u017ce by\u0107 ustawiony tylko raz podczas inicjalizacji aplikacji i nie mo\u017ce by\u0107 p\u00f3\u017aniej zmieniony.<\/p>\n<p>Dla ka\u017cdego pojedynczego wyszukiwania atrybuty mog\u0105 by\u0107 jednorazowo wst\u0119pnie wype\u0142nione. Ponadto mo\u017cliwe jest oznaczenie poszczeg\u00f3lnych atrybut\u00f3w w taki spos\u00f3b, aby wynikowe pola nie by\u0142y edytowalne lub nie by\u0142y widoczne. Aby przypisa\u0107 warto\u015b\u0107 do atrybutu, nale\u017cy u\u017cy\u0107 nazwy atrybutu, kt\u00f3ra zosta\u0142a wprowadzona w wyszukiwaniu. W celu kontrolowania wspomnianych oznacze\u0144, do atrybutu nale\u017cy do\u0142\u0105czy\u0107 sta\u0142y termin. Wymagane sta\u0142e znajduj\u0105 si\u0119 w klasie <em>ObjectSearchConstants<\/em>.<\/p>\n<p><em>public interface ObjectSearchConstants{ <\/em><br \/>\n<em>public static final String FIX = &#8222;_FIX_PRESET&#8221;; <\/em><br \/>\n<em>public static final String HIDDEN = &#8222;_HIDDEN&#8221;; <\/em><br \/>\n<em>} <\/em><\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W poni\u017cszym przyk\u0142adzie przedstawiono struktur\u0119 wyszukiwania. W pierwszym wyszukiwaniu zdefiniowano trzy atrybuty. Atrybut <em>userGuid<\/em> jest wst\u0119pnie ustawiony i nie jest widoczny dla u\u017cytkownika. Pole wynikowe nie jest wy\u015bwietlane w wyszukiwaniu. Atrybut <em>state<\/em> otrzymuje wst\u0119pnie zdefiniowan\u0105 warto\u015b\u0107, kt\u00f3ra jest wy\u015bwietlana, ale nie mo\u017ce by\u0107 zmieniona przez u\u017cytkownika. Dla trzeciego atrybutu wst\u0119pnie ustawiono dwie warto\u015bci typu <em>Short<\/em>, kt\u00f3re jednak mog\u0105 by\u0107 modyfikowane przez u\u017cytkownika.<\/p>\n<p><em>private static final String SEARCHES = new String[] { <\/em><br \/>\n<em>&#8222;com.cisag.sys&#8230;XSearch&#8221;, <\/em><br \/>\n<em>&#8222;com.cisag.sys&#8230;YSearch&#8221; <\/em><br \/>\n<em>}; <\/em><br \/>\n<em>private void initLocatorSearches() { <\/em><br \/>\n<em>CisParameterList[] paramArray = new <\/em><br \/>\n<em>CisParameterList[SEARCHES.length]; <\/em><br \/>\n<em>paramArray[0] = new CisParameterList(); <\/em><br \/>\n<em>paramArray[0].setString(&#8222;userGuid&#8221; + <\/em><br \/>\n<em>ObjectSearchConstants.HIDDEN, <\/em><\/p>\n<p><em>SelectionSupport.toGuidSelection(env.getUserGuid())); <\/em><br \/>\n<em>paramArray[0].setString(&#8222;state&#8221; + <\/em><br \/>\n<em>ObjectSearchConstants.FIX, <\/em><br \/>\n<em>SelectionSupport.toShortSelection(State.A)); <\/em><br \/>\n<em>paramArray[0].setString(&#8222;extrastate&#8221;, <\/em><br \/>\n<em>SelectionSupport.toShortSelection( <\/em><br \/>\n<em>new short[]{ExtraState.A, ExtraState.B})); <\/em><br \/>\n<em>setSearchNames(SEARCHES, paramArray); <\/em><br \/>\n<em>}<\/em> <\/div><\/section>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Do przypisywania warto\u015bci atrybut\u00f3w zawsze nale\u017cy u\u017cywa\u0107 odpowiedniej metody z klasy <em>SelectionSupport<\/em>. Wyniki tych metod najcz\u0119\u015bciej maj\u0105 posta\u0107 ci\u0105gu znak\u00f3w (<em>String<\/em>). Z tego powodu w li\u015bcie parametr\u00f3w atrybut musi by\u0107 zdefiniowany jako <em>String<\/em>, a nie jego pierwotny typ danych. Jest to wyra\u017anie widoczne w przyk\u0142adzie z dwoma u\u017cywanymi stanami (<em>states<\/em>).<\/div><\/section>\n<h5 id=\"przejmowanie-wartosci-do-aplikacji\" ><span class=\"ez-toc-section\" id=\"Przejmowanie_wartosci_do_aplikacji\"><\/span>Przejmowanie warto\u015bci do aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wyszukiwanie w obszarze nawigacji umo\u017cliwia przejmowanie warto\u015bci do aplikacji za pomoc\u0105 prostego lub podw\u00f3jnego klikni\u0119cia mysz\u0105. Dodatkowo, w niekt\u00f3rych wyszukiwaniach warto\u015b\u0107 mo\u017ce by\u0107 u\u017cyta za pomoc\u0105 menu kontekstowego lub metody <em>Drag&amp;Drop<\/em>.<\/p>\n<p>Aby to zadzia\u0142a\u0142o, w bazie danych repozytorium dla metadanych wyszukiwania musi by\u0107 zdefiniowany obiekt bazowy, a tak\u017ce musi istnie\u0107 powi\u0105zanie mi\u0119dzy jednym lub kilkoma kluczami podstawowymi tego obiektu a kolumnami wynikowymi wyszukiwania. Warto\u015bci klucza podstawowego s\u0105 przekazywane do <em>SelectionGroup<\/em> aplikacji, co powoduje za\u0142adowanie po\u017c\u0105danego obiektu.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Jako obiekt bazowy dla wyszukiwania A wprowadzono obiekt O. Obiekt O ma atrybut <em>guid<\/em> typu <em>byte[]<\/em> jako klucz podstawowy. Jako wynik wyszukiwania A przewidziane s\u0105 kolumny <em>guid, name, description<\/em>, przy czym <em>guid<\/em> odpowiada kluczowi podstawowemu obiektu O. Dok\u0142adnie to powi\u0105zanie musi by\u0107 zdefiniowane dla wyszukiwania, tzn. na li\u015bcie powi\u0105za\u0144 kluczy podstawowych, do atrybutu <em>guid<\/em> obiektu O nale\u017cy wpisa\u0107 nazw\u0119 kolumny <em>guid<\/em> z wyszukiwania A.<\/div><\/section>\n<h5 id=\"cele-operacji-dragdrop\" ><span class=\"ez-toc-section\" id=\"Cele_operacji_Drag_Drop\"><\/span>Cele operacji Drag&amp;Drop<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Operacja <em>Drag&amp;Drop<\/em>\u00a0mo\u017ce by\u0107 u\u017cyta w r\u00f3\u017cnych celach. Mo\u017ce by\u0107 ona skierowana do odpowiedniego <em>EntityField<\/em> lub do nag\u0142\u00f3wka aplikacji. Aby mo\u017cna by\u0142o jej u\u017cy\u0107 w nag\u0142\u00f3wku, obiekt bazowy musi by\u0107 zdefiniowany jako parametr przekazywania dla aplikacji.<\/p>\n<h5 id=\"obiekty-zalezne-od-czasu\" ><span class=\"ez-toc-section\" id=\"Obiekty_zalezne_od_czasu\"><\/span>Obiekty zale\u017cne od czasu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Obiekty zale\u017cne od czasu mog\u0105 wyst\u0119powa\u0107 w wielu wersjach. Wyszukiwania daj\u0105 opcj\u0119 wy\u015bwietlania wszystkich wersji lub tylko wersji aktualnej na moment wykonania wyszukiwania.<\/p>\n<p>Ta funkcjonalno\u015b\u0107 jest okre\u015blana przez przypisanie atrybutu <em>validFrom<\/em>, kt\u00f3ry w obiekcie zale\u017cnym od czasu nale\u017cy do klucza podstawowego.<\/p>\n<p>Je\u015bli u\u017cytkownik chce wy\u015bwietli\u0107 wszystkie wersje obiektu, atrybut <em>validFrom<\/em>\u00a0obiektu bazowego musi by\u0107 powi\u0105zany z odpowiednim parametrem w wyszukiwaniu.<\/p>\n<p>Je\u015bli u\u017cytkownik chce wy\u015bwietli\u0107 tylko aktualn\u0105 wersj\u0119, atrybutowi <em>validFrom\u00a0<\/em>nie nale\u017cy przypisywa\u0107 \u017cadnego parametru wyszukiwania. W takim przypadku, <em>kernel<\/em> automatycznie tworzy warunek potrzebny do okre\u015blenia aktualnej wersji.<\/p>\n<h4 id=\"searchmanager\" ><span class=\"ez-toc-section\" id=\"SearchManager\"><\/span>SearchManager<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"35\" data-end=\"267\">Do pola wprowadzania w Comarch ERP Enterprise mo\u017cna przypisa\u0107 <em>SearchManager<\/em>. Nale\u017cy przy tym rozr\u00f3\u017cni\u0107, \u017ce w Comarch ERP Enterprise istniej\u0105 dwie warstwy w interfejsie u\u017cytkownika, znajduj\u0105ce si\u0119 w pakietach <em>com.cisag.pgm.gui<\/em> oraz <em>com.cisag.pgm.dialog<\/em>.<\/p>\n<p data-start=\"269\" data-end=\"490\" data-is-last-node=\"\" data-is-only-node=\"\">Klasy w pakiecie <em>gui<\/em> zosta\u0142y zoptymalizowane pod k\u0105tem potrzeb rozwoju aplikacji. Klasy tego pakietu bazuj\u0105 na klasach z pakietu <em>dialog<\/em>. \u015awiadomie jednak unikni\u0119to bezpo\u015bredniego dziedziczenia pomi\u0119dzy tymi klasami.<\/p>\n<p data-start=\"269\" data-end=\"490\" data-is-last-node=\"\" data-is-only-node=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-37581 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1.png\" alt=\"\" width=\"811\" height=\"711\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1.png 811w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1-300x263.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1-768x673.png 768w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1-50x44.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1-600x526.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_9-1-320x281.png 320w\" sizes=\"auto, (max-width: 811px) 100vw, 811px\" \/><\/p>\n<p style=\"text-align: center;\" data-start=\"269\" data-end=\"490\" data-is-last-node=\"\" data-is-only-node=\"\">Wyci\u0105g z diagramu klas dla <em>SearchManager<\/em><\/p>\n<h5 data-start=\"269\" data-end=\"490\" id=\"searchmanager-w-pakiecie-com-cisag-pgm-dialog\" ><span class=\"ez-toc-section\" id=\"SearchManager_w_pakiecie_comcisagpgmdialog\"><\/span>SearchManager w pakiecie com.cisag.pgm.dialog<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"90\" data-end=\"261\">W pakiecie <em>dialog<\/em> znajduj\u0105 si\u0119 interfejsy <em>SearchManager<\/em> i <em>CommonSearchManager<\/em>. Oba \u015bci\u015ble wsp\u00f3\u0142pracuj\u0105 z <em>SearchTarget<\/em>, kolejnym interfejsem w tym pakiecie.<\/p>\n<p data-start=\"263\" data-end=\"724\">Interfejs <em>SearchTarget<\/em> identyfikuje obiekty, kt\u00f3re akceptuj\u0105 wynik lub wyniki zapytania wyszukiwania przekazywanego do <em>SearchManager<\/em>. Udost\u0119pnia on metody wykorzystywane przez <em>SearchManager<\/em> do zwracania wynik\u00f3w oraz pozyskiwania dodatkowych metadanych i parametr\u00f3w. Element wizualny (<em>VisualElement<\/em>), kt\u00f3ry ma obs\u0142ugiwa\u0107 <em>SearchManager<\/em> \u2014 przyk\u0142adowo pola tekstowe czy tabele \u2014 mo\u017ce zaimplementowa\u0107 ten interfejs bezpo\u015brednio albo korzysta\u0107 z odpowiedniego adaptera.<\/p>\n<p data-start=\"726\" data-end=\"943\"><em>CommonSearchManager<\/em> udost\u0119pnia metod\u0119, za pomoc\u0105 kt\u00f3rej rejestrowane s\u0105 skr\u00f3ty klawiszowe (<em>KeyStrokes<\/em>) wywo\u0142uj\u0105ce wyszukiwanie dla danego pola. Dodatkowo zawsze u\u017cywany jest klik myszy na ikonie pomocy warto\u015bci.<\/p>\n<p data-start=\"945\" data-end=\"1364\">Metoda <em>search<\/em> jest wywo\u0142ywana za ka\u017cdym razem, gdy naci\u015bni\u0119ty zostanie jeden ze skr\u00f3t\u00f3w klawiszowych albo gdy klikni\u0119to mysz\u0105 ikon\u0119 pomocy warto\u015bci. W ramach metody <em>search<\/em> decyduje si\u0119, czy wyszukiwanie ma zbudowa\u0107 w\u0142asn\u0105 wizualizacj\u0119. Je\u015bli nie, istnieje mo\u017cliwo\u015b\u0107 zwr\u00f3cenia listy obiekt\u00f3w. Obiekty te musz\u0105 implementowa\u0107 metod\u0119 <em>toString<\/em>. Zwr\u00f3cone ci\u0105gi znak\u00f3w s\u0105 wy\u015bwietlane na li\u015bcie wyboru (<em>ComboBox<\/em>).<\/p>\n<p data-start=\"1366\" data-end=\"1589\">Je\u017celi wymagany jest uk\u0142ad dwukolumnowy, wszystkie metody <em>toString<\/em> musz\u0105 zawiera\u0107 znak tabulatora w \u0142a\u0144cuchu. Tekst po lewej stronie tabulatora jest u\u017cywany jako pierwsza kolumna, a tekst po prawej jako druga kolumna.<\/p>\n<p data-start=\"1591\" data-end=\"1918\" data-is-last-node=\"\" data-is-only-node=\"\">Gdy u\u017cytkownik wybierze warto\u015b\u0107 z listy, wywo\u0142ywana jest metoda <em>setSearchResult<\/em>. Parametr <em data-start=\"1685\" data-end=\"1691\">Code<\/em> zawiera wybrany obiekt. Je\u015bli nie zosta\u0142 wybrany \u017caden obiekt, metoda zostaje wywo\u0142ana z parametrem <em data-start=\"1792\" data-end=\"1798\">Code<\/em> r\u00f3wnym <em>null<\/em>. To wywo\u0142anie mo\u017ce zosta\u0107 wykorzystane do usuni\u0119cia z <em>SearchManager<\/em> obiekt\u00f3w, kt\u00f3re nie s\u0105 ju\u017c potrzebne.<\/p>\n<p data-start=\"1591\" data-end=\"1918\" data-is-last-node=\"\" data-is-only-node=\"\"><em>public interface SearchTarget { <\/em><br \/>\n<em>Object getCurrentValue(); <\/em><br \/>\n<em>void setSearchResult(Object value, String description); <\/em><br \/>\n<em>VisualElement getVisualElement(); <\/em><br \/>\n<em>PopupWindow getPopupWindow(); <\/em><br \/>\n<em>DataDescription getDataDescription(); <\/em><br \/>\n<em>} <\/em><\/p>\n<h5 data-start=\"269\" data-end=\"490\" id=\"searchmanager-w-pakiecie-com-cisag-pgm-objsearch\" ><span class=\"ez-toc-section\" id=\"SearchManager_w_pakiecie_comcisagpgmobjsearch\"><\/span>SearchManager w pakiecie com.cisag.pgm.objsearch<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"35\" data-end=\"307\">Dla pakietu <em>gui<\/em> zosta\u0142 utworzony w\u0142asny <em>SearchManager<\/em>, kt\u00f3ry znajduje si\u0119 w pakiecie <em>com.cisag.pgm.objsearch<\/em>. Ten <em>SearchManager<\/em> udost\u0119pnia kilka metod, kt\u00f3re mog\u0105 by\u0107 nadpisywane przez dewelopera, aby w okre\u015blonych miejscach przebiegu wyszukiwania wprowadza\u0107 zmiany.<\/p>\n<p data-start=\"309\" data-end=\"574\">Sam <em>SearchManager<\/em> nie implementuje interfejsu <em>SearchManager<\/em> z pakietu <em>com.cisag.pgm.dialog<\/em>. Zamiast tego odwo\u0142uje si\u0119 do obiektu, kt\u00f3ry implementuje<em> SearchManager<\/em>. <em>SearchManager<\/em> z pakietu<em> objsearch<\/em> implementuje dodatkowo interfejs <em>SearchResultHandler<\/em>.<\/p>\n<p data-start=\"576\" data-end=\"678\"><em>SearchManager<\/em> jest zaimplementowany jako klasa abstrakcyjna i zawiera zasadniczo nast\u0119puj\u0105ce metody:<\/p>\n<p data-start=\"576\" data-end=\"678\"><em>public boolean isSearchExecutable() <\/em><br \/>\n<em>public void initSearch(SearchInfo searchInfo) <\/em><br \/>\n<em>public List getResultList(SearchInfo searchInfo) <\/em><\/p>\n<p data-start=\"828\" data-end=\"967\">Metoda <em>isSearchExecutable<\/em> mo\u017ce by\u0107 wykorzystana do uwzgl\u0119dnienia warunk\u00f3w, kt\u00f3re pozwalaj\u0105 lub uniemo\u017cliwiaj\u0105 wykonanie wyszukiwania.<\/p>\n<p data-start=\"970\" data-end=\"1251\" data-is-last-node=\"\">Metoda <em>initSearch<\/em> mo\u017ce by\u0107 u\u017cyta do ustawienia dodatkowych parametr\u00f3w wyszukiwania przed jego wykonaniem. Opr\u00f3cz ustawienia parametr\u00f3w mo\u017cna odpowiednie pole wst\u0119pnie wype\u0142ni\u0107 lub ustawi\u0107 jako niewidoczne. Pola wst\u0119pnie wype\u0142nione nie mog\u0105 by\u0107 zmieniane podczas wyszukiwania.<\/p>\n<p data-start=\"970\" data-end=\"1251\" data-is-last-node=\"\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Wyszukiwanie powinno zosta\u0107 zainicjowane w taki spos\u00f3b, aby z pola <em>PartnerField<\/em> w interfejsie u\u017cytkownika numer partnera zosta\u0142 wprowadzony jako wst\u0119pna warto\u015b\u0107 dla parametru <em>number<\/em>. Parametr <em>user<\/em> ma by\u0107 na sta\u0142e wst\u0119pnie ustawiony, a parametr <em>type<\/em> r\u00f3wnie\u017c ma zosta\u0107 wst\u0119pnie ustawiony, ale nie powinien by\u0107 wy\u015bwietlany.<\/p>\n<p data-start=\"970\" data-end=\"1251\" data-is-last-node=\"\"><em>public void initSearch(SearchInfo searchInfo) { <\/em><br \/>\n<em>if (partnerField != null) { <\/em><br \/>\n<em>if (searchInfo.isSelectionField(&#8222;number&#8221;)) { <\/em><br \/>\n<em>String partnerName = partnerField.getValue(); <\/em><br \/>\n<em>searchInfo.setParameter(&#8222;number&#8221;, partnerName); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>if (searchInfo.isSelectionField(&#8222;user&#8221;)) { <\/em><br \/>\n<em>searchInfo.setParameter(&#8222;user&#8221;, userName, <\/em><br \/>\n<em>SearchInfo.FIX_PRESET); <\/em><\/p>\n<p data-start=\"970\" data-end=\"1251\" data-is-last-node=\"\"><em>} <\/em><br \/>\n<em>if (searchInfo.isSelectionField(&#8222;type&#8221;)) { <\/em><br \/>\n<em>searchInfo.setParameter(&#8222;type&#8221;, types, <\/em><br \/>\n<em>SearchInfo.HIDDEN_FIELD); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<p data-start=\"163\" data-end=\"477\">Metoda <em>getResultList<\/em> umo\u017cliwia wst\u0119pne zdefiniowanie wyniku wyszukiwania. W li\u015bcie wyniki s\u0105 przechowywane w postaci obiekt\u00f3w <em>CisListPartMutable<\/em>. Warto\u015bci musz\u0105 by\u0107 wprowadzane do odpowiednich obiekt\u00f3w <em>CisListPartMutable<\/em> za pomoc\u0105 metody <em>setObject(attrName, attrWert)<\/em>, zgodnie z nazwami zdefiniowanych atrybut\u00f3w. Obiekty <em>CisListPartMutable<\/em> s\u0105 nast\u0119pnie wy\u015bwietlane jako wynik wyszukiwania. Je\u015bli lista zostanie wype\u0142niona, wyszukiwanie w bazie danych nie jest wykonywane.<\/p>\n<h5 data-start=\"163\" data-end=\"477\" id=\"searchresulthandler\" ><span class=\"ez-toc-section\" id=\"SearchResultHandler\"><\/span>SearchResultHandler<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"35\" data-end=\"335\">Interfejs <em>SearchResultHandler<\/em> s\u0142u\u017cy do przekazania wyniku wyszukiwania, kt\u00f3ry zosta\u0142 zapisany w <em>SearchInfo<\/em>, dalej do <em>SearchTarget<\/em>. W tym celu dost\u0119pne s\u0105 trzy metody. Dwie z nich, zawieraj\u0105ce dopisek &#8230;<em>AndLoad<\/em>, dodatkowo wywo\u0142uj\u0105 akcj\u0119 <em>Load<\/em> aplikacji.<\/p>\n<p data-start=\"35\" data-end=\"335\"><em>public void takeValue(SearchInfo searchInfo) <\/em><br \/>\n<em>public void takeValueAndLoad(SearchInfo searchInfo) <\/em><br \/>\n<em>public void takeValueAndLoad(Object code, String description) <\/em><\/p>\n<p data-start=\"35\" data-end=\"335\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Podczas przej\u0119cia wyniku numer partnera z wybranego rekordu ma zosta\u0107 wpisany do pola <em>PartnerField<\/em>.<\/p>\n<p data-start=\"512\" data-end=\"633\"><em>public void takeValue(SearchInfo searchInfo) { <\/em><br \/>\n<em>Object partnerName = searchInfo.getResult(&#8222;number&#8221;); <\/em><br \/>\n<em>if (partnerField!=null &amp;&amp; partnerName instanceof String) { <\/em><br \/>\n<em>partnerField.setValue((String) partnerName); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h5 data-start=\"512\" data-end=\"633\" id=\"defaultsearchmanager\" ><span class=\"ez-toc-section\" id=\"DefaultSearchManager\"><\/span>DefaultSearchManager<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Standardowe zachowanie wyszukiwa\u0144 w Comarch ERP Enterprise jest zapisane w klasie <em>com.cisag.pgm.objsearch.DefaultSearchManager<\/em>. Klasa ta implementuje interfejs <em>com.cisag.pgm.objsearch.SearchManager<\/em>. <em>DefaultSearchManager<\/em> przechowuje wewn\u0119trznie mapowanie pomi\u0119dzy obiektami<em> SearchTarget<\/em> i <em>SearchInfo<\/em>. Programista mo\u017ce utworzy\u0107 w\u0142asn\u0105 klas\u0119 dziedzicz\u0105c\u0105 po tej klasie, aby uzyska\u0107 zachowanie wyszukiwania odbiegaj\u0105ce od standardowego.<\/p>\n<h5 id=\"baseguisearchmanager\" ><span class=\"ez-toc-section\" id=\"BaseGuiSearchManager\"><\/span>BaseGuiSearchManager<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"70\" data-end=\"339\">Klasa <em>BaseGuiSearchManager<\/em> zapewnia po\u0142\u0105czenie z pakietem <em>com.cisag.pgm.dialog<\/em>, implementuj\u0105c <em>CommonSearchManager<\/em> tego pakietu. Zakres zada\u0144 tej klasy obejmuje g\u0142\u00f3wnie dost\u0119p do obiektu <em>SearchTarget<\/em>, na kt\u00f3rym opiera si\u0119 wyszukiwanie.<\/p>\n<h5 data-start=\"70\" data-end=\"339\" id=\"implementacja-wlasnego-searchmanager\" ><span class=\"ez-toc-section\" id=\"Implementacja_wlasnego_SearchManager\"><\/span>Implementacja w\u0142asnego SearchManager<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"70\" data-end=\"339\">Je\u015bli potrzebny jest w\u0142asny <em>SearchManager<\/em>, programista mo\u017ce zdecydowa\u0107, czy chce u\u017cy\u0107 klasy pochodnej od <em>DefaultSearchManager<\/em>, czy te\u017c bezpo\u015brednio dziedziczy\u0107 po abstrakcyjnej klasie <em>com.cisag.pgm.objsearch.SearchManager<\/em>. W przypadku dziedziczenia po <em>DefaultSearchManager<\/em> zachowanie wyszukiwa\u0144 pozostaje w du\u017cej mierze zachowane. Je\u015bli natomiast utworzony zostanie ca\u0142kowicie w\u0142asny <em>SearchManager<\/em>, konieczne jest odtworzenie lub samodzielne zaimplementowanie wymaganego zachowania. Zalecane jest dziedziczenie po <em>DefaultSearchManager<\/em>.<\/p>\n<h4 data-start=\"70\" data-end=\"339\" id=\"wyswietlanie-wielu-widokow-lub-wyszukiwan-w-wyszukiwaniu-dialogowym\" ><span class=\"ez-toc-section\" id=\"Wyswietlanie_wielu_widokow_lub_wyszukiwan_w_wyszukiwaniu_dialogowym\"><\/span>Wy\u015bwietlanie wielu widok\u00f3w lub wyszukiwa\u0144 w wyszukiwaniu dialogowym<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"70\" data-end=\"339\"><em>DefaultSearchManager<\/em> umo\u017cliwia wy\u015bwietlenie wi\u0119cej ni\u017c jednego wyszukiwania lub widoku w wyszukiwaniu dialogowym. Wyb\u00f3r widok\u00f3w odbywa si\u0119 poprzez list\u0119 wyboru w pasku narz\u0119dzi wyszukiwania dialogowego. Lista ta jest widoczna tylko wtedy, gdy dost\u0119pnych jest wi\u0119cej ni\u017c jeden widok. Do rejestrowania widok\u00f3w w<em> DefaultSearchManager<\/em> s\u0142u\u017c\u0105 metody:<\/p>\n<p data-start=\"70\" data-end=\"339\"><em>public void initSearchViews() <\/em><br \/>\n<em>protected final void addSearchView(SearchView searchView) <\/em><br \/>\n<em>protected final void setDefaultSearchView(SearchView searchView) <\/em><\/p>\n<p data-start=\"70\" data-end=\"339\">Aby uzyska\u0107 wi\u0119cej ni\u017c jeden widok, nale\u017cy nadpisa\u0107 metod\u0119 <em>initSearchViews()<\/em> w klasie <em>DefaultSearchManager<\/em>. Za pomoc\u0105 <em>SearchViewFactory<\/em> mo\u017cna tworzy\u0107 <em>SearchViews<\/em> dla wyszukiwa\u0144 OQL. Klasa <em>SearchViewFactory<\/em> zawiera metod\u0119:<\/p>\n<p data-start=\"70\" data-end=\"339\"><em>public class SearchViewFactory { <\/em><br \/>\n<em>static public SearchView createSearchView( <\/em><br \/>\n<em>byte[] databaseGuid, <\/em><br \/>\n<em>String searchName, <\/em><br \/>\n<em>SearchResultHandler resultHandler, <\/em><br \/>\n<em>SearchTarget target) <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"1897\" data-end=\"2014\">Alternatywnie mo\u017cna r\u00f3wnie\u017c zaimplementowa\u0107 w\u0142asny <em>SearchView<\/em>, kt\u00f3ry dziedziczy po abstrakcyjnej klasie <em>SearchView<\/em>.<\/p>\n<p data-start=\"62\" data-end=\"817\">Rejestracja <em>SearchView<\/em> odbywa si\u0119 poprzez wywo\u0142anie metody <em>addSearchView(&#8230;)<\/em> w klasie <em>DefaultSearchManager<\/em>. Gdy wszystkie widoki zostan\u0105 zarejestrowane, za pomoc\u0105 metody <em>setDefaultSearchView(&#8230;)<\/em> mo\u017cna okre\u015bli\u0107, kt\u00f3ry <em>SearchView<\/em> ma zosta\u0107 wy\u015bwietlony u\u017cytkownikowi przy otwieraniu wyszukiwania dialogowego. Kolejno\u015b\u0107 rejestracji decyduje r\u00f3wnie\u017c o kolejno\u015bci widok\u00f3w na li\u015bcie wyboru. Je\u015bli pierwotne wyszukiwanie ma zosta\u0107 r\u00f3wnie\u017c uwzgl\u0119dnione na li\u015bcie wyboru, nale\u017cy w odpowiednim miejscu wywo\u0142a\u0107 metod\u0119 <em>initSearchViews(&#8230;)<\/em> w klasie <em>DefaultSearchManager<\/em>. Przy jej wywo\u0142aniu ten <em>SearchView<\/em> zostaje automatycznie zdefiniowany jako <em>DefaultSearchView<\/em>. Je\u015bli jednak ma zosta\u0107 u\u017cyty inny widok jako domy\u015blny, trzeba go ustawi\u0107 tak, jak opisano wcze\u015bniej.<\/p>\n<p data-start=\"62\" data-end=\"817\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Obok wyszukiwania powi\u0105zanego z polem ma zosta\u0107 wy\u015bwietlone wyszukiwanie <em>com.cisag.app.general.MySearchName<\/em>. Dodatkowe wyszukiwanie ma zosta\u0107 umieszczone na li\u015bcie wyboru przed wyszukiwaniem powi\u0105zanym z polem i ma by\u0107 widoczne jako pierwsze przy otwieraniu wyszukiwania dialogowego.<\/p>\n<p data-start=\"62\" data-end=\"817\"><em>public class MySearchManager extends DefaultSearchManager { <\/em><br \/>\n<em>public void initSearchViews() { <\/em><br \/>\n<em>SearchView searchView = <\/em><br \/>\n<em>SearchViewFactory.createSearchView( <\/em><br \/>\n<em>getDatabaseGuid(), <\/em><br \/>\n<em>&#8222;com.cisag.app.general.MySearchName&#8221;, <\/em><br \/>\n<em>this, <\/em><br \/>\n<em>getSearchTarget()); <\/em><br \/>\n<em>addSearchView(searchView); <\/em><br \/>\n<em>super.initSearchViews(); <\/em><br \/>\n<em>setDefaultSearchView(searchView); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h6 data-start=\"62\" data-end=\"817\" id=\"searchviews-i-lista-wyboru\" ><span class=\"ez-toc-section\" id=\"SearchViews_i_lista_wyboru\"><\/span>SearchViews i lista wyboru<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1606\" data-end=\"2044\">Do wyszukiwania wst\u0119pnego u\u017cywany jest <em>DefaultSearchView<\/em>. Je\u015bli <em>DefaultSearchView<\/em> nie opiera si\u0119 na wyszukiwaniu standardowym, w\u00f3wczas do wyszukiwa\u0144 wst\u0119pnych u\u017cywany jest pierwszy <em>SearchView<\/em>, kt\u00f3ry opiera si\u0119 na wyszukiwaniu standardowym. Je\u017celi wyszukiwanie wst\u0119pne nie przynosi \u017cadnych wynik\u00f3w, otwierane jest wyszukiwanie dialogowe, a u\u017cytkownikowi prezentowany jest widok <em>DefaultSearchView<\/em>.<\/p>\n<h4 data-start=\"1606\" data-end=\"2044\" id=\"searchiterator\" ><span class=\"ez-toc-section\" id=\"SearchIterator\"><\/span>SearchIterator<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1606\" data-end=\"2044\"><em>SearchIterator<\/em> jest u\u017cywany wy\u0142\u0105cznie wewn\u0119trznie podczas wyszukiwania. Do dost\u0119pu do bazy danych z u\u017cyciem iteratora nale\u017cy wi\u0119c korzysta\u0107 z klasy <em>com.cisag.pgm.util.ResultSetAdapter<\/em>. Alternatywnie zamiast iteratora mo\u017cna zastosowa\u0107 <em>CisOqlSearchStatement<\/em>. Wynikiem wyszukiwania jest w tym przypadku <em>CisResultSet<\/em>.<\/p>\n<h4 data-start=\"1606\" data-end=\"2044\" id=\"pola-cech-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Pola_cech_wyszukiwania\"><\/span>Pola cech wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"62\" data-end=\"680\">Do wyszukiwa\u0144 dost\u0119pne s\u0105 specjalne pola cech wyszukiwania. Znajduj\u0105 si\u0119 one w pakiecie <em>com.cisag.pgm.gui.<\/em> Pola te charakteryzuj\u0105 si\u0119 tym, \u017ce przy etykiecie posiadaj\u0105 przycisk, za pomoc\u0105 kt\u00f3rego mo\u017cna wy\u015bwietli\u0107 list\u0119. Lista ta zawiera mo\u017cliwe wzorce wprowadzania w postaci kr\u00f3tkich wyra\u017ce\u0144, np. <em>zaczyna si\u0119 od ABC<\/em>. Je\u017celi zostanie wybrany jeden z wpis\u00f3w z listy, wzorzec ten jest przenoszony do pola i mo\u017ce zosta\u0107 dostosowany przez u\u017cytkownika. W podanym przyk\u0142adzie do pola zostanie wpisane <em>ABC*<\/em>. W wygenerowanych wyszukiwaniach pola cech wyszukiwania s\u0105 u\u017cywane automatycznie.<\/p>\n<p data-start=\"682\" data-end=\"731\">Dost\u0119pne s\u0105 nast\u0119puj\u0105ce pola cech wyszukiwania:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 115px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Pole cechy wyszukiwania<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Typ danych<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">TextSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Ci\u0105gi znak\u00f3w<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">DecimalSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Liczby naturalne i rzeczywiste<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">AbstractCisQuantitySelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Liczby naturalne i rzeczywiste z jednostk\u0105<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">CisDateSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Data i czas<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Od abstrakcyjnej klasy <em>AbstractCisQuantitySelectionField<\/em> istniej\u0105 szczeg\u00f3lne warianty dla warto\u015bci specjalnych:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 115px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Pole cechy wyszukiwania<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Typ danych<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">QuantitySelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Ilo\u015bci<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">DurationSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Czas trwania<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">ForeignAmountSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Waluty obce<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">DomesticAmountSelectionField<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Data i czas<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1761\" data-end=\"1839\">Pola cech wyszukiwania te znajduj\u0105 si\u0119 w pakiecie <em>com.cisag.app.general.gui<\/em>.<\/p>\n<h5 data-start=\"1761\" data-end=\"1839\" id=\"mozliwosci-wprowadzania-w-polach-cech-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Mozliwosci_wprowadzania_w_polach_cech_wyszukiwania\"><\/span>Mo\u017cliwo\u015bci wprowadzania w polach cech wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1841\" data-end=\"2047\">Do pola cechy wyszukiwania u\u017cytkownik mo\u017ce wprowadzi\u0107 jedn\u0105 lub wi\u0119cej cech wyszukiwania. Comarch ERP Enterprise obs\u0142uguje przy tym nast\u0119puj\u0105c\u0105 gramatyk\u0119:<\/p>\n<p data-start=\"1841\" data-end=\"2047\"><em>Selection = [CaseSensitiv | CaseInsensitiv] [OrList]; <\/em><br \/>\n<em>OrList = Parameter {ParameterSeparator Parameter}; <\/em><br \/>\n<em>Parameter = Range | SingleOperator; <\/em><br \/>\n<em>ParameterSeparator = &#8222;, &#8222;; <\/em><\/p>\n<p data-start=\"1841\" data-end=\"2047\"><em>Range = LowerRange | UpperRange | FullRange; <\/em><br \/>\n<em>LowerRange = &#8222;- &#8221; UpperValue; <\/em><br \/>\n<em>UpperRange = LowerValue &#8221; -&#8222;; <\/em><br \/>\n<em>FullRange = LowerValue &#8221; &#8211; &#8221; UpperValue; <\/em><br \/>\n<em>SingleOperator = [Operator] Value; <\/em><br \/>\n<em>Operator = &#8222;&lt;&#8221; | &#8222;&gt;&#8221; | &#8222;!=&#8221;; <\/em><br \/>\n<em>CaseSensitiv = &#8222;=&#8221;; <\/em><br \/>\n<em>CaseInsensitiv = &#8222;~&#8221;; <\/em><br \/>\n<em>Value = ? Alle Zeichenfolgen die nicht &#8222;, &#8221; oder &#8221; &#8211; &#8221; enthalten ?; <\/em><br \/>\n<em>UpperValue = ? Alle Zeichenfolgen die nicht &#8222;, &#8221; enthalten ?; <\/em><br \/>\n<em>LowerValue = ? Alle Zeichenfolgen die nicht &#8222;, &#8221; oder &#8221; &#8211; &#8221; <\/em><br \/>\n<em>enthalten ?;<\/em><\/p>\n<p data-start=\"1841\" data-end=\"2047\">Warto\u015bci dla <em>Value, UpperValue<\/em> i <em>LowerValue <\/em>zale\u017c\u0105 od typu danych. W przypadku cech wyszukiwania dla liczb dozwolone s\u0105 np. tylko liczby, separator tysi\u0119cy oraz separator dziesi\u0119tny. W przypadku cech wyszukiwania dla czasu i daty nie s\u0105 obs\u0142ugiwane <em>Operator, CaseSensitiv<\/em> oraz <em>CaseInsentiv<\/em>. Natomiast oceniane s\u0105 warto\u015bci <em>Value, UpperValue<\/em> i <em>LowerValue<\/em>. Opis mo\u017cliwo\u015bci dla czasu i daty nie jest cz\u0119\u015bci\u0105 niniejszego artyku\u0142u.<\/p>\n<h4 data-start=\"1841\" data-end=\"2047\" id=\"hooki\" ><span class=\"ez-toc-section\" id=\"Hooki\"><\/span>Hooki<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1841\" data-end=\"2047\">W Comarch ERP Enterprise dost\u0119pnych jest kilka hook\u00f3w, kt\u00f3re pozwalaj\u0105 wp\u0142ywa\u0107 na przebieg wyszukiwania. W obiektach deweloperskich do wyszukiwania OQL mo\u017cna przypisa\u0107 klas\u0119 Javy jako hook. Klasa ta musi dziedziczy\u0107 po abstrakcyjnej klasie <em>com.cisag.pgm.objsearch.SearchHook<\/em>. Zawarte w niej hooki mo\u017cna podzieli\u0107 na pi\u0119\u0107 grup:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 161px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Grupa hook\u00f3w<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Kr\u00f3tki opis<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchIteratorHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wymiana <em>SearchIteratora<\/em><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SelectionFieldHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wymiana i manipulacja polami cech wyszukiwania<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">ExecuteHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Manipulacja i rozszerzanie zapytania OQL przed jego wykonaniem<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">ResultHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Manipulacja list\u0105 wynik\u00f3w<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">VisualisationHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">U\u017cycie w\u0142asnej wizualizacji do prezentacji wynik\u00f3w<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1590\" data-end=\"1825\">Niekt\u00f3re grupy hook\u00f3w s\u0105 dalej podzielone. Zawarte w nich hooki mog\u0105 by\u0107 czasami u\u017cywane w kombinacji, a czasami wy\u0142\u0105cznie samodzielnie. Szczeg\u00f3\u0142owe informacje znajduj\u0105 si\u0119 w dalszej cz\u0119\u015bci dokumentacji opisuj\u0105cej poszczeg\u00f3lne hooki.<\/p>\n<p data-start=\"1827\" data-end=\"2312\">Alternatywnie, zamiast u\u017cycia abstrakcyjnej klasy <em>SearchHook<\/em>, hook mo\u017ce by\u0107 zaimplementowany na bazie interfejs\u00f3w. Jednak interfejsy te zosta\u0142y oznaczone jako <em>deprecated<\/em> w Comarch ERP Enterprise 4.3. Hooki oparte na interfejsach powinny zosta\u0107 w odpowiednim momencie przeniesione na abstrakcyjn\u0105 klas\u0119.<\/p>\n<h5 data-start=\"1827\" data-end=\"2312\" id=\"searchhook\" ><span class=\"ez-toc-section\" id=\"SearchHook\"><\/span>SearchHook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"67\" data-end=\"387\">Aby m\u00f3c u\u017cywa\u0107 hooka z klasy <em>com.cisag.pgm.objsearch.SearchHook<\/em>, nale\u017cy z jednej strony zaimplementowa\u0107 odpowiednie metody hooka, a z drugiej strony aktywowa\u0107 go. Aktywacja hooka odbywa si\u0119 w konstruktorze klasy dziedzicz\u0105cej poprzez wywo\u0142anie nast\u0119puj\u0105cego konstruktora w klasie <em>SearchHook<\/em>:<\/p>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><em>protected SearchHook(int activeHookTypes, int inactiveHookTypes)<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div>\n<p data-start=\"469\" data-end=\"721\">Konstruktor zawiera dwa parametry do ustawiania typ\u00f3w hook\u00f3w. Mo\u017cliwe jest zar\u00f3wno aktywowanie, jak i dezaktywowanie hook\u00f3w. Dezaktywacja hook\u00f3w ma znaczenie w przypadku dziedziczenia po ju\u017c zaimplementowanym hooku, np. aby wymusi\u0107 inn\u0105 wizualizacj\u0119.<\/p>\n<p data-start=\"723\" data-end=\"812\">Dost\u0119pne typy hook\u00f3w zosta\u0142y zdefiniowane jako sta\u0142e w wewn\u0119trznej klasie <em>HookType<\/em>:<\/p>\n<p data-start=\"723\" data-end=\"812\"><em>public static final class HookType { <\/em><br \/>\n<em>public static final int SEARCH_ITERATOR = &#8230;; <\/em><br \/>\n<em>public static final int SELECTION_FIELD = &#8230;; <\/em><br \/>\n<em>public static final int EXECUTE = &#8230;; <\/em><br \/>\n<em>public static final int RESULT_CHANGE_CONTENT = &#8230;; <\/em><br \/>\n<em>public static final int RESULT_FILTER = &#8230;; <\/em><br \/>\n<em>public static final int VISUALISATION_LIST = &#8230;; <\/em><br \/>\n<em>public static final int VISUALISATION_TABLE = &#8230;; <\/em><br \/>\n<em>public static final int VISUALISATION_COLUMN = &#8230;; <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"723\" data-end=\"812\">Dla konstruktor\u00f3w nale\u017cy stosowa\u0107 nast\u0119puj\u0105cy wzorzec:<\/p>\n<p data-start=\"723\" data-end=\"812\"><em>public class MySearchHook extends SearchHook { <\/em><\/p>\n<p><em>public MySearchHook() { <\/em><br \/>\n<em>this(0, 0); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>protected MySearchHook(int activeHookType, <\/em><br \/>\n<em>int inactiveHookTypes){ <\/em><br \/>\n<em>super(HookType.SELECTION_FIELD | <\/em><br \/>\n<em>HookType.VISUALISATION_COLUMN | activeHookType, <\/em><br \/>\n<em>inactiveHookType); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>\u2026 <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"1711\" data-end=\"2217\">Ka\u017cdy<em> SearchHook<\/em> musi posiada\u0107 konstruktor bezparametrowy. Konstruktor ten wywo\u0142ywany jest przy tworzeniu klasy z wyszukiwania. Standardowa implementacja tego konstruktora zawsze wywo\u0142uje <em>this(0, 0).<\/em> Konstruktor z dwoma warto\u015bciami typu<em> int<\/em> wywo\u0142uje z kolei konstruktor klasy nadrz\u0119dnej, przekazuj\u0105c mu te warto\u015bci. Ka\u017cda z warto\u015bci mo\u017ce by\u0107 rozszerzona o wymagane typy hook\u00f3w, kt\u00f3re \u0142\u0105czy si\u0119 operatorem <em>I<\/em>. W poprzednim przyk\u0142adzie aktywowano <em>SelectionFieldHook<\/em> oraz <em>VisualisationColumnHook<\/em>.<\/p>\n<p data-start=\"2219\" data-end=\"2515\">Je\u017celi hook ma by\u0107 podstaw\u0105 dla innego hooka, mo\u017cna po nim dziedziczy\u0107. Je\u015bli w takim przypadku potrzebny jest inny hook wizualizacji, nale\u017cy dezaktywowa\u0107 hook wizualizacji klasy nadrz\u0119dnej i aktywowa\u0107 nowy hook wizualizacji. Hook <em>SelectionFieldHook<\/em> klasy nadrz\u0119dnej pozostaje przy tym aktywny.<\/p>\n<p data-start=\"2219\" data-end=\"2515\"><em>public class AdaptedSearchHook extends MySearchHook { <\/em><\/p>\n<p><em>public AdaptedSearchHook () { <\/em><br \/>\n<em>this(0, 0); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>protected AdaptedSearchHook(int activeHookType, <\/em><br \/>\n<em>int inactiveHookTypes){ <\/em><br \/>\n<em>super(HookType.VISUALISATION_LIST | activeHookType, <\/em><br \/>\n<em>HookType.VISUALISATION_COLUMN | inactiveHookType); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>\u2026 <\/em><br \/>\n<em>} <\/em><\/p>\n<h5 data-start=\"97\" data-end=\"355\" id=\"searchiteratorhook\" ><span class=\"ez-toc-section\" id=\"SearchIteratorHook\"><\/span>SearchIteratorHook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"97\" data-end=\"355\">HookType: <em>SEARCH_ITERATOR<\/em><\/p>\n<p data-start=\"97\" data-end=\"355\"><em>public SearchIterator createSearchIterator(SearchInfo searchInfo)<\/em><\/p>\n<p data-start=\"97\" data-end=\"355\">Za pomoc\u0105 tego hooka mo\u017cna wymieni\u0107 <em>SearchIterator<\/em>. Przyk\u0142adem zastosowania mo\u017ce by\u0107 dost\u0119p do systemu plik\u00f3w zamiast do bazy danych.<\/p>\n<h5 data-start=\"97\" data-end=\"355\" id=\"selectionfieldhook\" ><span class=\"ez-toc-section\" id=\"SelectionFieldHook\"><\/span>SelectionFieldHook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"97\" data-end=\"355\">HookType: <em>SELECTION_FIELD<\/em><\/p>\n<p data-start=\"97\" data-end=\"355\"><em>public Field manipulateSelectionFieldBefore(String name, Field field)<\/em><br data-start=\"481\" data-end=\"484\" \/><em>public void manipulateSelectionFieldAfter(String name, Field field)<\/em><\/p>\n<p data-start=\"97\" data-end=\"355\">W wyszukiwaniu dialogowym i w wyszukiwaniu w nag\u0142\u00f3wku do wprowadzania cech wyszukiwania u\u017cywane s\u0105 pola wej\u015bciowe. Zwykle wy\u015bwietlane pola wybierane s\u0105 automatycznie w zale\u017cno\u015bci od typu. Na przyk\u0142ad dla <em>Valueset<\/em> tworzone jest <em>ValueSetField<\/em>.<\/p>\n<p data-start=\"812\" data-end=\"1159\">Je\u017celi do wprowadzania cech wyszukiwania potrzebne s\u0105 specjalne pola, za pomoc\u0105 tego hooka mo\u017cna manipulowa\u0107 lub wymienia\u0107 u\u017cywane pola. W Comarch ERP Enterprise podczas budowania interfejsu rozr\u00f3\u017cnia si\u0119 dwa momenty. Niekt\u00f3re ustawienia mo\u017cna przypisa\u0107 do pola tylko przed dodaniem go do interfejsu, inne dopiero po dodaniu. Dlatego dost\u0119pne s\u0105 dwie metody.<\/p>\n<p data-start=\"1161\" data-end=\"1343\">Metoda <em>manipulateSelectionFieldBefore<\/em> umo\u017cliwia wymian\u0119 pola lub modyfikacj\u0119 pola proponowanego. Metoda <em>manipulateSelectionFieldAfter<\/em> pozwala zmieni\u0107 w\u0142a\u015bciwo\u015bci istniej\u0105cego pola.<\/p>\n<p data-start=\"1345\" data-end=\"1601\">Ka\u017cda metoda przyjmuje dwa parametry: nazw\u0119 parametru (tak\u0105, jak\u0105 w metadanych wyszukiwania OQL zapisano przy danym atrybucie w pozycji <em>Name<\/em>) oraz pole u\u017cywane przez wyszukiwanie. Na podstawie nazwy mo\u017cna zdecydowa\u0107, czy nale\u017cy zmieni\u0107 przekazane pole.<\/p>\n<p data-start=\"1895\" data-end=\"2041\"><em>public Field manipulateSelectionFieldBefore(String name, <\/em><br \/>\n<em>Field field) { <\/em><br \/>\n<em>if (name.equals(&#8222;definition&#8221;)) { <\/em><br \/>\n<em>field = new MySpecialField(Guid.toHexString( <\/em><br \/>\n<em>WebInterface.getInstanceGuid(field)), <\/em><br \/>\n<em>field.getOriginalPath(),&#8230;); <\/em><br \/>\n<em>field.setSelectionMode(true); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>return field; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>public void manipulateSelectionFieldAfter(String name, <\/em><br \/>\n<em>Field field) { <\/em><br \/>\n<em>if (name.equals(&#8222;definition&#8221;)) { <\/em><br \/>\n<em>field.setSearchManager(null); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"2043\" data-end=\"2357\">Je\u017celi pole zostaje zast\u0105pione, nale\u017cy pami\u0119ta\u0107, aby by\u0142o ono u\u017cywane w trybie <em>SelectionMode<\/em>, poniewa\u017c w ramach wyszukiwa\u0144 wywo\u0142ywana jest wy\u0142\u0105cznie metoda <em>getSelectionString<\/em> dla danego pola. Metoda <em>getValue<\/em> nie jest brana pod uwag\u0119. Ponadto do utworzenia nowego pola nale\u017cy u\u017cy\u0107 GUID i \u015bcie\u017cki pierwotnego pola.<\/p>\n<h6 data-start=\"2043\" data-end=\"2357\" id=\"simpleentityfields-i-guidselection\" ><span class=\"ez-toc-section\" id=\"SimpleEntityFields_i_GuidSelection\"><\/span>SimpleEntityFields i GuidSelection<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2043\" data-end=\"2357\">W Comarch ERP Enterprise ze wzgl\u0119d\u00f3w technicznych nie mo\u017cna tworzy\u0107 relacji mi\u0119dzy r\u00f3\u017cnymi bazami danych. Je\u015bli mimo to u\u017cytkownik chce odwo\u0142a\u0107 si\u0119 do rekordu w innej bazie danych, mo\u017cna w tabeli zapisa\u0107 jedynie klucz do tego rekordu. Informacji o celu referencji nie da si\u0119 odzwierciedli\u0107 przy u\u017cyciu \u015brodk\u00f3w Comarch ERP Enterprise. Dopiero w kodzie \u017ar\u00f3d\u0142owym programisty ta informacja jest zawarta.<\/p>\n<p data-start=\"2779\" data-end=\"3008\">Wyszukiwania OQL r\u00f3wnie\u017c nie mog\u0105 by\u0107 wykonywane pomi\u0119dzy bazami danych. Programista nie ma te\u017c mo\u017cliwo\u015bci zmodyfikowania w kodzie \u017ar\u00f3d\u0142owym wygenerowanych wyszukiwa\u0144 w taki spos\u00f3b, aby wyniki by\u0142y ustalane ponad bazami danych.<\/p>\n<p data-start=\"2779\" data-end=\"3008\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-37583 \" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10.png\" alt=\"\" width=\"386\" height=\"172\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10.png 797w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10-300x134.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10-768x342.png 768w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10-50x22.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10-600x267.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_10-320x143.png 320w\" sizes=\"auto, (max-width: 386px) 100vw, 386px\" \/><\/p>\n<article class=\"text-token-text-primary w-full focus:outline-none scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:25c11371-6ece-431f-a423-b8aac8b33fe6-7\" data-testid=\"conversation-turn-16\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] thread-sm:[--thread-content-margin:--spacing(6)] thread-lg:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] thread-sm:[--thread-content-max-width:40rem] thread-lg:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"130606c2-f0cb-46b0-8c04-e8276150794d\" data-message-model-slug=\"gpt-5\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words dark markdown-new-styling\">\n<p style=\"text-align: center;\" data-start=\"0\" data-end=\"42\" data-is-last-node=\"\" data-is-only-node=\"\">Relacja mi\u0119dzy tabelami r\u00f3\u017cnych baz danych<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<p data-start=\"2779\" data-end=\"3008\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Pomi\u0119dzy obiektami <em>A<\/em> i <em>B<\/em> istnieje relacja. Obiekt B mo\u017ce by\u0107 referencjonowany przez <em>n<\/em> obiekt\u00f3w <em>A<\/em> i odwrotnie. Obiekt <em>A<\/em> znajduje si\u0119 w bazie danych <em>DB1<\/em>, a obiekt <em>B<\/em> w bazie danych <em>DB2.<\/em><\/p>\n<p data-start=\"231\" data-end=\"376\">Je\u017celi zostanie wykonane zapytanie OQL na tabeli <em>A<\/em> w bazie <em>DB1<\/em>, nie ma mo\u017cliwo\u015bci odwo\u0142ania si\u0119 do atrybut\u00f3w, np. <em>name<\/em>, tabeli <em>B<\/em> w bazie <em>DB2<\/em>.<\/p>\n<p data-start=\"378\" data-end=\"604\">Jedyn\u0105 informacj\u0105, jak\u0105 obiekt <em>A<\/em> posiada o obiekcie <em>B<\/em>, jest klucz obiektu <em>B<\/em> w postaci tablicy bajt\u00f3w. Informacja o tym, \u017ce klucz odnosi si\u0119 do obiektu w tabeli <em>B<\/em>, nie mo\u017ce zosta\u0107 odwzorowana w postaci relacji pomi\u0119dzy <em>A<\/em> i <em>B<\/em>.<\/div><\/section><\/p>\n<p data-start=\"45\" data-end=\"410\">Aby mo\u017cna by\u0142o wykona\u0107 zapytanie na tabeli <em>A<\/em>, u\u017cytkownik musia\u0142by w jaki\u015b spos\u00f3b zna\u0107 i wprowadzi\u0107 <em>GUID-y<\/em> obiekt\u00f3w <em>B<\/em> u\u017cywanych jako ograniczenia, co nie jest dla niego praktyczne. U\u017cytkownik powinien raczej wprowadza\u0107 dane w formie czytelnej dla cz\u0142owieka, takie jak atrybut <em>name<\/em> w tabeli <em>B<\/em>. Tego typu atrybuty nie s\u0105 jednak dost\u0119pne przy zapytaniu na tabeli <em>A<\/em>.<\/p>\n<p data-start=\"412\" data-end=\"880\">Dlatego u\u017cytkownikowi trzeba da\u0107 mo\u017cliwo\u015b\u0107 uzyskania <em>GUID-\u00f3w<\/em> z tabeli <em>B<\/em>. Rozwi\u0105zanie tego problemu polega na kompromisie. Pole typu <em>SimpleEntityField<\/em> pozwala u\u017cytkownikowi wprowadzi\u0107 tekst, kt\u00f3ry jako klucz biznesowy jednoznacznie identyfikuje obiekt w tabeli. Opr\u00f3cz tego klucza biznesowego zazwyczaj istnieje te\u017c techniczny klucz w postaci <em>GUID<\/em>. <em>SimpleEntityFields<\/em> mapuj\u0105 wprowadzon\u0105 przez u\u017cytkownika warto\u015b\u0107 na <em>GUID<\/em>, kt\u00f3ry mo\u017cna pobra\u0107 dla pola metod\u0105 <em>getGuid()<\/em>.<\/p>\n<p data-start=\"882\" data-end=\"1306\">Wyszukiwania OQL w Comarch ERP Enterprise pozwalaj\u0105 dzi\u0119ki <em>SelectionFieldHook<\/em> na podmian\u0119 p\u00f3l wej\u015bciowych. Zamiast automatycznie utworzonego pola mo\u017cna wtedy zastosowa\u0107 <em>SimpleEntityField<\/em>. Pole <em>SimpleEntityField<\/em> musi by\u0107 odpowiednio ustawione do tego specjalnego zastosowania, aby przy wywo\u0142aniu metody <em>getSelectionString<\/em> zosta\u0142 zwr\u00f3cony w\u0142a\u015bciwy wynik, czyli <em>GUID<\/em>. W tym celu nale\u017cy wy\u0142\u0105czy\u0107 <em>SelectionMode<\/em>, a w\u0142\u0105czy\u0107 <em>GuidSelectionMode<\/em>.<\/p>\n<p data-start=\"1308\" data-end=\"1588\"><em>public Field manipulateSelectionFieldBefore(String name,<\/em><br data-start=\"1379\" data-end=\"1382\" \/><em>Field field ) { <\/em><br \/>\n<em>if (name.equals(&#8222;definition&#8221;)) { <\/em><br \/>\n<em>SimpleEntityField result = new MySimpleEntityField(&#8230;); <\/em><br \/>\n<em>result.setSelectionMode(false); <\/em><br \/>\n<em>result.setGuidSelectionMode(true); <\/em><br \/>\n<em>field = result; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>return field; <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"1590\" data-end=\"1774\">Kompromis polega na tym, \u017ce dla wyszukiwania mo\u017cna u\u017cy\u0107 jako ograniczaj\u0105cego parametru maksymalnie jednego obiektu z tabeli <em>B<\/em>. Nie ma mo\u017cliwo\u015bci u\u017cycia kilku obiekt\u00f3w <em>B<\/em> jednocze\u015bnie.<\/p>\n<p data-start=\"1590\" data-end=\"1774\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Zosta\u0142o utworzone zapytanie OQL na tabeli <em>A<\/em>, kt\u00f3re zawiera parametr <em>b (byte[])<\/em>. Za pomoc\u0105 <em>SelectionFieldHook<\/em> dla tego parametru wstawiane jest pole <em>SimpleEntityField<\/em> dla obiekt\u00f3w z tabeli <em>B<\/em> i odpowiednio konfigurowane. U\u017cytkownik otrzymuje wyszukiwanie w postaci np. okna dialogowego. W polu <em>SimpleEntityField<\/em> dla parametru <em>b<\/em> mo\u017ce on wprowadzi\u0107 kod-klucz lub wybra\u0107 obiekt w wygodny spos\u00f3b za pomoc\u0105 powi\u0105zanego wyszukiwania. Przy uruchomieniu wyszukiwania <em>GUID<\/em> wybranego obiektu jest odczytywany i podstawiany do parametru <em>b<\/em>. W rezultacie wyszukiwanie zwraca tylko te obiekty z tabeli <em>A<\/em>, kt\u00f3re w polu <em>b<\/em> maj\u0105 wpisan\u0105 <em>GUID<\/em> obiektu <em>B<\/em>.<\/div><\/section><\/p>\n<p data-start=\"2430\" data-end=\"2872\">Za pomoc\u0105 tej funkcji mo\u017cna r\u00f3wnie\u017c rozwi\u0105za\u0107 inny problem.<\/p>\n<p data-start=\"2430\" data-end=\"2872\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Tabele<em> A1<\/em> do <em>An<\/em> znajduj\u0105 si\u0119 w tej samej bazie danych. Wszystkie posiadaj\u0105 wiele atrybut\u00f3w i s\u0105 ze sob\u0105 bardzo z\u0142o\u017cenie powi\u0105zane. Zapytanie obejmuj\u0105ce te tabele prowadzi do bardzo du\u017cego z\u0142\u0105czenia (<em>JOIN<\/em>), kt\u00f3re mocno obci\u0105\u017ca zasoby. Je\u015bli u\u017cytkownik chce pomin\u0105\u0107 cz\u0119\u015b\u0107 z\u0142\u0105cze\u0144, mo\u017cna to zrobi\u0107 przy u\u017cyciu opisanej metody, bior\u0105c pod uwag\u0119 zwi\u0105zane z ni\u0105 ograniczenia.<\/div><\/section><\/p>\n<h5 data-start=\"2430\" data-end=\"2872\" id=\"executehook\" ><span class=\"ez-toc-section\" id=\"ExecuteHook\"><\/span>ExecuteHook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"43\" data-end=\"141\">HookType: <em>EXECUTE<\/em><\/p>\n<p data-start=\"43\" data-end=\"141\"><em>public String prepareExecute(CisOqlSearchStatement stmt)<\/em><\/p>\n<p data-start=\"143\" data-end=\"400\"><em>ExecuteHook<\/em> umo\u017cliwia wp\u0142ywanie na spos\u00f3b \u0142\u0105czenia cech wyszukiwania oraz uwzgl\u0119dnianie dodatkowych parametr\u00f3w i cech podczas wyszukiwania. Je\u015bli w polu wej\u015bciowym zostanie wprowadzonych kilka cech wyszukiwania, w zapytaniu s\u0105 one \u0142\u0105czone operatorem <em>OR<\/em>.<\/p>\n<p data-start=\"143\" data-end=\"400\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W polu wej\u015bciowym <em>A<\/em> u\u017cytkownik wpisuje tekst: <em>1, a*, b. <\/em>Powstaje w\u00f3wczas nast\u0119puj\u0105ce powi\u0105zanie:<\/p>\n<p style=\"text-align: center;\" data-start=\"143\" data-end=\"400\"><em>A=1 OR A LIKE \u2018a<\/em>\u2019 OR A LIKE \u2018*b\u2019 <\/div><\/section><\/p>\n<p data-start=\"553\" data-end=\"624\">Cechy wyszukiwania z kilku p\u00f3l s\u0105 natomiast \u0142\u0105czone operatorem <em>AND<\/em>.<\/p>\n<p data-start=\"553\" data-end=\"624\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Wyszukiwanie posiada pola wej\u015bciowe dla parametr\u00f3w <em>A, B<\/em> i <em>C<\/em>. U\u017cytkownik wpisuje w <em>A<\/em> &#8211; <em>1 , 2<\/em>, w <em>B &#8211; 3<\/em>, a w C &#8211; <em>a* , b<\/em>*. Powstaje nast\u0119puj\u0105ce powi\u0105zanie:<\/p>\n<p style=\"text-align: center;\" data-start=\"553\" data-end=\"624\"><em>(A=1 OR A=2) AND B=3 AND (C LIKE \u2018a*\u2019 OR C LIKE \u2018b*\u2019)<\/em> <\/div><\/section><\/p>\n<p data-start=\"849\" data-end=\"1014\">Czasami jednak po\u017c\u0105dane jest, aby niekt\u00f3re pola wej\u015bciowe by\u0142y po\u0142\u0105czone operatorem <em>OR<\/em>, a tak\u017ce aby uwzgl\u0119dni\u0107 dodatkowe parametry, np. do sprawdzania uprawnie\u0144.<\/p>\n<p data-start=\"849\" data-end=\"1014\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Atrybuty <em>A<\/em> i <em>B<\/em> z poprzedniego przyk\u0142adu powinny by\u0107 po\u0142\u0105czone operatorem <em>OR<\/em> zamiast <em>AND<\/em>:<\/p>\n<p style=\"text-align: center;\" data-start=\"849\" data-end=\"1014\"><em>((A=1 OR A=2) OR B=3) AND (C LIKE \u2018a*\u2019 OR C LIKE \u2018b*\u2019)<\/em> <\/div><\/section><\/p>\n<p data-start=\"1181\" data-end=\"1600\">Aby uzyska\u0107 takie zachowanie, metodzie <em>execute<\/em> klasy <em>CisOqlSearchStatement<\/em> mo\u017cna przekaza\u0107 dodatkowy warunek w postaci \u0142a\u0144cucha znak\u00f3w. Warunek ten mo\u017ce zawiera\u0107 zar\u00f3wno dodatkowe, jak i znane ju\u017c parametry powi\u0105zane w OQL. Warunek jest analizowany przez<em> statement<\/em> \u2013 wszystkie parametry w nim znalezione nie s\u0105 ju\u017c p\u00f3\u017aniej ponownie uwzgl\u0119dniane. Pozosta\u0142e parametry s\u0105 \u0142\u0105czone standardowo za pomoc\u0105 operatora <em>AND<\/em>.<\/p>\n<p data-start=\"1602\" data-end=\"1825\">Dzi\u0119ki <em>ExecuteHook<\/em> programista uzyskuje dost\u0119p do <em>statementu<\/em>. W metodzie <em>prepareExecute<\/em> mo\u017cna zbudowa\u0107 dodatkowy warunek i zwr\u00f3ci\u0107 go jako wynik metody. Warto\u015bci dodatkowych parametr\u00f3w musz\u0105 zosta\u0107 ustawione na statement.<\/p>\n<p data-start=\"1602\" data-end=\"1825\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Modyfikacja umo\u017cliwia, w przypadku braku odpowiedniego uprawnienia, wy\u015bwietlanie tylko tych rekord\u00f3w, kt\u00f3re aktualny u\u017cytkownik sam utworzy\u0142 albo w kt\u00f3rych jest wpisany w polu <em>userGuid<\/em>.<\/p>\n<p data-start=\"1827\" data-end=\"2028\"><em>public String prepareExecute(CisOqlSearchStatement stmt) { <\/em><br \/>\n<em>if (!Logic.getInstance().isAllowedDisplayOthersObjects()){ <\/em><br \/>\n<em>String condition = <\/em><br \/>\n<em>&#8222;ac:updateInfo.createUser={userGuid} OR EXISTS &#8221; <\/em><br \/>\n<em>+ &#8222;(SELECT w:guid FROM com.cisag&#8230;.obj.XYZ w &#8221; <\/em><br \/>\n<em>+ &#8222;WHERE w:userGuid={userGuid})&#8221;; <\/em><br \/>\n<em>CisEnvironment env = CisEnvironment.getInstance(); <\/em><br \/>\n<em>stmt.setGuid(&#8222;userGuid&#8221;, env.getUserGuid()); <\/em><br \/>\n<em>return condition; <\/em><br \/>\n<em>} else { <\/em><br \/>\n<em>return &#8222;&#8221;; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h5 data-start=\"1827\" data-end=\"2028\" id=\"resulthooks\" ><span class=\"ez-toc-section\" id=\"ResultHooks\"><\/span>ResultHooks<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1827\" data-end=\"2028\">Za pomoc\u0105<em> ResultHooks<\/em> mo\u017cna manipulowa\u0107 wynikiem wyszukiwania. Manipulacja ta odbywa si\u0119 w momencie, gdy wynik nie zosta\u0142 jeszcze zwizualizowany. <em>ResultHook<\/em> dzieli si\u0119 na <em>ResultChangeContentHook<\/em>, s\u0142u\u017c\u0105cy do modyfikacji tre\u015bci wyniku wyszukiwania, oraz <em>ResultFilterHook<\/em>, s\u0142u\u017c\u0105cy do zmiany zbioru wynik\u00f3w. Oba hooki mog\u0105 by\u0107 ze sob\u0105 \u0142\u0105czone, przy czym w kolejno\u015bci wywo\u0142a\u0144 <em>ResultFilterHook<\/em> jest wykonywany przed<em> ResultChangeContentHook<\/em>.<\/p>\n<h6 data-start=\"1827\" data-end=\"2028\" id=\"resultchangecontenthook\" ><span class=\"ez-toc-section\" id=\"ResultChangeContentHook\"><\/span>ResultChangeContentHook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1827\" data-end=\"2028\">HookType: <em>RESULT_CHANGE_CONTENT<\/em><\/p>\n<p data-start=\"1827\" data-end=\"2028\"><em>public void changeContentInResultList(java.util.List list)<\/em><\/p>\n<p data-start=\"611\" data-end=\"960\">Za pomoc\u0105 <em>ResultChangeContentHook<\/em> mo\u017cna manipulowa\u0107 zawarto\u015bci\u0105 rekordu. Nie mo\u017cna jednak usuwa\u0107 ani dodawa\u0107 rekord\u00f3w do wyniku. Przekazana lista zawiera maksymalnie sze\u015b\u0107dziesi\u0105t obiekt\u00f3w <em>CisListPartMutable<\/em>. Sama lista jest list\u0105 niemodyfikowaln\u0105, wi\u0119c zmiana jej rozmiaru, np. poprzez usuwanie element\u00f3w, spowoduje wyj\u0105tek.<\/p>\n<p data-start=\"962\" data-end=\"1572\">Poniewa\u017c wielko\u015b\u0107 wyniku nie ulega zmianie, hook ten mo\u017ce by\u0107 stosowany bez zak\u0142\u00f3cania funkcji liczenia rekord\u00f3w w wyszukiwaniu dialogowym. Ka\u017cdy <em>CisListPartMutable<\/em> w li\u015bcie reprezentuje jeden rekord. Dost\u0119p do poszczeg\u00f3lnych kolumn wyniku odbywa si\u0119 poprzez nazw\u0119 atrybutu, tak jak zosta\u0142a zdefiniowana w metadanych wyszukiwania. Wszystkie typy prymitywne (np. <em>double, short<\/em>) s\u0105 w <em>CisListPartMutable<\/em> odwzorowane przez swoje klasy opakowuj\u0105ce (<em>Double, Short<\/em>). Cz\u0119\u015b\u0107 specjalna jest zawsze przechowywana w <em>CisListPartMutable<\/em> jako <em>Specialpart<\/em>, nawet je\u015bli w bazie danych posiada wiele atrybut\u00f3w.<\/p>\n<p data-start=\"962\" data-end=\"1572\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"> Po\u0142\u0105czenie dw\u00f3ch <em>String\u00f3w<\/em>:<\/p>\n<p data-start=\"962\" data-end=\"1572\"><em>public void changeContentInResultList(List list) { <\/em><br \/>\n<em>Iterator iterator = list.iterator(); <\/em><br \/>\n<em>CisListPartMutable row; <\/em><br \/>\n<em>while (iterator.hasNext()) { <\/em><br \/>\n<em>row = (CisListPartMutable) iterator.next(); <\/em><br \/>\n<em>code = (String) row.getObject(&#8222;code&#8221;); <\/em><br \/>\n<em>description = (String) row.getObject(&#8222;desc&#8221;); <\/em><br \/>\n<em>row.setObject(&#8222;xyz&#8221;, code + &#8222;-&#8221; + description); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h6 data-start=\"962\" data-end=\"1572\" id=\"resultfilterhook\" ><span class=\"ez-toc-section\" id=\"ResultFilterHook\"><\/span>ResultFilterHook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"962\" data-end=\"1572\">HookType: <em>RESULT_FILTER <\/em><\/p>\n<p data-start=\"962\" data-end=\"1572\"><em>public List filterResultList(java.util.List list) <\/em><\/p>\n<p data-start=\"2062\" data-end=\"2487\">Za pomoc\u0105 <em>ResultFilterHook<\/em> mo\u017cna filtrowa\u0107 wynik wyszukiwania. Mo\u017cna przy tym zar\u00f3wno usuwa\u0107, jak i dodawa\u0107 rekordy. Przekazana lista zawiera maksymalnie sze\u015b\u0107dziesi\u0105t obiekt\u00f3w <em>CisListPartMutable<\/em>. Analogicznie jak w przypadku <em>ResultChangeContentHook<\/em> ka\u017cdy obiekt <em>CisListPartMutable<\/em> reprezentuje rekord, a dost\u0119p do kolumn odbywa si\u0119 w taki sam spos\u00f3b. Lista zwr\u00f3cona przez hook mo\u017ce by\u0107 list\u0105 przekazan\u0105 lub nowo utworzon\u0105.<\/p>\n<p data-start=\"2489\" data-end=\"3036\"><em>ResultFilterHook<\/em> powinien by\u0107 stosowany tylko wtedy, gdy zmieniana jest liczno\u015b\u0107 wyniku, poniewa\u017c w takim przypadku w wyszukiwaniach musi zosta\u0107 wy\u0142\u0105czona funkcja liczenia rekord\u00f3w. Wynika to z faktu, \u017ce liczenie rekord\u00f3w odbywa si\u0119 na poziomie bazy danych. Je\u015bli zbi\u00f3r wynik\u00f3w zostanie p\u00f3\u017aniej zmodyfikowany, wynik zliczania nie b\u0119dzie si\u0119 zgadza\u0142 z faktyczn\u0105 liczb\u0105 rekord\u00f3w. Aby uzyska\u0107 poprawny wynik zliczania, hook musia\u0142by by\u0107 uruchamiany dla wszystkich rekord\u00f3w, co ze wzgl\u0119du na wydajno\u015b\u0107 i wykorzystanie zasob\u00f3w nie jest uzasadnione.<\/p>\n<p data-start=\"2489\" data-end=\"3036\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"> Usuni\u0119cie rekord\u00f3w o typach <em>TYPE_A, TYPE_B<\/em> i <em>TYPE_C<\/em> oraz mapowanie warto\u015bci <em>TYPE_D<\/em> na <em>TYPE_A<\/em>:<\/p>\n<p data-start=\"2489\" data-end=\"3036\"><em>public List filterResultList(List list) { <\/em><br \/>\n<em>for (Iterator i = list.iterator(); i.hasNext();) { <\/em><br \/>\n<em>CisListPartMutable row = (CisListPartMutable) i.next(); <\/em><br \/>\n<em>Short type = (Short) row.getObject(&#8222;type&#8221;); <\/em><br \/>\n<em>switch (type.shortValue()) { <\/em><br \/>\n<em>case TYPE_A: <\/em><br \/>\n<em>case TYPE_B:<\/em><\/p>\n<p data-start=\"2489\" data-end=\"3036\"><em>case TYPE_C: <\/em><br \/>\n<em>i.remove(); <\/em><br \/>\n<em>break; <\/em><br \/>\n<em>case TYPE_D: <\/em><br \/>\n<em>row.setObject(&#8222;type&#8221;, <\/em><br \/>\n<em>CisNumberFactory.getShort(TYPE_A)); <\/em><br \/>\n<em>break; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><br \/>\n<em>return list; <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<h5 data-start=\"2489\" data-end=\"3036\" id=\"visualisationhooks\" ><span class=\"ez-toc-section\" id=\"VisualisationHooks\"><\/span>VisualisationHooks<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"43\" data-end=\"569\">W Comarch ERP Enterprise do wizualizacji wynik\u00f3w wyszukiwania standardowo u\u017cywane jest <em>Grid-Control<\/em>. Grid-Control zast\u0119puje list\u0119 i tabel\u0119. \u0141\u0105czy w sobie w\u0142a\u015bciwo\u015bci tabeli i listy, a ponadto oferuje dodatkowe mo\u017cliwo\u015bci prezentacji. W <em>Grid-Control<\/em> mo\u017cna na przyk\u0142ad przesuwa\u0107 kolumny, zmienia\u0107 ich szeroko\u015b\u0107 i uk\u0142ada\u0107 je w wielu wierszach. Mo\u017cna te\u017c usuwa\u0107 kolumny z widoku i przywraca\u0107 je w p\u00f3\u017aniejszym czasie. Kolumny oznaczone w modelu danych jako sortowalne mog\u0105 by\u0107 dodawane do sortowania poprzez klikni\u0119cie w nag\u0142\u00f3wek kolumny.<\/p>\n<p data-start=\"571\" data-end=\"745\">U\u017cywane kolumny s\u0105 okre\u015blane na podstawie metadanych wyszukiwania OQL. W zale\u017cno\u015bci od typu danych dobierane s\u0105 odpowiednie pola do wy\u015bwietlenia i ustawiane w <em>Grid-Control<\/em>.<\/p>\n<p data-start=\"747\" data-end=\"1332\">Je\u015bli og\u00f3lna wizualizacja nie spe\u0142nia wymaga\u0144, mo\u017cna za pomoc\u0105 <em>VisualisationHooks<\/em> manipulowa\u0107 sposobem prezentacji albo ca\u0142kowicie go wymieni\u0107. Do tego zadania dost\u0119pne s\u0105 trzy hooki. Specjalnie dla wizualizacji opartej na <em>Grid-Control<\/em> istnieje <em>VisualisationColumnHook<\/em>, kt\u00f3ry pozwala na manipulowanie poszczeg\u00f3lnymi kolumnami. Je\u015bli wizualizacja ma by\u0107 przedstawiona w postaci listy, mo\u017cna u\u017cy\u0107 <em>VisualisationListHook<\/em>. <em>VisualisationTableHook<\/em> wraz z wprowadzeniem <em>VisualisationColumnHook<\/em> praktycznie utraci\u0142 znaczenie i s\u0142u\u017cy jedynie do wype\u0142niania <em>Grid-Control<\/em> danymi w formie tabeli.<\/p>\n<p data-start=\"1334\" data-end=\"1420\">Hooki wizualizacji nie mog\u0105 by\u0107 ze sob\u0105 \u0142\u0105czone. Mo\u017cna aktywowa\u0107 tylko jeden z nich.<\/p>\n<h6 data-start=\"1334\" data-end=\"1420\" id=\"visualisationcolumnhook\" ><span class=\"ez-toc-section\" id=\"VisualisationColumnHook\"><\/span>VisualisationColumnHook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1334\" data-end=\"1420\">HookType: <em>VISUALISATION_COLUMN<\/em><\/p>\n<p data-start=\"1334\" data-end=\"1420\"><em>public static abstract class ColumnModel { <\/em><br \/>\n<em>public abstract short getVisualisationTarget(); <\/em><\/p>\n<p data-start=\"1334\" data-end=\"1420\"><em>public abstract Column getColumn(String name); <\/em><br \/>\n<em>public abstract Column createColumn(String name, String guid, <\/em><br \/>\n<em>String displayFieldPath); <\/em><br \/>\n<em>public abstract boolean isColumnDefinied(String name); <\/em><br \/>\n<em>public abstract java.util.List getColumnNames(); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>public static abstract class Column { <\/em><br \/>\n<em>public static final int GENERIC_FIELD = 1; <\/em><br \/>\n<em>public static final int SPECIAL_FIELD = 2; <\/em><br \/>\n<em>public abstract short getVisualisationTarget(); <\/em><br \/>\n<em>public abstract String getName(); <\/em><br \/>\n<em>public abstract String getGuid(); <\/em><br \/>\n<em>public abstract String getDisplayFieldPath(); <\/em><br \/>\n<em>public abstract void setDisplayFieldPath( <\/em><br \/>\n<em>String displayFieldPath); <\/em><br \/>\n<em>public abstract void setDisplayType(int displayType); <\/em><br \/>\n<em>public abstract int getDisplayType(); <\/em><br \/>\n<em>public abstract void setDeleted(boolean state); <\/em><br \/>\n<em>public abstract boolean isDeleted(); <\/em><br \/>\n<em>public abstract Field getDisplayField(); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>public void manipulateColumnModel(ColumnModel model) <\/em><br \/>\n<em>public Field createDisplayField(Column column) <\/em><br \/>\n<em>public void manipulateDisplayField(Column column) <\/em><br \/>\n<em>public void setDisplayFieldValue(Column column, <\/em><br \/>\n<em>CisListPartMutable data) <\/em><\/p>\n<p data-start=\"43\" data-end=\"350\"><em>VisualisationColumnHook<\/em> s\u0142u\u017cy do ukierunkowanej manipulacji kolumnami w wizualizacji wynik\u00f3w. Hook sk\u0142ada si\u0119 z czterech metod i dw\u00f3ch klas wewn\u0119trznych. Klasy wewn\u0119trzne opisuj\u0105 model danych u\u017cywany do manipulacji. Podstawow\u0105 klas\u0105 jest <em>ColumnModel<\/em>. Posiada ona dla ka\u017cdej kolumny instancj\u0119 klasy <em>Column<\/em>.<\/p>\n<p data-start=\"352\" data-end=\"563\">Obiekt <em>Column<\/em> ma nazw\u0119 unikaln\u0105 w ramach wyszukiwania. Jako nazwa u\u017cywany jest atrybut z metadanych wyszukiwania OQL. Dost\u0119p do kolumny w <em>ColumnModel<\/em> odbywa si\u0119 przez metod\u0119 <em>ColumnModel#getColumn(String name)<\/em>.<\/p>\n<p data-start=\"565\" data-end=\"869\">Aby manipulowa\u0107 modelem kolumn, nale\u017cy zaimplementowa\u0107 metod\u0119 <em>manipulateColumnModel(ColumnModel model)<\/em>. Otrzymuje ona jako parametr model kolumn, kt\u00f3ry zosta\u0142 utworzony na podstawie metadanych wyszukiwania OQL. Model ten zawiera jedynie kolumny, kt\u00f3re w metadanych maj\u0105 przypisan\u0105 pozycj\u0119 wy\u015bwietlania.<\/p>\n<p data-start=\"871\" data-end=\"1093\">Metody <em>createDisplayField(\u2026), manipulateDisplayField(\u2026)<\/em> i <em>setDisplayFieldValue(\u2026)<\/em> trzeba implementowa\u0107 tylko wtedy, gdy zamiast automatycznie generowanych p\u00f3l do prezentacji warto\u015bci w kolumnie ma zosta\u0107 u\u017cyte inne pole.<\/p>\n<p data-start=\"1095\" data-end=\"1884\">Po\u0142\u0105czenie mi\u0119dzy danymi, kolumnami i mo\u017cliwo\u015bci\u0105 sortowania opiera si\u0119 na nazwie atrybutu w wyszukiwaniu OQL. Ka\u017cdy wiersz wyniku jest enkapsulowany w <em>CisListPartMutable<\/em>. W jego ramach dost\u0119p do konkretnej warto\u015bci odbywa si\u0119 przez nazw\u0119 atrybutu. <em>CisListPartMutable<\/em> zawiera wszystkie atrybuty, kt\u00f3re maj\u0105 przypisan\u0105 pozycj\u0119 zwracan\u0105, czyli mo\u017ce zawiera\u0107 wi\u0119cej atrybut\u00f3w ni\u017c tych z przypisan\u0105 pozycj\u0105 wy\u015bwietlania. Na podstawie logicznego typu danych atrybutu, kt\u00f3ry u\u017cywany jest w wy\u015bwietlaniu, okre\u015blany jest typ prymitywny warto\u015bci. Na tej podstawie dobierane jest pole do prezentacji. Warto\u015b\u0107 jest rzutowana na odpowiedni typ danych i przypisywana do pola poprzez odpowiedni\u0105 metod\u0119. Wiedz\u0119 t\u0119 mo\u017cna wykorzysta\u0107, je\u015bli chce si\u0119 w wynikach wyszukiwania wy\u015bwietla\u0107 dodatkowe kolumny.<\/p>\n<p data-start=\"1886\" data-end=\"2409\">Zasadniczo manipulacje na kolumnach powinny by\u0107 wykonywane tylko wtedy, gdy og\u00f3lna prezentacja nie jest wystarczaj\u0105ca. Dotyczy to na przyk\u0142ad sytuacji, gdy do prezentacji potrzebne s\u0105 ikony lub <em>EntityFields<\/em>. Przy nowych kolumnach nale\u017cy sprawdzi\u0107, czy zachowanie domy\u015blne jest wystarczaj\u0105ce. W takim przypadku wystarczy zadba\u0107, aby <em>CisListPartMutable<\/em> mia\u0142 przypisan\u0105 warto\u015b\u0107 do nazwy kolumny z odpowiednim typem danych. Mo\u017cna to osi\u0105gn\u0105\u0107 np. poprzez u\u017cycie<em> ResultChangeContentHook<\/em> i przypisanie warto\u015bci do nazwy kolumny.<\/p>\n<p data-start=\"2411\" data-end=\"2495\">W dalszej cz\u0119\u015bci na podstawie konkretnych zada\u0144 pokazane s\u0105 mo\u017cliwe implementacje.<\/p>\n<p data-start=\"2411\" data-end=\"2495\"><strong>Wykluczenie kolumny z wy\u015bwietlania<\/strong><\/p>\n<p data-start=\"2411\" data-end=\"2495\">Aby wykluczy\u0107 kolumn\u0119 z wy\u015bwietlania, nale\u017cy oznaczy\u0107 j\u0105 jako usuni\u0119t\u0105. W <em>Grid-Control<\/em> mo\u017cna ukrywa\u0107 kolumny i u\u017cytkownik mo\u017ce je p\u00f3\u017aniej ponownie doda\u0107. Kolumna oznaczona jako usuni\u0119ta nie zostanie jednak dodana do <em>Grid-Control<\/em> i nie mo\u017ce by\u0107 przez u\u017cytkownika przywr\u00f3cona.<\/p>\n<p data-start=\"2411\" data-end=\"2495\"><em>public void manipulateColumnModel(ColumnModel model) { <\/em><br \/>\n<em>model.getColumn(&#8222;name&#8221;).setDeleted(true); <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"2411\" data-end=\"2495\"><strong>Wy\u015bwietlanie dodatkowej kolumny<\/strong><\/p>\n<p data-start=\"2411\" data-end=\"2495\">Dodatkow\u0105 kolumn\u0119 mo\u017cna doda\u0107 do modelu za pomoc\u0105 metody <em>createColumn(\u2026)<\/em>. Nazwa u\u017cytej kolumny mo\u017ce, ale nie musi, by\u0107 znana w wyszukiwaniu jako atrybut. Wymagane s\u0105 zawsze <em>GUID<\/em> oraz logiczny typ danych. Na ich podstawie w przypadku og\u00f3lnym budowane jest pole, kt\u00f3re zostanie wykorzystane do prezentacji danych.<\/p>\n<p data-start=\"2411\" data-end=\"2495\"><em>public void manipulateColumnModel(ColumnModel model) { <\/em><br \/>\n<em>model.createColumn(&#8222;name&#8221;, <\/em><br \/>\n<em>&#8222;0000541C2E541D1082DD846464090000&#8221;, <\/em><br \/>\n<em>&#8222;com.cisag.app.general.ui:PartnerName.lt&#8221;); <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"988\" data-end=\"1037\">Dla pozyskiwania danych istniej\u0105 trzy warianty:<\/p>\n<ul>\n<li data-start=\"1040\" data-end=\"1136\">w wyszukiwaniu OQL istnieje atrybut o tej samej nazwie, kt\u00f3ry ma przypisan\u0105 pozycj\u0119 zwracania,<\/li>\n<li data-start=\"1139\" data-end=\"1240\">w wyszukiwaniu OQL istnieje atrybut o tej samej nazwie, kt\u00f3ry nie ma przypisanej pozycji zwracania,<\/li>\n<li data-start=\"1243\" data-end=\"1302\">w wyszukiwaniu OQL nie istnieje atrybut o podanej nazwie.<\/li>\n<\/ul>\n<p>W pierwszym przypadku w <em>CisListPartMutable<\/em> znajduje si\u0119 ju\u017c atrybut z warto\u015bci\u0105 potrzebn\u0105 do wy\u015bwietlenia. W dw\u00f3ch pozosta\u0142ych przypadkach nale\u017cy za pomoc\u0105 <em>ResultChangeContentHook<\/em> podstawi\u0107 warto\u015b\u0107 dla atrybutu. Je\u017celi atrybut w wyszukiwaniu jest oznaczony jako sortowalny, trzeba upewni\u0107 si\u0119, \u017ce wy\u015bwietlane warto\u015bci pasuj\u0105 do sortowania. Oznacza to, \u017ce gdy u\u017cytkownik kliknie nag\u0142\u00f3wek kolumny, dane b\u0119d\u0105 pobierane z bazy w nowej kolejno\u015bci. Je\u015bli w polu zamiast warto\u015bci u\u017cytych do sortowania zostan\u0105 wy\u015bwietlone inne, mo\u017ce wyst\u0105pi\u0107 niesp\u00f3jno\u015b\u0107 mi\u0119dzy warto\u015bciami a kolejno\u015bci\u0105 sortowania.<\/p>\n<p><strong>Zast\u0105pienie pola do wy\u015bwietlania<\/strong><\/p>\n<p>Jak ju\u017c wspomniano, pola do wy\u015bwietlania nale\u017cy zast\u0119powa\u0107 tylko wtedy, gdy automatycznie tworzone pola nie spe\u0142niaj\u0105 wymaga\u0144. Zwykle ma to miejsce przy prezentacji <em>ValueSets<\/em> jako ikony lub gdy wymagane jest <em>EntityField<\/em>. W takich przypadkach mo\u017cna dla kolumny ustawi\u0107 odpowiedni\u0105 flag\u0119.<\/p>\n<p><em>public void manipulateColumnModel(ColumnModel model) { <\/em><br \/>\n<em>model.getColumn(&#8222;name&#8221;).setDisplayType(Column.SPECIAL_FIELD); <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"2350\" data-end=\"2598\">Po ustawieniu flagi nale\u017cy zaimplementowa\u0107 metody <em>createDisplayField(\u2026), manipulateDisplayField(\u2026)<\/em> i <em>setDisplayFieldValue(\u2026)<\/em> dla odpowiedniej kolumny. Metody te wywo\u0142ywane s\u0105 wy\u0142\u0105cznie dla kolumn, dla kt\u00f3rych ustawiono flag\u0119 <em>Column.SPECIAL_FIELD<\/em>.<\/p>\n<p data-start=\"2600\" data-end=\"3027\">Podobnie jak w przypadku cech wyszukiwania, istniej\u0105 dwie metody do tworzenia i manipulacji polem wy\u015bwietlania. Metoda <em>createDisplayField(\u2026)<\/em> tworzy pole wy\u015bwietlania. Nale\u017cy przy tym mo\u017cliwie wykorzysta\u0107 <em>GUID<\/em> i \u015bcie\u017ck\u0119 z obiektu <em>Column<\/em>. Metoda <em>manipulateDisplayField(\u2026)<\/em> jest wywo\u0142ywana po dodaniu wygenerowanego pola do <em>Grid-Control<\/em>. Tutaj mo\u017cna wprowadzi\u0107 zmiany w polu, kt\u00f3re mo\u017cliwe s\u0105 dopiero po dodaniu go do interfejsu.<\/p>\n<p data-start=\"2600\" data-end=\"3027\"><em>public Field createDisplayField(Column column) { <\/em><br \/>\n<em>if (column.getName().equals(&#8222;name&#8221;)) { <\/em><br \/>\n<em>return new MySpecialField(column.getGuid(), <\/em><br \/>\n<em>column.getDisplayPath()); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><br \/>\n<em>public void manipulateDisplayField(Column column) { <\/em><br \/>\n<em>if (column.getName().equals(&#8222;name&#8221;)) { <\/em><br \/>\n<em>MySpecialField field = (MySpecialField) <\/em><br \/>\n<em>column.getDisplayField();<\/em><\/p>\n<p data-start=\"2600\" data-end=\"3027\"><em>field.set&#8230;; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"2600\" data-end=\"3027\">Po utworzeniu pola nale\u017cy zaimplementowa\u0107 przypisywanie warto\u015bci do tego pola. Metoda <em>setDisplayFieldValue(\u2026)<\/em> otrzymuje opr\u00f3cz obiektu <em>Column<\/em>, zawieraj\u0105cego wygenerowane pole, tak\u017ce <em>CisListPartMutable<\/em> dla bie\u017c\u0105cego wiersza. Dane potrzebne do wype\u0142nienia pola mo\u017cna pobra\u0107 z dowolnych wpis\u00f3w w wierszu. Mo\u017cna to wykorzysta\u0107 np. do wype\u0142niania wielowarstwowego <em>IconField<\/em> na podstawie kilku status\u00f3w.<\/p>\n<p data-start=\"2600\" data-end=\"3027\"><em>public void setDisplayFieldValue(Column column, <\/em><br \/>\n<em>CisListPartMutable part) { <\/em><br \/>\n<em>if (column.getName().equals(&#8222;name&#8221;)) { <\/em><br \/>\n<em>MySpecialField field = (MySpecialField) <\/em><br \/>\n<em>column.getDisplayField(); <\/em><br \/>\n<em>String value1 = (String) part.getObject(&#8222;value1&#8221;); <\/em><br \/>\n<em>String value2 = (String) part.getObject(&#8222;value2&#8221;); <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>field.setValue(value1, value2,&#8230;); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em><\/p>\n<h6 data-start=\"2600\" data-end=\"3027\" id=\"visualisationlisthook\" ><span class=\"ez-toc-section\" id=\"VisualisationListHook\"><\/span>VisualisationListHook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2600\" data-end=\"3027\">HookType: <em>VISUALISATION_LIST <\/em><\/p>\n<p data-start=\"2600\" data-end=\"3027\"><em>public void initList(List list, short type) <\/em><br \/>\n<em>public ListView createView(short type) <\/em><br \/>\n<em>public static final class VisualisationTarget { <\/em><br \/>\n<em>public static final short DIALOG = &#8230;; <\/em><br \/>\n<em>public static final short LOCATOR = &#8230;; <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"43\" data-end=\"493\">Je\u015bli standardowe rozwi\u0105zanie nie wystarcza do prezentacji wynik\u00f3w, mo\u017cna utworzy\u0107 w\u0142asn\u0105 list\u0119. Metoda <em>createView<\/em> tworzy w zale\u017cno\u015bci od przekazanego typu obiekt <em>ListView<\/em>. Jako mo\u017cliwe warto\u015bci przekazywane s\u0105 <em>VisualisationTarget.DIALOG<\/em> albo <em>VisualisationTarget.LOCATOR<\/em>. Dzi\u0119ki temu wygl\u0105d prezentacji mo\u017ce zosta\u0107 dostosowany do miejsca u\u017cycia. W nawigatorze aplikacyjnym (<em>LOCATOR<\/em>) dost\u0119pna szeroko\u015b\u0107 jest mniejsza ni\u017c w oknie dialogowym (<em>DIALOG<\/em>).<\/p>\n<p data-start=\"495\" data-end=\"668\">Metoda <em>initList<\/em> umo\u017cliwia ustawienie nazw i szeroko\u015bci kolumn. Podobnie jak w metodzie <em>createView<\/em> wygl\u0105d mo\u017ce by\u0107 dostosowany w zale\u017cno\u015bci od warto\u015bci <em>VisualisationTarget<\/em>.<\/p>\n<p data-start=\"495\" data-end=\"668\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przy implementacji nale\u017cy pami\u0119ta\u0107, aby do wy\u015bwietlania danych u\u017cywa\u0107 mo\u017cliwie tylko etykiet (<em>Labels<\/em>). Etykiety z regu\u0142y nie otrzymuj\u0105 fokusu, dzi\u0119ki czemu mo\u017ce go przej\u0105\u0107 ca\u0142y wiersz. Natomiast pola tekstowe przejmuj\u0105 fokus, przez co wiersz nie zostaje zaznaczony. Je\u017celi do wy\u015bwietlania nie mo\u017cna u\u017cy\u0107 etykiety, w polu przeznaczonym do prezentacji nale\u017cy ustawi\u0107 w\u0142a\u015bciwo\u015b\u0107 <em>setRequestFocusEnabled(false)<\/em>.<\/div><\/section><\/p>\n<p data-start=\"495\" data-end=\"668\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Do prezentacji listy nale\u017cy zawsze u\u017cywa\u0107 <em>ListStyle SEARCH<\/em>. Styl ten powoduje, \u017ce podczas zaznaczania wiersza odpowiedni kolor t\u0142a zostaje ustawiony w <em>ListView<\/em>.<\/div><\/section><\/p>\n<h6 data-start=\"495\" data-end=\"668\" id=\"visualisationtablehook\" ><span class=\"ez-toc-section\" id=\"VisualisationTableHook\"><\/span>VisualisationTableHook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"495\" data-end=\"668\">HookType: <em>VISUALISATION_TABLE<\/em><\/p>\n<p data-start=\"495\" data-end=\"668\"><em>public void initTable(Table table, short type) <\/em><br \/>\n<em>public void dataToTable(CisListPartMutable data, short type) <\/em><br \/>\n<em>public static final class VisualisationTarget { <\/em><br \/>\n<em>public static final short DIALOG = &#8230;; <\/em><br \/>\n<em>public static final short LOCATOR = &#8230;; <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"43\" data-end=\"206\">Je\u015bli standardowe rozwi\u0105zanie nie wystarcza do prezentacji wynik\u00f3w, mo\u017cna utworzy\u0107 w\u0142asn\u0105 tabel\u0119. Metoda <em>initTable<\/em> umo\u017cliwia ustawienie nazw i szeroko\u015bci kolumn.<\/p>\n<p data-start=\"208\" data-end=\"416\">Podobnie jak w przypadku prezentacji listy, za pomoc\u0105 parametru <em>type<\/em> okre\u015bla si\u0119 przeznaczenie tabeli. Jako mo\u017cliwa warto\u015b\u0107 przekazywana jest jedna z dw\u00f3ch sta\u0142ych z klasy wewn\u0119trznej <em>VisualisationTarget<\/em>.<\/p>\n<p data-start=\"418\" data-end=\"485\">Metoda <em>dataToTable<\/em> umieszcza dane w poszczeg\u00f3lnych polach tabeli.<\/p>\n<p data-start=\"418\" data-end=\"485\"><em>public void dataToTable(CisListPartMutable part, short type) { <\/em><br \/>\n<em>switch(type) { <\/em><br \/>\n<em>case (VisualisationTarget.DIALOG): <\/em><br \/>\n<em>&#8230;. <\/em><br \/>\n<em>break; <\/em><br \/>\n<em>case (VisualisationTarget.LOCATOR): <\/em><br \/>\n<em>&#8230;. <\/em><br \/>\n<em>break; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"418\" data-end=\"485\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\"><em>VisualisationTableHook<\/em> nie powinien by\u0107 ju\u017c u\u017cywany, poniewa\u017c do prezentacji wynik\u00f3w stosowane jest <em>Grid-Control. VisualisationTableHook<\/em> udost\u0119pnia jedynie interfejs, dzi\u0119ki kt\u00f3remu <em>Grid-Control<\/em> zachowuje si\u0119 podobnie jak tabela. Oznacza to jednak, \u017ce wszystkie kolumny musz\u0105 zosta\u0107 zdefiniowane. Sortowanie po nag\u0142\u00f3wkach kolumn nie mo\u017ce by\u0107 w tym przypadku zagwarantowane. Z tego powodu zaleca si\u0119 stosowanie <em>VisualisationColumnHook<\/em> zamiast <em>VisualisationTableHook<\/em>.<\/div><\/section><\/p>\n<h5 data-start=\"418\" data-end=\"485\" id=\"przestawienie-interfacehooks-na-abstrakcyjna-klase-searchhook\" ><span class=\"ez-toc-section\" id=\"Przestawienie_InterfaceHooks_na_abstrakcyjna_klase_SearchHook\"><\/span>Przestawienie InterfaceHooks na abstrakcyjn\u0105 klas\u0119 SearchHook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"43\" data-end=\"581\">W Comarch ERP Enterprise 4.3 interfejsy <em>InterfaceHooks<\/em> zosta\u0142y oznaczone jako przestarza\u0142e (<em>deprecated<\/em>). Dzia\u0142aj\u0105 one nadal bez ogranicze\u0144 tak\u017ce od wersji 4.3, jednak zaleca si\u0119, aby wyszukiwania zosta\u0142y przeniesione na abstrakcyjn\u0105 klas\u0119 <em>SearchHook<\/em>, szczeg\u00f3lnie w celu pe\u0142nego wykorzystania mo\u017cliwo\u015bci <em>Grid-Control<\/em>. Przestawienie na abstrakcyjn\u0105 klas\u0119 <em>SearchHook<\/em> jest na og\u00f3\u0142 bezproblemowe. Wa\u017cne jest jednak, aby opr\u00f3cz implementacji metod hook zosta\u0142 zarejestrowany w konstruktorze.<\/p>\n<p data-start=\"583\" data-end=\"713\">Poni\u017cej znajduje si\u0119 tabela z kr\u00f3tkim zestawieniem, kt\u00f3ry <em>InterfaceHook<\/em> nale\u017cy przekszta\u0142ci\u0107 na kt\u00f3ry <em>HookType<\/em> klasy <em>SearchHook<\/em>:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 184px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>InterfaceHook<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>SearchHook.HookType<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">CisObjectSearchIteratorCreator<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchIteratorHook<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchIteratorCreatorHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchIteratorHook<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">CisObjectSearchFieldManipulation<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SelectionFieldHook<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">CisObjectSearchExecuteHook<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">ExecuteHook<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchResultManipulation<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\n<ul>\n<li>SearchResultManipulation<\/li>\n<li>ResultFilterHook<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">ResultListHook (SearchListManager, ListViewCreator)<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\n<ul>\n<li>VisualisationListHook<\/li>\n<li>VisualisationColumnHook<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">SearchTableManager (TableDataManager)<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\n<ul>\n<li>VisualisationTableHook<\/li>\n<li>VisualisationColumnHook<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>CisObjectSearchIteratorCreator i SearchIteratorCreatorHook<\/strong><\/p>\n<p><em>CisObjectSearchIteratorCreator<\/em> jest ju\u017c od Comarch ERP Enterprise 4 oznaczony jako przestarza\u0142y i powinien by\u0107, je\u015bli to mo\u017cliwe, zast\u0105piony przez <em>SearchIteratorCreatorHook<\/em>. Zamiast <em>SearchIteratorCreatorHook<\/em> nale\u017cy teraz stosowa\u0107 <em>SearchIteratorHook<\/em>. Nazwa metody pozostaje taka sama, a spos\u00f3b dzia\u0142ania nie zosta\u0142 zmieniony.<\/p>\n<p><em>public SearchIterator createSearchIterator(SearchInfo searchInfo)<\/em><\/p>\n<p><strong>CisObjectSearchFieldManipulation <\/strong><\/p>\n<p data-start=\"1682\" data-end=\"1900\">Zamiast hooka <em>CisObjectSearchFieldManipulation<\/em> nale\u017cy stosowa\u0107 <em>SelectionFieldHook<\/em>. Do przestawienia wystarczy dostosowa\u0107 nazwy metod, poniewa\u017c spos\u00f3b dzia\u0142ania nie zosta\u0142 zmieniony.<\/p>\n<p data-start=\"1902\" data-end=\"2079\">Dwie metody hooka <em>CisObjectSearchFieldManipulation<\/em>:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public Field manipulateFieldBefore(String name, Field field) <\/em><br \/>\n<em>public void manipulateFieldAfter(String name, Field field)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Dwie metody hooka <em>SelectionFieldHook<\/em>:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public Field manipulateSelectionFieldBefore(String name, <\/em><br \/>\n<em>Field field) <\/em><br \/>\n<em>public void manipulateSelectionFieldAfter(String name, Field field) <\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><strong>CisObjectSearchExecuteHook<\/strong><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Zamiast <em>CisObjectSearchExecuteHook<\/em> nale\u017cy stosowa\u0107 <em>ExecuteHook<\/em>. Nazwa metody pozostaje taka sama, a spos\u00f3b dzia\u0142ania nie zosta\u0142 zmieniony.<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public String prepareExecute(CisOqlSearchStatement stmt)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><strong>SearchResultManipulation<\/strong><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Zamiast hooka <em>SearchResultManipulation<\/em> nale\u017cy stosowa\u0107 jeden z dw\u00f3ch <em>ResultHooks<\/em>: <em>ResultChangeContentHook<\/em> lub <em>ResultFilterHook<\/em>.<\/p>\n<p data-start=\"1902\" data-end=\"2079\">Hook SearchResultManipulation posiada nast\u0119puj\u0105c\u0105 sygnatur\u0119 metody:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public List getManipulatedList(List list)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Je\u015bli ma zosta\u0107 zmieniona liczba rekord\u00f3w, nale\u017cy zastosowa\u0107 <em>ResultFilterHook<\/em>. Implementacja metody mo\u017ce pozosta\u0107 bez zmian:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public java.util.List filterResultList(java.util.List list)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Je\u015bli manipulowany ma by\u0107 jedynie zawarto\u015b\u0107 rekord\u00f3w, nale\u017cy u\u017cy\u0107 <em>ResultChangeContentHook<\/em>. W tym hooku przekazywana jest niemodyfikowalna lista, dlatego w implementacji trzeba wprowadzi\u0107 odpowiednie dostosowania:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public void changeContentInResultList(java.util.List list)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dla hooka <em>SearchResultManipulation<\/em> w wyszukiwaniach w\u0142\u0105czone jest liczenie rekord\u00f3w. Hook otrzymuje list\u0119 z rekordami i mo\u017ce j\u0105 dowolnie manipulowa\u0107, w tym usuwa\u0107 i dodawa\u0107 rekordy. Z tego powodu nie ma jednak gwarancji, \u017ce wynik zliczania rekord\u00f3w w bazie danych odpowiada rzeczywistej liczbie rekord\u00f3w prezentowanej u\u017cytkownikowi.<\/div><\/section><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><strong>ResultListHook (SearchListManager, ListViewCreator)<\/strong><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Do prezentacji wynik\u00f3w w formie listy istnieje kilka interfejs\u00f3w. Podstaw\u0105 jest <em>ListViewCreator<\/em>, na kt\u00f3rym bazuj\u0105 <em>ResultListHook<\/em> oraz <em>SearchListManager<\/em>. <em>SearchListManager<\/em> zosta\u0142 od Comarch ERP Enterprise 4 oznaczony jako przestarza\u0142y i powinien by\u0107 zast\u0105piony przez <em>SearchResultList<\/em>. Oba interfejsy r\u00f3\u017cni\u0105 si\u0119 jedynie dodatkowym parametrem, kt\u00f3ry okre\u015bla, czy lista ma by\u0107 zbudowana dla nawigatora aplikacyjnego, czy dla okna dialogowego.<\/p>\n<p>ListViewCreator:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public ListView createView(String viewName)<\/em><\/p>\n<p>SearchListManager:<\/p>\n<p><em>public void initList(List list) <\/em><\/p>\n<p>SearchResultList:<\/p>\n<p><em>public void initList(List list, String type) <\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Jako zamiennik dla trzech interfejs\u00f3w dost\u0119pny jest w <em>SearchHook VisualisationListHook<\/em> z nast\u0119puj\u0105cymi metodami:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public ListView createView(short type)<\/em><br data-start=\"196\" data-end=\"199\" \/><em>public void initList(List list, short type)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Przy przestawieniu nale\u017cy pami\u0119ta\u0107, \u017ce jako cel wizualizacji trzeba przekaza\u0107 warto\u015b\u0107 typu <em>short<\/em>. Odpowiednie sta\u0142e znajduj\u0105 si\u0119 w klasie <em>VisualisationTarget<\/em>. Funkcjonalno\u015b\u0107 obu metod pozostaje taka sama, wi\u0119c poza obs\u0142ug\u0105 parametru type nie trzeba wprowadza\u0107 \u017cadnych zmian.<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public static final class VisualisationTarget {<\/em><br data-start=\"571\" data-end=\"574\" \/><em>public static final short DIALOG = &#8230;;<\/em><br data-start=\"613\" data-end=\"616\" \/><em>public static final short LOCATOR = &#8230;;<\/em><br data-start=\"656\" data-end=\"659\" \/><em>}<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Wizualizacja w postaci listy jest wspierana r\u00f3wnie\u017c w <em>SearchHook<\/em>. Zaleca si\u0119 jednak stosowanie wizualizacji za pomoc\u0105 <em>Grid-Control<\/em>. Do tego celu s\u0142u\u017cy <em>VisualisationColumnHook<\/em>.<\/div><\/section><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><strong>SearchTableManager (TableDataManager)<\/strong><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Bezpo\u015brednim zamiennikiem <em>SearchTableManager<\/em> jest <em>VisualisationTableHook<\/em>.<em> SearchTableManager<\/em> dziedziczy po <em>TableDataManager<\/em>.<\/p>\n<p data-start=\"1902\" data-end=\"2079\">SearchTableManager:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public void initTable(Table table)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">TableDataManager:<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public void dataToTable(CisListPartMutable data)<\/em><br data-start=\"1144\" data-end=\"1147\" \/><em>public void dataFromTable(CisListPartMutable data)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\">Metoda <em>dataFromTable<\/em> klasy <em>TableDataManager<\/em> by\u0142a w wyszukiwaniach zawsze implementowana jako pusta, poniewa\u017c w tym przypadku nie istnieje funkcjonalno\u015b\u0107 przekazywania danych z tabeli z powrotem do modelu.<\/p>\n<p data-start=\"1902\" data-end=\"2079\">Metody <em>VisualisationTableHook<\/em> zosta\u0142y wi\u0119c zredukowane do dw\u00f3ch. Dodatkowo pojawia si\u0119 parametr typu <em>short<\/em>, kt\u00f3ry okre\u015bla, czy tabela ma by\u0107 wy\u015bwietlana w nawigatorze aplikacyjnym, czy w oknie dialogowym.<\/p>\n<p data-start=\"1902\" data-end=\"2079\"><em>public void initTable(Table table, short type)<\/em><br data-start=\"1663\" data-end=\"1666\" \/><em>public void dataToTable(CisListPartMutable data, short type)<\/em><\/p>\n<p data-start=\"1902\" data-end=\"2079\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Wraz z wprowadzeniem <em>Grid-Control<\/em> w wyszukiwaniu r\u00f3wnie\u017c tabele s\u0105 w nim prezentowane w tej formie. <em>VisualisationTableHook<\/em> umo\u017cliwia manipulacj\u0119 <em>Grid-Control<\/em> przez interfejs tabeli. Nie daje to jednak pe\u0142nej funkcjonalno\u015bci <em>Grid-Control<\/em>. Przyk\u0142adowo, sortowanie poprzez klikni\u0119cie nag\u0142\u00f3wka kolumny nie jest mo\u017cliwe. Dla u\u017cytkownika nie jest widoczne, czy w programowaniu zastosowano <em>VisualisationColumnHook<\/em>, czy <em>VisualisationTableHook<\/em>. Zauwa\u017cy on jedynie, \u017ce w danym wyszukiwaniu pewne funkcje s\u0105 niedost\u0119pne. Dlatego zaleca si\u0119 przej\u015bcie z <em>VisualisationTableHook<\/em> na <em>VisualisationColumnHook<\/em>.<\/div><\/section><\/p>\n<h4 data-start=\"1902\" data-end=\"2079\" id=\"dane-wykonywania-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Dane_wykonywania_wyszukiwania\"><\/span>Dane wykonywania wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"43\" data-end=\"430\">W obiektach deweloperskich dla wyszukiwa\u0144 w Comarch ERP Enterprise zapisywane s\u0105 metadane. Wyszukiwanie, podobnie jak ka\u017cde inne obiekty deweloperskie, jest jednoznacznie identyfikowane przez kombinacj\u0119 przestrzeni nazw i nazwy. Na podstawie metadanych tworzone s\u0105 dla wyszukiwa\u0144 dane wykonywania, kt\u00f3re przechowywane s\u0105 w <em>SearchInfo<\/em>.<\/p>\n<p data-start=\"432\" data-end=\"730\"><em>SearchInfo<\/em> obejmuje nazw\u0119 wyszukiwania, pe\u0142n\u0105 nazw\u0119 kwalifikowan\u0105 oraz nazw\u0119 wy\u015bwietlan\u0105. Dodatkowo mo\u017cna zapisywa\u0107 i odczytywa\u0107 parametry domy\u015blne za pomoc\u0105 metod <em>setParameter<\/em> i <em>getParameter<\/em>. Informacje te mog\u0105 by\u0107 wykorzystywane przy implementacji w\u0142asnego <em>SearchManagera<\/em> w metodzie <em>initSearch<\/em>.<\/p>\n<p data-start=\"732\" data-end=\"1024\">W metadanych mo\u017cna zapisa\u0107 nazw\u0119 klasy hooka. Je\u017celi taka nazwa jest obecna, tworzona jest instancja i odk\u0142adana w <em>SearchInfo<\/em>. Opr\u00f3cz hooka w<em> SearchInfo<\/em> tworzony i przechowywany jest r\u00f3wnie\u017c <em>SearchIterator<\/em>. Dzi\u0119ki u\u017cyciu <em>SearchIteratorHook<\/em> mo\u017cna w <em>SearchInfo<\/em> umie\u015bci\u0107 w\u0142asny <em>SearchIterator<\/em>.<\/p>\n<p data-start=\"1026\" data-end=\"1399\">Ka\u017cdy atrybut wyszukiwania w metadanych jest odwzorowany w obiekcie <em>CisSearchField<\/em>. W zale\u017cno\u015bci od zastosowania <em>CisSearchField<\/em>, <em>SearchInfo<\/em> utrzymuje do niego kilka referencji. Mo\u017cliwe zastosowania to: pole wyszukiwania, pole wy\u015bwietlania, pole sortowania, pole zapytania lub pole zwracane. Dla ka\u017cdego z tych zastosowa\u0144 w <em>SearchInfo<\/em> istnieje lista, kt\u00f3r\u0105 mo\u017cna odczyta\u0107.<\/p>\n<p data-start=\"1401\" data-end=\"1521\">Rekordy wybrane przez u\u017cytkownika na li\u015bcie wynik\u00f3w s\u0105 w <em>SearchInfo<\/em> przechowywane do przekazania do pola wywo\u0142uj\u0105cego.<\/p>\n<p data-start=\"1401\" data-end=\"1521\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-37584 size-full\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11.png\" alt=\"\" width=\"611\" height=\"361\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11.png 611w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11-300x177.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11-50x30.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11-600x355.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/09\/Podrecznik_referencyjny_Wyszukiwania_11-320x189.png 320w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/p>\n<p style=\"text-align: center;\" data-start=\"1401\" data-end=\"1521\">Wyci\u0105g z danych wykonawczych<\/p>\n<h5 id=\"zachowania-specjalne\" ><span class=\"ez-toc-section\" id=\"Zachowania_specjalne\"><\/span>Zachowania specjalne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"88\" data-end=\"167\">Poszczeg\u00f3lne atrybuty w metadanych mog\u0105 by\u0107 opatrzone specjalnym zachowaniem.<\/p>\n<h6 data-start=\"169\" data-end=\"202\" id=\"identyfikacja-i-oznaczenie\" ><span class=\"ez-toc-section\" id=\"Identyfikacja_i_oznaczenie\"><\/span>Identyfikacja i oznaczenie<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"43\" data-end=\"540\">Atrybuty ze specjalnym zachowaniem <em>Identyfikacja<\/em> lub <em>Oznaczenie<\/em> s\u0105 w wyszukiwaniach odczytywane w kilku miejscach. Ka\u017cde specjalne zachowanie mo\u017ce by\u0107 przypisane tylko do jednego atrybutu w wyszukiwaniu. Zar\u00f3wno <em>Identyfikacja<\/em>, jak i <em>Oznaczenie<\/em> musz\u0105 by\u0107 zdefiniowane jako cecha wyszukiwania, pole wy\u015bwietlania oraz warto\u015b\u0107 zwracana. Znaczenie tych dw\u00f3ch specjalnych zachowa\u0144 zosta\u0142o cz\u0119\u015bciowo wyja\u015bnione ju\u017c w rozdziale dotycz\u0105cym wyszukiwania wst\u0119pnego.<\/p>\n<p data-start=\"542\" data-end=\"683\">Przy zastosowaniu znacznika usuwania parametr <em>Identyfikacja<\/em> jest r\u00f3wnie\u017c wykorzystywany. Szczeg\u00f3\u0142y mo\u017cna znale\u017a\u0107 w opisie znacznika usuwania.<\/p>\n<p data-start=\"685\" data-end=\"1089\">Po tym, jak u\u017cytkownik wybierze z listy wynik\u00f3w \u017c\u0105dane rekordy i przejmie je, w przypadku wyboru pojedynczego rekordu zawarto\u015b\u0107 p\u00f3l <em>Identyfikacja<\/em> i <em>Oznaczenie<\/em> jest przekazywana do pola wywo\u0142uj\u0105cego. Przy wielu wybranych rekordach zawarto\u015b\u0107 pola <em>Identyfikacja<\/em> ka\u017cdego rekordu jest \u0142\u0105czona i przekazywana do pola wywo\u0142uj\u0105cego. Zawarto\u015b\u0107 p\u00f3l oznaczenia nie jest w tym przypadku uwzgl\u0119dniana.<\/p>\n<h6 data-start=\"685\" data-end=\"1089\" id=\"znacznik-usuwania\" ><span class=\"ez-toc-section\" id=\"Znacznik_usuwania\"><\/span>Znacznik usuwania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1091\" data-end=\"1493\">To specjalne zachowanie mo\u017ce by\u0107 przypisane tylko atrybutom opartym na znaczniku czasu (<em>Timestamp<\/em>). Zazwyczaj chodzi tu o atrybut <em>deleteTime<\/em> z cz\u0119\u015bci <em>UpdateInformation<\/em> obiektu biznesowego. Dodatkowo atrybut musi by\u0107 oznaczony jako pole zapytania i wy\u015bwietlania. W ramach jednego wyszukiwania tylko jeden atrybut mo\u017ce mie\u0107 przypisane specjalne zachowanie <em>Znacznik usuwania.<\/em><\/p>\n<p data-start=\"1495\" data-end=\"1814\">Je\u017celi wymienione warunki s\u0105 spe\u0142nione, w obszarze zapytania wyszukiwania pojawia si\u0119 pole<em> ValueSet<\/em> z wpisami <em>Ze znacznikiem usuwania<\/em> oraz <em>Bez znacznika usuwania<\/em>. Dzi\u0119ki temu u\u017cytkownik mo\u017ce wyszukiwa\u0107 obiekty ze znacznikiem usuwania albo obiekty bez niego, bez konieczno\u015bci r\u0119cznego podawania czasu usuni\u0119cia.<\/p>\n<p data-start=\"1816\" data-end=\"2152\">W obszarze roboczym dla obiekt\u00f3w ze znacznikiem usuwania wy\u015bwietlane jest odpowiednie ikonograficzne oznaczenie. Ikona zawsze pojawia si\u0119 w kolumnie danego pola po prawej stronie, kt\u00f3re posiada specjalne zachowanie <em>Identyfikacja<\/em>. Atrybut ze specjalnym zachowaniem <em>Znacznik usuwania<\/em> nie otrzymuje w tabeli wynik\u00f3w w\u0142asnej kolumny.<\/p>\n<h6 data-start=\"1816\" data-end=\"2152\" id=\"niewidoczny\" ><span class=\"ez-toc-section\" id=\"Niewidoczny\"><\/span>Niewidoczny<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1816\" data-end=\"2152\">Atrybuty ze specjalnym zachowaniem <em>Niewidoczny<\/em> mog\u0105 by\u0107 u\u017cywane jako ukryte parametry zapytania. Pola te s\u0105 generowane i dodawane do interfejsu u\u017cytkownika, a nast\u0119pnie prze\u0142\u0105czane na tryb niewidoczny. To specjalne zachowanie mo\u017ce by\u0107 u\u017cywane wy\u0142\u0105cznie w zapytaniach.<\/p>\n<h6 data-start=\"1816\" data-end=\"2152\" id=\"kontekst-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Kontekst_wyszukiwania\"><\/span>Kontekst wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1816\" data-end=\"2152\">Dla tych atrybut\u00f3w nie s\u0105 generowane pola cech wyszukiwania. S\u0142u\u017c\u0105 one wy\u0142\u0105cznie do kontekstu wyszukiwania.<\/p>\n<h5 id=\"ustawienia-w-definicjach-wyszukiwania\" ><span class=\"ez-toc-section\" id=\"Ustawienia_w_definicjach_wyszukiwania\"><\/span>Ustawienia w definicjach wyszukiwania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"798\" data-end=\"1063\">Funkcjonalno\u015b\u0107 kontekstu wyszukiwania opiera si\u0119 na tym, \u017ce istnieje zestaw nazw atrybut\u00f3w, kt\u00f3re w zbiorze wyszukiwa\u0144 maj\u0105 to samo znaczenie. Z tego zestawu nazw atrybut\u00f3w wyszukiwanie mo\u017ce korzysta\u0107. Tylko u\u017cyte parametry s\u0105 pobierane w kontek\u015bcie wyszukiwania.<\/p>\n<p data-start=\"1065\" data-end=\"1327\" data-is-last-node=\"\" data-is-only-node=\"\">Atrybuty wykorzystywane w kontek\u015bcie wyszukiwania musz\u0105 by\u0107 cechami wyszukiwania i oznaczone specjalnym zachowaniem kontekstu wyszukiwania. Wa\u017cne jest przy tym, aby nazwa parametru, czyli alias w OQL, by\u0142a taka sama we wszystkich wyszukiwaniach.<\/p>\n<h5 data-start=\"35\" data-end=\"58\" id=\"interfejsy\" ><span class=\"ez-toc-section\" id=\"Interfejsy\"><\/span>Interfejsy<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"60\" data-end=\"186\">Temat kontekstu wyszukiwania obejmuje trzy interfejsy: <em>SearchContextProvider, SearchContext i SearchContextData<\/em>.<\/p>\n<h6 data-start=\"188\" data-end=\"216\" id=\"searchcontextprovider\" ><span class=\"ez-toc-section\" id=\"SearchContextProvider\"><\/span>SearchContextProvider<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"217\" data-end=\"303\">Aplikacja mo\u017ce zaimplementowa\u0107 <em>SearchContextProvider<\/em>, aby udost\u0119pnia\u0107 <em>SearchContext<\/em>.<\/p>\n<p><em>public interface SearchContextProvider { <\/em><br \/>\n<em>public SearchContext getSearchContext(); <\/em><br \/>\n<em>} <\/em><\/p>\n<h6 data-start=\"406\" data-end=\"426\" id=\"searchcontext\" ><span class=\"ez-toc-section\" id=\"SearchContext\"><\/span>SearchContext<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"427\" data-end=\"676\"><em>SearchContext<\/em> dostarcza dla cechy wyszukiwania ci\u0105g wyszukiwania. Ci\u0105g ten zostaje przypisany do iteratora wyszukiwania. Do tworzenia ci\u0105gu wyszukiwania powinna by\u0107 u\u017cywana klasa <em>com.cisag.pgm.objsearch.SelectionSupport<\/em>.<\/p>\n<p><em>public interface SearchContext { <\/em><br \/>\n<em>String getSelectionString(SearchContextData searchContextData); <\/em><br \/>\n<em>} <\/em><\/p>\n<h6 data-start=\"794\" data-end=\"818\" id=\"searchcontextdata\" ><span class=\"ez-toc-section\" id=\"SearchContextData\"><\/span>SearchContextData<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"819\" data-end=\"1178\" data-is-last-node=\"\" data-is-only-node=\"\">Instancje <em>SearchContextData<\/em> s\u0105 tworzone i przekazywane do <em>SearchContext<\/em>. Opr\u00f3cz nazwy atrybutu przekazywana jest r\u00f3wnie\u017c nazwa wyszukiwania oraz GUID bazy danych, w kt\u00f3rej wyszukiwanie jest wykonywane. Na podstawie tych informacji tworzona jest cecha ograniczaj\u0105ca wyszukiwanie, kt\u00f3ra zostaje zwr\u00f3cona przez <em>SearchContext<\/em> w metodzie <em>getSelectionString(&#8230;)<\/em>.<\/p>\n<p><em>public interface SearchContextData { <\/em><br \/>\n<em>public byte[] getDatabaseGuid(); <\/em><br \/>\n<em>public String getSearchName(); <\/em><br \/>\n<em>public String getParameterName(); <\/em><br \/>\n<em>}<\/em><\/p>\n<h5 id=\"klasa-pomocnicza-searchcontextutility\" ><span class=\"ez-toc-section\" id=\"Klasa_pomocnicza_SearchContextUtility\"><\/span>Klasa pomocnicza SearchContextUtility<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa pomocnicza <em>SearchContextUtility<\/em> umo\u017cliwia zarejestrowanie <em>SearchContextProvider<\/em> na polu oraz ponowne odczytanie tej informacji.<\/p>\n<p><em>public class SearchContextUtility { <\/em><\/p>\n<p><em>static public void setSearchContextProvider( <\/em><br \/>\n<em>Field guiField, SearchContextProvider provider) <\/em><br \/>\n<em>static public SearchContextProvider <\/em><br \/>\n<em>getSearchContextProvider(Field guiField) <\/em><br \/>\n<em>static public SearchContextProvider <\/em><br \/>\n<em>getSearchContextProvider( <\/em><br \/>\n<em>com.cisag.pgm.dialog.VisualElement dialogElement) <\/em><br \/>\n<em>} <\/em><\/p>\n<h5 id=\"kolejnosc-ustalania\" ><span class=\"ez-toc-section\" id=\"Kolejnosc_ustalania\"><\/span>Kolejno\u015b\u0107 ustalania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"94\" data-end=\"241\">Gdy wyszukiwanie zostaje otwarte na polu, pr\u00f3ba ustalenia <em>SearchContextProvider<\/em> odbywa si\u0119 w kolejno\u015bci: <em>SearchManager<\/em>, <em>Field<\/em>, <em>Application<\/em>.<\/p>\n<p data-start=\"243\" data-end=\"451\">Najpierw w <em>SearchManager<\/em> za pomoc\u0105 metody <em>getSearchContextProvider<\/em>() podejmowana jest pr\u00f3ba uzyskania <em>providera<\/em>. Je\u015bli metoda ta nie zosta\u0142a nadpisana w ramach w\u0142asnego <em>SearchManager<\/em>, zwraca wynik <em>null<\/em>.<\/p>\n<p data-start=\"453\" data-end=\"497\"><em>searchManager.getSearchContextProvider() <\/em><\/p>\n<p data-start=\"499\" data-end=\"644\">Je\u017celi w <em>SearchManager<\/em> nie znaleziono <em>SearchContextProvider<\/em>, to dla pola wyszukiwanie odbywa si\u0119 poprzez klas\u0119 pomocnicz\u0105 <em>SearchContextUtility<\/em>.<\/p>\n<p data-start=\"646\" data-end=\"702\"><em>SearchContextUtility.getSearchContextProvider(field) <\/em><\/p>\n<p data-start=\"704\" data-end=\"881\">Dopiero gdy dla pola nie uda si\u0119 ustali\u0107 <em>SearchContextProvider<\/em>, sprawdzane jest, czy bie\u017c\u0105ca aplikacja, do kt\u00f3rej nale\u017cy to pole, implementuje interfejs <em>SearchContextProvider<\/em>.<\/p>\n<p data-start=\"883\" data-end=\"931\"><em>application instanceof SearchContextProvider <\/em><\/p>\n<p data-start=\"933\" data-end=\"1127\">Je\u015bli w kt\u00f3rym\u015b z trzech krok\u00f3w uda\u0142o si\u0119 ustali\u0107 <em>SearchContextProvider<\/em>, to po otwarciu wyszukiwania zostaje on przypisany ka\u017cdemu polu cechy wyszukiwania za pomoc\u0105 klasy <em>SearchContextUtility<\/em>.<\/p>\n<p data-start=\"1129\" data-end=\"1447\" data-is-last-node=\"\" data-is-only-node=\"\">Gdy nast\u0119pnie otwierane jest wyszukiwanie na jednym z p\u00f3l cech wyszukiwania, w pierwszej kolejno\u015bci sprawdzany jest <em>SearchManager<\/em> tego pola. Je\u017celi metoda <em>getSearchContextProvider()<\/em> nie zosta\u0142a nadpisana, to za pomoc\u0105 klasy<em> SearchContextUtility<\/em> sprawdzane jest, czy <em>SearchContextProvider<\/em> zosta\u0142 przypisany do pola.<\/p>\n<h5 id=\"kontekst-wyszukiwania-w-wyszukiwaniu-nawigatora-zaleznym-od-aplikacji\" ><span class=\"ez-toc-section\" id=\"Kontekst_wyszukiwania_w_wyszukiwaniu_nawigatora_zaleznym_od_aplikacji\"><\/span>Kontekst wyszukiwania w wyszukiwaniu nawigatora zale\u017cnym od aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"119\" data-end=\"388\">Je\u015bli aplikacja implementuje interfejs <em>SearchContextProvider<\/em>, to tak\u017ce wyszukiwania w nawigatorze tej aplikacji korzystaj\u0105 z tego kontekstu wyszukiwania. Zasadniczo pola kluczowe aplikacji i wyszukiwanie w nawigatorze powinny u\u017cywa\u0107 tego samego <em>SearchContextProvider<\/em>.<\/p>\n<p data-start=\"390\" data-end=\"843\">Je\u015bli jednak w aplikacji wszystkie pola (poza polami kluczowymi) wymagaj\u0105 bardziej specjalistycznego <em>SearchContextProvider<\/em>, np. dlatego, \u017ce pola maj\u0105 by\u0107 zale\u017cne od za\u0142adowanego obiektu, to deweloper musi \u2014 korzystaj\u0105c z dotychczas opisanych mo\u017cliwo\u015bci \u2014 ustawia\u0107 <em>SearchContextProvider<\/em> na ka\u017cdym polu aplikacji. Jest to sprzeczne z ide\u0105 kontekstu wyszukiwania, wed\u0142ug kt\u00f3rej<em> SearchContextProvider<\/em> powinien by\u0107 r\u0119cznie ustawiany wy\u0142\u0105cznie dla wyj\u0105tk\u00f3w.<\/p>\n<p data-start=\"845\" data-end=\"892\">W takim przypadku mo\u017cna post\u0105pi\u0107 nast\u0119puj\u0105co: <em>SearchContextProvider<\/em> aplikacji zostaje przygotowany dla szczeg\u00f3lnego przypadku, kt\u00f3ry jednak dotyczy wi\u0119kszo\u015bci p\u00f3l. Pola kluczowe, kt\u00f3rych liczba jest zazwyczaj niewielka, otrzymuj\u0105 w\u0142asny <em>SearchContextProvider<\/em>.<\/p>\n<p data-start=\"845\" data-end=\"892\">Wyszukiwania w nawigatorze r\u00f3wnie\u017c wymagaj\u0105 w\u0142asnego <em>SearchContextProvider<\/em>. Aby go udost\u0119pni\u0107, mo\u017cna w klasie <em>CisUiApplication<\/em> nadpisa\u0107 nast\u0119puj\u0105c\u0105 metod\u0119:<\/p>\n<p data-start=\"845\" data-end=\"892\"><em>public class CisUiApplication { <\/em><br \/>\n<em>\u2026 <\/em><br \/>\n<em>public SearchContextProvider getLocatorSearchContextProvider(){\u2026} <\/em><br \/>\n<em>\u2026 <\/em><br \/>\n<em>} <\/em><\/p>\n<p data-start=\"1407\" data-end=\"1710\">W kolejno\u015bci ustalania <em>SearchContextProvider<\/em> w wyszukiwaniach nawigatora metoda ta jest wywo\u0142ywana jako pierwsza. Je\u015bli zwr\u00f3ci \u2014 jak w standardzie \u2014 warto\u015b\u0107 <em>null<\/em>, to sprawdzane jest, czy aplikacja implementuje interfejs <em>SearchContextProvider<\/em>. Je\u015bli tak, to jest on u\u017cywany w wyszukiwaniach nawigatora.<\/p>\n<p data-start=\"1712\" data-end=\"2059\" data-is-last-node=\"\" data-is-only-node=\"\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zazwyczaj pola kluczowe i wyszukiwania w nawigatorze zale\u017cne od aplikacji u\u017cywaj\u0105 tego samego <em>SearchContextProvider<\/em>. Metody<em> getLocatorSearchContextProvider<\/em> nie nale\u017cy jednak stosowa\u0107 do ustawiania<em> SearchContextProvider<\/em> na polach kluczowych, poniewa\u017c jest ona przeznaczona wy\u0142\u0105cznie dla wyszukiwa\u0144 w nawigatorze zale\u017cnych od aplikacji.<\/div><\/section><\/p>\n<h4 id=\"czesci-specjalne\" ><span class=\"ez-toc-section\" id=\"Czesci_specjalne\"><\/span>Cz\u0119\u015bci specjalne<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"79\" data-end=\"390\">W wyszukiwaniach niekt\u00f3re wyr\u00f3\u017cnione cz\u0119\u015bci (<em>Parts<\/em>) s\u0105 traktowane w spos\u00f3b szczeg\u00f3lny. Dla tych cz\u0119\u015bci stosuje si\u0119 specjalne pola wprowadzania. R\u00f3wnie\u017c podczas wyszukiwania i przygotowywania wynik\u00f3w wyszukiwania s\u0105 one obs\u0142ugiwane odr\u0119bnie. W wyszukiwaniach nazywa si\u0119 je cz\u0119\u015bciami specjalnymi.<\/p>\n<p data-start=\"392\" data-end=\"583\">Cz\u0119\u015bci specjalne nie mog\u0105 by\u0107 u\u017cywane w wyszukiwaniu ani jako atrybuty kluczowe, ani jako kryteria sortowania. W obu przypadkach wznawianie wyszukiwania nie b\u0119dzie wtedy dzia\u0142a\u0142o poprawnie.<\/p>\n<p data-start=\"585\" data-end=\"655\">Poni\u017cej przedstawiono kr\u00f3tko, jakie cz\u0119\u015bci specjalne s\u0105 obs\u0142ugiwane:<\/p>\n<h5 data-start=\"657\" data-end=\"678\" id=\"domesticamount\" ><span class=\"ez-toc-section\" id=\"DomesticAmount\"><\/span>DomesticAmount<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"679\" data-end=\"1097\">Comarch ERP Enterprise potrafi jednocze\u015bnie operowa\u0107 trzema walutami, tzn. przy wprowadzaniu kwoty nale\u017cy poda\u0107 walut\u0119. Mo\u017ce by\u0107 ona wybrana spo\u015br\u00f3d trzech z g\u00f3ry okre\u015blonych walut. Kwoty dla pozosta\u0142ych dw\u00f3ch walut s\u0105 zazwyczaj obliczane automatycznie. W przypadku dalszych oblicze\u0144 przeprowadzane s\u0105 oddzielne kalkulacje dla wszystkich trzech walut. Dzi\u0119ki temu unika si\u0119 b\u0142\u0119d\u00f3w zaokr\u0105gle\u0144 podczas przeliczania mi\u0119dzy walutami.<\/p>\n<p data-start=\"1099\" data-end=\"1463\">Na podstawie wybranej waluty (jednej z trzech mo\u017cliwych) mo\u017cna okre\u015bli\u0107, do kt\u00f3rej kolumny w bazie danych nale\u017cy wprowadzony ci\u0105g wyszukiwania. W danym momencie mo\u017cliwe jest wyszukiwanie tylko w jednej walucie. W przypadku \u015brodowiska wielofirmowego wyszukiwanie odbywa si\u0119 zawsze wy\u0142\u0105cznie w walucie krajowej, wsp\u00f3lnej dla wszystkich organizacji.<\/p>\n<h5 data-start=\"1465\" data-end=\"1505\" id=\"foreignamount-quantity-duration\" ><span class=\"ez-toc-section\" id=\"ForeignAmount_Quantity_Duration\"><\/span>ForeignAmount, Quantity, Duration<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li data-start=\"1508\" data-end=\"1580\"><strong>ForeignAmount<\/strong> &#8212; waluta obca, kt\u00f3ra opr\u00f3cz kwoty zawiera r\u00f3wnie\u017c walut\u0119<\/li>\n<li data-start=\"1583\" data-end=\"1652\"><strong>Quantity<\/strong> &#8212; ilo\u015b\u0107, kt\u00f3ra opr\u00f3cz warto\u015bci liczbowej posiada jednostk\u0119<\/li>\n<li data-start=\"1655\" data-end=\"1732\"><strong>Duration<\/strong> &#8212; czas trwania, sk\u0142adaj\u0105cy si\u0119 z warto\u015bci liczbowej oraz jednostki<\/li>\n<\/ul>\n<p data-start=\"1734\" data-end=\"1904\">Wszystkie trzy cz\u0119\u015bci maj\u0105 wsp\u00f3ln\u0105 cech\u0119: w wyszukiwaniu s\u0105 okre\u015blane poprzez ci\u0105g wyszukiwania dla warto\u015bci liczbowej oraz identyfikator GUID dla waluty lub jednostki.<\/p>\n<h5 data-start=\"1906\" data-end=\"1948\" id=\"storagelocation_rlb-row-level-bin\" ><span class=\"ez-toc-section\" id=\"StorageLocation_RLB_Row-Level-Bin\"><\/span>StorageLocation_RLB (Row-Level-Bin)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1949\" data-end=\"2336\">Zarz\u0105dzanie miejscami sk\u0142adowania zapisuje w tej cz\u0119\u015bci lokalizacj\u0119 magazynow\u0105 z dok\u0142adnym wskazaniem miejsca sk\u0142adowania. Rozr\u00f3\u017cnia si\u0119 tu rz\u0105d, poziom i miejsce. Do prezentacji poszczeg\u00f3lne elementy przedstawiane s\u0105 w podanej kolejno\u015bci i oddzielane my\u015blnikiem, np. 10-2-4. Wprowadzanie <em>StorageLocation_RLB<\/em> obs\u0142uguje symbole wieloznaczne (<em>wildcards<\/em>) jedynie na ko\u0144cu, np. 10-2-*.<\/p>\n<p data-start=\"2338\" data-end=\"2426\">Przy wprowadzaniu<em> Row-Level-Bin<\/em> obowi\u0105zuje konwencja dotycz\u0105ca liczby podanych cz\u0119\u015bci. Podanie tylko jednej cz\u0119\u015bci danych jest traktowane jak podanie miejsca sk\u0142adowania (<em>Bin<\/em>), np. 70*. Podanie dw\u00f3ch cz\u0119\u015bci danych jest traktowane jak podanie rz\u0119du i miejsca (<em>Row-Bin<\/em>), np. 10-70*. Dopiero podanie trzech cz\u0119\u015bci danych jest traktowane jako wskazanie rz\u0119du, poziomu i miejsca (<em>Row-Level-Bin<\/em>), np. 10-5-70*<\/p>\n<h5 data-start=\"2764\" data-end=\"2779\" id=\"duration\" ><span class=\"ez-toc-section\" id=\"Duration\"><\/span>Duration<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2780\" data-end=\"2843\">Okres czasu opisany jest przez dwa punkty: pocz\u0105tek i koniec. Je\u015bli podane s\u0105 oba punkty, m\u00f3wi si\u0119 o okresie zamkni\u0119tym. Je\u015bli brakuje jednego lub obu punkt\u00f3w, jest to okres otwarty. Wyszukiwania w Comarch ERP Enterprise interpretuj\u0105 wprowadzony okres czasu.<\/p>\n<h4 id=\"valueset-wartosci-0\" ><span class=\"ez-toc-section\" id=\"Valueset_%E2%80%93_wartosci_0\"><\/span>Valueset &#8211; warto\u015bci 0<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"71\" data-end=\"274\">W Comarch ERP Enterprise warto\u015bci zestawu (<em>Valuesets<\/em>) powinny z definicji mie\u0107 warto\u015b\u0107 wi\u0119ksz\u0105 ni\u017c 0. Tworzenie sta\u0142ych dla zestawu warto\u015bci zale\u017cy od poziomu wersjonowania systemu, na kt\u00f3rym prowadzi si\u0119 rozw\u00f3j.<\/p>\n<p data-start=\"276\" data-end=\"497\"><em>Valueset<\/em> sk\u0142ada si\u0119 z kolekcji sta\u0142ych, np. 1, 2, 3, 4, 5, 6. Zestawy warto\u015bci mog\u0105 by\u0107 ograniczane poprzez hierarchi\u0119 dziedziczenia typ\u00f3w logicznych, co dodatkowo zmniejsza liczb\u0119 mo\u017cliwych sta\u0142ych, np. 1, 2, 4, 5.<\/p>\n<p data-start=\"499\" data-end=\"731\">W bazie danych w odpowiednim polu zawsze zapisany jest dok\u0142adnie jeden element zestawu <em>Valueset<\/em>. Poniewa\u017c przy zapisie j\u0105dro systemu nie sprawdza, czy zapisana warto\u015b\u0107 pochodzi z mo\u017cliwego zestawu, mo\u017ce by\u0107 tam zapisane tak\u017ce 0.<\/p>\n<p data-start=\"733\" data-end=\"888\">Pole <em>Valueset<\/em> zwraca w metodzie <em>getSelectionString<\/em> wyliczenie wybranych sta\u0142ych zestawu <em>Valueset<\/em>, oddzielonych przecinkiem i spacj\u0105 (np. 1, 2, 3, 4).<\/p>\n<p data-start=\"733\" data-end=\"888\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Metoda<em> getSelectionString()<\/em> zwraca \u0142a\u0144cuch znak\u00f3w. Zawarto\u015b\u0107 tego \u0142a\u0144cucha mo\u017ce ulec zmianie w przysz\u0142o\u015bci i jest tu podana jedynie w celach pogl\u0105dowych. Do konwersji tablic typu<em> short<\/em> z i do ci\u0105gu wyszukiwania nale\u017cy u\u017cywa\u0107 odpowiednich metod klasy <em>com.cisag.pgm.objsearch.SelectionSupport<\/em>. Nie wolno parsowa\u0107 zawarto\u015bci \u0142a\u0144cucha wyszukiwania.<\/div><\/section><\/p>\n<p data-start=\"1251\" data-end=\"1526\">W opisie danych (<em>Data-Description<\/em>) mo\u017cna okre\u015bli\u0107, czy wprowadzenie warto\u015bci do typu logicznego jest wymagane, czy nie. Tylko je\u015bli wprowadzenie nie jest wymagane, metoda <em>getSelectionString<\/em> zwraca opr\u00f3cz wybranych sta\u0142ych zestawu r\u00f3wnie\u017c warto\u015b\u0107 0, np. 0, 1, 2, 3, 4.<\/p>\n<p data-start=\"1528\" data-end=\"1761\">Podczas wyszukiwania analizowany jest otrzymany \u0142a\u0144cuch wyszukiwania <em>Valueset<\/em>. Je\u015bli zostanie w nim znalezione 0, ci\u0105g znak\u00f3w zostaje rozszerzony o <em>null<\/em> jako dodatkow\u0105 mo\u017cliw\u0105 warto\u015b\u0107. Zachowanie to jest zdefiniowane systemowo.<\/p>\n<p data-start=\"1763\" data-end=\"1864\">Warto\u015bci ci\u0105gu wyszukiwania s\u0105 \u0142\u0105czone operatorem <em>OR<\/em> i dodawane jako warunek do klauzuli <em>WHERE<\/em>.<\/p>\n<p data-start=\"1866\" data-end=\"1877\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><em>WHERE &#8230; (a = 0 OR a = 1 OR a = 4 OR a = 6 OR a is NULL) &#8230;<\/em><\/div><\/section><\/p>\n<h5 data-start=\"1866\" data-end=\"1877\" id=\"powod-dodawania-wartosci-null\" ><span class=\"ez-toc-section\" id=\"Powod_dodawania_wartosci_null\"><\/span>Pow\u00f3d dodawania warto\u015bci null<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1866\" data-end=\"1877\">Pole <em>Valueset<\/em> zawsze zwraca \u0142a\u0144cuch z parametrami ograniczaj\u0105cymi wynik wyszukiwania. Zachowuje si\u0119 wi\u0119c inaczej ni\u017c wi\u0119kszo\u015b\u0107 innych p\u00f3l, kt\u00f3re mog\u0105 zwr\u00f3ci\u0107 pusty \u0142a\u0144cuch znak\u00f3w, co skutkuje tym, \u017ce odpowiadaj\u0105cy parametr nie jest brany pod uwag\u0119 w klauzuli <em>WHERE<\/em>.<\/p>\n<p data-start=\"2275\" data-end=\"2487\"><em>Outer Join<\/em> zwraca r\u00f3wnie\u017c rekordy wtedy, gdy dla danego rekordu nie ma odpowiadaj\u0105cego wpisu w tabeli po\u0142\u0105czonej. Je\u015bli w <em>SELECT<\/em> znajduj\u0105 si\u0119 atrybuty tabeli do\u0142\u0105czanej, to s\u0105 one wype\u0142niane warto\u015bci\u0105 <em>null.<\/em><\/p>\n<p data-start=\"2489\" data-end=\"2866\">Dla wyja\u015bnienia przyj\u0119to nast\u0119puj\u0105ce za\u0142o\u017cenie: zar\u00f3wno w <em>SELECT<\/em>, jak i w <em>WHERE<\/em> znajduje si\u0119 ten sam zestaw <em>Valueset<\/em> tabeli po\u0142\u0105czonej. W opisie danych (<em>Data-Description<\/em>) zestawu <em>Valueset<\/em> jest okre\u015blone, \u017ce wprowadzenie jest wymagane. Zgodnie z opisanymi wcze\u015bniej zasadami zestaw <em>Valueset<\/em> dostarcza wtedy jedynie wybrane przez u\u017cytkownika sta\u0142e jako parametry zapytania.<\/p>\n<p data-start=\"2868\" data-end=\"3159\">Je\u015bli takie ograniczenie zostanie zastosowane do rekordu, kt\u00f3rego atrybuty w tabeli do\u0142\u0105czonej s\u0105 r\u00f3wne <em>null<\/em>, to rekord ten zostaje usuni\u0119ty z wynik\u00f3w, poniewa\u017c <em>null<\/em> nie odpowiada \u017cadnej z mo\u017cliwych sta\u0142ych zestawu. Powstaje wi\u0119c dok\u0142adnie takie zachowanie, kt\u00f3rego <em>Outer Join<\/em> mia\u0142 unika\u0107.<\/p>\n<p data-start=\"3161\" data-end=\"3321\">Je\u015bli natomiast wprowadzenie do zestawu <em>Valueset<\/em> nie by\u0142oby wymagane, to w klauzuli <em>WHERE<\/em> pojawi\u0142oby si\u0119 dodatkowe <em>is Null<\/em> i rekord pozosta\u0142by w wynikach.<\/p>\n<p data-start=\"3161\" data-end=\"3321\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Zestaw <em>Valueset<\/em> ma warto\u015bci 1, 2, 3, 4, 5, 6 i jest ograniczony do 1, 2, 4, 6.<br data-start=\"3428\" data-end=\"3431\" \/>W pierwszym przypadku w opisie danych (<em>Data-Description<\/em>) ustawiono wprowadzenie jako wymagane. U\u017cytkownik wybra\u0142 warto\u015b\u0107 <em>Wszystkie<\/em> w polu <em>Valueset<\/em>. Metoda <em>getSelectionString<\/em> zwraca nast\u0119puj\u0105cy \u0142a\u0144cuch: 1, 2, 4, 6.<\/div><\/section><\/p>\n<p data-start=\"3161\" data-end=\"3321\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W drugim przypadku u\u017cytkownik wybiera tylko warto\u015bci 1, 2. W efekcie metoda <em>getSelectionString<\/em> zwraca \u0142a\u0144cuch: 1, 2.<\/div><\/section><\/p>\n<p data-start=\"3161\" data-end=\"3321\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W trzecim przypadku, opartym ponownie na przyk\u0142adzie 1, w opisie danych (<em>Data-Description<\/em>) ustawiono wprowadzenie jako niewymagane. Metoda <em>getSelectionString<\/em> zwraca: 0, 1, 2, 4, 6. W kolejnym kroku, z powodu obecno\u015bci warto\u015bci 0, do \u0142a\u0144cucha zostaje do\u0142\u0105czone <em>null<\/em>, w wyniku czego pe\u0142na zawarto\u015b\u0107 wygl\u0105da nast\u0119puj\u0105co: 0, 1, 2, 4, 6, null.<\/div><\/section><\/p>\n<h4 id=\"wznawianie-wyszukiwan\" ><span class=\"ez-toc-section\" id=\"Wznawianie_wyszukiwan\"><\/span>Wznawianie wyszukiwa\u0144<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"69\" data-end=\"501\">Wyszukiwanie w Comarch ERP Enterprise zazwyczaj nigdy nie \u0142aduje pe\u0142nego zestawu danych. Zamiast tego zawsze wczytywana jest tylko ograniczona liczba rekord\u00f3w. W udost\u0119pnionych wizualizacjach wyszukiwania \u2014 wyszukiwaniu dialogowym, wyszukiwaniu w obszarze nawigacyjnym itd. \u2014 liczba ta jest ograniczona do 60 rekord\u00f3w. Je\u015bli potrzebne s\u0105 kolejne rekordy, wyszukiwanie musi zosta\u0107 wznowione w poprzednim miejscu, aby doci\u0105gn\u0105\u0107 nast\u0119pne rekordy.<\/p>\n<p data-start=\"503\" data-end=\"672\">Aby mo\u017cliwe by\u0142o wznowienie, w wygenerowanym na podstawie metadanych zapytaniu OQL nale\u017cy wprowadzi\u0107 pewne rozszerzenia. Proces ten zostanie wyja\u015bniony na przyk\u0142adzie.<\/p>\n<p data-start=\"674\" data-end=\"886\" data-is-last-node=\"\" data-is-only-node=\"\">Tabela<em> Table1<\/em> posiada atrybuty <em>a, b, e, f, k, m<\/em>. Atrybuty <em>k<\/em> i <em>m<\/em> tworz\u0105 kluczowe atrybuty rekordu. Na podstawie metadanych wyszukiwania opartego na tej tabeli mo\u017cna wygenerowa\u0107 nast\u0119puj\u0105ce zapytanie OQL.<\/p>\n<p><em>SELECT a, b <\/em><br \/>\n<em>FROM Table1 <\/em><br \/>\n<em>WHERE (a = 'abc&#8217; AND f=y) <\/em><br \/>\n<em>ORDER BY e, f <\/em><\/p>\n<p>Do ponownego uruchomienia konieczne jest jednoznaczne zachowanie kolejno\u015bci sortowania tabeli. Mo\u017ce si\u0119 zdarzy\u0107, \u017ce dla okre\u015blonych kryteri\u00f3w sortowania istnieje wi\u0119cej ni\u017c jeden rekord. Aby jednoznacznie ustali\u0107 kolejno\u015b\u0107, klauzula <em>ORDER BY<\/em> zostaje rozszerzona o atrybuty klucza g\u0142\u00f3wnego <em>k<\/em> i <em>m<\/em>.<\/p>\n<p><em>SELECT a, b <\/em><br \/>\n<em>FROM Table1 <\/em><br \/>\n<em>WHERE (a = 'abc&#8217; AND f=y) <\/em><br \/>\n<em>ORDER BY e, f, k, m<\/em><\/p>\n<p>Aby p\u00f3\u017aniej mo\u017cliwe by\u0142o ponowne uruchomienie, nale\u017cy zapami\u0119ta\u0107 ostatni odczytany rekord. Poniewa\u017c atrybuty <em>a<\/em> i <em>b<\/em> nie wystarczaj\u0105 do jednoznacznego okre\u015blenia rekordu w bazie danych z uwzgl\u0119dnieniem sortowania, wszystkie atrybuty z klauzuli <em>ORDER BY<\/em> musz\u0105 zosta\u0107 r\u00f3wnie\u017c uwzgl\u0119dnione w klauzuli <em>SELECT<\/em>.<\/p>\n<p data-start=\"35\" data-end=\"186\"><em>SELECT a, b, e, f, k, m <\/em><br \/>\n<em>FROM Table1 <\/em><br \/>\n<em>WHERE (a = 'abc&#8217; AND f=y) <\/em><br \/>\n<em>ORDER BY e, f, k, m<\/em><\/p>\n<p data-start=\"35\" data-end=\"186\">Za pomoc\u0105 tego OQL mo\u017cna teraz wykona\u0107 pierwsze zapytanie. Ostatni odczytany rekord <em>n<\/em> zawiera jako wynik nast\u0119puj\u0105ce dane:<\/p>\n<p data-start=\"35\" data-end=\"186\"><em>an, bn, en, fn, kn, mn<\/em><\/p>\n<p data-start=\"35\" data-end=\"186\">Do ponownego uruchomienia nale\u017cy nast\u0119pnie utworzy\u0107 dodatkowy warunek, za pomoc\u0105 kt\u00f3rego mo\u017cna okre\u015bli\u0107 rekordy nast\u0119puj\u0105ce po rekordzie<em> n<\/em>.<\/p>\n<p><em>e &gt; en <\/em><br \/>\n<em>OR (e = en AND f &gt; fn) <\/em><br \/>\n<em>OR (e = en AND f = fn AND k &gt; kn) <\/em><br \/>\n<em>OR (e = en AND f = fn AND k = kn AND m &gt; mn)<\/em><\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">U\u017cycie znak\u00f3w <em>&lt;<\/em> lub <em>&gt;<\/em> zale\u017cy od kolejno\u015bci sortowania zdefiniowanej w wyszukiwaniu. Atrybuty sortowania rosn\u0105cego <em>ASC<\/em> otrzymuj\u0105 znak <em>&gt;<\/em>, atrybuty sortowania malej\u0105cego <em>DESC<\/em> znak <em>&lt;<\/em>. Je\u017celi dla atrybutu w klauzuli <em>ORDER BY<\/em> nie podano ani <em>ASC<\/em>, ani <em>DESC<\/em>, kolejno\u015b\u0107 jest zawsze rosn\u0105ca (<em>ASC<\/em>).<\/div><\/section>\n<p data-start=\"358\" data-end=\"432\" data-is-last-node=\"\" data-is-only-node=\"\">Wbudowane w OQL daje to dla poni\u017cszych wyszukiwa\u0144 nast\u0119puj\u0105ce wywo\u0142anie:<\/p>\n<p><em>SELECT a, b, e, f, k, m <\/em><br \/>\n<em>FROM Table1 <\/em><br \/>\n<em>WHERE (a = 'abc&#8217; AND f=y) <\/em><br \/>\n<em>AND e &gt; en <\/em><br \/>\n<em>OR (e = en AND f &gt; fn) <\/em><br \/>\n<em>OR (e = en AND f = fn AND k &gt; kn) <\/em><br \/>\n<em>OR (e = en AND f = fn AND k = kn AND m &gt; mn) <\/em><br \/>\n<em>ORDER BY e, f, k, m <\/em><\/p>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Nie wolno u\u017cywa\u0107 jako kryteri\u00f3w sortowania atrybut\u00f3w, kt\u00f3re mog\u0105 zawiera\u0107 warto\u015b\u0107 <em>null<\/em>, poniewa\u017c w przeciwnym razie ponowne uruchamianie wyszukiwania nie b\u0119dzie dzia\u0142a\u0107.<\/div><\/section>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Specjalne cz\u0119\u015bci nie mog\u0105 by\u0107 u\u017cywane ani jako atrybuty kluczowe, ani jako kryteria sortowania, poniewa\u017c w przeciwnym razie ponowne uruchamianie wyszukiwania nie b\u0119dzie dzia\u0142a\u0107.<\/div><\/section>\n<h4 id=\"sortowania\" ><span class=\"ez-toc-section\" id=\"Sortowania\"><\/span>Sortowania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wyszukiwanie mo\u017ce zwr\u00f3ci\u0107 du\u017c\u0105 liczb\u0119 rekord\u00f3w. Aby m\u00f3c lepiej zarz\u0105dza\u0107 tym zbiorem, konieczne jest wykonanie sortowania. Sortowanie odbywa si\u0119 ju\u017c na poziomie bazy danych.<\/p>\n<h5 id=\"metadane\" ><span class=\"ez-toc-section\" id=\"Metadane\"><\/span>Metadane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"58\" data-end=\"447\">Podczas rejestrowania metadanych wyszukiwania w bazie danych repozytorium mo\u017cna okre\u015bli\u0107 atrybuty, kt\u00f3re zostan\u0105 zakwalifikowane jako mo\u017cliwe do sortowania. Spo\u015br\u00f3d tych atrybut\u00f3w mo\u017cna nast\u0119pnie wskaza\u0107 te, kt\u00f3re maj\u0105 by\u0107 faktycznie u\u017cywane do sortowania. Oznacza to, \u017ce je\u015bli u\u017cytkownik nie wprowadzi innych ustawie\u0144, znalezione rekordy zostan\u0105 posortowane zgodnie z tymi ustawieniami.<\/p>\n<p data-start=\"449\" data-end=\"592\">Opr\u00f3cz wyboru atrybut\u00f3w sortowania mo\u017cna r\u00f3wnie\u017c okre\u015bli\u0107 kierunek sortowania dla ka\u017cdego atrybutu. Sortowanie mo\u017ce by\u0107 rosn\u0105ce lub malej\u0105ce.<\/p>\n<p data-start=\"449\" data-end=\"592\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Nie wolno u\u017cywa\u0107 jako kryteri\u00f3w sortowania atrybut\u00f3w pochodz\u0105cych z tabel typu <em>Outer Join<\/em>. Atrybuty te mog\u0105 potencjalnie przyjmowa\u0107 warto\u015b\u0107 <em>null<\/em> i dlatego nie nadaj\u0105 si\u0119 do sortowania. Powoduje to problemy przy ponownym uruchamianiu wyszukiwa\u0144.<\/div><\/section><\/p>\n<p data-start=\"449\" data-end=\"592\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Specjalne cz\u0119\u015bci nie mog\u0105 by\u0107 u\u017cywane do sortowania. W przeciwie\u0144stwie do zapyta\u0144 i wy\u015bwietlania, <em>Part<\/em> nie jest rozwijany w OQL, tzn. OQL nie zostaje rozszerzone o atrybuty tej cz\u0119\u015bci. Je\u017celi jednak mimo to ma by\u0107 przeprowadzone sortowanie wed\u0142ug tej cz\u0119\u015bci, to odpowiednie atrybuty istotne dla sortowania musz\u0105 zosta\u0107 osobno zarejestrowane jako atrybuty wyszukiwania.<\/div><\/section><\/p>\n<h5 id=\"dialog-sortowania\" ><span class=\"ez-toc-section\" id=\"Dialog_sortowania\"><\/span>Dialog sortowania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"67\" data-end=\"309\">W wyszukiwaniu dialogowym oraz w wyszukiwaniu w obszarze nawigacyjnym u\u017cytkownik ma mo\u017cliwo\u015b\u0107 zmiany sposobu sortowania wynik\u00f3w. W tym celu otwierany jest dialog. Sk\u0142ada si\u0119 on z dw\u00f3ch list oraz r\u00f3\u017cnych przycisk\u00f3w umieszczonych mi\u0119dzy nimi.<\/p>\n<p data-start=\"311\" data-end=\"641\">Na li\u015bcie po lewej stronie znajduj\u0105 si\u0119 atrybuty aktualnie u\u017cywane do sortowania. Istotna jest kolejno\u015b\u0107, w jakiej atrybuty zosta\u0142y umieszczone. Parametr znajduj\u0105cy si\u0119 najwy\u017cej jest jednocze\u015bnie pierwszym atrybutem w sortowaniu. Obok ka\u017cdego atrybutu widoczny jest symbol okre\u015blaj\u0105cy kierunek sortowania \u2013 rosn\u0105cy lub malej\u0105cy.<\/p>\n<p data-start=\"643\" data-end=\"773\">Na li\u015bcie po prawej stronie znajduj\u0105 si\u0119 natomiast atrybuty, kt\u00f3re s\u0105 dost\u0119pne do sortowania, ale obecnie nie s\u0105 wykorzystywane.<\/p>\n<p data-start=\"775\" data-end=\"914\">\u0141\u0105cznie atrybuty w obu listach odpowiadaj\u0105 dok\u0142adnie zbiorowi atrybut\u00f3w oznaczonych w metadanych wyszukiwania jako mo\u017cliwe do sortowania.<\/p>\n<p data-start=\"916\" data-end=\"1078\" data-is-last-node=\"\" data-is-only-node=\"\">Za pomoc\u0105 przycisk\u00f3w mo\u017cna przenosi\u0107 atrybuty z jednej listy na drug\u0105. Mo\u017cna tak\u017ce, po zaznaczeniu atrybutu z pierwszej listy, zmieni\u0107 jego kierunek sortowania.<\/p>\n<h5 data-start=\"109\" data-end=\"134\" id=\"kolejnosc-sortowania-w-bazie-danych-i-comarch-erp-enterprise\" ><span class=\"ez-toc-section\" id=\"Kolejnosc_sortowania_w_bazie_danych_i_Comarch_ERP_Enterprise\"><\/span>Kolejno\u015b\u0107 sortowania w bazie danych i Comarch ERP Enterprise<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"97\" data-end=\"382\">Jak ju\u017c wspomniano, sortowanie odbywa si\u0119 zgodnie z kolejno\u015bci\u0105 sortowania bazy danych. R\u00f3\u017cne bazy danych mog\u0105 mie\u0107 r\u00f3\u017cne porz\u0105dki sortowania. Kolejno\u015b\u0107 sortowania w bazie danych opiera si\u0119 na j\u0119zyku bazy danych. Te same dane mog\u0105 by\u0107 wi\u0119c r\u00f3\u017cnie posortowane w r\u00f3\u017cnych bazach danych.<\/p>\n<p data-start=\"384\" data-end=\"827\">Aby uwzgl\u0119dni\u0107 ten fakt, w<em> TransactionManager<\/em> mo\u017cna pobra\u0107 <em>Comparator<\/em> dla ka\u017cdej bazy danych pod\u0142\u0105czonej do systemu. Mo\u017ce on zosta\u0107 wykorzystany do por\u00f3wnywania list rekord\u00f3w. Alternatywnie dost\u0119pna jest klasa <em>com.cisag.pgm.objsearch.DefaultComparator<\/em>, kt\u00f3ra umo\u017cliwia por\u00f3wnywanie obiekt\u00f3w typu <em>CisListPartMutables<\/em> w spos\u00f3b specyficzny dla danej bazy danych. Wewn\u0105trz ta klasa opiera si\u0119 na opisanym <em>Comparatorze<\/em> z <em>TransactionManager<\/em>.<\/p>\n<p data-start=\"829\" data-end=\"894\" data-is-last-node=\"\" data-is-only-node=\"\">To sortowanie jest u\u017cywane wewn\u0105trz wyszukiwa\u0144 w <em>DefaultSearch<\/em>.<\/p>\n<h5 data-start=\"109\" data-end=\"134\" id=\"sortorderaction\" ><span class=\"ez-toc-section\" id=\"SortOrderAction\"><\/span>SortOrderAction<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"65\" data-end=\"254\"><em>SortOrderActions<\/em> mo\u017cna wykorzysta\u0107 do wy\u015bwietlania <em>SortOrderDialog<\/em>, np. w nag\u0142\u00f3wkach tabel. W po\u0142\u0105czeniu z <em>SortOrder<\/em> i <em>Comparator<\/em> mo\u017cna r\u00f3wnie\u017c wykonywa\u0107 sortowania w pami\u0119ci operacyjnej.<\/p>\n<p data-start=\"256\" data-end=\"366\"><em>SortOrder<\/em> mo\u017cna utworzy\u0107 na potrzeby wyszukiwania, u\u017cywaj\u0105c nazwy wyszukiwania jako parametru dla <em>SortOrder<\/em>.<\/p>\n<p data-start=\"256\" data-end=\"366\"><em>SortOrder sortOrder = new SortOrder(&#8222;com.cisag&#8230;.&#8221;);<\/em><\/p>\n<p data-start=\"35\" data-end=\"266\">Alternatywnie mo\u017cna r\u00f3wnie\u017c r\u0119cznie ustawi\u0107 wszystkie istotne dane w postaci list tablicowych (<em>Array-Listen<\/em>). Nazwy nie s\u0105 w tym przypadku \u015bcie\u017ckami ani odwo\u0142aniami do tabel znakowych, lecz rzeczywi\u015bcie wy\u015bwietlanymi nazwami w dialogu.<\/p>\n<p data-start=\"35\" data-end=\"266\"><em>String[] availableDisplayNames = &#8230;; <\/em><br \/>\n<em>String[] availableFieldNames= &#8230;; <\/em><br \/>\n<em>String[] defaults= &#8230;; <\/em><br \/>\n<em>boolean[] defaultDirections = &#8230;; <\/em><br \/>\n<em>SortOrder sortOrder = new SortOrder(availableDisplayNames, <\/em><br \/>\n<em>availableFieldNames, <\/em><br \/>\n<em>defaults, <\/em><br \/>\n<em>defaultDirections); <\/em><\/p>\n<p data-start=\"35\" data-end=\"266\">Aby utworzy\u0107 <em>SortOrderAction<\/em> dla wygenerowanej <em>SortOrder<\/em>, nale\u017cy utworzy\u0107 <em>SortOrderAction<\/em> i przypisa\u0107 <em>SortOrder<\/em> do tej akcji. Zarejestrowany <em>ActionListener<\/em> zostanie wywo\u0142any w momencie, gdy sortowanie w dialogu zostanie zmienione i dialog zostanie zamkni\u0119ty.<\/p>\n<p data-start=\"35\" data-end=\"266\"><em>SortOrderAction sortOrderAction = new SortOrderAction(); <\/em><br \/>\n<em>sortOrderAction.setSortOrder(sortOrder); <\/em><br \/>\n<em>sortOrderAction.addActionListener(this); <\/em><\/p>\n<p data-start=\"35\" data-end=\"266\">Tak wygenerowana SortOrder mo\u017ce by\u0107 nast\u0119pnie wy\u015bwietlana na interfejsie, np. jako <em>HeaderElement<\/em> listy.<\/p>\n<p data-start=\"35\" data-end=\"266\"><em>List list = new List(&#8230;); <\/em><br \/>\n<em>Button sortOrderButton = list.addHeaderElement(sortOrderAction);<\/em><\/p>\n<p data-start=\"35\" data-end=\"266\">W aplikacjach zapyta\u0144 <em>SortOrderAction<\/em> powinien zawsze by\u0107 uwzgl\u0119dniany w <em>SelectionGroup<\/em>. Je\u015bli parametry aplikacji s\u0105 zapisywane, zapisywane s\u0105 r\u00f3wnie\u017c ustawienia sortowania.<\/p>\n<p data-start=\"35\" data-end=\"266\"><em>CisUiApplication application = &#8230;; <\/em><br \/>\n<em>SelectionGroup result = application.getSelectionGroup(); <\/em><br \/>\n<em>result.setSortOrderAction(sortOrderAction);<\/em><\/p>\n<p data-start=\"35\" data-end=\"214\">Gdy dialog sortowania zostanie zamkni\u0119ty, wykonywana jest akcja o identyfikatorze <em>Action.SORTORDER_CHANGED<\/em>. Mo\u017ce ona nast\u0119pnie zosta\u0107 obs\u0142u\u017cona w zarejestrowanym <em>ActionListener<\/em>.<\/p>\n<p data-start=\"216\" data-end=\"382\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u015bli wymagane jest w\u0142asne sortowanie danych, nale\u017cy zaimplementowa\u0107<em> Comparator<\/em>, kt\u00f3ry przejmie to zadanie. <em>Comparator<\/em> jest przekazywany li\u015bcie do metody <em>sort(&#8230;)<\/em>.<\/p>\n<p data-start=\"216\" data-end=\"382\" data-is-last-node=\"\" data-is-only-node=\"\"><em>public void performAction(Action action) { <\/em><br \/>\n<em>if (action.getId() == Action.SORTORDER_CHANGED) { <\/em><br \/>\n<em>list.sort(new AComparator(sortOrderAction.getSortOrder())); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"216\" data-end=\"382\" data-is-last-node=\"\" data-is-only-node=\"\">Zalecana implementacja w\u0142asnego <em>Comparator<\/em> mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co. Do por\u00f3wnywania powinien by\u0107, jak ju\u017c wspomniano, u\u017cywany <em>Comparator<\/em> bazy danych.<\/p>\n<p data-start=\"216\" data-end=\"382\" data-is-last-node=\"\" data-is-only-node=\"\"><em>class AComparator implements Comparator { <\/em><br \/>\n<em>Comparator databaseComparator; <\/em><\/p>\n<p><em>public ACompatator() { <\/em><br \/>\n<em>CisTransactionManager tm = &#8230;; <\/em><br \/>\n<em>databaseComparator = tm.getComparator(&#8230;); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>public int compare(Object o1, Object o2) { <\/em><br \/>\n<em>CisListPartMutable row1 = (CisListPartMutable) o1; <\/em><br \/>\n<em>CisListPartMutable row2 = (CisListPartMutable) o2; <\/em><br \/>\n<em>MyObject obj1 = (MyObject) row1.getData(); <\/em><br \/>\n<em>MyObject obj2 = (MyObject) row2.getData(); <\/em><br \/>\n<em>String[] attrs = sortOrder.getSelectedFieldNames(); <\/em><br \/>\n<em>boolean[] dirs = sortOrder.getSelectedDirections(); <\/em><br \/>\n<em>\/\/ dirs[] = true &#8211;&gt; asc-sort else desc-sort <\/em><br \/>\n<em>for (int i = 0; i &lt; attrs.length; i++) { <\/em><br \/>\n<em>int r = 0; \/\/ -1:(o1&lt;o2), 0:(o1=o2), +1:(o1&gt;o2) <\/em><br \/>\n<em>if (&#8222;code&#8221;.equals(attrs[i])) { <\/em><br \/>\n<em>r = databaseComparator.compare(obj1.getCode(), <\/em><br \/>\n<em>obj2.getCode()); <\/em><br \/>\n<em>} else if (&#8222;description&#8221;.equals(attrs[i])) { <\/em><br \/>\n<em>r = databaseComparator.compare(obj1.getDescription(), <\/em><br \/>\n<em>obj2.getDescription()); <\/em><br \/>\n<em>} &#8230; <\/em><br \/>\n<em>if (r != 0) { <\/em><br \/>\n<em>return dirs[i] ? r : -r; <\/em><br \/>\n<em>} <\/em><br \/>\n<em>} <\/em><br \/>\n<em>return row1.getIndex() &#8211; row2.getIndex(); <\/em><br \/>\n<em>} <\/em><br \/>\n<em>}<\/em><\/p>\n<h4 data-start=\"109\" data-end=\"134\" id=\"wielkosc-liter\" ><span class=\"ez-toc-section\" id=\"Wielkosc_liter\"><\/span>Wielko\u015b\u0107 liter<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"136\" data-end=\"508\">W systemach Comarch ERP Enterprise dla ka\u017cdego atrybutu typu ci\u0105g znak\u00f3w okre\u015blone jest zachowanie podczas wprowadzania i wyszukiwania, kt\u00f3re ma wp\u0142yw na tworzone dla niego pola wprowadzania. O ile nie wyst\u0119puj\u0105 wyj\u0105tki, identyfikatory (<em>Business Keys<\/em>) zawieraj\u0105 wy\u0142\u0105cznie wielkie litery. Wszystkie pozosta\u0142e atrybuty typu ci\u0105g znak\u00f3w mog\u0105 zawiera\u0107 zar\u00f3wno ma\u0142e, jak i wielkie litery.<\/p>\n<p data-start=\"510\" data-end=\"1106\">Indeksy s\u0105 zwykle stosowane w obiektach biznesowych w celu zwi\u0119kszenia wydajno\u015bci. Je\u015bli jednak wyszukiwanie odbywa si\u0119 niezale\u017cnie od wielko\u015bci liter, baza danych nie mo\u017ce wykorzysta\u0107 indeksu. Z tego powodu, o ile nie wyst\u0119puj\u0105 wyj\u0105tki, w przypadku wyszukiwania w atrybutach, dla kt\u00f3rych istnieje indeks, uwzgl\u0119dniana jest wielko\u015b\u0107 liter. Natomiast przy wyszukiwaniu we wszystkich pozosta\u0142ych atrybutach, tj. atrybutach bez indeksu, bez wyj\u0105tk\u00f3w lub identyfikator\u00f3w, wielko\u015b\u0107 liter nie jest uwzgl\u0119dniana. W szczeg\u00f3lno\u015bci wszystkie pola oznaczenia s\u0105 wyszukiwane niezale\u017cnie od wielko\u015bci liter.<\/p>\n<p data-start=\"1108\" data-end=\"1123\">Wyj\u0105tki:<\/p>\n<ul>\n<li data-start=\"1126\" data-end=\"1326\">Z wyj\u0105tkiem danych konfiguracyjnych, we wszystkich atrybutach systemowych obiekt\u00f3w biznesowych wielko\u015b\u0107 liter jest uwzgl\u0119dniana przy wprowadzaniu i wyszukiwaniu, niezale\u017cnie od ustawie\u0144 systemowych.<\/li>\n<li data-start=\"1329\" data-end=\"1421\">W nast\u0119puj\u0105cych obiektach biznesowych przy identyfikacji wielko\u015b\u0107 liter jest uwzgl\u0119dniana: j\u0119zyki, zwroty grzeczno\u015bciowe, tytu\u0142y, jednostki, relacje partnerskie. W klasie implementacyjnej hooka <em>com.cisag.app.general.log.CaseSensitivityRegistryHookImpl<\/em> zarejestrowane s\u0105 te odst\u0119pstwa od zachowania wyszukiwania i wprowadzania. Klasa ta zawiera wyj\u0105tki obowi\u0105zuj\u0105ce w standardzie. Na potrzeby rozwoju partnerskiego, klientowskiego lub aplikacji nale\u017cy wprowadzi\u0107 w\u0142asn\u0105 implementacj\u0119 hooka <em>com.cisag.pgm.appserver.hook.CaseSensitivityRegistryHook<\/em>, kt\u00f3ry zosta\u0142 zdefiniowany w kontrakcie <em>hooka com.cisag.pgm.appserver.Server<\/em>. W klasie <em>com.cisag.app.general.log.CaseSensitivityRegistry<\/em> mo\u017cna zarejestrowa\u0107 dodatkowe wyj\u0105tki, kt\u00f3re nie musz\u0105 mie\u0107 okre\u015blonego prefiksu deweloperskiego. Mo\u017ce to by\u0107 konieczne np. wtedy, gdy rozw\u00f3j partnerski nie zawiera w\u0142asnej implementacji hooka, ale w adaptacji klienta ma zosta\u0107 zarejestrowany wyj\u0105tek z tego rozwoju partnerskiego.<\/li>\n<li data-start=\"2333\" data-end=\"2465\">Sta\u0142e w kr\u0119gach numeracyjnych musz\u0105 by\u0107 zapisywane wielkimi literami, aby by\u0142y generowane tylko numery zapisane wielkimi literami.<\/li>\n<\/ul>\n<h5 id=\"ustawienia-rejestru-casesensitivityregistry\" ><span class=\"ez-toc-section\" id=\"Ustawienia_rejestru_CaseSensitivityRegistry\"><\/span>Ustawienia rejestru CaseSensitivityRegistry<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa <em>com.cisag.app.general.log.CaseSensitivityRegistry<\/em> zawiera metod\u0119, kt\u00f3ra dostarcza list\u0119 domy\u015blnych ustawie\u0144 dotycz\u0105cych rozr\u00f3\u017cniania wielko\u015bci liter.<\/p>\n<p>Ka\u017cdy wyj\u0105tek jest definiowany za pomoc\u0105 z\u0142o\u017conego ci\u0105gu znak\u00f3w. Pierwsza warto\u015b\u0107 w tym ci\u0105gu, po kt\u00f3rej nast\u0119puje \u015brednik, musi by\u0107 albo <em>PATH<\/em> albo <em>PARENT<\/em>.<\/p>\n<p data-start=\"39\" data-end=\"407\">PATH jest u\u017cywany wtedy, gdy dok\u0142adnie jeden atrybut obiektu biznesowego jest obj\u0119ty regu\u0142\u0105. W takim przypadku po <em data-start=\"157\" data-end=\"163\">Path<\/em> podaje si\u0119 pe\u0142n\u0105, kwalifikowan\u0105 nazw\u0119 obiektu biznesowego, dwukropek oraz nazw\u0119 atrybutu (czyli tzw. <em>Atrybut-Path<\/em>). Nast\u0119pnie, po \u015bredniku, okre\u015bla si\u0119 spos\u00f3b wyszukiwania. Do wyboru s\u0105 warto\u015bci: <em>CASE_SENSITIV<\/em>, <em>UPPER<\/em> i <em>CASE_INSENSITIV<\/em>.<\/p>\n<p data-start=\"409\" data-end=\"652\"><em>PARENT<\/em> mo\u017ce by\u0107 u\u017cywany wy\u0142\u0105cznie w hierarchiach i grupach. Po <em data-start=\"476\" data-end=\"484\">PARENT<\/em> i \u015bredniku podaje si\u0119 nazw\u0119 cz\u0119\u015bci oraz spos\u00f3b wyszukiwania. Wszystkie obiekty biznesowe, kt\u00f3re dziedzicz\u0105 po danej cz\u0119\u015bci, u\u017cywaj\u0105 wskazanego sposobu wyszukiwania.<\/p>\n<p data-start=\"409\" data-end=\"652\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"> <em>public static void initCaseSensitivityDefaults( <\/em><br \/>\n<em>List caseSensitivityDefaults) { <\/em><br \/>\n<em>caseSensitivityDefaults.add(&#8222;PATH;&#8221; + <\/em><br \/>\n<em>&#8222;com.cisag.app.general.obj.Language:isoCode;&#8221; + <\/em><br \/>\n<em>&#8222;CASE_SENSITIVE&#8221;); <\/em><br \/>\n<em>caseSensitivityDefaults.add(&#8222;PATH;&#8221; + <\/em><br \/>\n<em>&#8222;com.cisag.app.general.obj.NumberRange:&#8221; + <\/em><br \/>\n<em>&#8222;format[0].constant;&#8221; + <\/em><br \/>\n<em>&#8222;UPPER&#8221;); <\/em><br \/>\n<em>caseSensitivityDefaults.add(&#8222;PARENT;&#8221; + <\/em><br \/>\n<em>&#8222;com.cisag.app.general.obj.Code;&#8221; + <\/em><br \/>\n<em>&#8222;UPPER&#8221;); <\/em><br \/>\n<em>&#8230; <\/em><br \/>\n<em>}<\/em> <\/div><\/section><\/p>\n<p data-start=\"409\" data-end=\"652\">Rejestrowanie wyj\u0105tk\u00f3w w implementacji hooka odbywa si\u0119 w podobny spos\u00f3b \u2014 informacje na ten temat mo\u017cna znale\u017a\u0107 w dokumentacji Javy dla interfejsu <em>com.cisag.pgm.appserver.hook.CaseSensitivityRegistryHook.CaseSensitivityRegistry<\/em>.<br data-start=\"243\" data-end=\"246\" \/>Nie jest mo\u017cliwe rejestrowanie wyj\u0105tk\u00f3w typu <em>PARENT <\/em>w implementacji hooka.<\/p>\n<h4 id=\"searchactions\" ><span class=\"ez-toc-section\" id=\"SearchActions\"><\/span>SearchActions<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><em>SearchActions<\/em> to specjalny rodzaj akcji, kt\u00f3re po wywo\u0142aniu uruchamiaj\u0105 dialog wyszukiwania. Gdy u\u017cytkownik wybierze jeden lub wi\u0119cej element\u00f3w i wybierze przycisk<strong> [Akceptuj]<\/strong>, powiadamiany jest <em>acceptListener<\/em>. Tekst na przycisku mo\u017ce by\u0107 zdefiniowany przez programist\u0119.<\/p>\n<p>W konstruktorze <em>SearchAction<\/em> podaje si\u0119 <em>ActionListener<\/em>, kt\u00f3ry jest powiadamiany, gdy u\u017cytkownik dokona wyboru i kliknie przycisk potwierdzenia. Obiekt <em>ActionEvent<\/em>, opr\u00f3cz <em>acceptId<\/em>, zawiera w swoim <em>state<\/em> tablic\u0119 obiekt\u00f3w <em>CisParameterLists<\/em>. W przypadku pojedynczego wyboru, tablica ta zawiera dok\u0142adnie jedn\u0105 <em>CisParameterLists.<\/em>\u00a0W tej li\u015bcie parametr\u00f3w, wyniki z wybranego wiersza s\u0105 przechowywane pod nazwami atrybut\u00f3w, kt\u00f3re zosta\u0142y zdefiniowane w wyszukiwaniu.<\/p>\n<p>Poni\u017cej znajduje si\u0119 lista dost\u0119pnych metod dla klasy <em>SearchAction<\/em>.<\/p>\n<p><em>public SearchAction(int acceptId, String actionPath, ActionListener <\/em><br \/>\n<em>acceptListener) <\/em><br \/>\n<em>public void setSearch(String search) <\/em><br \/>\n<em>public void setAcceptName(String acceptName) <\/em><br \/>\n<em>public void setAcceptNameFrom(String absPath, Object[] parameters) <\/em><br \/>\n<em>public void setVisualElement(VisualElement visualElement) <\/em><br \/>\n<em>public void setMultiSelection(boolean multiSelection) <\/em><br \/>\n<em>public void setSearchManager(SearchManager searchManager) <\/em><br \/>\n<em>public void startSearch() <\/em><\/p>\n<h4 id=\"buforowanie-wynikow-wyszukiwania-w-pamieci-podrecznej\" ><span class=\"ez-toc-section\" id=\"Buforowanie_wynikow_wyszukiwania_w_pamieci_podrecznej\"><\/span>Buforowanie wynik\u00f3w wyszukiwania w pami\u0119ci podr\u0119cznej<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Wszystkie rodzaje wyszukiwania \u2014 dialogowe, listy wyboru i te w nag\u0142\u00f3wku \u2014 obs\u0142uguj\u0105 buforowanie wynik\u00f3w w pami\u0119ci podr\u0119cznej (<em>cache<\/em>). Mechanizm ten jest zintegrowany z <em>CisOqlSearchStatement<\/em>.\u00a0Listy wyboru zawsze wy\u015bwietlaj\u0105 aktualne dane, kt\u00f3re mog\u0105 pochodzi\u0107 bezpo\u015brednio z bazy danych lub z pami\u0119ci podr\u0119cznej. Natomiast wyszukiwanie w nag\u0142\u00f3wku i dialogi wyszukiwania mog\u0105 pokazywa\u0107 r\u00f3wnie\u017c dane nieaktualne. Je\u015bli dane pochodz\u0105 z <em>cache<\/em> w nag\u0142\u00f3wku listy wynik\u00f3w pojawia si\u0119 odpowiednia informacja. Je\u015bli dane s\u0105 potencjalnie nieaktualne, dodatkowo zostanie wy\u015bwietlony <em>tooltip<\/em>. Aby zaktualizowa\u0107 dane i od\u015bwie\u017cy\u0107 pami\u0119\u0107 podr\u0119czn\u0105, wystarczy ponownie uruchomi\u0107 wyszukiwanie.<\/p>\n<p>System decyduje, czy dane w pami\u0119ci podr\u0119cznej s\u0105 aktualne, analizuj\u0105c u\u017cywane obiekty biznesowe. Je\u015bli w kt\u00f3rej\u015b z tabel zawieraj\u0105cych te obiekty dosz\u0142o do zmian (dodania, usuni\u0119cia lub modyfikacji danych), system oznaczy wpis w pami\u0119ci podr\u0119cznej jako nieaktualny przy nast\u0119pnym dost\u0119pie. Nale\u017cy jednak pami\u0119ta\u0107, \u017ce takie oznaczenie nie zawsze wskazuje na to, \u017ce dane s\u0105 przestarza\u0142e, poniewa\u017c buforowane informacje mog\u0142y nie zosta\u0107 zmienione.<\/p>\n<p>Pami\u0119\u0107 podr\u0119czna u\u017cywa unikalnego klucza sk\u0142adaj\u0105cego si\u0119 z bazy danych, j\u0119zyka, zapytania OQL (wraz z typami danych) oraz cech wyszukiwania. Ka\u017cdy wpis w <em>cache<\/em> przechowuje maksymalnie 61 rekord\u00f3w. Na ka\u017cdy serwer aplikacji Comarch ERP Enterprise przypada jeden <em>cache<\/em> wyszukiwania, dzi\u0119ki czemu inni u\u017cytkownicy, wysy\u0142aj\u0105cy identyczne zapytanie, mog\u0105 r\u00f3wnie\u017c skorzysta\u0107 z wcze\u015bniej buforowanych danych.<\/p>\n<p>Domy\u015blna wielko\u015b\u0107 pami\u0119ci podr\u0119cznej to 300 wpis\u00f3w. W przypadku du\u017cej liczby u\u017cytkownik\u00f3w, zaleca si\u0119 zwi\u0119kszenie jej rozmiaru. W tym celu nale\u017cy ustawi\u0107 w\u0142a\u015bciwo\u015b\u0107 <em>com.cisag.sys.objsearch.SearchCacheMaxSize<\/em> na wy\u017csz\u0105 warto\u015b\u0107.<\/p>\n<h4 id=\"wstepne-wypelnianie-danych\" ><span class=\"ez-toc-section\" id=\"Wstepne_wypelnianie_danych\"><\/span>Wst\u0119pne wype\u0142nianie danych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Je\u015bli u\u017cytkownik chce wst\u0119pnie wype\u0142ni\u0107 dane w wyszukiwaniu, musi przestrzega\u0107 kilku zasad:<\/p>\n<p>Wst\u0119pne wype\u0142nianie musi by\u0107 realizowane zar\u00f3wno dla list wyboru, jak i dla wyszukiwania dialogowego. Aby to zagwarantowa\u0107, wst\u0119pne wype\u0142nianie musi by\u0107 realizowane za pomoc\u0105 w\u0142asnego <em>SearchManager<\/em>.\u00a0W metodzie <em>initSearch<\/em> mo\u017cna wst\u0119pnie wype\u0142ni\u0107 ka\u017cdy atrybut wyszukiwania. Wst\u0119pne warto\u015bci mo\u017cna ustawia\u0107 tylko dla prostych atrybut\u00f3w, takich jak ci\u0105gi znak\u00f3w (<em>String<\/em>) czy zestawy warto\u015bci (<em>ValueSet<\/em>). Specjalne cz\u0119\u015bci, czas i data s\u0105 wykluczone.<\/p>\n<p>W metodzie <em>manipulateSelectionFieldAfter<\/em> w<em> SelectionFieldHook<\/em> r\u00f3wnie\u017c mo\u017cna wst\u0119pnie wype\u0142nia\u0107 pola. Jednak\u017ce, poniewa\u017c te warto\u015bci nie s\u0105 u\u017cywane we wst\u0119pnych wyszukiwaniach, nie zaleca si\u0119 ich tam ustawiania.<\/p>\n<h4 id=\"debugowanie\" ><span class=\"ez-toc-section\" id=\"Debugowanie\"><\/span>Debugowanie<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"wyswietlanie-oql-na-konsoli\" ><span class=\"ez-toc-section\" id=\"Wyswietlanie_OQL_na_konsoli\"><\/span>Wy\u015bwietlanie OQL na konsoli<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dzi\u0119ki wbudowanej funkcji debugowania w systemie Comarch ERP Enterprise, mo\u017cna wy\u015bwietli\u0107 wewn\u0119trznie u\u017cywane zapytanie OQL na konsoli. Zapytanie jest wy\u015bwietlane na poziomie <em>Debug.FINE<\/em>.<\/p>\n<p>Aby to zrobi\u0107, nalezy wprowadzi\u0107 nast\u0119puj\u0105c\u0105 komend\u0119 w konsoli dzia\u0142aj\u0105cego serwera aplikacji Comarch ERP Enterprise (SAS):<\/p>\n<p><em>dbgcls \u2013class:com.cisag.sys.objsearch.log.CisOqlSearchStatement <\/em><br \/>\n<em>\u2013level:100<\/em><\/p>\n<p>Po wykonaniu zapytania OQL, na konsoli zostanie wy\u015bwietlone samo zapytanie oraz warto\u015bci jego parametr\u00f3w.<\/p>\n<h4 id=\"zmiana-maksymalnej-liczby-rekordow\" ><span class=\"ez-toc-section\" id=\"Zmiana_maksymalnej_liczby_rekordow\"><\/span>Zmiana maksymalnej liczby rekord\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Domy\u015blna maksymalna liczba rekord\u00f3w wy\u015bwietlanych w warto\u015bciach pomocniczych lub w pomocy nawigacyjnej zwi\u0105zanej z aplikacj\u0105 to 500. W niekt\u00f3rych przypadkach mo\u017ce by\u0107 konieczne, aby celowo zmieni\u0107 t\u0119 warto\u015b\u0107 dla poszczeg\u00f3lnych wyszukiwa\u0144. Warto\u015b\u0107 mo\u017ce by\u0107 ustawiona na mniejsz\u0105 lub wi\u0119ksz\u0105 ni\u017c 500.<\/p>\n<p>Ustawienie odbywa si\u0119 za pomoc\u0105 w\u0142a\u015bciwo\u015bci <em>com.cisag.sys.objsearch.SearchResultSize<\/em>, zgodnie z opisem w artykule <em>W\u0142a\u015bciwo\u015bci Comarch ERP Enterprise<\/em>, w rozdziale dotycz\u0105cym us\u0142ugi trwa\u0142o\u015bci.<\/p>\n<h4 id=\"wydajnosc\" ><span class=\"ez-toc-section\" id=\"Wydajnosc\"><\/span>Wydajno\u015b\u0107<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ka\u017cdy dodatkowy <em>join<\/em> zwi\u0119ksza z\u0142o\u017cono\u015b\u0107 zapytania do bazy danych. Dzi\u0119ki u\u017cyciu fragment\u00f3w, tabele potrzebne do selekcji lub sortowania s\u0105 w\u0142\u0105czane do zapytania tylko wtedy, gdy s\u0105 faktycznie niezb\u0119dne. Dlatego zaleca si\u0119 dzielenie zapyta\u0144 OQL na jak najwi\u0119ksz\u0105 liczb\u0119 fragment\u00f3w. Du\u017ca liczba fragment\u00f3w nie ma negatywnego wp\u0142ywu na wydajno\u015b\u0107 wyszukiwania.<\/p>\n<p>Wyb\u00f3r kolejno\u015bci sortowania oraz u\u017cycie <em>DISTINCT<\/em> mo\u017ce mie\u0107 negatywny wp\u0142yw na wydajno\u015b\u0107 wyszukiwania. Kiedy u\u017cytkownik stosuje <em>DISTINCT<\/em> lub sortuje wyniki, konieczne jest obliczenie ca\u0142ego zestawu wynik\u00f3w zapytania. W przypadku du\u017cych zbior\u00f3w danych mo\u017ce to prowadzi\u0107 do bardzo d\u0142ugiego czasu wykonania. Dlatego <em>DISTINCT<\/em> nale\u017cy u\u017cywa\u0107 tylko wtedy, gdy jest to absolutnie konieczne.<\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9697","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\/9697","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=9697"}],"version-history":[{"count":95,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9697\/revisions"}],"predecessor-version":[{"id":37588,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9697\/revisions\/37588"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}