Fore.NET, Fore и пользовательские функции Prognoz Platform

Филипп Пономарев

В этой статье мы посмотрим, где можно использовать язык программирования Fore.NET, а также обратим внимание на пользовательские функции метабазы как один из вариантов применения Fore.NET и Fore.

Fore.NET в Prognoz Platform

Отличительной особенностью сборки Fore.NET от сборок Fore является точка входа, именно это позволяет запускать сборки Fore.NET непосредственно из навигатора объектов. Это может быть как статическая функция main, так и форма, имеющая пустой конструктор.

Непосредственно писать программный код для Fore.NET можно только в среде разработки. Несмотря на это, Fore.NET применяется во многих ключевых возможностях Prognoz Platform. Давайте взглянем на них поподробнее.

Зачастую Fore.NET применяется в задачах планирования. Мы можем создать задачу «Выполнение сборки .NET», указать необходимые нам параметры и запустить планировщик задач. Таким образом, мы можем заставить Fore.NET работать по расписанию или по различным событиям, тем самым увеличивая гибкость системы и автоматизируя циклические процессы:

Следующая огромная область применения Fore.NET – отчетность. Мы подробнее остановимся на регламентных отчетах.

Создадим сборку Fore.NET «GLOBALSUBS», добавим в нее модуль, добавим программный код, вычисляющий разность двух целых чисел:

Public Class MyForeNETFunctions Public Shared Function ForeNetDiffer(a:Integer; b:integer):Integer; Begin Return a-b; End Function ForeNetDiffer; End Class MyForeNETFunctions;

Теперь привяжем модуль Fore.NET к созданному нами регламентному отчету:

Теперь в необходимую ячейку можно добавить ссылку на нашу функцию «ForeNetDiffer», для этого достаточно выбрать ячейку и нажать на карандаш: Далее в мастере функций заполнить параметры:

И получить ожидаемый результат:

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

Разберем подробнее эту ссылку:

GLOBALSUBS.GlobalSubs.MyForeNETFunctions.ForeNetDiffer(10, 5)

GLOBALSUBS – имя нашей сборки. Для работы с гиперссылкой его указывать не надо т.к. мы указываем модуль, откуда будет выполняться процедура. Подробнее можно почитать в статье про Fore.

GlobalSubs – namespace самой сборки, задается в параметрах сборки, там же где и точка входа:

MyForeNETFunctions – имя namespace, которое мы указали.

MyForeNETFunctions – имя класса, содержащее в себе публичную статичную функцию Fore.NET. Публичные функции, которые не лежат в классах, автоматически помещаются в класс __Globals и помечаются как shared.

ForeNetDiffer – непосредственно имя нашей функции.

Также имеется возможность обрабатывать события отчетности в Fore.NET, это делается аналогично обработке событий Fore.

Пользовательские функции Prognoz Platform

Мы посмотрели основные места, где используется Fore.NET, однако в Prognoz Platform есть не особо распространенная, но очень полезная функциональность, отвечающая на вопросы: «Что делать в том случае, если необходимо использовать различные функции из различных модулей, при этом не имея желания постоянно подключать сборки в отчетность? Или в том случае, когда такие функции необходимо использовать, например, в моделировании?» Для таких целей в Prognoz Platform есть пользовательские функции. Прежде всего необходимо отметить, что пользовательские функции – часть глобальных объектов, которые являются специальными объектами метабазы.

Для того чтобы работать с глобальными Fore-функциями, нам необходимо получить Methods объекта ISharedParams текущей метабазы. Работа с глобальными Fore.NET функциями ведется через NETMethods объекта ISharedParamsEx текущей метабазы. Для получения этих объектов можно выполнить следующий программный код:

FNMethods: IForeNETMethods; FMethods: IForeMethods; Shp: ISharedParams; ShpEx: ISharedParamsEx; Var Desc:IMetabaseObjectDescriptor; Begin mb := MetabaseClass.Active; Desc := mb.SpecialObject(MetabaseSpecialObject.SharedParams); Shp := Desc.Edit As ISharedParams; FMethods := Shp.Methods; ShpEx := shp As ISharedParamsEx; FNMethods:= ShpEx.NETMethods; End

Теперь рассмотрим подробнее интерфейс коллекции методов Fore – IForeMethods:

Item(Key): IForeMethod – данная функция позволяем получить пользовательскую Fore-функцию по ее ключу

Count: Integer – количество пользовательских функций

Add: IForeMethod – добавить пользовательскую функцию

Remove(Key) – удалить пользовательскую функцию из коллекции

