• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Запуск бизнес-процесса из плагина ЛОЦМАН на C#

Автор Black_Walker, 24.12.21, 15:35:47

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Black_Walker

Всем добрый день. Возникла необходимость сделать плагин на C#, который запускает бизнес-процесс. Из справки по SDK понял, что для работы с WF в текущих версиях рекомендуется использовать библиотеку WorkflowBuisnessLogic. Кто-нибудь имел дело с этой библиотекой? Ни в справке ни на форуме не нашёл примера, как ей пользоваться в контексте .NET плагина. В справке приведён пример подготовки библиотеки к работе на ObjectPascal или Delfi я так понял. И при подготовке объекта библиотеки кроме имени сервера приложения и имени БД там требуется передать в объект уникальный идентификатор окна (handle) главного окна приложения. Т.е. в свойство MainHandle нужно передать ID окна клиента ЛОЦМАН? Подскажите, пожалуйста, как его получить?

        WFBusinessLogic workflowBusinessLogic = new WFBusinessLogic();
        workflowBusinessLogic.AppServer = "имя сервера";
        workflowBusinessLogic.ConnectToDB("имя базы данных", "", "", "");
        workflowBusinessLogic.MainHandle = нужен ID;
        if (workflowBusinessLogic.Connected == true) System.Windows.MessageBox.Show("Есть подключение к БД");
       

ИринаФ

Добрый день!
            Type t = Type.GetTypeFromCLSID(Guid.Parse("{8A1BB533-6E3D-48B9-A6DD-3B25AA50FA23}"));
            IWFBusinessLogic iWfbl = Activator.CreateInstance(t) as IWFBusinessLogic;
            iWfbl.AppServer = "имя сервера";
            iWfbl.MainHandle = this.Handle.ToInt32();
            iWfbl.Connected = true;
            iWfbl.ConnectToDB("dbName, "", "", "");
            object obj1, obj2;
            iWfbl.SetStateOfProcess(id, 1, out obj1, out obj2;
+ Благодарностей: 1

Black_Walker

Цитата: ИринаФ от 24.12.21, 16:34:00iWfbl.MainHandle = this.Handle.ToInt32();
Вот тут не совсем понимаю, в каком контексте идёт активация библиотеки? Я выделил логику создания и активации объекта библиотеки в конструктор отдельного класса, в котором и выделен метод бизнес-логики. И ссылка this приведёт лишь к объекту этого класса, а не к окну ЛОЦМАНа.
Логику я построил таким образом:
1. Вызываю окно плагина из меню ЛОЦМАН.
2. Окно плагина содержит WPF-контрол с кнопкой, по нажатию этой кнопки происходит создание объекта бизнес-процесса по шаблону.
3. Обработчик события нажатия кнопки создаёт объект класса с бизнес-логикой, в конструктор класса пробрасываю имя сервера и базы данных.
4. Объект класса инициирует библиотеку WFbl в конструкторе (я сделал свойство отдельное для неё).
5. Затем обработчик события вызывает метод класса бизнес логики, который запускает метод CreateNewProcessBy() объекта библиотеки.

Т.е. всю логику я инкапсулировал  в отдельный класс. Пока в качестве теста я кидаю в поле MainHandle просто 0. Объект процесса в базе корректно создаётся вроде бы. Но хотелось бы сделать всё правильно. Ведь зачем-то это поле нужно.

Black_Walker

internal class WFBL
    {
        private IWFBusinessLogic wFBusinessLogic;
        private string _dbName;
        private object stErrorMessage;
        private object inReturnCode;

        public WFBL(string appServer, string dbName, int mainHandle)
        {
            wFBusinessLogic = new WFBusinessLogic();
            _dbName = dbName;
            wFBusinessLogic.AppServer = appServer;
            wFBusinessLogic.MainHandle = mainHandle;
        }

        public void CreateBP()
        {
            wFBusinessLogic.ConnectToDB(_dbName, "", "", "");
            wFBusinessLogic.CreateNewProcessBy
                (_dbName, 0, $"имя процесса", 463, out inReturnCode, out stErrorMessage);
        }
    }

Black_Walker

В общем-то создавать процесс и запускать его я научился. Но вот проблема с занесением текста задания в первое задание бизнес-процесса. Не понимаю как определить ID первой стадии созданного процесса? ID самого процесса есть.
Пытаюсь использовать метод:

InsUpdStageIntoBP("текст задания", null, null, 1, 1, null, null, _processId, null, 4227, 1, 1, out inReturnCode, out stErrorMessage);
Если в качестве ID стадии добавлять ID из схемы БП в конфигураторе (в моём случае это 4227), то у меня меняется текст задания именно в схеме. А вот как определить ID стадии именно созданного экземпляра процесса?
Ну и выкидывается исключение при выполнении метода:
Разрушительный сбой (Исключение HRESULT: 0x8000FFFF (E_UNEXPECTED)).

Кто-нибудь уже сталкивался с подобным?

ИринаФ


ИринаФ

А если получить все стадии GetRouteItems, пробежаться по ним?

Black_Walker

https://forum.ascon.ru/index.php?topic=36407.msg292627#msg292627 Вот здесь описал проблему, пробовал. Система возвращает пустой датасет, хотя сам процесс создаётся, и его ID я знаю.