Pisma LOOP
Pisma:LOOP
Funkcja wykonuje pętlę, parParametry - argumenty pętli, parEvaluate - wyrażnie wykonywane i doklejane do wyniku dla każdej iteracji pętli, parIterator - iterator, jaki chcemy mieć w wyrażeniu evaluate.
- parParametry
- może zawierać albo paramString z parametrami OD i DO, np. OD=1|DO=10
- alternatywnie zawiera listę elementów, np. 1|3|50|23|4|x|43|z
- parEvaluate
- dowolne wyrażenie do evaluowania, np. 'CLIP(AdresKth(I,1))&''<13,10>'''
- zabindowana zmienna I pozwala wstawiać w wyrażenie aktualną wartość iteratora pętli
- parIterator
- poprawny pod kątem nazw identyfikatorów zmiennych ciąg znaków (musi zaczynać się od litery i zawierać tylko litery, cyfry, znak podkreślenia lub dwukropek), np. 'I'
W pismach BIND('LOOP')
Pisma:GetRecord
QGloZ_GetRecord na użytek pism, pozwala pobrać dowolny rekord z dowolnej tabeli pod warunkiem, że tabela ma klucz unikalny podstawowy wg ID i znamy ID.
W pismach BIND('T:GetRecord')
Funkcja zwraca 0 gdy nie udało się pobrać rekordu lub 1 jeżeli udało się !!!
Pisma:GatherRecords
KSTableList.GatherRecords na użytek pism.
Parametry: IDT, EVAL, FILTER
- zwraca fromString złożony z EVALi wykonanych na rekordach tabeli IDT filtrowanych filtrem FILTER
- w pismach BIND('T:GatherRecords')
- przykład: T:GatherRecords(2,'KTH:ID_KTH','') zwróci listę id wszystkich KTH w stylu 1|2|3|...|100 pod warunkiem, że lista zmieści się w zmiennej 65535 znaków!!!
Pisma:GatherRanged
KSTableList.GatherRanged na użytek pism.
Parametry: IDT, KEY, KEYLOW, KEYHIGH, EVAL, FILTER
- analogicznie jak w przypadku Pisma:GatherRecords przy czym można określić zakres za pomocą klucza
- KEY - nazwa klucza, np. 'ZAS:wg_ob_kodu'
- KEYLOW - paramString, wartość początkowa pól klucza, np. 'ZAS:id_ob='&OB:id_ob
- KEYHIGH - paramString, wartość końcowa pól klucza, można powielić wyrażenie z KEYLOW
- w pismach BIND('T:GatherRanged')
- przykład: T:GatherRanged(4,'ZAS:wg_ob_kodu','ZAS:id_ob='&OB:id_ob,'ZAS:id_ob='&OB:id_ob,'ZAS:id_zas','') zwróci listę id zasobów należących do obiektu OB:id_ob
KSRef:Get
Link z AdaSys na użytek pism.
W pismach BIND('R:Get')
- pozwala na pobranie wartości dowolnego pola dowolnej tabeli z aktualnego bufora (zatem rekord musi być wcześniej pobrany z tabeli, np. za pomocą T:GetRecord)
- przykład: R:Get('ZAS:Kod') zwróci wartość pola ZAS:kod
KSRef:Set
Link z AdaSys na użytek pism.
W pismach BIND('R:Set')
- pozwala na ustawienie wartości dowolnego pola dowolnej tabeli w aktualnym buforze
- przykład: R:Set('ZAS:Kod','1001001') ustawi wartość pola ZAS:Kod na '1001001'
Przykładowy zestaw pism korzystający z wprowadzonych rozszerzeń:
Pismo 1 - wątek Obiekty:
-----------------------------------------------------------------------
#<kod_obie># - #<adresob>#
-----------------------------------------------------------------------
#[SET('Zasoby',T:GatherRanged(4,'ZAS:wg_ob_kodu','ZAS:id_ob='&OB:id_ob,'ZAS:id_ob='&OB:id_ob,'ZAS:id_zas',''))]#
#[LOOP(GET('Zasoby'),'PISMO(''CPI=2|IDT=4|ID=''&I)','I')]#
-----------------------------------------------------------------------
Pismo 2 - wątek Zasoby:
#<kod_zaso># - #<powier># - #<adres>#
Wyjaśnienie:
Pismo 1 w wątku obiektów wykonywane jest dla każdego zaznaczonego obiektu. Wywołujemy je bezpośrednio z pism:
CZYNSZE - Wydruki - Pisma - wg Obiektów => wybieramy zakres i [Drukuj].
W pierwszej linii standardowe makra - kod obiektu i adres obiektu.
W następnej linii użyte zostały dwie funkcje:
- SET(nazwa zmiennej,wartość) do ustawienia zmiennej tymczasowej pisma
- T:GatherRanged(...) do zebrania identyfikatorów zasobów należących do aktualnego obiektu
W kolejnej linii użyte zostały kolejne trzy funkcje:
- LOOP(argumenty,wyrażenie) - jako argumenty wstawiamy pobraną wcześniej listę id zasobów - pętla wykona wyrażenie
dla każego elementu
- GET(nazwa zmiennej) do pobrania zapisanej wcześniej listy zasobów
- PISMO(...) do wywołania wybranego pisma w wątku zasobów. Pismo w wątku zasobów zawiera jedną linię
wypisującą kod zasobu, powierzchnię i adres. Na końcu pisma wstawiony znak przejścia do nowej linii, aby
pismo wywoływane w obiektach samoczynnie przechodziło do nowej linii po każdym wywołaniu.
Przykładowy efekt działania pisma 1:
-----------------------------------------------------------------------
1001 - DWORCOWA 6, 12-345 SULECHÓW
-----------------------------------------------------------------------
1001001 - 74,62 - DWORCOWA 6/1, 12-345 SULECHÓW
1001002 - 54,46 - DWORCOWA 6/2, 12-345 SULECHÓW
1001003 - 74,62 - DWORCOWA 6/3, 12-345 SULECHÓW
1001004 - 54,46 - DWORCOWA 6/4, 12-345 SULECHÓW
1001005 - 74,62 - DWORCOWA 6/5, 12-345 SULECHÓW
1001006 - 54,46 - DWORCOWA 6/6, 12-345 SULECHÓW
1001007 - 74,62 - DWORCOWA 6/7, 12-345 SULECHÓW
1001008 - 54,46 - DWORCOWA 6/8, 12-345 SULECHÓW
1001009 - 74,62 - DWORCOWA 6/9, 12-345 SULECHÓW
-----------------------------------------------------------------------
-----------------------------------------------------------------------
1002 - RÓWNOLEGŁA 1, 12-345 SULECHÓW
-----------------------------------------------------------------------
1002001 - 69,00 - RÓWNOLEGŁA 1/1, 12-345 SULECHÓW
1002002 - 65,80 - RÓWNOLEGŁA 1/2, 12-345 SULECHÓW
1002003 - 69,00 - RÓWNOLEGŁA 1/3, 12-345 SULECHÓW
1002004 - 65,80 - RÓWNOLEGŁA 1/4, 12-345 SULECHÓW
1002005 - 69,00 - RÓWNOLEGŁA 1/5, 12-345 SULECHÓW
1002006 - 65,80 - RÓWNOLEGŁA 1/6, 12-345 SULECHÓW
1002007 - 69,00 - RÓWNOLEGŁA 1/7, 12-345 SULECHÓW
1002008 - 65,80 - RÓWNOLEGŁA 1/8, 12-345 SULECHÓW
1002009 - 69,00 - RÓWNOLEGŁA 1/9, 12-345 SULECHÓW
1002010 - 65,80 - RÓWNOLEGŁA 1/10, 12-345 SULECHÓW
-----------------------------------------------------------------------
Inny przykład - dodajemy w piśmie 1:
#[SET('ZasobyPow',T:GatherRanged(4,'ZAS:wg_ob_kodu','ZAS:id_ob='&OB:id_ob,'ZAS:id_ob='&OB:id_ob,'ZAS:powierzchnia',''))]#
#[SET('ZasobySuma',0)]#
#[LOOP(GET('ZasobyPow'),'SET(''ZasobySuma'',GET(''ZasobySuma'')+I)','I')]#
Sumaryczna powierzchnia zasobów w obiekcie: #[GET('ZasobySuma')]#
Wyjaśnienie:
1. Gromadzimy powierzchnie wszystkich zasobów w obiekcie.
2. Ustawiamy zmienną sumującą na 0.
3. Wykonujemy pętlę po pobranych powierzchniach i sumujemy w zmiennej sumującej.
4. Wypisujemy wartość zgromadzonej sumy.
Inny przykład - zagnieżdżanie pętli:
#[LOOP('OD=1|DO=5','LOOP(''OD=1|DO=5'',''FORMAT(X*Y,@N3)'',''X'')&''
''','Y')]#
Powyższy przykład wygeneruje tabliczkę mnożenia od 1 do 5.
Pierwsza pętla wykonuje się od 1 do 5 i podstawia pod zmienną Y.
Wewnątrz wywoływana jest druga pętla również od 1 do 5 i podstawia pod zmienną X.
Wewnątrz wykonywane jest mnożenie X i Y i formatowane do 3 znaków.
Widać również sprytne wykonanie przejścia do nowej linii po każdym wierszu tabliczki mnożenia.
O czym należy pamiętać:
- aby przewidywana długość listy generowanej przez T:GatherRecords lub T:GatherRanged nie przekroczyła 65535 znaków,
- o zwielokrotnianiu apostrofów: bezpośrednio w makrze używamy pojedynczego apostrofu, ale jeżeli generujemy
ciąg znaków (czyli już mamy apostrof otwierający i zamykający) to wewnątrz używamy podwójnego apostrofu.
- jeżeli jakieś pole nie jest zabindowane, można skorzystać z R:Get
- pisma wywoływane nie powinny być typu RTF, pismo główne może być RTF
- o stosowaniu w miarę unikalnych nazw iteratorów w pętlach. Mechanizm co prawda zachowuje stan bindowania
i przywraca po wykonaniu całej pętli, jednak może dojść do nieprzewidzianych sytuacji.