Zmiany pomiędzy wersją początkową i wersją 1 dla NewBusinessAdmin/Reports/Filters

Pokaż
Ignoruj:
Data i czas:
09/09/15 15:06:11 (9 years temu)
Autor:
msawkiewicz (IP: 79.188.124.105)
Komentarz:

--

Legend:

Bez zmian
Dodane
Usunięte
Zmienione
  • NewBusinessAdmin/Reports/Filters

    v1 v1  
     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 
     13Moduł 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 
     19Standardowe 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 
     21Należ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. 
     22Warunki 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 
     27W 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 
     29W przypadku niewłaściwego podpięcia raportu lub niewłaściwego użycia operatora raport wygeneruje błąd. 
     30 
     31== Obsługiwane tokeny == 
     32 
     33Obecnie 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 
     62W 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 
     68Od wersji 4.0 system eDokumenty umożliwia definiowanie własnych parametrów do raportów określanych jako Filtry. 
     69 
     70Na wstępie należy wyszukać interesujący nas raport lub dodać nowy [wiki:UserGuide/AdvancedConfiguration/DefiningReports Tworzenie raportów w SQL]. 
     71 
     72Przykładowa definicja raportu (kod SQL): 
     73 
     74{{{ 
     75SELECT 
     76    contid, 
     77    name_1, 
     78    adddat, 
     79    macrtk, 
     80    is_del    
     81FROM 
     82    contacts    
     83WHERE 
     84    ent_id = {ENT_ID}        
     85    AND {FILTER_STRING} 
     86}}} 
     87 
     88== Ważne uwagi == #wazne_uwagi 
     89 
     90Aby 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 
     92Istotną kwestią jest również miejsce w którym jest dodany token {FILTER_STRING} oraz operator jaki go poprzedza (AND/OR zalecany AND). 
     93Być może przykład będzie dość abstrakcyjny jednak proszę zwrócić uwagę na zapytanie zagnieżdżone: 
     94 
     95{{{ 
     96SELECT *  
     97FROM 
     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}}} 
     110Waż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 
     114Po otwarciu dialoga raportu powinna nam się pojawić dodatkowa zakładka - "Filtry". 
     115 
     116[[BR]][[Image(panel_filtry.png)]][[BR]] (''Panel "Filtry"'')[[BR]] 
     117 
     118Przyciski 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 
     125Klikają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 
     129Opis 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 
     140Poniż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 
     161W 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 
     165Po 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 
     169Oraz 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 
     173Po 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 
     176Nowa 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 
     178Przy 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 
     180Publikować (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 == 
     184Aby 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 
     186Przykład SQL 
     187{{{ 
     188SELECT * FROM contacts --{GROUP_BY} 
     189}}} 
     190 
     191 
     192== Przydatne kwerendy SQL do filtrów == 
     193 
     194MAGAZYNY 
     195{{{ 
     196SELECT wahaid, name__ FROM warehouses WHERE is_del IS false ORDER BY prior_ 
     197}}} 
     198 
     199GRUPY PRODUKTÓW 
     200{{{ 
     201SELECT pgr_id, name__ FROM product_groups  
     202WHERE 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 
     205KOMÓRKI ORGANIZACYJNE  
     206{{{ 
     207-- z ograniczeniem do tych do których user ma prawo 
     208SELECT orunid, orunsm AS caption  
     209FROM organization_units  
     210WHERE is_del IS FALSE  
     211AND ndetpe = 'ORGCELL' 
     212AND chkUsrOrgAcc({LOGGED_USR_ID}, orunid)  
     213ORDER BY orunsm 
     214 
     215-- Wybór komórek typu Komórka organizacyjna (same działy) 
     216SELECT orunid, COALESCE(orunsm, '') || ' - ' || ndenam AS stanowisko 
     217FROM orgtree_view  
     218WHERE orunid > 0 AND ndetpe = 'ORGCELL'  
     219AND orunsm IS NOT NULL AND is_del IS FALSE 
     220}}} 
     221 
     222OPIEKUN SPRAWY (lista pracowników) 
     223{{{ 
     224Filtr = rspuid={value} 
     225Do listy: SELECT usr_id, fullnm FROM orgtree_view WHERE is_del is FALSE 
     226}}} 
     227 
     228STATUSY (lista) 
     229{{{ 
     230-- SPRAWY 
     231Filtr = state_ in ({value}) 
     232SELECT tpstid, dscrpt FROM types_of_processes_states WHERE clsnam LIKE 'PROCESS%' ORDER BY state_ 
     233 
     234-- DOKUMENTY typu dctpid = 2 (Faktury) 
     235SELECT tpstid, dscrpt FROM types_of_processes_states  
     236WHERE clsnam = 'DOCUMENT|2' ORDER BY state_ 
     237}}} 
     238 
     239TERMIN PLANOWANY > OD (data) 
     240{{{ 
     241foreda >= '{value}'::date 
     242}}} 
     243 
     244WARTOŚĆ SPRAWY (tekstowy) 
     245{{{ 
     246forepa > COALESCE(NULLIF('{value}', '')::int,0) 
     247}}} 
     248 
     249{{{ 
     250-- Osoby do których użytkownik ma prawo 
     251SELECT ov.usr_id, ov.usrnam FROM orgtree_view ov where 
     252chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE 
     253 
     254 
     255-- Wartości cechy osób do których uzytkownik ma prawo 
     256SELECT ftopid, ftopnm 
     257FROM  
     258features_options  
     259INNER JOIN features_options_def USING(fodfid) 
     260LEFT JOIN users u ON u.initls = ftopnm 
     261LEFT JOIN orgtree_view ov ON ov.usr_id = u.usr_id 
     262WHERE featid = 91 
     263AND (CASE WHEN (SELECT count(*) > 0 FROM users_link_group  
     264WHERE grp_id = 29 AND usr_id = {LOGGED_USR_ID}) THEN 1 = 1  
     265ELSE chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE END) 
     266ORDER BY ftopnm 
     267 
     268-- Wartości cechy tekstowej o featid 83 
     269SELECT DISTINCT data__ AS value, data__ AS caption 
     270FROM features_text_view 
     271WHERE featid = 83 
     272ORDER BY data__ 
     273 
     274-- Wartości do listy wyboru z cechy - lista opcji 
     275SELECT ftopid, ftopnm 
     276FROM  
     277features_options  
     278INNER JOIN features_options_def USING(fodfid) 
     279WHERE featid = 66 
     280ORDER 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.  
     284SELECT c.strcid AS keyval, c.prn_id, c.strnam AS name__,  
     285CASE WHEN (SELECT count(*) FROM cregisters.creg_structure_elements c2  
     286WHERE c2.prn_id = c.strcid) > 0 THEN 'FOLDER' ELSE 'ITEM' END AS icon__  
     287FROM cregisters.creg_structure_elements c WHERE c.is_del IS FALSE