Глава 2. Принципы построения задачи

Сценарий (или задача) на zCode имеет два основных представления: видеоформы и отчеты.
Первые, как правило, содержатся в каталоге PANEL и имеют расширение *.PAN. Вторые - в каталоге BLANK и имеют расширение *.BLK. Данные виды файлов при загрузке программой Z.EXE интерпретируются и реализуются по разному.
Но, кроме того, сценарии видеоформ могут интерпретироваться как отчеты при помощи функции REPORT(), а сценарии отчетов - как видеоформы с помощью функции VIDEO(). При этом одни команды интерпретируются по другому, а другие (не используемые для данного вида сценария) игнорируются.

2.1. Структура задачи

Задача в общем случае включает следующие разделы:

В скобках указаны используемые операторы описания.

В любом месте задачи можно поместить произвольные операторы и их последовательности, которые будут выполняться по мере их сканирования интерпретатором.
Ни один из перечисленных разделов не является обязательным; порядок следования разделов может быть другим.

(Использование баз данных, индексных файлов, кодовых таблицы и фреймов описано в следующих главах.)

Директива #include позволяет включить в тело программы текст из другого файла (по умолчанию - из того же каталога и с таким же расширением, что и у текущей программы). Формат ее следующий:

#include < симв_выр>

где симв_выр - символьное выражение или константа, задающая имя включаемого файла.

Пример:  #include <"vi_doc">

В программах на zCode для введения пояснений используются комментарии.
Комментарий - это последовательность символов, ограниченная разделителями /* и */ и игнорируемая интерпретатором zCode. Комментарий может занимать часть строки, одну и несколько строк, и может быть вложенным в другой комментарий, например:
   /* Это пример многострочного
      комментария  /* вложенный коментарий*/
      .......
   */

2.2. Переменные и массивы

Задача может оперировать с большим числом программных переменных и массивов, причем они должны быть описаны явно перед их первым применением. (Количество используемых переменных ограничено только возможностью оперативной памяти).
Идентификатор переменной или массива представляет собой последовательность букв (латинских или русских) и цифр, начинающуюся с буквы. Символ "_" (подчеркивание) рассматривается как буква. Длина идентификатора - до 40 знаков. Прописные и строчные буквы различаются.

2.2.1. Программные переменные

Переменные относиться к одному из трех типов данных: числовому, символьному и датовскому (см. п.1.4).
В настоящей версии в качестве логических (LOG) переменных можно использовать только глобальные переменные (см. п.2.2.3).

Описание начинается с ключевого слова (NUM, CHAR или DATE), после которого через запятую перечисляются переменные. Описание завершается точкой с запятой ';'.

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

При попытке разместить в символьной переменной строки большей длины, чем объявлено в описании, информация усекается до объявленного размера без выдачи диагностического сообщения. Если разместим в символьной переменной строку меньшей длины, то строка закончится завершающем нулем ('\0').

Примеры описания переменных:
 NUM Level, Curs, Цена, Сумма ;

 CHAR Name:20, Тип:4, Str_1 ;
   /* Символьные переменные Name и Тип имеют размер соответственно
      20 и 4 байта, а переменная Str_1 - 80 байт */

 DATE  D_beg, D_end, Дата1, Дата2 ;

2.2.2. Массивы

Массивы описываются тем же способом, что и простые переменные. Число элементов массива задается константой или выражением, которое заключается в квадратные скобки [ ].
Для символьных и датовских переменных резервируется ровно столько элементов, сколько объявлено в описании. Нумерация элементов массива начинается с единицы.
Для числовых переменных резервируется число элементов на единицу больше объявленного размера. Нумерация элементов числового массива начинается с нуля. Дополнительный (нулевой) элемент используется, обычно, для накопления некодовых значений.
  Пример:
  -------
   NUM  Sum_nal [100], Сумма_Дт [ Codemax( chtab) ] ;
   CHAR Names:10 [20] ;

