Podręcznik użytkownika > Raporty > Filtrowanie raportów

Filtrowanie raportów

Moduł raportów w systemie eDokumenty umożliwia filtrowanie danego raportu poprzez określenie parametrów na dwa sposoby:

  • standardowe parametry
  • utworzenie filtrów przez użytkownika

Standardowe parametry

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.

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. Warunki stosowania operatorów:

Operator Kiedy stosować Przykład parametru
IN dla listy, gdyż możemy otrzymać kilka zaznaczonych elementów.
Token zostanie zamieniony na identyfikatory z danej listy np.: 1,2,3,4
Miejsce: Lista klientów
Parametr: contid IN ({CONTID})
znak = dla kartoteki przekazywana jest tylko jedna wartość do parametru Miejsce: Kartoteka klienta
Parametr: contid = {CONTID}

W przypadku, jeśli w definicji raportu użyjemy np.: {CONTID} a raport zostanie wywołany z modułu (przekazane zostaną zaznaczone elementy), token zostanie zamieniony na pierwszy z zaznaczonych elementów.

W przypadku niewłaściwego podpięcia raportu lub niewłaściwego użycia operatora raport wygeneruje błąd.

Obsługiwane tokeny

Obecnie obsługiwane tokeny to:

Nazwa Opis Wartość domyślna Określanie na formularzu
{DATE_FROM} Data od Początek bieżącego miesiąca TAK
{DATE_TO} Data do Koniec bieżącego miesiąca TAK
{USR_ID} Pracownik Pracownik z listy TAK
{LOGGED_USR_ID} Zalogowany pracownik Id zalogowanego pracownika (users.usr_id) NIE
{ENT_ID} Identyfikator podmiotu Identyfikator podmiotu NIE
{FILTER_STRING} Ciąg filtrujący 'TRUE' TAK - definicja filtrów to określa
{ACORID} Jednostka rozliczeniowa 0 TAK
{TOVCID} Miejsce powstawania kosztów 0 TAK
{ADANID} Dodatkowa analityka 0 TAK
{CONTID} Klient Pierwszy nie usunięty klient z listy (sortowany po contid) TAK
{CONTIDS} Klient Pierwszy nie usunięty klient z listy (sortowany po contid) TAK
{DOC_ID} Dokument (z listy lub kartoteka) 0 NIE
{DOC_IDS} Dokument (z listy lub kartoteka) 0 NIE
{DOCIDS} Dokument (z listy lub kartoteka) 0 NIE
{PRC_ID} Sprawa 0 TAK
{PRC_IDS} Sprawa 0 TAK
{PRCIDS} Sprawa 0 TAK
{EVNTID} Zdarzenie (z listy lub kartoteka) 0 NIE
{EVNTIDS} Zdarzenie (z listy lub kartoteka) 0 NIE
{CAMPID} Kampania (z listy lub kartoteka) 0 TAK
{CAMPIDS} Kampania (z listy lub kartoteka) 0 TAK
{DEVCID} Urządzenie (z listy lub kartoteka) 0 TAK
{DEVCIDS} Urządzenie (z listy lub kartoteka) 0 TAK
{DEPOID} Produkt (z listy lub kartoteka) 0 TAK
{DEPOIDS} Produkt (z listy lub kartoteka) 0 TAK
{RES_ID} Zasób (z listy lub kartoteka) 0 TAK

Definiowanie filtrów

System eDokumenty umożliwia definiowanie własnych parametrów do raportów określanych jako Filtry.

Przykładowa definicja raportu (kod SQL):

SELECT
    contid,
    name_1,
    adddat,
    macrtk,
    is_del   
FROM
    contacts   
WHERE
    ent_id = {ENT_ID}       
    AND {FILTER_STRING}

Ważne uwagi

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.

Istotną kwestią jest również miejsce, w którym jest dodany token {FILTER_STRING} oraz operator, jaki go poprzedza (AND/OR - zalecany AND).

Przykład

SELECT * 
FROM
    (SELECT
        contid,
        name_1,
        adddat,
        macrtk,
        is_del   
    FROM
        contacts   
    WHERE
        ent_id = {ENT_ID} LIMIT 100) AS foo      
    AND {FILTER_STRING}

Ważne jest, aby przy takiej definicji raportu filtry wskazywały na kolumny umieszczone w głównym zapytaniu.

Definicja nowego filtra

Filtrami możemy zarządzać w zakładce Filtry w kartotece raportu.



Zakładka Filtry

