Цикл по 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