| 1 | [http://support.edokumenty.eu/trac/wiki/NewBusinessAdmin Podręcznik użytkownika] > [http://support.edokumenty.eu/trac/wiki/NewBusinessAdmin/Reports Raporty] > Filtrowanie raportów |
| 2 | |
| 3 | {{{ |
| 4 | #!html |
| 5 | <figure> |
| 6 | <center> |
| 7 | <img src="/trac/raw-attachment/wiki/NewBusinessAdmin/Attachments/update.png" width="400px"> |
| 8 | </figure> |
| 9 | }}} |
| 10 | |
| 11 | = Filtrowanie raportów = |
| 12 | |
| 13 | Moduł raportów w systemie eDokumenty umożliwia filtrowanie danego raportu poprzez określenie parametrów na dwa sposoby: |
| 14 | * standardowe parametry |
| 15 | * utworzenie filtrów przez użytkownika |
| 16 | |
| 17 | == Standardowe parametry == |
| 18 | |
| 19 | Standardowe parametry to specjalne tokeny, dzięki którym możemy obsłużyć przekazywane dane z listy, kartoteki lub poprzez formularz parametrów do raportu. [[BR]] |
| 20 | |
| 21 | Należy zwrócić uwagę na miejsce, z którego jest wywoływany raport, gdyż ma to wpływ na definicję operatora SQL przed takim tokenem. |
| 22 | Warunki stosowania operatorów: |
| 23 | || Operator || Kiedy stosować || Przykład parametru || |
| 24 | || IN || dla listy gdyż możemy otrzymać kilka zaznaczonych elementów.[[BR]] Token zostanie zamieniony na identyfikatory z danej listy np.: 1,2,3,4 || '''Miejsce:''' Lista klientów [[BR]] '''Parametr:''' contid IN ({CONTID}) || |
| 25 | || znak = || dla kartoteki przekazywana jest tylko jedna wartość do parametru || '''Miejsce:''' Kartoteka klienta [[BR]] '''Parametr:''' contid = {CONTID} || |
| 26 | |
| 27 | W przypadku, jeśli w definicji raportu użyjemy np.: {CONTID} a raport zostanie wywołany z modułu (przekazane zostaną zaznaczone elementy) wtedy token zostanie zamieniony na pierwszy z zaznaczonych elementów. [[BR]] |
| 28 | |
| 29 | W przypadku niewłaściwego podpięcia raportu lub niewłaściwego użycia operatora raport wygeneruje błąd. |
| 30 | |
| 31 | == Obsługiwane tokeny == |
| 32 | |
| 33 | Obecnie obsługiwane tokeny to: |
| 34 | || Nazwa || Opis || Wartość domyślna || Określanie na formularzu || |
| 35 | || {DATE_FROM} || Data od || Początek bieżącego miesiąca || TAK || |
| 36 | || {DATE_TO} || Data do || Koniec bieżącego miesiąca || TAK || |
| 37 | || {USR_ID} || Pracownik || Pracownik z listy || TAK || |
| 38 | || {LOGGED_USR_ID} || Zalogowany pracownik || Id zalogowanego pracownika (users.usr_id) || NIE || |
| 39 | || {ENT_ID} || Identyfikator podmiotu || Identyfikator podmiotu || NIE || |
| 40 | || {FILTER_STRING} || Ciąg filtrujący || 'TRUE' || TAK - definicja filtrów to określa || |
| 41 | || {ACORID} || Jednostka rozliczeniowa || 0 || TAK || |
| 42 | || {TOVCID} || Miejsce powstawania kosztów || 0 || TAK || |
| 43 | || {ADANID} || Dodatkowa analityka || 0 || TAK || |
| 44 | || {CONTID} || Klient || Pierwszy nie usunięty klient z listy (sortowany po contid) || TAK || |
| 45 | || {CONTIDS} || Klient || Pierwszy nie usunięty klient z listy (sortowany po contid) || TAK || |
| 46 | || {DOC_ID} || Dokument (z listy lub kartoteka) || 0 || NIE || |
| 47 | || {DOC_IDS} || Dokument (z listy lub kartoteka) || 0 || NIE || |
| 48 | || {DOCIDS} || Dokument (z listy lub kartoteka) || 0 || NIE || |
| 49 | || {PRC_ID} || Sprawa || 0 || TAK || |
| 50 | || {PRC_IDS} || Sprawa || 0 || TAK || |
| 51 | || {PRCIDS} || Sprawa || 0 || TAK || |
| 52 | || {EVNTID} || Zdarzenie (z listy lub kartoteka) || 0 || NIE || |
| 53 | || {EVNTIDS} || Zdarzenie (z listy lub kartoteka) || 0 || NIE || |
| 54 | || {CAMPID} || Kampania (z listy lub kartoteka) || 0 || TAK || |
| 55 | || {CAMPIDS} || Kampania (z listy lub kartoteka) || 0 || TAK || |
| 56 | || {DEVCID} || Urządzenie (z listy lub kartoteka) || 0 || TAK || |
| 57 | || {DEVCIDS} || Urządzenie (z listy lub kartoteka) || 0 || TAK || |
| 58 | || {DEPOID} || Produkt (z listy lub kartoteka) || 0 || TAK || |
| 59 | || {DEPOIDS} || Produkt (z listy lub kartoteka) || 0 || TAK || |
| 60 | || {RES_ID} || Zasób (z listy lub kartoteka) || 0 || TAK || |
| 61 | |
| 62 | W momencie jeśli w danym raporcie zostanie użyty taki token to system wygeneruje odpowiednie pole na formularzu parametrów do raportu - jeśli jest obsługiwane. Poniższy zrzut ekranu przedstawia wszystkie tokeny możliwe do określania poprzez formularz. |
| 63 | |
| 64 | [[BR]][[Image(podstawowe_parametry.png)]][[BR]] (''Parametry'')[[BR]] |
| 65 | |
| 66 | == Definiowanie filtrów == #definiowanie_filtrow |
| 67 | |
| 68 | Od wersji 4.0 system eDokumenty umożliwia definiowanie własnych parametrów do raportów określanych jako Filtry. |
| 69 | |
| 70 | Na wstępie należy wyszukać interesujący nas raport lub dodać nowy [wiki:UserGuide/AdvancedConfiguration/DefiningReports Tworzenie raportów w SQL]. |
| 71 | |
| 72 | Przykładowa definicja raportu (kod SQL): |
| 73 | |
| 74 | {{{ |
| 75 | SELECT |
| 76 | contid, |
| 77 | name_1, |
| 78 | adddat, |
| 79 | macrtk, |
| 80 | is_del |
| 81 | FROM |
| 82 | contacts |
| 83 | WHERE |
| 84 | ent_id = {ENT_ID} |
| 85 | AND {FILTER_STRING} |
| 86 | }}} |
| 87 | |
| 88 | == Ważne uwagi == #wazne_uwagi |
| 89 | |
| 90 | Aby filtrowanie było możliwe wymagane jest dodanie specjalnego tokenu '''{FILTER_STRING}''', który w momencie akceptacji filtrów zostanie zamieniony na warunki SQL zgodne z definicją filtrów. Jeśli w definicji raportu zabraknie tego tokenu to pomimo definicji filtrów nie będą one dostępne na panelu parametrów. |
| 91 | |
| 92 | Istotną kwestią jest również miejsce w którym jest dodany token {FILTER_STRING} oraz operator jaki go poprzedza (AND/OR zalecany AND). |
| 93 | Być może przykład będzie dość abstrakcyjny jednak proszę zwrócić uwagę na zapytanie zagnieżdżone: |
| 94 | |
| 95 | {{{ |
| 96 | SELECT * |
| 97 | FROM |
| 98 | (SELECT |
| 99 | contid, |
| 100 | name_1, |
| 101 | adddat, |
| 102 | macrtk, |
| 103 | is_del |
| 104 | FROM |
| 105 | contacts |
| 106 | WHERE |
| 107 | ent_id = {ENT_ID} LIMIT 100) AS foo |
| 108 | AND {FILTER_STRING} |
| 109 | }}} |
| 110 | Ważne jest aby przy takiej definicji raportu filtry wskazywały na kolumny umieszczone w głównym zapytaniu. |
| 111 | |
| 112 | == Definicja nowego filtra == #definicja_nowego_filtra |
| 113 | |
| 114 | Po otwarciu dialoga raportu powinna nam się pojawić dodatkowa zakładka - "Filtry". |
| 115 | |
| 116 | [[BR]][[Image(panel_filtry.png)]][[BR]] (''Panel "Filtry"'')[[BR]] |
| 117 | |
| 118 | Przyciski na widocznym zrzucie umożliwiają standardowe zarządzanie filtrami: |
| 119 | || Nazwa przycisku || Opis || |
| 120 | || Nowy || definicja nowego filtra/grupy || |
| 121 | || Edycja || edycja istniejącego filtra/grupy możliwa również poprzez dwukrotne kliknięcie elementu drzewka || |
| 122 | || Usuń || sunięcie filtra lub grupy (usuwane są też wszystkie podrzędne) || |
| 123 | || Odśwież listę || odświeża listę filtrów || |
| 124 | |
| 125 | Klikając przycisk "Nowy" otrzymujemy formularz dzięki, której możemy zdefiniować nowy filtr lub grupę (zależne od wyboru pola Rodzaj - poniższy zrzut ekranu). |
| 126 | |
| 127 | [[BR]][[Image(filtr_raportu.png)]][[BR]] (''Definicja filtra'')[[BR]] |
| 128 | |
| 129 | Opis pól: |
| 130 | || Nazwa pola || Opis || |
| 131 | || Nazwa || nazwa filtra lub grupy filtrów w zależności co zostanie wybrane w polu rodzaj || |
| 132 | || Opis || dodatkowa informacja wyświetlania po najechaniu na nazwę filtra w panelu filtrów raportu (dostępny na wygenerowanym raporcie) || |
| 133 | || Nadrzędny || w przypadku jeśli dany filtr lub grupa ma należeć do grupy należy wybrać z dostępnej listy || |
| 134 | || Rodzaj || '''Grupa''' - grupuje kilka filtrów lub innych grup[[BR]] '''Filtr''' - konkretny filtr - filtry mogą być definiowane bez elementu nadrzędnego lub mogą należeć do grupy. Filtr nie może należeć do innego filtra || |
| 135 | || Typ opcji || rodzaj wygenerowanego pola na panelu filtrów w wygenerowanym raporcie. Szczegóły poniżej || |
| 136 | || Filtr || wyrażenie filtrujące. W zależności od typ opcji może wymagać podanie tokenu {value} - szczegóły poniżej || |
| 137 | || Wartości dla listy || tylko dla typu: Lista jednokrotnego wyboru, Lista wielokrotnego wyboru, Pola radiowe - kwerenda SQL, gdzie pierwsza wartość to klucz, który '''musi być typu INTEGER''' natomiast druga to opis wartości. Można stosować następujące tokeny: [[BR]] {LOGGED_USER} - identyfikator zalogowanego pracownika (users.usr_id) [[BR]] {LOGGED_ORUNID} - identyfikator jednostki zalogowanego pracownika (organization_units.orunid) [[BR]] {ENT_ID} - identyfikator podmiotu (podmioty.id_pod) [[BR]] {CURRENT_DATE} - bieżąca data w formacie YYYY-MM-DD [[BR]] {CURRENT_TIME} - bieżący czas w formacie HH:MM || |
| 138 | |
| 139 | == Typ opcji == #typ_opcji |
| 140 | Poniżej znajduje się aktualna lista typów opcji oraz przykład definicji: |
| 141 | |
| 142 | || Typ opcji || Opis || Przykład filtru || Wymaga tokenu {value} || |
| 143 | || Wartość BOOLEAN || Zastosowanie dla kolumn typu boolean gdzie wartość to TRUE lub FALSE || is_del IS {value} || Tak || |
| 144 | || Wartość TEXT || Dowolne pole tekstowe do którego chcemy zastosować wyszukiwanie || name_1 ~* E'{value}' || Tak || |
| 145 | || Pole zaznaczane || Jedna opcja zaznaczenia filtruje tylko wtedy gdy jest zaznaczony. Jeśli podamy w filtrze token {value} zostanie zamieniony na TRUE || is_del IS TRUE to samo da nam is_del IS {value} ale is_del IS FALSE nie jest tym samym co is_del IS {value} - {value} jest zawsze zamieniane na TRUE || Nie ale może być patrz przykład || |
| 146 | || Lista jednokrotnego wyboru || Pole typu Select gdzie można wybrać tylko jedną wartość. Wymagane jest zadeklarowanie SQL dla listy opcji || adduid = {value} || Tak || |
| 147 | || Lista wielokrotnego wyboru || Lista z opcjami do wyboru || adduid || Nie tylko należy zadeklarować kolumnę której filtr dotyczy || |
| 148 | || Pola radiowe || Lista z opcjami do wyboru || adduid || Nie tylko należy zadeklarować kolumnę której filtr dotyczy || |
| 149 | || Pole daty z godziną || Wizualizacja tego filtru posiada dodatkowe pole do określania godziny jeśli jest wymagana taka do dokładność || adddat >= '{value}' lub można adddat >= '2012-01-01 12:00' || Raczej tak niepodanie tokenu {value} jest niecelowe || |
| 150 | || Pole daty bez godziny || Brak pola godzina || adddat >= '{value}' lub można adddat >= '2012-01-01' || Raczej tak niepodanie tokenu {value} jest niecelowe || |
| 151 | || Wybór miesiąca oraz roku || Umożliwia wybranie roku oraz miesiąca. Zwracana wartość to rok plus miesiąc oraz 1 dzień czyli np. 2012-02-01. Umożliwia to budowanie zakresów miesięcy jeśli zdefiniujemy drugi filtr tego typu w grupie || adddat >= '{value}' || Tak || |
| 152 | || Kontakt z książki adresowej || Zwraca identyfikator (contacts.contid) klienta || contid = {value} || Tak || |
| 153 | || Lista spraw || Zwraca identyfikator sprawy (processes.prc_id) || prc_id = {value} || Tak || |
| 154 | || Osoba kontaktowa || Zwraca identyfikator osoby kontaktowej (contact_persons.copeid) || copeid = {value} || Tak || |
| 155 | || Urządzenie || Zwraca identyfikator urządzenia (devices.devcid) || devcid = {value} || Tak || |
| 156 | || Projekt || Zwraca identyfikator projektu (projects.projid) || projid = {value} || Tak || |
| 157 | || Lista pracowników || Zwraca identyfikator wybranych pracowników (users.usr_id). '''WAŻNE - wymagane jest aby był operator IN w wyrażeniu filtrującym gdyż wartości są zwracane w postaci 1,2,3,4''' || adduid IN ({value}) || Tak || |
| 158 | || Drzewko || Zwraca identyfikator wybranego elementu drzewka. Napełniane kwerendą podaną poniżej w przykładach || category = {value} || Tak || |
| 159 | |
| 160 | |
| 161 | W moim przypadku chcę filtrować listę klientów według parametru opiekun dlatego: |
| 162 | - Typ opcji : Lista pracowników |
| 163 | - Filtr: macrtk IN ({value}) - pole macrtk przechowuje id opiekuna (users.usr_id) |
| 164 | |
| 165 | Po zapisaniu filtr jest dostępny z poziomu listy filtrów danego raportu: |
| 166 | |
| 167 | [[BR]][[Image(nowy_filtr_na_liscie.png)]][[BR]] (''Nowy filtr na liście filtrów w raporcie'')[[BR]] |
| 168 | |
| 169 | Oraz dodatkowo po wygenerowaniu raportu klikając przycisk Określ parametry otrzymujemy formularz jak na zrzucie poniżej: |
| 170 | |
| 171 | [[BR]][[Image(filtr_na_raporcie.png)]][[BR]] (''Filtr na wygenerowanym raporcie'')[[BR]] |
| 172 | |
| 173 | Po zatwierdzeniu (przycisk Zapisz na formularzu Określ parametru raportu) raport zostanie ponownie wygenerowany uwzględniając nasz wybór. |
| 174 | |
| 175 | == Jeden filtr wiele raportów == #powiazania |
| 176 | Nowa wersja 4.7.7 umożliwia publikację filtrów w wielu raportach. Dodatkowo został dodany słownik definicji filtrów dostępny z poziomu modułu Raporty -> Akcje -> Edycja definicji filtrów lub z poziomu zakładki Filtry w raporcie na pasku zadań. |
| 177 | |
| 178 | Przy dodawaniu filtru bezpośrednio z raportu system tworzy definicję filtru oraz publikuje go w danym raporcie w kontekście, którego aktualnie pracujemy. Zachowanie to możemy zmienić poprzez dodawanie już istniejącej definicji filtru do danego raportu. Można to zrobić poprzez opcję w menu Nowy na zakładce Filtry "Dodaj istniejący (powiązanie)". Z otwartego słownika wybieramy filtry lub grupę i klikamy Dodaj lub Dodaj i zamknij. Ważne jest, że jeśli publikujemy (dodajemy) element, który ma elementy podrzędne nastąpi automatyczne dodanie również tych elementów podrzędnych. |
| 179 | |
| 180 | Publikować (dodawać powiązania) można również poprzez metodę drag & drop danego elementu drzewka definicji filtrów na panel drzewka filtrów w raporcie. |
| 181 | |
| 182 | |
| 183 | == Dynamiczne grupowanie == |
| 184 | Aby na panelu filtrów widoczna była opcja dynamicznego grupowania (po kolumnach zdefiniowanych na panelu Wybór kolumn) w definicji SQL raportu należy dodać token {GROUP_BY}. Jest to jednak token sterujący dlatego należy go poprzedzić --. Pozycja tokena {GROUP_BY} nie ma znaczenia ważne aby był zakomentowany. |
| 185 | |
| 186 | Przykład SQL |
| 187 | {{{ |
| 188 | SELECT * FROM contacts --{GROUP_BY} |
| 189 | }}} |
| 190 | |
| 191 | |
| 192 | == Przydatne kwerendy SQL do filtrów == |
| 193 | |
| 194 | MAGAZYNY |
| 195 | {{{ |
| 196 | SELECT wahaid, name__ FROM warehouses WHERE is_del IS false ORDER BY prior_ |
| 197 | }}} |
| 198 | |
| 199 | GRUPY PRODUKTÓW |
| 200 | {{{ |
| 201 | SELECT pgr_id, name__ FROM product_groups |
| 202 | WHERE is_act IS TRUE AND is_del IS FALSE AND pgr_id NOT IN (SELECT prn_id FROM product_groups) ORDER BY prn_id, name__ |
| 203 | }}} |
| 204 | |
| 205 | KOMÓRKI ORGANIZACYJNE |
| 206 | {{{ |
| 207 | -- z ograniczeniem do tych do których user ma prawo |
| 208 | SELECT orunid, orunsm AS caption |
| 209 | FROM organization_units |
| 210 | WHERE is_del IS FALSE |
| 211 | AND ndetpe = 'ORGCELL' |
| 212 | AND chkUsrOrgAcc({LOGGED_USR_ID}, orunid) |
| 213 | ORDER BY orunsm |
| 214 | |
| 215 | -- Wybór komórek typu Komórka organizacyjna (same działy) |
| 216 | SELECT orunid, COALESCE(orunsm, '') || ' - ' || ndenam AS stanowisko |
| 217 | FROM orgtree_view |
| 218 | WHERE orunid > 0 AND ndetpe = 'ORGCELL' |
| 219 | AND orunsm IS NOT NULL AND is_del IS FALSE |
| 220 | }}} |
| 221 | |
| 222 | OPIEKUN SPRAWY (lista pracowników) |
| 223 | {{{ |
| 224 | Filtr = rspuid={value} |
| 225 | Do listy: SELECT usr_id, fullnm FROM orgtree_view WHERE is_del is FALSE |
| 226 | }}} |
| 227 | |
| 228 | STATUSY (lista) |
| 229 | {{{ |
| 230 | -- SPRAWY |
| 231 | Filtr = state_ in ({value}) |
| 232 | SELECT tpstid, dscrpt FROM types_of_processes_states WHERE clsnam LIKE 'PROCESS%' ORDER BY state_ |
| 233 | |
| 234 | -- DOKUMENTY typu dctpid = 2 (Faktury) |
| 235 | SELECT tpstid, dscrpt FROM types_of_processes_states |
| 236 | WHERE clsnam = 'DOCUMENT|2' ORDER BY state_ |
| 237 | }}} |
| 238 | |
| 239 | TERMIN PLANOWANY > OD (data) |
| 240 | {{{ |
| 241 | foreda >= '{value}'::date |
| 242 | }}} |
| 243 | |
| 244 | WARTOŚĆ SPRAWY (tekstowy) |
| 245 | {{{ |
| 246 | forepa > COALESCE(NULLIF('{value}', '')::int,0) |
| 247 | }}} |
| 248 | |
| 249 | {{{ |
| 250 | -- Osoby do których użytkownik ma prawo |
| 251 | SELECT ov.usr_id, ov.usrnam FROM orgtree_view ov where |
| 252 | chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE |
| 253 | |
| 254 | |
| 255 | -- Wartości cechy osób do których uzytkownik ma prawo |
| 256 | SELECT ftopid, ftopnm |
| 257 | FROM |
| 258 | features_options |
| 259 | INNER JOIN features_options_def USING(fodfid) |
| 260 | LEFT JOIN users u ON u.initls = ftopnm |
| 261 | LEFT JOIN orgtree_view ov ON ov.usr_id = u.usr_id |
| 262 | WHERE featid = 91 |
| 263 | AND (CASE WHEN (SELECT count(*) > 0 FROM users_link_group |
| 264 | WHERE grp_id = 29 AND usr_id = {LOGGED_USR_ID}) THEN 1 = 1 |
| 265 | ELSE chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE END) |
| 266 | ORDER BY ftopnm |
| 267 | |
| 268 | -- Wartości cechy tekstowej o featid 83 |
| 269 | SELECT DISTINCT data__ AS value, data__ AS caption |
| 270 | FROM features_text_view |
| 271 | WHERE featid = 83 |
| 272 | ORDER BY data__ |
| 273 | |
| 274 | -- Wartości do listy wyboru z cechy - lista opcji |
| 275 | SELECT ftopid, ftopnm |
| 276 | FROM |
| 277 | features_options |
| 278 | INNER JOIN features_options_def USING(fodfid) |
| 279 | WHERE featid = 66 |
| 280 | ORDER BY ftopnm |
| 281 | |
| 282 | -- Format zapytania do zwrócenia drzewka |
| 283 | -- Może być wykonane na dowolnej strukturze danych, ważne by zwracało elementy: KLUCZ, RODZIC, NAZWA, TYP. |
| 284 | SELECT c.strcid AS keyval, c.prn_id, c.strnam AS name__, |
| 285 | CASE WHEN (SELECT count(*) FROM cregisters.creg_structure_elements c2 |
| 286 | WHERE c2.prn_id = c.strcid) > 0 THEN 'FOLDER' ELSE 'ITEM' END AS icon__ |
| 287 | FROM cregisters.creg_structure_elements c WHERE c.is_del IS FALSE |