Комплексные программные решения для финансового рынка

Функциональная и платформенная масштабируемость, специальные отчеты... Преимущества подробнее  

Язык бизнес-правил

www.fansy-service.ru
Главная > Технология > Язык бизнес-правил


Язык бизнес-правил

Введение

Системный язык обработки данных Fansy-Script предназначен для спецификации бизнес-правил работы приложений. Основной набор функций приложения поставляется в базе Мета Данных. Ядро приложения компилирует код метаязыка и предоставляет средства его динамической отладки. Помимо стандартных операторов (присущих, например, языку Паскаль) язык имеет функции для манипулирования данными и управления транзакциями, функции доступа к метаданным, средства обработки исключительных ситуаций, средства анализа и порождения XML-объектов, средства доступа к API MS Office, средства доступа к протоколам POP3 и SNTP, а также возможность работы с объектами (классами) приложения. Язык ядра системы предназначен для функционального программирования. Каждая функция состоит из заголовка и тела.

1 Синтаксис заголовка функции

Заголовок представляет собой идентификатор функции за которым следует список входных и выходных параметров, с возможным указанием их типов. Идентификаторы входных параметров начинаются с символа %. Для всех функции, кроме встроенных, существует следующее ограничение: сначала следует список входных параметров, затем список выходных. Если тип параметра опущен, то его тип определится при задании ему значения.

Пример:

MyFunction (%str:String,ix:integer)

2 Синтаксис тела функции

Выражения - это конструкции, определяющие правила вычисления новых значений. Выражения состоят из операндов и операций. Скобки используются для изменения порядка выполнения операций в выражениях. При вычислении выражения аргументы операций всегда преобразуются к типу, диктуемому операцией или левым аргументом операции, поэтому явные преобразования типов не обязательны. Операция "+" для строк работает как конкатенация. Значение 1 в выражении типа Boolean, трактуется как True, 0 - как False.

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

Пример:

