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.