Formuły SQL jest to mechanizm budowania dowolnych formuł w których wartość jest pobierana z polecenia SQL
Polecenie SQL musi mieć następującą składnie:
select LP, WARTOŚĆ - gdzie
LP jest liczbą narzucającą kolejność a
WARTOŚĆ jest wartością jaką będziemy zwracać jako wynik formuły
W przypadku jak polecenie zwraca więcej niż jeden rekord, program sortuje po
LP i skleja pole
WARTOŚĆ jako ciąg znaków, ten mechanizm daje łatwy sposób implementacji list
Dostępne makra:
- ^yko:id|macro^ - Zwraca identyfikator kartoteki kontrahenta YKO_Id int
- ^yuk:id|macro^ - Zwraca identyfikator umowy YUK_Id int
Algorytm działania jest następujący:
- W polecenie SQL są wyszukiwane makra (ww) i jak zostaną znalezione to wartość jest podmieniana
- W SQL jest tworzona tabelka tymczasowa z dwoma kolumnami (LP int, S1024 varchar(1024))
- Do SQL wysyłane jest polecenie typu insert into (LP,S1024) select i tutaj wartość formuły
- Z SQL pobierana jest wartość tabelki w posortowaniu po LP a zawartość pola tekstowego jest łączona (konkatenacja łańcuchów)
- Złożony łańcuch znaków jest zwracany jako wartość formuły
Przykładowe polecenia:
Przykład pobierający z adresu kontrahenta telefon (wykorzystuje makro do umowy)
Select YUK_ID, Case
When isnull( YAK_Telefon1, '') <> '' then 'Telefon: '+YAK_Telefon1
Else ''
End
From YUmowa_Kontrahent, dbo.YKontrahent, dbo.YAdres_Kontrahent
Where YUK_Id = ^yuk:id|macro^ and
YUK_IdKontrahent=YKO_Id and
YKO_IdAdres=YAK_Id and
isnull( YKO_Archiwum,0)=0 and
isnull( YUK_Archiwum,0)=0
Przykład formatujący tekst w zależności czy umowa jest na czas określony czy nie
Select 1, Case
When isnull( YUK_Data_Obowiazuje_Do, 0)= 0 Then ' NA CZAS NIEOKREŚLONY'
Else ' OKREŚLONY DO DNIA ' + Convert( varchar(20), Convert( datetime, YUK_Data_Obowiazuje_Do-36163), 110)
End
From YUmowa_Kontrahent
Where YUK_Id = ^yuk:id|macro^
Przykład pokazujący idee budowania wartości. Wywołanie w teście zwraca łańcuch znaków " A - 11 B - 22" jak widać połączył dwa polecenia select
select 1, ' A - ' + Str( ^yko:id|macro^ )
union all
select 2, ' B - ' + Str( ^yuk:id|macro^)
Kolejny przykład gdzie jako wartość formuły zwracana jest lista przecinkowa zawartych umów z kontrahentem
Select Row_Number() Over( Order By YUK_NrUmowy) , Case Row_Number() Over( Order By YUK_NrUmowy) When 1 Then '' Else ', ' End + YUK_NrUmowy
From dbo.YUmowa_Kontrahent
Where YUK_IdKontrahent = ^yko:id|macro^