PXSQL filtr - rozszerzenie FRB
Generator raportów


Generatory raportów operują bezpośrednio na tabelach bazy danych lub też na kolejkach danych przygotowanych w pamięci przed wykonaniem wydruku. Rozszerzenie PX filtr dotyczy tylko tych wydruków, które operują bezpośrednio na tabelach! Wydruki wspierające rozszerzenie zostały oznaczone na liście szablonów symbolem PXSQL.


Rozszerzenie umożliwia precyzyjną kontrolę nad filtrowaniem danych, rozwiązuje problemy z wydrukami w wersji Ada na SQL i pozwala na optymalizację prędkości generowania wydruków.


PX filtr


Filtr wydruku w generatorze wprowadzamy we właściwościach raportu:



Istnieje również alternatywna metoda deklaracji filtrów - opisane niżej.


Aby skorzystać z rozszerzenia, filtr wprowadamy wg składni:


PX=[E#]<filtrView>^^^[E#]<filtrSQL>^^^[E#]<filtrManual>


gdzie:

PX= - przedrostek informujący o wykorzystaniu opcji rozszerzenia,

[E#] - E# do wstawienia opcjonalnie - powoduje jednorazową ewaluację wyrażenia przed wykorzystaniem dalej, umożliwia wykorzystanie zmiennych wyliczanych przed ustaleniem filtra (opisano dalej),

^^^ - ciąg znaków separujący poszczególne filtry,

<filtrView> - opcjonalny filtr widoku w stylu Clarionowym - odpowiednik filtra używanego bez rozszerzenia,

<filtrSQL> - opcjonalny filtr bezpośrednio na tabelach SQL (tylko wersja Ada SQL),

<filtrManual> - opcjonalny filtr operujący na rekordach widoku.


Rozszerzenie umożliwia wprowadzenie 3 rodzajów filtrów.


filtrView - jest to odpowiednik filtrowania bez zastosowania rozszerzenia, klasyczny filtr Clarionowy, który, o ile nie korzysta z wywołań funkcji i operuje tylko na zmiennych pamięciowych i polach tabeli, powinien wykonywać się szybko i w przypadku braku zdefiniowanego filtra dedykowanego SQL, powinien być przekazany przez program po transformacji do silnika SQL. Jeśli filtr zawiera wywołania funkcji, filtr nie zostanie przekazany do silnika i zamiast tego rekordy będą filtrowane po stronie klienta, co jest podejściem nieefektywnym, nadmiernie obciążającym silnik SQL i należy go unikać.


filtrSQL - umożliwia skonstruowanie filtra bezpośrednio dla silnika SQL. Do tabel należy odnosić się poprzez prefiks A, B, C zamiast prefiksów Clarionowych! Prefiksy nadawane są tabelom wg kolejności wystąpienia w strukturze widoku - zatem pierwsza tabela ma A, kolejne, B, C itd. Przykładowo: A.ID_KART, B.ID_OB.


filtrManual - umożliwia dodatkowe filtrowanie rekordów w czasie przetwarzania rekordów widoku. Tutaj należy umieszczać wszelkie wyrażenia wymagające użycia funkcji jak liczenie salda, zużycia liczników itd.


Uwaga! Jeśli podano obydwa filtrView oraz filtrSQL, to filtrView zostanie potraktowany jako element filtrManual z uwagi na to, że nie jest możliwe połączenie filtra filtrView i filtrSQL w jednym zapytaniu. W związku z tym powinno się wprowadzać albo filtry 1 i 3, albo 2 i 3.


Kilka przykładów poprawnej składni:


PX=OB:ID_OB=1

PX=E#'OB:ID_OB=1'

PX=^^^A.ID_OB=1

PX=^^^E#'A.ID_OB=1'

PX=^^^^^^OB:ID_OB=1

PX=^^^^^^E#'OB:ID_OB=1'

PX=E#'OB:ID_OB=1'^^^E#'A.ID_OB=1'^^^E#'OB:ID_OB=1'


Parametryzowanie filtrów


Przedrostek E# umożliwia wygenerowanie filtra jako ciągu znaków z zadanego wyrażenia. Dzięki temu możliwe jest parametryzowanie filtra PX.


Przykładowo:


PX=E#'OB:ID_OB='&WybranyOB


Przy założeniu, że WybranyOB to zabindowane wyrażenie o wartości 1, utworzony zostanie filtr:


OB:ID_OB=1


Ponieważ w momencie tworzenia filtra żadna ze zmiennych użytkownika nie została jeszcze ani razu ewaluowana, zdefiniowanie WybranyOB w zmiennych raportu jako "at the start of the report" nie wystarczy, by móc wykorzystać taką zmienną we filtrze. Należy dodatkowo w definicji zmiennej dodać prefiks E# oraz przepuścić zmienną przez funkcję BindExp. Przykładowo:



Przedrostek E# informuje program, że ta zmienna ma się wyliczyć przed wygenerowaniem filtra. Tak oznaczone zmienne nie będą już wyliczane podczas przetwarzania danych.


Funkcja BindExp umożliwia zabindowanie wartości wyrażenia pod zadaną nazwą - w tym przypadku WybranyOB otrzyma wynik zapytania o ID obiektu.


W przypadku, gdy nie ma potrzeby zapamiętywania wyniku, można pominąć BindExp, przykładowo:



Powyższy wpis powoduje wywołanie wybieraka przed wygenerowaniem filtra, ale nie zapisuje nigdzie wyniku tej operacji.


Wybierak a SQL


Uniwersalny wybierak (QGloZ_Manager) pozwala na wybranie zestawu rekordów do przetwarzania. Klasycznie filtrowanie rekordów wg wybieraka sprowadza sie do testowania rekordów funkcją QGloZ_Czy(...), jednak w przypadku wersji SQL jest to podejście nie efektywne.


W zamian należy skorzystać z opcji filtra SQL oraz z funkcji QGloZ_GetList(...). Dla powyższego przykładu QGloZ_Manager(3), czyli wybieraka obiektów, definicja filtra SQL przyjmie postać:


PX=^^^E#'(A.ID_OB IN ('&QGloZ_GetList(3)&'))'


Czyli po wykonaniu E# filtr przyjmie postać w stylu:


(A.ID_OB IN (1,2,3,4...))


Taki filtr działa znacznie szybciej, niż filtrowanie za pomocą QGloZ_Czy.


Alternatywna deklaracja filtrów PX


Filtry filtrSQL oraz filtrManual można alternatywnie zadeklarować w sekcji zmiennych użytkownika. Uwaga! Jeśli wykorzystano metodę "PX=...", to filtry zdefiniowane w zmiennych użytkownika zostaną zignorowane.


Aby zadeklarować filtrSQL, należy wprowadzić zmienną o nazwie PXFILTRSQL, analogicznie aby zadeklarować filtrManual, należy wprowadzić zmienną o nazwie PXFILTRMANUAL. Przykładowo:



W przypadku podania filtra standardowego, PXFILTRSQL i PXFILTRMANUAL - obowiązują te same reguły, co opisane wyżej, czyli jeśli podano filtr SQL, to filtr standardowy zostanie dopisany do filtra manualnego.


---