//Get_USD_ID(USD_ID:int) - извлечение иналитического кода валюты USD 
if IsNull(USD_ID) or (USD_ID=0) then   
   USD_ID:=Extract1('Данные', 'select ID from OD_VALUES where SYSNAME="USD" and 'V_TYPE=1') 
end;

3 Лексика

В словарь языка входят: идентификаторы, числа, строки и разделители. Они называются лексическими символами, или лексемами и в действительности состоят из последовательности знаков. Пробелы внутри лексем не допускаются, за исключением строк. Многократные пробелы, символы перевода строк, знаки табуляции и форматирования рассматриваются как один разделитель. Лексемы должны строится в соответствии со следующими правилами:

  1. Идентификаторы - последовательность букв, символов "_" и цифр. Первый знак должен быть буквой. При написании идентификаторов регистр значения не имеет.
  2. Числа - целые или вещественные без знака. 
  3. Строки - это последовательности знаков, заключенные в кавычки. Для этой цели могут использоваться как двойные кавычки, так и апострофы. Однако, открывающие и закрывающие кавычки должны быть одинаковы, и они не должны встречаться внутри текста. Строки знаков не могут продолжаться на следующую строку, т.е. разбиваться символом конца строки. Максимальный размер строки 255 символов. Для склеивания строк язык имеет операцию конкатенации строк "+". 
    Примеры:
    	"glastnost"  "DON'T Worry"  'пароль '+#11+'"перестройка"' 	"Маша"+"Петя" 
  4. Операторы и разделители - это специальные знаки ('+','=','-','*','<','/','>', '&' ,'.','(',')','~','|'), пары знаков ('<>', '<=', '>=') или зарезервированные слова ('AND', 'MOD', 'DIV' ,'NOT', 'OR'). Эти зарезервированные слова нельзя употреблять в качестве идентификаторов. Символы & и AND - синонимы, также как ~(тильда) и NOT , ! и OR.
  5. Комментарии - это произвольный набор знаков, заключенный в специальные кавычки "{" и "}". Они могут быть внесены между любыми двумя лексемами в программе. Комментарии не могут быть вложенными.
    Для описания встроенных функций, введем типы возможных аргументов функций. Нетерминалы синтаксиса будут использоваться для указания синтаксиса аргументов функций.

4 Типы данных

Тип данных определяет набор значений, которые могут принимать переменные этого типа, и множество операций над ними. Каждая переменная может иметь значение NULL (неопределено).

* Integer -объекты этого типа рассматривается как целая величина со знаком из диапазона от -2'147'483'648 до 2'147'483'647;
* Boolean - объекты этого типа имеет всего два значения TRUE и FALSE. 
* String - объекты этого типа принимает значения строк кода ASCII. 
* Float - объекты этого типа принимают значения вещественных чисел диапазона от 1.7e-308 до 1.7e308.
* Date - объекты этого типа принимают значения даты.
* Time - объекты этого типа принимают значения времени.
* DateTime - объекты этого типа принимают значения даты и времени.
* List - список строк, или одномерный массив с индексами от 0.

5 Операнды

Операнды представляют собой константы, объекты и функции. Объект представляет собой либо переменную функции (см. Функцию DefineFunctionsEmbededProgram), либо параметр функции, либо публичное (терминалогия Delphi) свойство компонентов приложения, либо метод компонента.
Пример:

// Заголовок функции: FUNC(%in,out) 	
    FORM->FUNC(1) // вызов функции  	
    FORM.FUNC.out1 // обращение к значению выходного параметра 	
    FORM.Caption :='Новый заголовок формы' ; 

Для обеспечения доступа к компонентам множественных форм (и форм - клонов), вместо имени формы следует указывать идентификатор 'OWNER', являющийся синонимом для имени формы, которая предоставляет, выполняющуюся сейчас функцию. Это имя будет распространятся и на все вхождения идентификатора 'OWNER' в тела функций, вызываемых из данной. 
Для доступа к свойствам функции следует вместо имени функции указывать идентификатор 'SELF', который является синонимом для имени функции как компонента. У каждого компонента предопределено псевдо-свойство 'SELF' для доступа к значению ссылки на класс компонента. Выражение 'OWNER.SELF' трактуется как указатель на класс формы.
Для обращение к свойствам исключительной ситуации следует указывать идентификатор 'EXCEPTION', который виден только в EXCEPTION- части TRY- оператора. У этого объекта определены два свойства: TEXT- строка сообщения и NAME- класс исключения.
Методы работают как встроенные функции (возможно с побочным эффектом), возвращающие логический результат (Boolean), который сообщает, что действие выполнилось успешно. Компоненты форм могут быть использованы для хранения глобальных значений, время жизни которых совпадает со временем жизни формы. Таким образом невидимые компоненты форм представляют собой аналог глобальных переменных, а сами формы - аналог модулей в языках программирования. 


6 Операции

Синтаксис выражения определяет старшинство операций в соответствии с четырьмя классами операций. Операция NOT имеет высший приоритет, затем идут мультипликативные операции, далее аддитивные и, наконец, отношения. Последовательность операций одинакового приоритета выполняется слева направо. Чем больше скобок Вы напишете, тем меньше ошибок будет в Ваших программах.
Список используемых операций приведен ниже. В некоторых случаях различные операции обозначаются одинаковым символом, тогда действительная операция определяется типами операндов.
Логические выражения в языке всегда вычисляются полностью

6.1 Арифметические операции

+ сложение
- вычитание
* умножение
/ вещественное деление
DIV деление нацело
MOD остаток от деления нацело (число по модулю)
Эти операции применимы к операндам типов Integer и Float. Операции "+" и "-" могут быть унарными. Операция "+" может быть использована для конкатенации объектов типа String и для добавления целого числа к объекту типа Date или DateTime. Операция "-" может быть применима к объектам типа Date и для вычитания целого числа из объектов типа Date и DateTime.
Операции DIV и MOD над типом Integer определяются следующими правилами:
x DIV y - равно целой части от x/y
x MOD y - равно остатку от деления x DIV y
x = (x DIV y)*y + (x MOD y)
остаток от деления имеет знак первого операнда.
5 DIV -2 = 2 -5 DIV 2 = -2
5 MOD -2 = -1 -5 MOD 2 = -1

6.2 Логические операции

OR логическое или
AND логическое и
NOT отрицание
Эти операции применимы к операндам типа BOOLEAN и результат тоже имеет тип BOOLEAN.
p OR q - означает "если p, то TRUE иначе q"
p AND q - означает "если p, то q, иначе FALSE".

7 Отношения

Результатом вычисления отношений является тип BOOLEAN. Отношения упорядочивания применимы ко всем базовым типам (кроме LIST).

= равно
<> не равно
< меньше
<= меньше равно 
> больше
>= больше равно 

При работе с NULL- значениями используется специальная логика:

Левый аргумент

Левый аргумент

Значение =

Значение <>

NULL

NULL

TRUE

FALSE

Значение

NULL

FALSE

TRUE

NULL

Значение

FALSE

TRUE

8 Операторы

8.1 Декларация локальной функции

* function Expr do Body end - определяет локальную функцию с заголовком Expr и телом Body; всегда возвращает true.
Локальные функции допускают вложенность произвольной глубины. Правила видимости объектов аналогичны языку Pascal. В текущей реализации запрещены локальные рекурсивные функции.

8.2 Декларации локальной переменной

* var ident[':='Expr]{',' ident[':='Expr]} - определяет одну или более локальных переменную функции, присваивая им значение и тип; всегда возвращает true(аналог функции Define).

8.3 Оператор присваивания

* ident ':=' Expr - изменяет значение объекта, присваивая ему значение и тип; возвращает присваиваемое значение;

8.4 Оператор условия

* if Expr then Body {elsif Expr then Body} else Body end - реализует оператор ветвления в стиле языка Modula-2, возвращающий значение Body в зависимости от значения логических выражений Expr;

8.5 Операторы циклов

* while Expr do Body end - реализует цикл While в стиле языка Modula-2; всегда возвращает число итераций цикла;
* repeat Body until Expr - реализует цикл Repeat в стиле языка Pascal; всегда возвращает число итераций цикла; 
* loop Body end - реализует цикл Loop в стиле языка Modula-2; выход из цикла обеспечивает встроенная функция Exit; всегда возвращает число итераций цикла;
* for Expr select Expr [from expr{',' expr}] into expr{',' expr} do Body end - выполняет SQL-запрос (аргумент select-части) к базе данных (аргумент for-части), передавая запросу значения параметров (аргумент from-части) и означивая объекты (аргумент into-части) значениями полей запроса; порядок параметров совпадает с их определением в запросе. Функция реализует цикл по курсору запроса выполняя тело Body для каждой итерации; преждевременный выход из цикла обеспечивает встроенная функция Exit; всегда возвращает число итераций цикла; 

8.6 Операторы защиты 

* with Expr do Body end - открывает транзакцию в базе данных Expr, выполняет тело Body, закрывает транзакцию, если тело выполнилось нормально или откатывает ее, если при вычислении тела возникло исключение; всегда возвращает true; 
* try Body1 except Body2 end - реализует защищенное выполнение последовательности Body1, при этом тело Body2 будет вычислено как значение функции, только если при вычислении последовательности Body1 произошло исключение;

9 Встроенные функции 

9.1 Функции для работы с типами

* CurrencyStr( %curr : Float, %code : String): String - переводит значение денег в строку;
* Char(%value:Integer):String - переводит значение целого числа в код символа;
* Clear(%Expr: AnyType): AnyType - очищает значение (станет Null), сохраняя тип;
* Date(%Expr: AnyType): Date - преобразование к типу Date;
* DateTime(%Expr: AnyType): DateTime -преобразование к типу DateTime;
* DateStr(%Expr:DateTime): String -возвращает строку из формата DateTime (возвращает строку типа '25 декабря 1995 года');
* Float(%Expr: AnyType): Float -преобразование к формату с плавающей точкой;
* Format(%Format: string, %Arg: AnyType): string. Строка формата содержит 2 типа объектов - собственно символы и спецификаторыFunctionsEmbededFormat. Собственно символы копируются в результирующую строку, а спецификаторы преобразуют типизированное значение поля в соответствии с форматом. Спецификаторы имеют следующий вид: "%" ["-"] [width] ["." prec] type
* Int(%Expr: AnyType): Integer -преобразование к типу Integer;
* IsBoolean(%Expr: AnyType): Boolean - истинно, если аргумент - логический;
* IsDate(%Expr: AnyType): Boolean - истинно, если аргумент - дата;
* IsDateTime(%Expr: AnyType): Boolean - истинно, если аргумент - дата и время;
* IsInt(%Expr: AnyType): Boolean -истинно, если аргумент-целое;
* IsFloat(%Expr: AnyType): Boolean - истинно, если аргумент-число с плавающей точкой;
* IsList(%Expr: AnyType): Boolean -истинно, если аргумент-список;
* IsNull(%Expr: AnyType): Boolean - истинно, если аргумент не означен;
* IsStr(%Expr: AnyType): Boolean -истинно, если аргумент-строка
* IsTime(%Expr: AnyType): Boolean - истинно, если аргумент - время;
* Ord(%value:String):Int - переводит значение символа в его ASCII код;
* Str(%Expr: AnyType): String -приведение к виду строки;
* Time(%Expr: AnyType): Time -преобразование к типу Time;
* Type(%Expr: AnyType): String -возвращает тип данных аргумента.

9.2 Функции для работы со строками

* Copy(%Expr: String, %Index:Integer, %Count: Integer): String - реализует копию подстроки;
* CompareText(%Expr1, %Expr2: String): Integer - сравнивает текст двух строк, возвращает -1, 0 или 1;
* Delete(%Expr: String, %Index:Integer, %Count:Integer): String - реализует удаление подстроки.
* GetValue(%Name: string, %Str: String): String -дает value из строки типа: 'Name1=value name2=value2 ...'}, в которой разделители заданы из множества [#0,#9,#10,#13,' ',',',';'];
* IsBlank(%Expr: String): Boolean -истинно, если строка пустая или состоит из пробелов и/или табуляторов;
* Length(%Expr: String): Integer - вычислить длину строки;
* LowerCase(%Expr: String): String -возвращает строку в нижнем регистре;
* Pos(%Substr: String, %S: String): Integer - определяет позицию подстроки %Substr в строке %S, возвращает целое число (если не найдена, то 0);
* RightPos(%Substr: String, %S: String): Integer - определяет позицию последнего вхождения подстроки %Substr в строку %S (если не найдена, то 0);
* Trim(%Expr: String): String - возвращает строку без всех пробелов;
* TrimLeft(%Expr: string): String - удаляет все пробелы слева;
* TrimRight(%Expr: string): String - удаляет все пробелы справа;
* UpperCase(%Expr: String): String - возвращает строку в верхнем регистре.

9.3 Функции для работы с датой и временем

* Day(%Expr : TDateTime ): Integer - возвращает день;
* DayOfWeek(%Expr:Date):Integer- возвращает день недели (понедельник - 1, воскресенье -7);
* DaysInPeriod(%Date1, %Date2: TDateTime):Integer- возвращает число дней в периоде+1 (т.о. если %Date1= %Date2, то результат 1);
* DaysPerMonth(%Year, %Month: Integer):Integer- возвращает число дней в месяце;
* DecodeDate(%Expr:Date,y_variable,m_ variable,d_ variable:Integer):Boolean - распаковывает дату как три целых числа (год, месяц, день);
* DecodeTime(%Expr:Date,h_variable,m_variable,s_variable,ms_variable:Integer) :Boolean - распаковывыет дату как три целых числа (часы,минуты,секунды,миллисекунды);
* EncodeDate(%y_Expr, %m_Expr, %d_Expr:Integer):Date - упаковывает дату из трех целых чисел (год, месяц, день);
* EncodeTime(%h_Expr, %m_Expr, %s_Expr. %ms_Expr:Integer):Date - упаковывыет дату из трех целых чисел (часы,минуты,секунды,миллисекунды);
* Month(%Expr : TDateTime ): Integer - возвращает месяц;
* Now : Date - возвращает текущую дату и время;
* Year(%Expr : DateTime ): Integer- возвращает год.

9.4 Функции для работы со списками

* List(Expr: AnyType{,%Expr: AnyType}) :Boolean - создает список из Str(Expr), если параметров нет - то пустой список;
* ListAdd(object : List, %item:AnyType):Integer - добавляет элемент item в хвост списка object, возвращает индекс элемента;
* ListCount(%object : List):Integer - извлекает число элементов списка object;
* ListInd(%object : List, %item:AnyType):Integer - возвращает индекс элемента item;
* ListIns(%object : List, %i:Integer, %item:AnyType):Boolean - добавляет элемент item на i-ое списка object;
* ListPut(%object : List, %i:Integer, %item:AnyType):Boolean - заменяет i-ой элемент списка object на item;
* ListDel(%object : List, %i:Integer):Boolean - удаляет i-ый элемент из списка object;
* ListGet(%object : List, %i:Integer):String - извлекает i-ый элемент списка object.
* ListSet(%object : List, %name:String, %value:String):String - означивает name значением value из списка object типа: ('Name1=value1', ... 'Name2=value2');
* ListVal(%object : List, %name:String):String - дает value из списка object типа: ('Name1=value1', ... 'Name2=value2'), списковый аналог строковой функции GetValue;

9.5 Функции для программирования

9.5.1 Функции с побочными эффектами

* Abort :Boolean - прекращает работу функции ,без выдачи сообщения на экран (молчаливое исключение);
* BreakPoint :Boolean - вызывает принудительную точку останова функции при работе под отладчиком; всегда возвращает true;
* Assert(%Expr1: Boolean, %Expr2:String ) :Boolean - если Expr1=False, то прекращает работу функции, выдавая сообщение Expr2 на экран (Assert(a,b)If(NOT a,Raise(b),True)) ; всегда возвращает true;
* Define(Ident [,%Expr: AnyType] ) :Boolean - определяет локальную переменную функции, присваивая ей значение и тип параметра (второй параметр не обязателен) ; всегда возвращает true; (функциональный аналог оператора var);
* Dec(object:[Int,Float]) : AnyType - функция, которая уменьшает аргумент на 1 (меняет object); всегда возвращает результат изменения;
* Dummy : Boolean - функция, которая ничего не делает (заглушка) ; всегда возвращает true;
* Eval(%header:string, %body : (String|List){, %param_i:String}): AnyType - вычисляет функцию (заголовок- %header, тело - %body) с возможными агрументами (в теле функции видны объекты окруужающего контекста);
* Exit : Boolean - принудительное завершение любого цикла (While,Repeat,Select) ; всегда возвращает true;
* Inc(object:[Int,Float]) : AnyType - функция, которая увеличивает аргумент на 1 (меняет object); всегда возвращает результат изменения;
* iIf (%Expr:BOOLEAN,Then_Body:AnyType,Else_Body:AnyType):AnyType - реализует IF - оператор, возвращающий значение Then_Body или Else_Body в зависимости от значения логического выражения %Expr; (функциональный аналог оператора if);
* iRepeat(%Body:AnyType, Expr: Boolean) : Boolean - реализует цикл Repeat в стиле языка Pascal; всегда возвращает число итераций цикла; (функциональный аналог оператора repeat);
* iTry(Body:AnyType, Except_Body:AnyType):AnyType - реализует защищенное выполнение последовательности Body, при этом тело Except_body будет вычислено как значение функции, только если при вычислении последовательности Body произошло исключение; (функциональный аналог оператора try);
* iWhile( %Expr: Boolean, Body:AnyType ) :Boolean - реализует цикл While в стиле языка Pascal; всегда возвращает число итераций цикла; (функциональный аналог оператора while);
* Out(%Expr: String{, specificator:AnyType}):Boolean - вывод управляющей строки Expr с подставленными спецификаторами specificatorFunctionsEmbededOut в файл. Имя файла совпадает с именем функции или отчета; всегда возвращает true;
* Propagate - распространение текущей исключительной ситуации;
* PropSet(%class:Integer,%property:String,%value:AnyType):Bollean - означивает published свойство %property класса %class значением %value; всегда возвращает true;
* PropVal(%class:Integer,%property:String):%value:AnyType - извлекает значение published свойства %property класса %class;
* Raise(%Expr: String):Boolean - вызов исключительной ситуации, приводящий к прекращению работы функции с выдачей сообщения Expr на экран; всегда возвращает true;
* Return(%Expr:AnyType):AnyType - принудительное завершение функции;
* Round(%Expr:Float [, %prec:Integer]):(Float,Integer) - реализует округление вещественного числа, до %prec знаков после запятой или до целого, если %prec=0 или не задан;
* Set(object, %value:AnyType): Boolean - устанавливает заданном объекту заданное значение; всегда возвращает true; (функциональный аналог оператора ':=');
* TypeVal(%Expr:AnyType):String - возвращает выражение на языке Metalic, эквивалентное значению и типу %Expr, всегда выполняется тождество: для любого x Eval('Expr',TypeVal(x))=x

9.5.2 Функции обработки данных

* ExecProc(%name:String, %base:String{, %param: AnyType}) :Boolean - выполняет хранимую на сервере процедуру name базы данных base, передавая ей входные параметры и получая от нее выходные параметры; порядок параметров совпадает с определением функции в базе данных.
* ExecSQL(%base:String, %query : (String|List) {, %param: AnyType}) :Boolean - выполняет SQL-запрос query к базе данных base, передавая запросу значения параметров (если они есть); всегда возвращает true.
* Extract(%base:String, %query : (String|List) {, %param: AnyType}) : AnyType - выполняет SQL-select запрос query к базе данных base, передавая запросу значения параметров (если они есть); возвращает поле select - выражения (если оно единственно), либо список в виде: имя поля=значение поля (если поле не единственно), либо NULL, если нет записей либо, исключительную ситуацию, если более 1 записи.
* Extract1(%base:String, %query : (String|List) {, %param: AnyType}) : AnyType - выполняет SQL-select запрос query к базе данных base, передавая запросу значения параметров (если они есть); возвращает поле select - выражения (если оно единственно), либо список в виде: имя поля=значение поля (если поле не единственно), либо, исключительную ситуацию, если более 1 записи или нет записей.
* ExtractSQL(%base:String, %query : (String|List) {, %param: AnyType}{,%object: AnyType}) :Boolean - выполняет SQL-select запрос query к базе данных base, передавая запросу значения параметров (если они есть) и означивая объекты object значениями полей запроса; порядок параметров совпадает с их определением в запросе. Функция возвращает число записей (0 или 1) или либо исключительную ситуацию, если более 1 записи; если записей нет, то объекты запроса не меняют своих значений.
* Gen_ID(%base:String, %generator : String , %count: Integer}) :Integer - увеличивает генератор generator в базе данных base на величину count; возвращает значение генератора.
* MetaExecSQL(%selection:(String|Integer), %query : (String|List)) :Boolean - выполняет SQL-запрос query к базе данных выборки %selection, множество параметров запроса означивается из полей и параметров выборки %selection; всегда возвращает true.
* MetaExtract(%selection:(String|Integer), %query : (String|List), {, param: AnyType}) :Boolean - SQL-запрос query определяет множество параметров, значения которых ищутся в выборке selection, а присваиваются параметрам param; всегда возвращает true.
* MetaFind(%selection:(String|Integer), %field : String, %value:AnyType) :Boolean - поиск записи в SQL-запросе выборки selection по значению %value поля %field; всегда возвращает результат поиска.
* MetaRefresh(%base:String, %table : String) :Boolean - вызывает переоткрытие выборок, зависимых от таблице table в базе данных base; всегда возвращает результат true.
* Record(%base:String, %query : (String|List) {, %param: AnyType},%Expr: AnyType {,%Expr: AnyType}) :Boolean - выполняет SQL-запрос query к базе данных base, передавая запросу значения параметров (если они есть) и означивая поля запроса значениями выражений %Expr; порядок параметров и полей совпадает с их определением в запросе. Запрос должен содержать select-выражение на отбор ровно 1 записи данных; всегда возвращает true.
* SelectSQL(%base:String, %query : (String|List) {, %param: AnyType}{,%object: AnyType}, Body) :Boolean - выполняет SQL-select запрос query к базе данных base, передавая запросу значения параметров (если они есть) и означивая объекты object значениями полей запроса; порядок параметров совпадает с их определением в запросе. Функция реализует цикл по курсору запроса выполняя тело Body для каждой итерации; всегда возвращает число итераций цикла; (функциональный аналог оператора for); если записей нет, то объекты запроса не меняют своих значений.
* Transact(%base:String, Body) :Boolean - открывает транзакцию в базе данных base, выполняет тело Body, закрывает транзакцию, если тело выполнилось нормально или откатывает ее, если при вычислении тела возникло исключение; всегда возвращает true; (функциональный аналог оператора with).