В этом примере массив числовых переменных Sum_nal имеет 101 элемент (от 0 до 100), а массив Сумма_Дт имеет число элементов, на единицу больше числа элементов кодовой таблицы chtab.dic. Массив символьных элементов Names имеет 20 элементов длиной по 10 байт каждый.

Описания простых переменных могут чередоваться с описанием массивов внутри одного описателя, например:
   NUM  Сумма, Sum_nal [100], Цена ;

Суммарная длина внутреннего представления переменных каждого описателя не должна превышать 64000 байт. Поэтому невозможно зарезервировать числовой массив размером 8000 элементов ( 8000 элементов * 8 байт на элемент = 64000 байт).
Невозможно также зарезервировать одним оператором два массива по 4000 элементов каждый, но можно это сделать двумя операторами, например:
   NUM  Array_1 [4000] ;
   NUM  Array_2 [4000] ;

2.2.3. Глобальные переменные

В программах можно использовать без предварительного описания глобальные переменные. Имена глобальных переменных начинаются символом '@'.

При входе в систему все они автоматически обнуляются (очищаются) , однако сохраняют свои значения при переходах от одного фрейма к другому, при смене задачи, при переходе к генерации отчета.
Глобальные переменные (кроме логических) можно инициализировать нужными значениями внутри файла конфигурации (Z.CFG).

Глобальные переменные типа NUM обозначены символами: @0 - @255 (их число равно 256).

Глобальные переменные типа DATE обозначены символами @D0 - @D19 (их число равно 20).

Глобальные переменные типа CHAR обозначены символами @S0 - @S19 (их число равно 20). Они представляют собой строки длиной 80 байт, что соответствует ширине экрана.

Глобальные переменные типа LOG обозначены символами @L0 - @L19 (их число равно 20). Они представляют собой однобайтовые злементы, которые могут принимать значение .TRUE. (.T.) или .FALSE. (.F.), что соответствует во внутреннем представлении 1 и 0.

Глобальные индексные переменные @I и @J - переменные целого типа, которые могут принимать значения в интервале от -32000 до +32000.
Эти переменные используются в качестве индекса для доступа к массивам, кодовым таблицам и специальным полям базы данных (с этой целью можно использовать также программные или глобальные переменные или выражения числового типа).
Переменная @J по умолчанию используется оператором CYCLE в качестве переменной цикла.

Над глобальными переменными можно производить те же операции, что и над программными переменными.
Они могут быть использованы для обмена данными между программами. Значения этих переменных могут быть заданы и изменены "вручную" путем редактирования (если соответствующая переменная выведена на экран) либо программно оператором '=>' (и '+>' -для числовых и индексных переменных).
Логическим переменным можно присваивать значения .TRUE. (.T.) или .FALSE. (.F.), а при редактировании - значения 1 и 0.

2.3. Описание процедур

Используемые в сценарии процедуры (функции) должны быть описаны до их применения. Описание функции аналогично описанию процедуры, но она возвращают значение, которое можно использовать в выражениях соответствующего типа.

Описание процедуры /функции имеет следующий вид:

PROC имя_проц ([опис_пар-ров]) тело_проц

где имя_проц - идентификатор процедуры (функции) ;
опис_пар-ров - список параметров вида: тип1 пар-р1, тип2 пар-р2,... ;
тело_проц - простой или составной оператор, выполняемый при вызове процедуры. Для функции последним должно быть задано выражение, возвращающее значение.
Примеры
-------
Proc Script_( CHAR Vd_, NUM Nm )
 {
 Vd_ = 'Р' .OR. Vd_ = 'П' ? "" :
 Vd_ = 'К' ? {Go (client, Nm) ;
	"МФО " + client->Mfob + "   PC " + client->Countb ;
 } :
 Vd_ = 'С' ? "" :
 Vd_ = ' ' ? doc->Script [11] :
            "????" ;
 }

Proc MIN( NUM A, NUM B) A < B ? A : B ;

/* пример вызова */
MIN(Sum_old + Doc->SumDoc - Nal_sum, Sum_out) => Dks->Sum;