Clear – отчистить коллекцию

RemoveByKey(Key) – удалить пользовательскую функцию по ключу

Коллекция методов Fore.NET имеет сходные методы, но она работает с IForeNETMethod.

Теперь рассмотрим непосредственно строение IForeMethod и IForeNETMethod, они оба наследуются от IBaseMethod:

Свойства:

Assembly – имя сборки, в котором находится метод

Method – название метода в сборке

Category – имя категории, в которой будет хранится метод

Name – имя пользовательского метода

Description – описание пользовательского метода

ResultType – возвращаемый тип

Tag – тэг

Только для чтения:

Key – ключ метода

Методы:

Bind – инициализирует пользовательский метод

Помимо выше перечисленного, в IForeMethod присутствуют свойства Params (параметры пользовательского метода) и Type (тип пользовательского метода). В IForeNETMethod присутствуют свойства Namespace и Params.

Теперь перейдем непосредственно к примеру применения пользовательских методов.

Прежде всего добавим эти методы, для этого добавим Fore-сборку «FFUNCS» со следующим программным кодом:

Public Function MySum(a:Integer; b:Double):Double; Begin Return a+b; End Function MySum; Public Function ShowMessage(v:Variant):Integer; Begin WinApplication.InformationBox(v As string); Return 0; End Function ShowMessage;

И Fore.NET-сборку «FNETFUNCS» со следующим программным кодом:

Namespace Nmspc Public Class MyClass Public Shared Sub winMes(s:string); Begin System.Windows.Forms.MessageBox.Show(s); End Sub winMes; End Class MyClass; End Namespace;

Обратим внимание на следующие моменты:

1. Мы можем итерировать пользовательские коллекции методов оператором For Each.

2. В начале идет добавление метода в коллекцию, а потом его настройка.

3. После любых манипуляций с глобальными объектами необходимо их сохранять: (Shp(Ex) As IMetabaseobject).Save;

Теперь добавим нашу глобальную функцию Fore:

Sub AddFore; Var mb : IMetabase; Shp: ISharedParams; Desc :IMetabaseObjectDescriptor; FMethods: IForeMethods; FMethod : IForeMethod; Begin mb := MetabaseClass.Active; Desc := mb.SpecialObject(MetabaseSpecialObject.SharedParams); Shp := Desc.Edit As ISharedParams; FMethods := Shp.Methods; FMethod := FMethods.Add; FMethod.Assembly := "FFUNCS"; FMethod.Name := "Show message from Fore"; FMethod.Method := "ShowMessage"; FMethod.Category := "MyFore"; FMethod.Description := "Showing ui message from Fore."; (Shp As IMetabaseObject).Save; End Sub AddFore;

И Fore.NET:

Sub AddForeNET; Var mb : IMetabase; Shp: ISharedParams; ShpEx: ISharedParamsEx; Desc :IMetabaseObjectDescriptor; FNMethods: IForeNETMethods; FNMethod : IForeNETMethod; Begin mb := MetabaseClass.Active; Desc := mb.SpecialObject(MetabaseSpecialObject.SharedParams); Shp := Desc.Edit As ISharedParams; ShpEx := shp As ISharedParamsEx; FNMethods:= ShpEx.NETMethods; FNMethod := FNMethods.Add; FNMethod.Assembly := "FNETFUNCS"; FNMethod.Name := "Show message from Fore.NET"; FNMethod.Method := "MyClass.winMes"; FNMethod.Category := "MyForeNET"; FNMethod.Description := "Showing WinForm MessageBox from Fore.NET"; FNMethod.Namespace_ := "Nmspc"; (Shp As IMetabaseObject).Save; End Sub AddForeNET;

Обратим внимание, что если метод находится в классе, то необходимо имя метода указывать как имя_класса.имя_метода.

После данных манипуляций у нас в глобальных параметрах метабазы будут храниться наши Fore-метод и Fore.NET-метод.

Теперь посмотрим где и как мы можем это использовать.

Прежде всего глобальные методы применяются в отчетности, для их автоматического прописывания также необходимо нажать на карандаш и выбрать нужный метод. Обратим внимание, что никакие сборки к отчету не подключены:

Ну и как результат:

Аналогично все работает и с Fore:

Кроме того, пользовательские методы подключены в некоторых универсальных редакторах формул, например, в моделировании:

Заключение

Мы рассмотрели использование языка Fore.NET в Prognoz Platform, а также научились делать платформу более удобной и гибкой за счет пользовательских методов.

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

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

Читайте также

Комментарии

Подробнее о политике использования персональных данных