Uniwersalny szablon SQL
Generator raportów


Szablon raportu umożliwiający wygenerowanie wydruku na bazie zapytania SQL.


Konstrukcja


Praca szablonu przebiega w etapach.

1. Wyznaczenie wartości zmiennych PX... oraz zmiennych oznaczonych w wyrażeniu jako do ewaluacji przed wykonaniem raportu (E#).

2. Wykonanie zapytania SQL.

3. Wykonanie nadpisań PXSET:....

4. Sortowanie kolejki danych (za pomocą PXSORT lub PXQSORT).

5. Filtrowanie - filtr zdefiniowany w raporcie.

6. Generowanie raportu przez FRB.


Wyliczanie zmiennych PX...


Na tym etapie program zbiera informacje potrzebne do wygenerowania zapytania SQL. W tym celu najpierw ewaluowane są wszystkie wyrażenia zdefiniowane przez użytkownika z prefiksem E# i nie nazwane etykietą zarezerwowaną (PX...). W tym miejscu można wyświetlić okna dialogowe i zebrać dane o zakresie i parametrach wydruku.


Przykładowo:



Aby móc skorzystać w wyrażeniach ze zmiennych wyliczonych na tym etapie, należy skorzystać z funkcji.


W przypadku, gdy wynik jest liczbą, można zastosować BindExp. Przykładowo:



Funkcja BindExp umożliwia zabindowanie wyrażenia pod zadaną nazwą - w tym przypadku WybranyOB otrzyma wynik zapytania o ID obiektu.
BindExp sprawdzi się tylko w przypadku wartości liczbowych, ponieważ funkcja binduje "wyrażenie", a wyrażenie musi być poprawnym z punktu widzenia języka Clarion.


W przypadku zmiennych nieliczbowych można zastosować funkcje zmiennych pamięciowych pism GET/SET.


Ważne - wyrażenia są ewaluowane w kolejności wprowadzenia jak na liście Calculated Fields.

Wykonanie zapytania SQL


Po wyliczeniu wszystkich wyrażeń, program wylicza wyrażenie o ustalonej etykiecie PXQUERY. Przykładowo:



Zapytanie można wprowadzić bezpośrednio, lub jako ciąg znaków do ewaluacji (poprzedzony E#). Jeśli chcemy skorzystać z funkcji i wyrażeń zabindowanych, należy użyć trybu z E#, jak w powyższym przykładzie.


Jeżeli w zapytaniu wystąpił błąd podczas wykonania, program wyświetli komunikat ze szczegółami błędu, jakie otrzymał od serwera SQL.


Uwaga! W przypadku układania zapytań z wykorzystaniem treści pól z bazy danych lub treści wprowadzanych przez użytkownika jako ciągi znaków wklejanych w łapkach, należy stosować funkcję filtrującą StrEscPSQL, aby zabezpieczyć zapytanie przed niebezpieczeństwem SQL injection.


Jeżeli zapytanie przebiegło poprawnie, to dane umieszczane są w kolejce pamięciowej dostępnej z poziomu edytora raportu jako pola LQ:S1 do LQ:S40. Kolejne pola są typu ciągu znaków i różnią się wielkością, która jest podana w opisie na liście:



W związku z tymi ograniczeniami należy odpowiednio konstruować zapytanie, aby dane tekstowe nie przekroczyły zadanych limitów.


Nadpisywanie wartości w kolejce danych


Kolejno opcjonalnie można nadpisać wybrane pola kolejki definiując pola PXSET:<nr>, czyli od PXSET:1 do PXSET:40. Pole jest typu E# - w przypadku, gdy chcemy dynamicznie utworzyć wzór na dane pole, generujemy do za pomocą prefiksu E#. W przypadku wzoru niezależnego od innych zmiennych, wpisujemy wzór bez E#.


Pola są wyliczanie w kolejności wprowadzania, można odwoływać się do pól kolejki LQ:S1...LQ:S40, przykładowo:


PXSET:2 = AdresZas(LQ:S1,1)

Sortowanie kolejki danych


W kolejnym etapie - o ile określono zmienną użytkownika o etykiecie PXSORT - następuje przetwarzanie kolejki danych i umieszczanie wyniku wyrażenia PXSORT w polu Sortowanie kolejki danych. Następnie kolejka jest sortowana wg tego pola.


Podczas wyliczania wyrażenia sortującego dostępne są pola kolejki LQ:S1 do LQ:S40, dostęp do tabel realizujemy za pomocą funkcji.


Pole PXSORT jest typu E#, to jest można albo wprowadzić wyrażenie sortowania bezpośrednio, albo utworzyć je z ciągu znaków poprzedzając przedrostkiem E#.


Ponieważ wyliczanie sortowania odbywa się po stronie klienta, dostępne są wszystkie funkcje systemu ADA.


Przykładowo:



Właściwości Sorting band w edytorze wydruku nie będą miały żadnego wpływu na kolejność rekordów, mogą natomiast służyć do grupowania.


PXSORT można pominąć, jeśli docelowe sortowanie zostanie uwzględnione w zapytaniu SQL za pomocą klauzuli ORDER BY.


Sortowanie kolejki wg pól kolejki


Alternatywnym sposobem sortowania jest zastosowanie zmiennej PXQSORT, czyli sortowanie kolejki wg jej pól. W takim przypadku wypełnianie pola PXSORT można pominąć. Przykładowo:


PXQSORT = +LQ:S1,+LQ:S2

Uwaga! Pola kolejki są typu string, zatem i sortowanie na nich odbywa się metodą sortowania ciągów znaków. W przypadku liczb można zastosować formatowanie z wiodącymi zerami, aby ciąg sortował sie jak liczba, przykładowo:


PXSET:2 = FORMAT(LQ:S1,'@N010')
PXQSORT = +LQ:S2

Debugowanie zapytania


Dodanie zmiennej PXDEBUG powoduje zapis zapytania, wyrażeń nadpisywania i sortingu oraz wygenerowanej kolejki do systemowego debuga. Kolejka jest przedstawiona w postaci kolejnych wierszy po zastosowaniu sortowania:


NrWiersza : Sortowanie,Pole1,Pole2,...,Pole40

Optymalizacje


Dodanie zmiennej PXACCUM powoduje zliczanie czasu przebiegu funkcji wywoływanych podczas PXSET:... oraz PXSORT - po wykonaniu wyświetlone zostaje okno z analizą danych.

Komentarz


Można również do raportu dodać komentarz dodając jedno lub więcej pól PX!, przykładowo:


PX! = Raport oparty o tabelę kontrahentów
PX! = Ważne - wywołujemy tylko dla wybranego kontrahenta KTH:ID_KTH

Za pomocą komentarza można również wyłączyć działanie wybranej zmiennej, np.:


PX!PXQSORT = +LQ:S1
PX!Suma = LQ:S2

Generowanie raportu przez FRB


Na tym etapie działa silnik raportów FRB - przetwarza rekord po rekordzie przygotowaną i ew. posortowaną kolejkę danych. Dla każdego rekordu dostępne są wszystkie pola kolejki - jak wspomniano wyżej. Dostęp do rekordów tabeli odbywa się za pomocą funkcji.


W wydruku dołączono kilka często używanych tabel, ale ich bufory nie są one automatycznie wypełniane wartościami. Aby wypełnić bufor, należy skorzystać z funkcji T:GetRecord przekazując numer tabeli i id rekordu. Wyrażenie odczytujące rekord umieszczamy w zmiennych użytkownika "at each record retrieve".


Przykładowo:



W tym przykładzie: dzięki temu wyrażeniu pola bufora tabeli Zasoby są wypełniane wartościami na podstawie id rekordu z pola LQ:S1 kolejki danych.


Dla tak przygotowanego zestawu zmiennych użytkownika, definicja raportu może wyglądać jak na przykładzie:



Jak widać - można korzystać zarówno z pól kolejki danych, jak i pól rekordów tabel i innych zabindowanych wyrażeń i funkcji.


Przykładowa definicja





---