Przejdź do głównej treści

Znacznik jako SQL


Znacznik jako SQL

tworzenie znacznika metodą z tabeli
:size=400px

Znacznik ten daje największe możliwości, jeśli chodzi o pobieranie danych z bazy. Poza standardowymi polami dostępne są dodatkowe:

  • Zapytanie SQL - definicja zapytania SQL, które zostanie wykonane.
  • Kontekst - typ kontekstu, z jakiego będą pobrane dane.
  • Źródło danych - jeśli chcemy aby dane były pobierane z innego systemu, możemy to zrobić poprzez określenie źródła danych. Aby zdefiniować źródło danych, należy przejść do Panelu sterowania -> Pozostałe ustawienia -> Źródła danych
  • Formatowanie - aby określić sposób wyświetlenia pobranych danych, należy wybrać odpowiednie formatowanie. Obecnie dostępne sposoby formatowania dla znacznika SQL to:
    • data
    • kwota numerycznie
    • kwota słownie
    • tabelka (z nagłówkiem i lp)
    • tabelka bez lp (z nagłówkiem)
    • tabelka bez nagłówka (z lp)
    • tabelka bez nagłówka i bez lp

W przypadku jeśli ma być nagłówek wtedy pierwszy wiersz wyniku jest nagłówkiem.

Dodatkowo dla formatowanie typu kwota (MONEY) - zapytanie musi być postaci

SELECT 123, 'PLN'
  • 1 kolumna to kwota
  • 2 kolumna to waluta

Przykład wykorzystania tego znacznika Jako przykład niech posłuży pobranie numeru nip jednej ze stron umowy. Zapytanie wygląda następująco:

SELECT nip_ _ _ FROM contacts WHERE contid = (SELECT toctid FROM contract WHERE ctrcid={CONTEXT})

Kroki tworzenia takiego zapytania są następujące:

  1. fraza pobierająca dane: SELECT nip_ _ _ FROM contacts
  2. fraza warunku: WHERE contid
  3. fraza podzapytania: (SELECT toctid FROM contract WHERE ctrcid={CONTEXT})

Podzapytanie tworzymy podobnie jak zwykłe zapytanie SQL, ale jako warunek WHERE wybieramy z listy kontekstów konkretny kontekst. W naszym przypadku będzie to kontekst 'Umowa'.

Po wybraniu tego kontekstu w miejsce kursora w polu zapytania SQL pojawi się definicja ctrcid={CONTEXT}. Aby zmienić kontekst usuwamy fragment ctrcid={CONTEXT} i ponownie wybieramy kontekst.

Aby obsłużyć brak danych i wypisać własny komunikat należy użyć formy np.

SELECT COALESCE((SELECT nip_ _ _ FROM contacts WHERE contid=c.toctid)::text , 'brak numeru nip') 
FROM contract c WHERE ctrcid={CONTEXT}

Parametry w znaczniku

Dla znaczników zadeklarowanych jako SQL dla dokumentów jest możliwe przekazywanie parametrów.

W obrębie wykonania SQL jest dodatkowy token (przykładowy dokument o id 123) {TOKEN_PARAMS}, który przechowuje wszystkie przekazane parametry do tokena. Definicja tokena w dokumencie RTF:

#DELEGACJA.KOSZTY.MIASTO;{CONTEXT},1# -- można używać {ENT_ID}, {LOGGED_USER}, {CONTEXT} - id dokumentu

Definicja znacznika SQL-owego może wyglądać tak:

SELECT {TOKEN_PARAMS}

Przekazanie parametrów odbywa się po średniku. Zawsze musi być robione jako ostatnie.

!>Uwaga W przypadku szablonów tworzonych w formacie rtf należy pamiętać, iż możliwe jest, aby tekst w znaczniku był formatowany tak jak sobie tego życzy użytkownik. Znacznik można standardowo sformatować poprzez pogrubienie itd. Jednak formatowaniu musi być poddany cały znacznik wraz z znakami {{ lub #.

Przykładu użytecznych kwerend

Kwerenda pobiera datę dokumentu który posłużył do wygenerowania aktualnego dokumentu np. procedura zapytania ofertowego tworzy ofertę - w ofercie chcemy pobrać do szablonu datę z zapytania.

SELECT d2.adddat::date FROM documents d
LEFT JOIN doc_link_doc dld ON d.doc_id = dld.doc_id
LEFT JOIN documents_view d2 ON dld.rel_to = d2.doc_id
WHERE d.doc_id = 905

Kwerenda pobiera zadania ze sprawy

SELECT 'OPIS' AS opis, 'START' AS start, 'KONIEC' AS koniec, 'CZAS TRWANIA' AS czas
UNION
SELECT dscrpt, to_char(start_, 'YYYY-MM-DD HH:MI') AS start, 
to_char(end___, 'YYYY-MM-DD HH:MI') AS end, 
((end___ - start_)::interval)::text AS duration FRom events_view WHERE prc_id IS NULL
ORDER BY czas DESC

Osoba tworząca pismo

SELECT firnam || ' ' || lasnam
FROM users u INNER JOIN documents d ON u.usr_id = d.adduid
WHERE d.doc_id = 125

Pobranie opisu z nadrzędnej komórki organizacyjnej

SELECT (SELECT regexp_replace(ndedsc, E'[\\n\\r]+', ' EDOK_LBR', 'g' ) FROM organization_units o WHERE orunid = get_ndedsc(8)::int)
FROM orgtree_view u 
INNER JOIN documents d ON u.usr_id = d.adduid
WHERE d.doc_id = 250

Status dokumentu (z ogólnego słownika statusów

SELECT tops.dscrpt FROM types_of_processes_states tops
LEFT JOIN documents d ON tops.tpstid = d.tpstid AND tops.clsnam = 'DOCUMENT'
AND d.doc_id = 1