9.6 Функция Format

* Format(%Format: string, %Arg: AnyType): string. Строка формата содержит 2 типа объектов - собственно символы и спецификаторы. Собственно символы копируются в результирующую строку, а спецификаторы преобразуют типизированное значение поля в соответствии с форматом. Спецификаторы имеют следующий вид: "%" ["-"] [width] ["." prec] type

9.6.1 Запись спецификаторов форматирования функции Format

Спецификатор формата начинается с символа %, за которым в стогом порядке следуют:
Не обязательный индикатор выравнивания влево ["-"]
Не обязательный спецификатор ширины поля, [width]
Не обязательный спецификатор точности ["." prec]
Обязательный символ типа преобразования, type.
Спецификатор ширины задает минимальную ширину поля для преобразования. Если результат короче, он дополняется пробелами. По умолчанию идет выравнивае вправо, но если спецификатор имеет индикатор "-", то происходит выравнивае влево.

9.6.2 Типы форматов функции Format

d Decimal. Аргумент должен быть целым (Integer). Значение преобразуется в строку десятичных цифр. Если спецификатор содержит спецификатор точности, то он определяет минимальную длину строки результата, если значение имеет меньшую длину, оно дополняется нулями слева.
e Scientific. Аргумент должен быть вещественным (float). Значение преобразуется в строку вида "-d.ddd...E+ddd". Результат начинается со знака "-", если число отрицательное. Одна цифра всегда предшествует десятичной точке. 
Общее количество цифр в результирующей строке (включая одну до десятичной точки) задается спецификатором точности (по умолчанию prec=15). За символом экспоненты "E" всегда следует знак "+" или "-" и по крайней мере 3 цифры.
f Fixed. Аргумент должен быть вещественным (float). Значение преобразуется в строку вида "-ddd.ddd...". Результат начинается со знака "-", если число отрицательное.
Число цифр после десятичной точки задается спецификатором точности (по умолчанию prec=2).
g General. Аргумент должен быть вещественным (float). Значение преобразуется в компактную десятичную с использованием fixed или scientific формата. Число значащих цифр в результате задается спецификатором точности (по умолчанию prec=15).
Хвостовые нули удаляются, а десятичная точка появляется при необходимости. Используется fixed формат, если число цифр слева от десятичной точки меньше или равно спецификатору точности или если значение больше или равно 0.00001. В противном случае используется scientific формат.
n Number. Аргумент должен быть вещественным (float). Значение преобразуется в строку вида "-d,ddd,ddd.ddd...". Формат "n" соответствует "f" формату, за исключением того, что результат содержит разделитеои тысяч.
m Money. Аргумент должен быть вещественным (float). Значение преобразуется в строку для представления значения валюты. Конвертирование управляетсяпосредством CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, DecimalSeparator, и CurrencyDecimals которые задаются в Windows Control Panel. Если формат содержит спецификатор точности, то его значение переопреляет значение переменной CurrencyDecimals.
p Pointer. Аргумент должен быть целым Integer). Значение преобразуется в строку вида "XXXX:YYYY" где XXXX и YYYY определяют segment и offset части адреса в шестнадцатиричном формате.
s String. Аргумент должен быть строкой (String). Строка вставляется на соответствующее место в результате. Спецификатор точности определяет максимальную длину результата. Если аргумен длиньше, то он обрезается.
x Hexadecimal. Аргумент должен быть целым Integer). Значение преобразуется в строку шестнадцатиричных цифр. Если строка формата содержит спецификатор точности, то результат будет иметь по крайней мере столько же цифр, если цифр меньше слева допишутся нули.

