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.