Przyciski na widocznym rysunku umożliwiają standardowe zarządzanie filtrami:

Nazwa przycisku Opis
Nowy definicja nowego filtra/grupy
Edycja edycja istniejącego filtra/grupy możliwa również poprzez dwukrotne kliknięcie elementu drzewka
Usuń sunięcie filtra lub grupy (usuwane są też wszystkie podrzędne)
Odśwież listę odświeża listę filtrów

Nowy filtr lub grupę filtrów definiujemy w formularzu Typ raportu.



Wypełniane pola:

  • Nazwa - nazwa filtra lub grupy filtrów, w zależności od wartości polu Rodzaj
  • Opis - dodatkowa informacja wyświetlania po najechaniu na nazwę filtra w panelu filtrów raportu (dostępny na wygenerowanym raporcie)
  • Nadrzędny - w przypadku, jeśli dany filtr lub grupa ma należeć do grupy, wybieramy ją z listy
  • Rodzaj. Wartość Grupa grupuje kilka filtrów lub innych grup, wartość Filtr oznacza 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.
  • Typ opcji - rodzaj wygenerowanego pola w panelu filtrów w wygenerowanym raporcie. Szczegóły poniżej.
  • Filtr - wyrażenie filtrujące. W zależności od typu opcji może wymagać podania tokena {value} - szczegóły poniżej.
  • 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: {LOGGED_USER} - identyfikator zalogowanego pracownika (users.usr_id), {LOGGED_ORUNID} - identyfikator jednostki zalogowanego pracownika (organization_units.orunid), {ENT_ID} - identyfikator podmiotu (podmioty.id_pod), {CURRENT_DATE} - bieżąca data w formacie YYYY-MM-DD, {CURRENT_TIME} - bieżący czas w formacie HH:MM

Typ opcji

Aktualna lista typów opcji oraz przykład definicji:

Typ opcji Opis Przykład filtru Wymaga tokenu {value}
Wartość BOOLEAN Zastosowanie dla kolumn typu boolean gdzie wartość to TRUE lub FALSE is_del IS {value} Tak
Wartość TEXT Dowolne pole tekstowe do którego chcemy zastosować wyszukiwanie name_1 ~* E'{value}' Tak
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
Lista jednokrotnego wyboru Pole typu Select gdzie można wybrać tylko jedną wartość. Wymagane jest zadeklarowanie SQL dla listy opcji adduid = {value} Tak
Lista wielokrotnego wyboru Lista z opcjami do wyboru adduid Nie tylko należy zadeklarować kolumnę której filtr dotyczy
Pola radiowe Lista z opcjami do wyboru adduid Nie tylko należy zadeklarować kolumnę której filtr dotyczy
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
Pole daty bez godziny Brak pola godzina adddat >= '{value}' lub można adddat >= '2012-01-01' Raczej tak niepodanie tokenu {value} jest niecelowe
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
Kontakt z książki adresowej Zwraca identyfikator (contacts.contid) klienta contid = {value} Tak
Lista spraw Zwraca identyfikator sprawy (processes.prc_id) prc_id = {value} Tak
Osoba kontaktowa Zwraca identyfikator osoby kontaktowej (contact_persons.copeid) copeid = {value} Tak
Urządzenie Zwraca identyfikator urządzenia (devices.devcid) devcid = {value} Tak
Projekt Zwraca identyfikator projektu (projects.projid) projid = {value} Tak
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
Drzewko Zwraca identyfikator wybranego elementu drzewka. Napełniane kwerendą podaną poniżej w przykładach category = {value} Tak

Przykład
Chcę filtrować listę klientów według parametru Opiekun. Wtedy:

  • wybieram Typ opcji: Lista pracowników
  • definiuję Filtr: macrtk IN ({value}) - pole macrtk przechowuje id opiekuna (users.usr_id)

Po zapisaniu filtr zostaje dodany do listy w zakładce Filtry, a po wygenerowaniu raportu wyświetla się w oknie po kliknięciu odnośnika Określ parametry.

Jeden filtr, wiele raportów

Raz zdefiniowane filtry mogą być publikowane (dodawane zostają powiązania) w wielu raportach. Słownik definicji filtrów dostępny jest z menu Akcje po wybraniu pozycji Edycja definicji filtrów lub z poziomu zakładki Filtry kartoteki raportu - po kliknięciu ikony Edytuj definicje filtrów raportów w Pasku narzędzi.

