Moduł raportów w systemie eDokumenty umożliwia filtrowanie danego raportu poprzez określenie parametrów na dwa sposoby:
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 stosowanie 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) wtedy 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.
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 |
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.
Od wersji 4.0 system eDokumenty umożliwia definiowanie własnych parametrów do raportów określanych jako Filtry.
Na wstępie należy wyszukać interesujący nas raport lub dodać nowy Tworzenie raportów w SQL?.
Przykładowa definicja raportu (kod SQL):
SELECT contid, name_1, adddat, macrtk, is_del FROM contacts WHERE ent_id = {ENT_ID} AND {FILTER_STRING}
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). Być może przykład będzie dość abstrakcyjny jednak proszę zwrócić uwagę na zapytanie zagnieżdżone:
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.
Po otwarciu dialoga raportu powinna nam się pojawić dodatkowa zakładka - "Filtry".
Przyciski na widocznym zrzucie 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 |
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).
Opis pól:
Nazwa pola | Opis |
Nazwa | nazwa filtra lub grupy filtrów w zależności co zostanie wybrane w 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 należy wybrać z dostępnej listy |
Rodzaj | Grupa - grupuje kilka filtrów lub innych grup 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 |
Typ opcji | rodzaj wygenerowanego pola na panelu filtrów w wygenerowanym raporcie. Szczegóły poniżej |
Filtr | wyrażenie filtrujące. W zależności od typ opcji może wymagać podanie tokenu {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 |
Poniżej znajduje się 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 |
W moim przypadku chcę filtrować listę klientów według parametru opiekun dlatego:
Po zapisaniu filtr jest dostępny z poziomu listy filtrów danego raportu:
(Nowy filtr na liście filtrów w raporcie)
Oraz dodatkowo po wygenerowaniu raportu klikając przycisk Określ parametry otrzymujemy formularz jak na zrzucie poniżej:
(Filtr na wygenerowanym raporcie)
Po zatwierdzeniu (przycisk Zapisz na formularzu Określ parametru raportu) raport zostanie ponownie wygenerowany uwzględniając nasz wybór.
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.
Przykład SQL
SELECT * FROM contacts --{GROUP_BY}
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 user 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 uzytkownik 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