Wykorzystanie parametrów dynamicznych
Parametry dynamiczne to zmienne, zdefiniowane przez Użytkownika, wykorzystywane w trakcie pracy z programem poprzez ich wstawienie w definicje zmiennych. W zależności od rodzaju tekstu, którym definiowane są parametry istnieją parametry dynamiczne:
- Filtrów (tekstem jest najczęściej fragment pewnej klauzuli: WHERE)
- Wykresów i Szybkich raportów (tekstem jest treść zapytania lub parametrów graficznych definicji wykresu)
- Wydruków (parametry dynamiczne Runtimes przekazywane do wydruku)
Składnia parametrów dynamicznych
Uwagi ogólne
Ogólna składnia parametru dynamicznego jest następująca:
?@[H]Picture[(_Q|_NQ)]|[Nazwa|]Prompt:Default[@?] (PD)
albo
?@EOL (PD)
albo
?@ABC(‘Tekst’) (PD)
gdzie:
@[H]Picture – format parametru. Jeśli w formacie zostanie użyty opcjonalny przełącznik ukrycia parametru (H), wówczas kontrolka odpowiadająca parametrowi nie jest kreowana, a wartość parametru pozostaje stała (dziedziczona lub Default – owa). Przełącznik ukrycia parametru H jest dostępny zawsze dla wszystkich formatów (dla uproszczenia – w dokumencie będzie on pomijany).
Dostępne formaty
- Standardowe (predefiniowane) formaty Clarionowe (np. @S20, @N-14.2, @N3, @D17, @T1,…)
- Dodatkowe formaty, zdefiniowane specjalnie dla obsługi parametrów dynamicznych:
@X – check
@O(RadioPrompt:RadioValue{[|RadioPrompt:RadioValue]…}) – option
@LsXXX(Biblioteka.dll|CallLookupFunkcjaU[(ParametryCallLookupFunkcjaU)]) lub
@LnXXX(Biblioteka.dll|CallLookupFunkcjaU[(ParametryCallLookupFunkcjaU)]) – lookup
@R(Zapytanie)
Elementy składni
- Nazwa – kod, po którym klasa identyfikuje i wiąże parametr (np. rozpoznaje, która dana z kolejki wynikowej wykresu / zmienna dynamiczna z aplikacji odpowiada temu parametrowi). Niedozwolonymi znakami w nazwie są pipe (separator nazwy od promptu) i dwukropek (separator promptu od wartości).
- Prompt – prompt pojawiający się przy kreowanych dynamicznie kontrolkach parametrów.Niedozwolonymi znakami w prompcie są pipe (separator nazwy od promptu) i dwukropek (separator promptu od wartości). Można natomiast używać znaku & (akcelerator).
- Default – domyślna (początkowa) wartość parametru (w przypadku parametrów posiadających sekwencję zakończenia @? można nie stosować otaczających stringowy Default ciapek). Jeśli Default nie zostanie podany – klasa przyjmie jego wartość jako pustą (0 lub ”, w zależności od typu parametru, określonego przez Picture). W wartości domyślnej można używać wyrażeń. Nie można natomiast stosować odwołań do parametrów dynamicznych (brak możliwości zagnieżdżania (z jednym wyjątkiem, opisanym przy omawianiu formatu lookupu)).
- Składnia typu: ?@EOL, służy do wstawienia w danym miejscu pustej linii.
Opcjonalna sekwencja zakończenia parametru: @?
W przypadku braku sekwencji zakończenia parametru (@?) należało przyjąć jakieś inne kryterium zakończenia. Kryterium to jest następujące:
Jako koniec parametru dynamicznego w przypadku braku sekwencji zakończenia przyjmujemy:
- Znak poprzedzający pierwsze wystąpienie któregokolwiek z poniższych znaków (sekwencji):
Spacja; ‘)’; ‘}’; ‘+’; ‘-‘; ‘*’; ‘/’; ‘,’; ‘%’; ‘=’; ‘|’; ‘<13,10>’, (SZ 1)
znalezionych po rozpoczęciu Default-u i niewystępujących wewnątrz literału stringowego (‘…’) albo w przypadku braku takiego wystąpienia:
- koniec tekstu. (SZ 2)
Modyfikatory otaczania apostrofami _Q i _NQ
Wymuszają otaczanie (_Q) lub nieotaczanie (_NQ) wstawianej wartości parametru apostrofami.
Jeśli parametr jest stringowy (@Picture=@S…) – jego wartość przy wstawianiu zostaje domyślnie otoczona apostrofami. Chcąc z tego zrezygnować używamy modyfikatora _NQ (użycie w tym przypadku modyfikatora _Q jest ignorowane).
Jeśli parametr jest niestringowy (@Picture<>@S…) – jego wartość przy wstawianiu nie zostaje domyślnie otoczona apostrofami. Chcąc wymusić otoczenie apostrofami takiego parametru używamy modyfikatora _Q (użycie w tym przypadku modyfikatora _NQ jest ignorowane).
Tekst, w którym jest umieszczony parametr stanowi wywołanie procedury, której drugim parametrem jest parametr stringowy, odpowiadający numerowi rachunku bankowego: OP_KASAI.DLL|CALLBRPLISTA(‘BRA’,?@n6_Q|RachunekID|Rachunek:0@?).
Umieszczenie całego parametru w apostrofach spowoduje, że parametr ten nie będzie „widziany” przez parser.
Stosowanie modyfikatorów ma sens tylko dla samodzielnych definicji parametrów (tzw. stara składnia), stanowiących jednocześnie deklarację parametru i odwołanie do jego wartości.
Jeśli definicja jest częścią deklaracji @PAR … PAR@, to stosowanie modyfikatorów nie ma sensu – deklaracje są w całości usuwane z tekstu. W tym przypadku modyfikatory należy umieszczać w odwołaniach do wartości parametrów (np. ??_QNazwa).
Wstawianie pustych linii pomiędzy parametrami
Jeśli chcemy wstawić linię przerwy pomiędzy kontrolkami parametrów – można w tym celu zadeklarować pomiędzy nimi specjalny, ukryty parametr (może być to również parametr, który nie będzie nigdzie indziej używany). Ukrycie należy wprowadzić wykorzystując deklarację parametru z opcją ukrycia @H[IDE]. Opcja ukrycia powinna być w tym przypadku bezparametrowa (@HIDE()) lub zawierać wyrażenie ewaluujące się zawsze do prawdy (np. @HIDE(1=1)).
Przykład 1: (poprawne ale nieefektywne wstawienie pustej linii pomiędzy kontrolki parametrów: ??Akronim i ??SprawdzajDaty)
@PAR ?@s20|Akronim|&Akronim:@? PAR@
@PAR ?@n1|PustaLinia|Pusta linia:@? @HIDE() PAR@
@PAR ?@X|SprawdzajDaty|&Sprawdzaj daty:1@? PAR@
Przykład 2: (linia nie będzie wstawiona)
@PAR ?@s20|Akronim|&Akronim:@? PAR@
@PAR ?@Hn1|PustaLinia|Pusta linia:@? PAR@
@PAR ?@X|SprawdzajDaty|&Sprawdzaj daty:1@? PAR@
Powyższe rozwiązanie ma wadę w postaci pojawiania się na moment kontrolki parametru a także ze względu na konieczność wpisywania członów składni, które nigdzie nie są wykorzystywane.
Wobec powyższego rozwiązanie to należy traktować jako przestarzałe.
Aby łatwo wstawić pustą linię, należy zastosować drugi wariant składni (PD), a więc: ?@EOL, jak w przykładzie 3:
Przykład 3: (poprawne i zalecane wstawienie pustej linii pomiędzy kontrolki parametrów ??Akronim i ??SprawdzajDaty).
@PAR ?@s20|Akronim|&Akronim:@? PAR@
@PAR ?@EOL PAR@
@PAR ?@X|SprawdzajDaty|&Sprawdzaj daty:1@? PAR@
Powtarzanie parametrów w tekście
Jeśli w tekście mamy kilka wystąpień parametru o takiej samej nazwie – wszystkie one generują jeden, wspólny parametr (wiązanie po nazwie), którego wartość za każdym razem jest wstawiana we wszystkie miejsca definicji tego parametru. Wartość domyślna parametru jest zczytywana z pierwszego wystąpienia.
Wobec powyższego powtarzanie pełnej definicji parametru w tekście jest zbyteczne. Aby uprościć wstawianie w kilku miejscach tego samego parametru została zaimplementowana składnia tzw. odwołań skróconych.
Zagnieżdżanie parametrów
Typy parametrów
Każdy parametr ma określony typ. O typie decyduje człon: Picture, definicji parametru. W zależności od typu dla parametru, kreowana jest jedna lub więcej kontrolek, których ustawienia są standardowe (generyczne). Ustawienia te można zmienić, używając odpowiednich opcji w deklaracji parametru (poza obrębem jego definicji).
Typ stringowy S (typ standardowy CW)
Składnia
?@[H]S… – gdzie: …, oznacza odpowiedni fragment każdego clarionowego członu: Picture, odpowiedniego typu.
Kontrolki
PROMPT + ENTRY
Atrybuty standardowe:
- dla kontrolki ENTRY: OVR, LEFT.
- dla kontrolki ENTRY: brak.
Rozwinięcie
Wartość otoczona apostrofami (lub nieotoczona apostrofami, jeśli użyto modyfikatora _NQ).
Typ numeryczny N (typ standardowy CW)
Składnia
?@[H]N… – gdzie: …, oznacza odpowiedni fragment każdego clarionowego członu: Picture, odpowiedniego typu.
Kontrolki
PROMPT + SPIN
Atrybuty standardowe dla kontrolki SPIN:
INS, RIGHT, STEP=1, RANGELOW = (9999999999999|0), RANGEHIGH=9999999999999.
Akcje standardowe kontrolki SPIN: brak.
Rozwinięcie
Wartość (dodatkowo otoczona apostrofami, jeśli użyto modyfikatora _Q).
Typ datownikowy D (typ standardowy CW)
Składnia
?@[H]D… – gdzie: …, oznacza odpowiedni fragment każdego clarionowego członu: Picture, odpowiedniego typu.
Kontrolki
PROMPT + SPIN
Atrybuty standardowe dla kontrolki SPIN:
INS, RIGHT, STEP=1, RANGELOW=Date(1,1,1900), RANGEHIGH= Date(1,1,2100).
Akcje standardowe kontrolki SPIN:
- Prawy klawisz myszy – wywołanie kalendarza pozwalającego wybrać datę.
Rozwinięcie
W zależności od kontekstu:
- wynik funkcji modyfikatora (np. Long2YMD), jeśli w odwołaniu skróconym użyto modyfikatora (np. _YMD_) albo
- wartość LONG clarionowej daty (dodatkowo otoczona apostrofami jeśli użyto modyfikatora _Q), jeśli wstawiony zostanie parametr do dowolnego tekstu w CDN XL albo do filtra TPS z KF lub parametrów wydruku RW w Optimie, albo
- wynik funkcji Long2DateTimeSQL (lub Long2DateTimeSQLQ jeśli użyto modyfikatora _Q) w pozostałych przypadkach.
Typ czasowy T (typ standardowy CW)
Składnia
?@[H]T… – gdzie: …, oznacza odpowiedni fragment każdego clarionowego członu: Picture, odpowiedniego typu.
Kontrolki
PROMPT + SPIN
Atrybuty standardowe dla kontrolki SPIN:
INS, RIGHT, STEP= 60*100(1 min.), RANGELOW=1 (północ), RANGEHIGH=24*3600 (północ).
Akcje standardowe kontrolki SPIN:
brak.
Rozwinięcie
W zależności od kontekstu:
- wynik funkcji modyfikatora (np. Long2HMS) jeśli w odwołaniu skróconym użyto modyfikatora (np. _HMS_), albo
- wartość LONG clarionowego czasu (dodatkowo otoczona apostrofami jeśli użyto modyfikatora_Q)
jeśli wstawiamy parametr do dowolnego tekstu w XL-u albo do filtra TPS z KF lub parametrów wydruku RW w Optimie, albo
- wynik funkcji LongT2DateTimeSQL (lub LongT2DateTimeSQLQ jeśli użyto modyfikatora _Q) w pozostałych przypadkach.
Typ dataczasowy DT (typ dodatkowy)
Składnia
?@[H]DT
Wartość początkowa
Może być podana w postaci YYYY-MM-DD HH:MM:SS lub YYYYMMDDHHMMSS (bez separatorów i spacji). Można też użyć wyrażenia zawierającego zabindowane funkcje; najczęściej używanym w tym kontekście funkcjami są:
- Now()
Zwraca bieżącą datę i czas w postaci YYYY-MM-DD HH:MM:SS
- DT(_Year, _Month, _Day, _Hour, _Minutes, _Seconds) Zwraca podaną parametrami datę i czas w postaci YYYY-MM-DD HH:MM:SS
- DT(_DateExpr, _IgnoredValue, _IgnoredValue, _Hour, _Minutes, _Seconds)
Przypadek zachodzący, gdy długość przekazanego jako pierwszy parametr ciągu znaków przekracza 4. Zwraca podaną parametrami datę i czas w postaci YYYY-MM-DD HH:MM:SS z tym, że data jest obliczana z wyrażenia: _DateExpr a dwa następne parametry są ignorowane.
Przykłady
Ustalony moment: @PAR ?@DT|dt1|Termin &ostateczny:2003-03-25 16:30:00 @? PAR@ lub
@PAR ?@DT|dt1|Termin &ostateczny:20030325163000 @?
Bieżący moment: @PAR ?@DT|dt2|&Teraz:{Now()} @? PAR@
Ustalony moment: @PAR ?@ DT|dt3|t&3:2003-03-20 18:00:00@? PAR@
Początek m-ca o 7.15: @PAR ?@DT|dtm1|&Pocz.mc.7.15:{DT({DateClwFirstDay(‘M’)}, 0, 0, 7, 15, 0)} @? PAR@
Koniec m-ca o 16.30: @PAR ?@DT|dtm2|&Kon.mc.16.30:{DT({DateClwLastDay(‘M’)}, 0, 0, 16, 30, 0)} @? PAR@
Początek roku, północ: @PAR ?@DT|dty1|&Początek roku:{DT({DateClwFirstDay(‘Y’)}, 0, 0, 0, 0, 0)} @? PAR@
Koniec roku, północ: @PAR ?@DT|dty2|&Koniec roku:{DT({DateClwLastDay(‘Y’)}, 0, 0, 0, 0, 0)} @? PAR@
15. nast. m-ca o 13.45: @PAR ?@DT|dtx|&15. nast. m-ca o 13.45:{DT({Date(Month(Today())+1, 15,
Year(Today()))}, 0, 0, 13, 45, 0)} @? PAR@
Aby walidować parametry typu DT – należy używać modyfikatorów _Q:
Ustalony moment z walidacją:
@PAR ?@DT|dt4|t&4:2003-03-22 10:00:00@? @COND(??_Qdt4 >= ??_Qdt3) @CONDMSG(dataczas ”Do” nie może być mniejsza niż dataczas ”Od”) PAR@
Rozwinięcia:
…WHERE CRK_TerminOd <= ??dt1 … WHERE YMDHMS(CRK_TerminOd) <= ??_YMDHMS_dt1 …
Kontrolki
PROMPT + ENTRY
Atrybuty standardowe kontrolki ENTRY:
INS, LEFT, format @P####-##-## ##:##:##P (YYYY-MM-DD HH:MM:SS), INS, RIGHT.
Akcje standardowe kontrolki ENTRY:
- Prawy klawisz myszy – wywołanie kalendarza pozwalającego wybrać datę (czas pozostaje bez zmian).
Rozwinięcie
W zależności od kontekstu:
- wartość w formacie YYYY-MM-DD HH:MM:SS (dodatkowo otoczona apostrofami jeśli użyto modyfikatora _Q) jeśli w odwołaniu skróconym użyto modyfikatora (np. _YMDHMS_), albo
- wartość w formacie YYYY-MM-DD HH:MM:SS (dodatkowo otoczona apostrofami jeśli użyto modyfikatora_Q)
jeśli wstawiamy parametr do dowolnego tekstu w XL-u albo do filtra TPS z KF lub parametrów wydruku RW w CDN Optima, albo
- wynik funkcji YMDHMS2DateTimeSQL (lub YMDHMS2DateTimeSQLQ jeśli użyto modyfikatora _Q) w pozostałych przypadkach.
Typ logiczny X (typ dodatkowy)
Składnia
?@[H]X
Wartość początkowa
Jedna z wartości {0, 1}. Jeśli nie podano – zostanie podstawione 0.
Kontrolki
CHECK
Atrybuty standardowe kontrolki CHECK:
TRUEVALUE=1, FALSEVALUE=0.
Akcje standardowe kontrolki CHECK:
brak.
Rozwinięcie
Wybrana wartość TRUEVALUE lub FALSEVALUE.
Typ wyboru opcji O (typ dodatkowy)
Składnia
@O(RadioPrompt:RadioValue{[|rPrompt:rValue]…})
Wartość początkowa
Jedna z wartości: RadioValue – jeśli nie podano, żadne radio nie będzie podświetlone, chyba że któreś z nich ma przypisaną wartość zero lub pustą.
Kontrolki
OPTION{RADIO,…}
Atrybuty standardowe kontrolki OPTION:
BOXED.
Akcje standardowe kontrolki OPTION:
brak.
Rozwinięcie
Wartość wybranej opcji: rValue (dodatkowo otoczona apostrofami, jeśli użyto modyfikatora _Q).
Uwagi
Zaleca się używać list rozwijanych zamiast opcji; jest to podyktowane tym, iż kontrolka opcji zajmuje dużo miejsca na ekranie (w pionie tyle, co dwa inne parametry) i teksty radio są najczęściej obcinane z powodu braku miejsca. Customizować można tylko całą kontrolkę OPTION (zmiana właściwości kontrolek RADIO nie jest przewidywana).
Typ wyboru z listy rozwijanej R (typ dodatkowy)
Składnia
@R(Zapytanie) – gdzie Zapytanie musi być tak zbudowane, aby zwracało przynajmniej dwie kolumny. Te dwie pierwsze kolumny mogą być stringowe lub całkowite w układach Str-Int lub Int-Str; najczęściej zwracają one odpowiednio Id i Kod (albo Kod i Id) pobranych rekordów. W dropdownie wyświetlana jest kolumna stringowa, a jako wartość parametru wstawiana jest kolumna całkowita.
Zapytanie nie zawsze musi odwoływać się do jakiegokolwiek obiektu w bazie SQL; dropdowny można z powodzeniem wykorzystywać zamiast „ekranożernych” opcji, np.: @PAR ?@R(SELECT 1, ‘Radio1’ UNION SELECT 2, ‘Radio2’ UNION SELECT 3, ‘Radio3’)|DD|&DD:Radio2 @? PAR@
Wartość początkowa
Wartość jest postaci: Id|Kod.
Jeśli defaultowy Kod odpowiada istniejącemu w recordsecie rekordowi, wtedy zostanie pobrany odpowiedni Id.
Jeśli defaultowe Id odpowiada istniejącemu w recordsecie rekordowi, wtedy zostanie pobrany odpowiedni Kod.
Jeśli recordset zawiera choć jeden rekord, wtedy zostanie pobrany Kod i Id pierwszego rekordu.
Jeśli jako Kod zostanie podstawiona wartość: brak, wtedy jako Id – wartość pusta.
Kontrolki
PROMPT + DROPDOWN
Atrybuty standardowe kontrolki DROPDOWN:
DROP=5, VSCROLL, LEFT, FROM=kolejka wynikowa recordsetu Zapytania.
Akcje standardowe kontrolki DROPDOWN:
brak.
Rozwinięcie
Jeśli nie użyto modyfikatora – wstawiana jest wartość Id wybranej pozycji rValue (dodatkowo otoczona apostrofami, jeśli użyto modyfikatora _Q). Użycie modyfikatora _RES2_ powoduje wstawienie wartości pola Kod.
Typ wyboru z listy wywoływanej L – LOOKUP (typ dodatkowy)
Składnia
@L(s|n)…(Biblioteka.dll|CallLookupFunkcjaU[(ParametryCallLookupFunkcjaU)])
Typ odpowiada lookupowi do funkcji Funkcja z użyciem przesiadki CallLookupFunkcjaU z biblioteki Biblioteka.dll, która to przesiadka dostaje parametry określające typ akcji (‘INIT’|‘BUTTON’|’ENTRY’), ID (zwykłe ID, GID itp.) i kod (string określający obiekt w sposób jednoznaczny, najczęściej kod, akronim itp.) obiektu i na podstawie tych parametrów wywołuje funkcję wyświetlającą odpowiednią listę w trybie lookup a następnie zwraca wartości dotyczące wybranego przez użytkownika rekordu (szczegóły – analogicznie, jak w rozdziale Lookupy).
Wybór s|n decyduje jedynie o formie wyświetlania wartości parametru (ENTRY|SPIN).
Wartość początkowa
Jest postaci Id|Kod. Jeśli defaultowy Kod odpowiada istniejącemu w bazie rekordowi – zostanie pobrany odpowiedni Id, w przeciwnym razie zostanie wykonana próba pobrania rekordu o podanym Id. Jeśli rekord zostanie znaleziony – zostanie podstawiony odpowiedni Kod, jeśli nie – obiekt zasygnalizuje błąd (to przy inicjalizacji kontrolki parametru, natomiast przy akceptacji nieznalezionej wartości wywoła lookup).
Jeśli chcemy z aplikacji wysłać zmienną dynamiczną inicjalizującą wartość początkową parametru typu lookup to możemy, ale nie musimy użyć składni [Id]|[Kod] (z pipem). Podanie samego Id jest też poprawne (klasa wykresów w przypadku stwierdzenia braku pipe-a w wartości związanej z parametrem typu lookup doklei go na koniec wartości, a więc zainicjalizuje parametr wartością:’|Id’).
Opcjonalne parametry ParametryCallLookupFunkcjaU mogą zawierać odwołania do wartości innych parametrów dynamicznych; jest to jedyny obsługiwany przypadek zagnieżdżania parametrów (obsługiwany tylko w wyższej warstwie, tj. przez klasę operującą na kontrolkach). Składnia odwołania jest następująca:
?#[_Q]NazwaInnegoParametru#?.
Przykład: BZp_BRpID=?@Ls30_NQ(OP_KASAI.DLL|CALLLOOKUPBRPLISTA({_Q’BRA,’&?#_QRachunekID#?}))|RaportID|&Raport:0|@?.
Kontrolki
PROMPTBUTTON + (ENTRY|SPIN)
Atrybuty standardowe kontrolki ENTRY/SPIN:
takie, jak dla standardowego typu stringowego/numerycznego.
Akcje standardowe kontrolki PROMPTBUTTON:
- Lookup do funkcji lookupowej i podstawienie wartości (Id|Kod) wybranego rekordu
- Akcje standardowe kontrolki ENTRY/SPIN:
- Sprawdzenie poprawności Kod-u/Id; jeśli Kod /Id nie jest poprawny – lookup do funkcji lookupowej i podstawienie wartości (Id|Kod) wybranego rekordu
Rozwinięcie
Jeśli nie użyto modyfikatora – wstawiana jest bieżąca wartość: Id (dodatkowo otoczona apostrofami, jeśli użyto modyfikatora _Q). Użycie modyfikatora _RES2_ powoduje wstawienie wartości pola Kod.
Typ wyboru pliku lub katalogu F – FILE(DIR)DIALOG (typ dodatkowy)
Składnia
@Fs…(F[ile]|D[irectory]][,[O[pen]|S[ave]][,Maski][,MaskaDomyslna][,Flagi])
Typ odpowiada dialogowi systemowemu pozwalającemu wybrać plik lub katalog.
Kontrolki
PROMPTBUTTON + ENTRY – gdzie znaczenie opcjonalnych atrybutów jest następujące:
- Maski (istotne tylko dla wyboru pliku) składa się z ciągu oddzielonych pipami (|) par Opis typu (maska typu) | Maska typu. Ciąg ten musi być otoczony apostrofami. Jeśli nie podano – przyjmuje się ‘Wszystkie pliki (*.*)|*.*’
- MaskaDomyslna (istotne tylko dla wyboru pliku) odpowiada jednej z wymienionych w atrybucie Maski masek.Jeśli nie podano – przyjmuje się *.*
- Flagi określa tryb otwarcia dialogu, jest to suma bitowa następujących flag:
OFN_ALLOWMULTISELECT EQUATE(00000200h)
OFN_CREATEPROMPT EQUATE(00002000h)
OFN_ENABLEHOOK EQUATE(00000020h)
OFN_ENABLETEMPLATE EQUATE(00000040h)
OFN_ENABLETEMPLATEHANDLE EQUATE(00000080h)
OFN_EXPLORER EQUATE(00080000h)
OFN_EXTENSIONDIFFERENT EQUATE(00000400h)
OFN_FILEMUSTEXIST EQUATE(00001000h)
OFN_HIDEREADONLY EQUATE(00000004h)
OFN_LONGNAMES EQUATE(00200000h)
OFN_NOCHANGEDIR EQUATE(00000008h)
OFN_NODEREFERENCELINKS EQUATE(00100000h)
OFN_NOLONGNAMES EQUATE(00040000h)
OFN_NONETWORKBUTTON EQUATE(00020000h)
OFN_NOREADONLYRETURN EQUATE(00008000h)
OFN_NOTESTFILECREATE EQUATE(00010000h)
OFN_NOVALIDATE EQUATE(00000100h)
OFN_OVERWRITEPROMPT EQUATE(00000002h)
OFN_PATHMUSTEXIST EQUATE(00000800h)
OFN_SHOWHELP EQUATE(00000010h)
OFN_SHAREAWARE EQUATE(00004000h)
OFN_SHAREFALLTHROUGH EQUATE(2)
OFN_SHARENOWARN EQUATE(1)
OFN_SHAREWARN EQUATE(0)
Jeśli nie podano – przyjmuje się OFN_NOCHANGEDIR + OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST – dla otwierania pliku, OFN_NOCHANGEDIR + OFN_PATHMUSTEXIST – dla zapisu pliku i OFN_NOCHANGEDIR + OFN_PATHMUSTEXIST dla otwarcia katalogu.
Atrybuty standardowe kontrolki ENTRY:
jak dla standardowego typu stringowego.
Akcje standardowe kontrolki PROMPTBUTTON:
File Dialog lub Dir Dialog
Akcje standardowe kontrolki ENTRY:W trybie wyboru katalogu doklejanie backslash-a na końcu wartości, jeśli wartość kończy się innym znakiem.
Rozwinięcie
Wartość otoczona apostrofami (lub nieotoczona apostrofami, jeśli użyto modyfikatora _NQ).
Przykłady
@PAR ?@Fs255(File, Open, ‘Pliki tekstowe (*.txt)|*.txt|Wszystkie pliki (*.*)|*.*’, *.txt)|FileOpen|&File open:d:\app @? PAR@
@PAR ?@Fs255(, , ‘Pliki tekstowe (*.txt)|*.txt|Wszystkie pliki (*.*)|*.*’, *.txt)|FileOpen|&File open:d:\app@?
@PAR ?@Fs255(File,Save)|FileSave|&File save:d:\app @? PAR@
@PAR ?@Fs255(Dir)|Dir|&Dir:d:\app @? PAR@
Typ pusty EOL – wstawienie wolnego miejsca (typ dodatkowy)
Składnia
?@EOL
Parametr tego typu jest interpretowany tylko w procesie wyświetlania kontrolek parametrów dynamicznych. Jego deklaracja jest usuwana z tekstu, a używanie odwołań – niemożliwe (brak nazwy parametru).
Kontrolki
brak
Rozwinięcie
Usunięcie deklaracji z tekstu.
Typ tekstowy ABC – wstawienie zadanego tekstu na oknie (typ dodatkowy)
Składnia
?@ABC(‘Tekst do wyświetlenia’)
Parametr tego typu jest interpretowany tylko w procesie wyświetlania kontrolek parametrów dynamicznych. Jego deklaracja jest usuwana z tekstu, a używanie odwołań – niemożliwe (brak nazwy parametru).
W tekście należy używać zawsze pełnej deklaracji parametru (@PAR … PAR@), a nie samej definicji.
W zasadzie użycie apostrofów ograniczających jest konieczne tylko, gdy w tekście do wyświetlenia występują nawiasy (), {} lub inne zastrzeżone sekwencje specjalne. Jednak dla większego bezpieczeństwa zaleca się zawsze używać apostrofów ograniczających. Jeśli w wyświetlanym tekście mają być apostrofy – w deklaracji należy je zdublować.
Kontrolki
brak
Rozwinięcie
Usunięcie deklaracji z tekstu.
Uwagi
Jeśli parametr ma być przez całą szerokość panelu – należy umieścić go po lewej stronie, a po prawej stronie (jako sąsiadujący parametr) wstawić parametr EOL.
Przykłady
@PAR ?@ABC(‘To jest tylko taki testowy tekst żeby wypróbować nowy typ parametru dynamicznego (typ ”ABC”).’)@? PAR@
Odwołania do parametrów, rozwijanie parametrów
Rozwijanie parametrów, to wstawianie ich aktualnych wartości w miejsce odwołań do tych parametrów.
Istnieją dwa rodzaje odwołań do parametru:
- Definicja parametru – umieszczając w tekście kilka definicji tego samego parametru
Należy mieć na uwadze fakt, że pomimo tego, iż w tekście istnieje kilka wystąpień tego samego parametru (a więc parametru o takiej samej nazwie Nazwa), to i tak będzie wykreowana tylko jedna kontrolka, a jej ustawienia będą zgodne z pierwszym wystąpieniem parametru (jeśli to wystąpienie posiada znacznik ukrycia H – kontrolka parametru nie będzie w ogóle wykreowana). Ustawienia następnych wystąpień są ignorowane.
- Skrócone odwołanie do parametru – składnia skróconego odwołania do parametru:
??[(_Q|_NQ)][Modyfikator…]Nazwa (PD2)
przy czym Nazwa nie może zawierać spacji z Modyfikator. Modyfikator ustala niestandardowe rozwijanie parametru i może być równy jednemu z poniższych ciągów znaków:
_RES2_ (wymuszenie wstawiania ‘kodu’ zamiast ‘ID’ dla parametrów typu DROPDOWN i LOOKUP),
_YMD_ (wstawianie wartości datownikowego parametru w formacie YYYY-MM-DD)
_HMS_ (wstawianie wartości czasowego parametru w formacie HH:MM:SS)
_ YMDHMS_ (wstawianie wartości datowoczasowego parametru w formacie YYYY-MM-DD HH:MM:SS)
_ DQ_ (dublowanie apostrofów wewnątrz wartości).
Zalecanym odwołaniem jest odwołanie skrócone – jest ono prostsze w użyciu a zarazem daje większe możliwości (modyfikatory). Odwołanie pełne (poprzez definicję parametru) jest pozostawione jedynie dla kompatybilności wstecz. Zalecanym sposobem jest utworzenie w jednym miejscu deklaracji wszystkich parametrów, a następnie stosowanie w dowolnych miejscach tylko odwołań skróconych.
Jest to zdecydowanie bardziej ergonomiczny sposób: nie musimy wpisywać wiele razy ustawień parametru, które i tak (poza pierwszym) będą zignorowane. Ustawienia będą oczywiście pobrane z pierwszego wystąpienia parametru o nazwie Nazwa, zgodnego z pełną składnią (PD).
Ponadto tylko w odwołaniach skróconych można stosować modyfikatory. Ograniczeniem tego rozwiązania jest niedopuszczenie spacji w Nazwie parametru.
Ponieważ odwołanie skrócone nie posiada sekwencji zakończenia – jego koniec ustalany jest podobnie, jak w przypadku zwykłego parametru bez sekwencji zakończenia (tj. po Nazwie musi występować jeden ze znaków określonych w zbiorze automatycznej sekwencji zakończenia parametru) z tą różnicą, że terminatorem może być dodatkowo znak ‘{‘.
Deklaracje parametrów
Podana na początku składnia definicji parametru dynamicznego (PD) może zostać umieszczona wewnątrz tzw. deklaracji parametru. Składnia deklaracji parametru dynamicznego jest następująca:
@PAR Definicja Opcje PAR@ (PD-DEKL)
gdzie Definicja ¬oznacza definicję parametru, określoną wzorem (PD) natomiast Opcje – ciąg opcji określających dodatkowe własności kontrolki parametru, oddzielonych spacjami:
Opcje = @Opcja([WarunekLubWartosc]) [@Opcja([WarunekLubWartosc])…] (PD-DEKL-O)
gdzie Opcja – jedna z opcji określających dodatkowe własności kontrolki parametru, WarunekLubWartosc – wyrażenie określające warunek zastosowania Opcji (np. dla disablowania) lub wartość opcji (np. wartość tip-u). W tej chwili dostępne są następujące opcje:
Opcja = (D[ISABLE] | H[IDE] | U[PPER] | (RL|RANGE LOW) | (RH|RANGE HIGH) | S[TEP] | T[IP] | M[SG] | COND | CONDMSG) (PD-DEKL-O-O)
W WarunekLubWartosc mogą występować wyrażenia. Jeśli WarunekLubWartosc nie zostanie otoczony nawiasami {} – nawiasy te zostaną automatycznie dodane, co spowoduje ewaluację WarunekLubWartosc jako wyrażenia. W przypadku pominięcia WarunekLubWartosc – uznaje się, że dana opcja ma występować bezwarunkowo lub ma wartość pustą.
Jeżeli WarunekLubWartosc dotyczy opcji COND to jest on sprawdzany w oparciu o bieżące wartości wszystkich parametrów dynamicznych.
Warunek jest sprawdzany:
- przy akceptacji kontrolki danego parametru (jeśli walidacja nie powiedzie się – wyświetlany jest komunikat i przywracana jest poprzednia wartość akceptowanego parametru),
- przy akceptacji całego tekstu (np. przed wykonaniem wykresu, zastosowaniem filtra itp.). Jeśli walidacja nie powiedzie się – jest tylko wyświetlany komunikat – błędna wartość jest pozostawiana.
Jeśli mają zostać walidowane parametry typu DT – należy używać modyfikatorów _Q:
@PAR ?@DT|dt4|t&4:2003-03-22 10:00:00@? @COND(??_Qdt4 >= ??_Qdt3) @CONDMSG(dataczas ”Do” nie może być mniejsza niż dataczas ”Od”) PAR@
Dla ułatwienia posługiwania się opcjami @M[SG] i @T[IP] wprowadzono następujący element składni:
@M[SG](=T[IP]) – przepisanie tip-u do message’a
@T[IP](=M[SG]) – przepisanie message’a do tip-u
Nie ma tu znaczenia kolejność występowania tych opcji.
Użycie deklaracji parametrów pozwala na:
- ustalenie kolejności kontrolek parametrów innej niż kolejność definicji w tekście (bez deklaracji),
- określenie dodatkowych opcji dotyczących kontrolek parametrów (takich, które nie mogą być podane w definicji, np. warunki disablowania i hidowania kontrolek, case,…),
- walidację wartości parametrów (z odpowiednimi komunikatami),
- logiczne zgrupowanie parametrów w jednym miejscu tekstu (np. na początku).
Istotną różnicą pomiędzy deklaracją parametru a jego definicją jest to, że deklaracje parametrów są w całości usuwane z tekstu przed jego wykonaniem.
Jeśli dany parametr ma gdziekolwiek w tekście deklarację – zostanie ona użyta do określenia własności parametru, nawet jeśli przed deklaracją występuje pełna definicja parametru.
W poniższym przykładzie Akronim jest zawsze UPPER a ponadto jest disablowany za każdym razem gdy Numer > 10. Z kolei Numer to spin o zakresie (–100; 100) i skoku 2, disablowany w przypadku gdy Akronim = ‘D’. Wreszcie spin Hide jest ukrywany, jeśli Numer=30. Parametr DataDo musi mieć wartość nie mniejszą od wartości parametru DataOd a przynajmniej jeden z checków FA, PA musi być zaznaczony.
@PAR ?@S20|Akronim|&Akronim:ALA@? @U(), @D(??Numer > 10) @MSG(Akronim kontrahenta) @TIP(=MSG) PAR@
@PAR ?@N-15.2|Numer|&Numer:20.0@? @RL(-100) @RH(100) @S(2) @D(??Akronim = ‘D’) PAR@
@PAR ?@N-15.2|Hide|&Hide:1.0@? @H(??Numer = 30) PAR@
@PAR ?@N-3|Do|&Do:10@? @RL(??Od) @RH(??Od + 10) PAR@
@PAR ?@D17|DataDo|&Do:{Today()+1}@? @COND(??DataDo >= ??DataOd) @CONDMSG(Data Do nie może być wcześniejsza niż data Od) PAR@
@PAR ?@X|PA|&Paragony:1@? @COND(??FA + ??PA > 0) @CONDMSG(Przynajmniej jeden typ dokumentu musi być zaznaczony) PAR@