Przy dodawaniu filtra bezpośrednio z kartoteki raportu system tworzy definicję filtra i publikuje go w edytowanym raporcie. Zachowanie to możemy zmienić poprzez dodawanie już istniejącej definicji filtra do 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.

Publikować filtry można również poprzez metodę drag&drop danego elementu drzewka definicji filtrów w oknie Definicje filtrów na drzewko filtrów w kartotece raportu.

Dynamiczne grupowanie

Aby na panelu filtrów widoczna była opcja dynamicznego grupowania (po kolumnach zdefiniowanych na zakładce Kolumny w kartotece raportu), w definicji SQL raportu dodajemy token {GROUP_BY}. Jest to token sterujący, dlatego należy go poprzedzić zapisem --. Pozycja tokena {GROUP_BY} nie jest istotna.

Przykład

SELECT * FROM contacts --{GROUP_BY}

Przydatne kwerendy SQL do filtrów

MAGAZYNY

SELECT wahaid, name__ FROM warehouses WHERE is_del IS false ORDER BY prior_

GRUPY PRODUKTÓW

SELECT pgr_id, name__ FROM product_groups 
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__

KOMÓRKI ORGANIZACYJNE

-- z ograniczeniem do tych, do których użytkownik ma prawo
SELECT orunid, orunsm AS caption 
FROM organization_units 
WHERE is_del IS FALSE 
AND ndetpe = 'ORGCELL'
AND chkUsrOrgAcc({LOGGED_USR_ID}, orunid) 
ORDER BY orunsm

-- Wybór komórek typu Komórka organizacyjna (same działy)
SELECT orunid, COALESCE(orunsm, '') || ' - ' || ndenam AS stanowisko
FROM orgtree_view 
WHERE orunid > 0 AND ndetpe = 'ORGCELL' 
AND orunsm IS NOT NULL AND is_del IS FALSE

OPIEKUN SPRAWY (lista pracowników)

Filtr = rspuid={value}
Do listy: SELECT usr_id, fullnm FROM orgtree_view WHERE is_del is FALSE

STATUSY (lista)

-- SPRAWY
Filtr = state_ in ({value})
SELECT tpstid, dscrpt FROM types_of_processes_states WHERE clsnam LIKE 'PROCESS%' ORDER BY state_

-- DOKUMENTY typu dctpid = 2 (Faktury)
SELECT tpstid, dscrpt FROM types_of_processes_states 
WHERE clsnam = 'DOCUMENT|2' ORDER BY state_

TERMIN PLANOWANY > OD (data)

foreda >= '{value}'::date

WARTOŚĆ SPRAWY (tekstowy)

forepa > COALESCE(NULLIF('{value}', '')::int,0)
-- Osoby, do których użytkownik ma prawo
SELECT ov.usr_id, ov.usrnam FROM orgtree_view ov where
chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE


-- Wartości cechy osób, do których użytkownik ma prawo
SELECT ftopid, ftopnm
FROM 
features_options 
INNER JOIN features_options_def USING(fodfid)
LEFT JOIN users u ON u.initls = ftopnm
LEFT JOIN orgtree_view ov ON ov.usr_id = u.usr_id
WHERE featid = 91
AND (CASE WHEN (SELECT count(*) > 0 FROM users_link_group 
WHERE grp_id = 29 AND usr_id = {LOGGED_USR_ID}) THEN 1 = 1 
ELSE chkUsrOrgAcc({LOGGED_USR_ID}, ov.orunid) IS TRUE END)
ORDER BY ftopnm

-- Wartości cechy tekstowej o featid 83
SELECT DISTINCT data__ AS value, data__ AS caption
FROM features_text_view
WHERE featid = 83
ORDER BY data__

-- Wartości do listy wyboru z cechy - lista opcji
SELECT ftopid, ftopnm
FROM 
features_options 
INNER JOIN features_options_def USING(fodfid)
WHERE featid = 66
ORDER BY ftopnm

-- Format zapytania do zwrócenia drzewka
-- Może być wykonane na dowolnej strukturze danych, ważne by zwracało elementy: KLUCZ, RODZIC, NAZWA, TYP. 
SELECT c.strcid AS keyval, c.prn_id, c.strnam AS name__, 
CASE WHEN (SELECT count(*) FROM cregisters.creg_structure_elements c2 
WHERE c2.prn_id = c.strcid) > 0 THEN 'FOLDER' ELSE 'ITEM' END AS icon__ 
FROM cregisters.creg_structure_elements c WHERE c.is_del IS FALSE