Цикл по SQL таблице Назад В начало Вперед

Конструкция <цикл по SQL таблице> не используется в управляемых формах-прототипах, т.к. данные формы не работают с логическими таблицами.

<цикл по SQL таблице> ::=
.{ [<горизонтальный цикл>] [<цикл с отступом>]
		<шапка цикла> [group] by <поле таблицы> [; <имя цикла>]
		<тело цикла>
.}

Конструкция открывается и закрывается фигурной скобкой, имеющей префикс точку и стоящей в первой позиции строки. За открывающей скобкой следует признак горизонтального цикла (если Вы собираетесь выводить значения в одной строке), затем признак цикла с отступом (если необходим отступ) и <шапка цикла> (в шапке задается имя таблицы, по которой работает цикл). Затем следуют ключевое слово group (можно опустить), ключевое слово by, имя поля, по которому открыта данная таблица, и при необходимости имя цикла.

<шапка цикла> ::=
	<шапка главного цикла> | [<шапка вложенного цикла>]

Шапка вложенного цикла может опускаться в тех случаях, когда внутренний цикл организован по той же таблице, что и внешний.

<шапка главного цикла> ::= table "<имя таблицы> [:inherited]"

Шапка главного (внешнего) цикла начинается вспомогательным ключевым словом table. Часть шапки цикла, следующая за словом table, заключается в одинарные кавычки. В кавычках указывается имя таблицы, по которой организуется цикл, после которого может стоять ключевое слово inherited.

Слово inherited используется только в присоединенных формах в тех случаях, когда Вы не хотите проводить повторный проход по логической таблице. Перед ключевым словом inherited ставится двоеточие.

<шапка вложенного цикла> ::= "<имя таблицы> [:inherited]"

Шапка вложенного цикла отличается от шапки главного (внешнего) цикла тем, что в ней отсутствует ключевое слово table.

<Поле таблицы> - имя поля, по которому открыта данная таблица.

<имя цикла> ::= <идентификатор>

Цикл может иметь имя, расположенное после имени поля, по которому открыта данная таблица. Перед именем цикла ставится точка с запятой.

Имя цикла используется при создании агрегатных полей.

<тело цикла> ::=
		[<заголовок>]
		<тело>
		[<подножие>]

Тело цикла состоит из конструкции <тело> и не обязательных заголовка и подножия.

Заголовок и подножие цикла, если они заданы, печатаются на каждой странице отчета в пределах действия цикла. Правила оформления заголовков и подножий цикла совпадают с правилами для заголовков и подножий формы.

В теле цикла используется та же конструкция <тело>, что и в соответствующей форме.

Для выхода из цикла до момента его нормального завершения в конструкции <программный блок> тела цикла можно вызвать метод формы fBreak.

Для выхода из текущей итерации цикла до момента ее нормального завершения и перехода к следующей итерации в конструкции <программный блок> тела цикла можно вызвать метод формы fContinue.

Тело цикла исполняется столько раз, сколько записей в поле, по которому открыта таблица. Для каждой итерации цикла создается новая строка отчета.

Пример 1

Пример содержит описание логической таблицы, цикл по этой таблице, условный внутренний блок с фильтром.

.form "base1"
.ard
.var
  vids:string
  t:string
.endvar
.create view t1 as select
basedoc.*,klval.*,katorg.*
where ((
  basedoc.cval==klval.nrec and
  basedoc.corg==katorg.nrec
))
;
.fields
  basedoc.nodoc
  basedoc.name:"p:l"
  basedoc.summa:"p:r"
  klval.simvolv
  katorg.name
  vids
  t
.endfields
.begin
  datetostr(t1.basedoc.dform,"");
end.

				список документов оснований
номер	 наименование	сумма	 валюта	контрагент

.{table "t1" by basedoc.nrec;
&&&&&&&   @@@@@@@@@@@	 &&&&&  @@@@@@	 @@@@@@@@@@@
.begin
  vids:="счет";
  if basedoc.viddoc=201 then vids:="счет - фактура";
  if basedoc.viddoc=501 then vids:="заявка";
  t:=datetostr(basedoc.dform,"");
end.
  вид документа: ^
.{?internal;t<>"";
  дата формирования:^
.}
----------------------------------
.}
.endform

Пример 2

Пример содержит описание логической таблицы и вложенные циклы по этой таблице.

.form "base2"
.ard
.var
  vids:string
  t:string
  z1:longint
  z2:longint
  z3:longint
.endvar
.create view t1 as select
basedoc.*,stepdoc.*,spstep.*,katmc.*,katusl.*,katotped.*,
klval.*
where ((
  basedoc.nrec  == stepdoc.cbasedoc	 and
  stepdoc.nrec  == spstep.cstepdoc	and
  spstep.cmcusl == katmc.nrec		 and
  spstep.cmcusl == katusl.nrec		and
  spstep.cotped == katotped.nrec				and
  spstep.cval == klval.nrec
))
;
.fields
  basedoc.nodoc
  if(spstep.prmc=1,katmc.name,katusl.name):"p:l"
  spstep.kol:"p:r"
  katotped.name:"p:l"
  klval.simvolv:"p:r"
  spstep.price
  spstep.summa
  z1
  z2:"p:r"
  z3
.endfields

			 спецификация документов - оснований
наименование  колич. ед.измер.  вал	цена	 сумма
товара-услуги
.{table 't1' by basedoc.nrec;
	номер документа-основания -  &&&&&&&
.{ by spstep.nrec;
.begin
  if spstep.cval=0 then
	z1:=z1+spstep.summa;
  if spstep.cval=2 then
	z2:=z2+spstep.summa;
  if spstep.cval=3 then
	z3:=z3+spstep.summa;
end.
@@@@@@@@	&&&&&& @@@@@@@@@ &&&&&& &&&&&&&& &&&&&&&&&&&&
@@@@@@@@
@@@@@@@@
.}
--------------------------------------------------------------
.}
  всего:
	российских рублей  - &&&&&&&&&
	долларов  сша	- &&&&&&&&&
	марок фрг		- &&&&&&&&&
.endform

Пример 3

.form "filt"
.ard
.create view t1 as select
basedoc.*
;
.fields
  basedoc.nodoc
  basedoc.viddoc
.endfields
пример фильтра
-------------------------
.begin
  filt.dofilter("t1","my");
end.
.{table "t1" by basedoc.nrec;
	^  ^
.}
.endform