9.7 Функция Out

* Out(%Expr: String{, specificator:AnyType}):Boolean - вывод управляющей строки Expr с подставленными спецификаторами specificator в файл. Имя файла совпадает с именем функции или отчета; всегда возвращает true;

9.7.1 Запись спецификаторов форматирования функции Out

Спецификатор форматирования указывается через двоеточие сразу после записи выражения:
a + b :10:5:c
Спецификаторы имеют следующий формат:
* - первое число - ширина поля вывода, (если ширина поля вывода не указана данным спецификатором или специальными символами управляющей строки или задана ширина 0, значение выводится полностью);
* - второе число - количество цифр после десятичной точки для данных типа DOUBLE (если значение равно 0 - дробная часть не выводится)
* :l - выравнивание по левому краю поля вывода (умолчание для строк);
* :r - выравнивание по правому краю поля вывода (умолчание для чисел);
* :c - выравнивание по центру поля вывода;

9.7.2 Формат управляющей строки функции Out

Управляющая строка (первый аргумент функции Out)- это последовательность печатных и управляющих символов. Все символы, которые не являются управляющими, являются печатными и выводятся на устройство вывода как есть. Управляющие символы служат для задания формата вывода значений. Управляющие символы имеют более высокий приоритет, чем спецификаторы форматирования.
К управляющим символам относятся: '#' - последовательность этих символов задает позицию и ширину поля вывода .
Одиночный символ '#' задает не ширину поля вывода равную 1, а позицию табуляции. В этом случае ширина поля вывода задается спецификатором. Позиция табуляции задает место, от которого происходит выравнивание поля вывода.
Если поле выравнивается по левому краю - позиция табуляции задает левую границу.
Если поле выравнивается по правому краю - позиция табуляции задает правую границу.
Если поле выравнивается по центру - позиция табуляции задает центральную позицию поля вывода.
Пример:
Set(a,567);
Set(b,23.50);
Set(c,4.3);
Set(e,( b*c );
Out(' #### | # | ####### | # ', a, b, c:7:2, e );

9.8 Арифметические функции

* Abst(v:Float|Integer):Float-вычисляет абсолютную величину аргумента;
* Exp(expr:Float):Float-экспонента (e**expr);
* Ln(expr:Float):Float-натуральный логарифм (Ln(e)=n);
* Max( v1:integer, v2 :integer ) :integer;
* Min( v1:integer, v2 :integer ) :integer;
* Sqrt(expr:Float):Float-вычисляет квадратный корень.

9.9 Функции ввода/вывода через диалоговые окна

* Message (%Expr:String ) :boolean - открывает окно с сообщением и кнопкой "OK";
* Warning (%Expr:String ) :boolean - окно с предупреждением и кнопкой "OK";
* Question (%Expr:String ) :boolean - окно с вопросом, требующим ответа "Да" или "Нет"; возвращает ответ;
* Request (%Expr:String; %Default:AnyType ) :String - окно с вопросом, требующим ввод ответа в виде строки; %Default - подсказка ответа; есть кнопки "ОК" и "Отмена"; возвращает ответ или пустую строку (если отмена); нажатие "OK" с пустой строкой воспринимается как отмена.

9.10 Функции для работы с файлами

* ListToFile( %L:List, %File_Name:String ): Boolean - записывает список %L в файл %File_Name;
* FileToList( %File_Name:String ): List - проводит обратную операцию;
* DirToList( %Dir_Name:String ): List - читает из директории %Dir_Name список всех файлов и возвращает его в качесиве результата;
* DeleteFile( %File_Name:String ): Boolean - комментарий излишен;

9.11 Функции для работы с формами

* ActiveForm:String - возвращает имя текущей активной формы;
* Close(%name:String) :Boolean - закрывает форму;
* CloseMultiple(%name:String) :Boolean - закрывает форму, или все экземпляры множественной формы;
* CloseModal(%name:String) :Integer - закрывает форму возвращая модальный результат: failed=-1; mrNone=0; mrOk=1; mrCancel=2; mrAbort=3; mrRetry=4; mrIgnore=5; mrYes=6; mrNo=7; mrAll=8;
* IsExist(%Expr: String): Boolean - истинно, если форма с именем Expr- включена в приложение;
* IsOpen(%Expr: String): Boolean - истинно, если форма с именем Expr- открыта;
* IsOpenMultiple(%Expr: String): Boolean - истинно, если открыт хотя бы один экземпляр формы с именем Expr;
* FormParam(%name:String):String - выдает параметр, заданный при открытии формы;
* Open(%name:String,%param:string):Boolean - открывает форму, с параметром;
* OpenMultiple(%name:String,%param:string):String - открывает форму, с параметром, возвращает имя формы;
* Report(%name:String):Boolean - вызов отчета.

9.12 Специальные функции

* Application:String - возвращает идентификатор текущего приложения;
* CreateControl(%name:String, %type:String, %form_name:String, %parent:String, %top: Integer, %left:Integer, %height:Integer, %width:Integer)-создает визуальный контрол name стандартного типа type на компоненте parent формы form_name;
* Lexema(%expr:AnyType):String - переводит значение аргумента к константе в синтаксисе языка Metalic;
* LinkControl(%name:String, %form_name:String, %select_id:String, %as_name:String) - привязывает визуальный контрол name формы form_name к полю %as_name выборки select_id; 
* CreateButton(%name:String, %caption:String; %form:String, %parent:String, %top: Integer, %left:Integer, %height:Integer, %width:Integer) - создает кнопку name с надписью caption на компоненте parent формы form; Пример: CreateButton('AAA', 'Ask', owner.name, 'p_header', 0, 0, 20, 220);
* LinkButton( %name :String, %form_name :String, %function_body :String|List) - привязывает функциональное выражение function_body к событию нажатия кнопки name формы form_name; Пример: LinkButton('AAA', owner.name, [Question('Who is who?')]);
* LinkQueryEvent( %select_id :String, %form_name :String, %event :String, %function_body :String|List) - привязывает функциональное выражение к событию выборки select_id; предопределены следующие события: 'AFTERCANCEL', 'BEFORECANCEL', 'AFTERCLOSE', 'BEFORECLOSE', 'AFTERDELETE', 'BEFOREDELETE', 'AFTEREDIT', 'BEFOREEDIT', 'AFTERINSERT', 'BEFOREINSERT', 'AFTEROPEN', 'BEFOREOPEN', 'AFTERPOST', 'BEFOREPOST';
* LinkControlEvent( %name :String, %form_name :String, %event :String, %function_body :String|List) - привязывает функциональное выражение к событию контрола name формы form_name; предопределены следующие события: 'ONENTER', 'ONEXIT', 'ONCHANGE';
* SetFocus( %name :String, %form_name :String) - устанавливает фокус на контроле name формы form_name;
* User :String - возвращает идентификатор пользователя, активировавшего приложение.

10 Отладка функций

Поговорим об отладке пользовательских функций, операций и отчетов на языке fansy-script, ибо встроенные и специальные считаются отлаженными априори.
Фиксация ошибки функции возможна только во время работы целевого приложения. При возникновении ошибки ядро системы открывает форму, показывающую исходный текст функции и позицию ошибки в нем. Для исправления ошибки системной функции необходимо вызвать редактор метаданных ADMIN, исправить ошибку и перезапустить приложение, ошибку пользовательской функции (в экспорте данных) можно исправить без перезапуска.

Рисунок 1 Встроенный отладчик

Возможности отладчика

 Выполнить одну строку текста функции и остановиться на следующей.
 Выполнить одну строку текста функции и остановиться на следующей строке с учетом возможного вызова другой функции.
 Продолжить выполнение с трассировкой строк исходного текста функции до следующей точки останова.
 Продолжить выполнение функции до следующей точки останова
 Остановить выполнение функции - принудительная точка останова.
 Продолжить выполнение функции без отладчика.
 Поставить/убрать точку останова в данной строке текста.
 Прекратить выполнение функции и процесс отладки.
Наш адрес: 105066, г. Москва, улица Нижняя Красносельская, дом 35, строение 64, БЦ Виктория Плаза, 9 этаж, офис 916
Телефон: +7 (495) 109-5581;
Электронная почта: fansy@fansy-service.ru
© 2002 - 2022
ООО Проверенные технологии