Uniwersalny szablon SQL
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
---