AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.05.2019, 20:17   #1  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение

Ок, расскажите "как правильно добавить действия, которые должны быть выполнены на клиенте (например, импорт из Excel) в современных версиях Аксапты?"

должны быть выполнены на клиенте - это не блажь, это реальное условие. Импорт из Excel это всего лишь пример. Ровно как это написано в вопросе.
Правильно так
X++:
public boolean runsImpersonated()
 {
     // false means that the batch must run on a client.
     return false;
 }
https://docs.microsoft.com/en-us/dyn...nd-run-a-batch
Цитата:
Running Your Batch on the Client
You have a batch class that overrides the runImpersonated method. The override makes the batch eligible to run only on a client computer. You run a job that schedules the batch. The batch remains in a waiting status until you use the client to tell the AOS to send the client-bound batch to your client now so the batch can run.
Если нужно часть действий на клиента, а часть действий на сервере то этому клиентскому RunBaseBatch никто не запрещает вызывать серверный код.

Но так чтобы серверный RunBaseBatch вызывал клиентский код? В принципе кто запрещает Написать компонент на .NET как сервис на клиентской машине, дергать из Batch сервера по адресу:порту.
За это сообщение автора поблагодарили: mazzy (10).
Старый 31.05.2019, 21:08   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Правильно так
X++:
public boolean runsImpersonated()
 {
     // false means that the batch must run on a client.
     return false;
 }
https://docs.microsoft.com/en-us/dyn...nd-run-a-batch
Точно! можно разделять на два класса (клиентский и серверный) не только при помощи свойства, но и при помощи этого метода.

Не очень понятна фраза "The batch remains in a waiting status until you use the client to tell the AOS to send the client-bound batch to your client now so the batch can run."
Спасибо, попробую порыть в этом направлении.
Изображения
 
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2019, 13:55   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
От этого кстати всегда больно так это запрещает смотреть с уровня выше или сбоку.
Ну, не запрещай себе смотреть.
Сначала ответь на поставленный вопрос, потом обзирай.

Цитата:
Сообщение от ax_mct Посмотреть сообщение
Правильно так
X++:
public boolean runsImpersonated()
 {
     // false means that the batch must run on a client.
     return false;
 }
https://docs.microsoft.com/en-us/dyn...nd-run-a-batch
Нет, похоже, это не совсем тот путь, который можно было бы назвать правильным.

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

метод runsImpersonated() не решает задачу передачи данных с клиента на сервер. по-прежнему, можно передавать данные через таблицу, создавая тикет для сессии, и занимаясь обслуживанием сессионных данных (удаление устаревших, нумератор сессии, уникальность нумератора в случае отказов и т.п.)

Мало того, этот метод сильно усложняет saveLast. Либо я чего-то кардинально не понимаю.

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

Кто-нибудь ходил этим путем? Есть рекомендации?

============
пока вариант с двумя классами и со свойством runOn кажется более простым. там только одна сложность - как передать расписание запуска второму классу и сбросить эти параметры с первого.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 01.06.2019 в 14:07.
За это сообщение автора поблагодарили: ax_mct (2).
Старый 01.06.2019, 15:56   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
пока вариант с двумя классами и со свойством runOn кажется более простым. там только одна сложность - как передать расписание запуска второму классу и сбросить эти параметры с первого.
Если у нас уже есть RunBaseBatch который мы в режиме legacy на клиенте то зачем нам еще один RunBaseBatch на сервере?
Если это одна операция и просто нужен код работающий на сервере то это можно и так сделать. В рамках одного и того же RunBaseBatch.

Если это несколько операций и у нас есть отдельные независимые RunBaseBatch которые должны быть запущены последовательно то на ум приходит то что называется batch task когда мы ручками создаем строки в Batch tasks и определяем Conditions. Это требует canGoBatchJournal = true и особенностей вызова параметров у RunBaseBatch.


Но вот как эти Batch tasks работают с legacy client RunBaseBatch - не знаю. По идее должны.
Старый 01.06.2019, 16:51   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Если у нас уже есть RunBaseBatch который мы в режиме legacy на клиенте то зачем нам еще один RunBaseBatch на сервере?
вроде старался формулировать предельно четко, не забывая нужное для ответа.

Что непонятно в исходной формулировке?
Что непонятно в исходном вопросе?

Цитата:
Сообщение от mazzy Посмотреть сообщение
Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере.
Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте.

Как и куда правильно вставить действия, которые должны выполняться на клиенте?
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2019, 16:54   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
оставлю отдельным сообщением:
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кто-нибудь ходил этим путем? Есть рекомендации?
__________________
полезное на axForum, github, vk, coub.
Старый 02.06.2019, 15:45   #7  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере.
Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте.

Как и куда правильно вставить действия, которые должны выполняться на клиенте?

Сейчас правильный способ видится таким:
* разбить процесс на два runBaseBatch класса: первый будет иметь свойство RunOn=Client, второй - RunOn=Server
* первый в методе run должен будет выполнить клиентские действия, создать второй класс на сервере и передать ему параметры и данные

Но что-то как-то слишком сложно. Очень напоминает overprogramming.

Может существует другой способ?
Цитата:
Сообщение от mazzy Посмотреть сообщение
Что непонятно в исходной формулировке?
-работать на пакетном сервере.
-Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте.
-Как и куда правильно вставить действия, которые должны выполняться на клиенте

Непонятно почему запуск клиентского RunBaseBatch (оставленный как legacy) когда клиент
работает как пакетный сервер не покрывает все три условия.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Что непонятно в исходном вопросе?
В исходном вопросе непонятно зачем нужен второй RunBaseBatch на сервере.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Кто-нибудь ходил этим путем? Есть рекомендации?
Каким путем?
Клиентский пакетник создает серверный пакетник и передает ему параметры и данные?
Дык если нужен последующий пакетник то речь об BatchTasks.

А если просто вызов серверного кода в том же запуске то о том и речь что пакетник то зачем.
Грубо например BlbBlaServer::runOnServer(Args, DataReferenceParmId)

Я тупой
Теги
как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax3,ax4,ax2009,ax2012: Есть ли красивый способ передать packable объект между клиентом и сервером? mazzy DAX: Программирование 20 09.06.2019 23:19
axaptacorner: How to read excel and update record in AX2012 through X++ code Blog bot DAX Blogs 0 04.01.2019 17:13
Скрипт для переноса данных Ax3.0 (Oracle) - Ax2009 (MSSQL) someOne DAX: Программирование 2 14.06.2011 14:53
axcoder: AxPath pugin for Tabax which works with Ax3, Ax4, Ax2009 Blog bot DAX Blogs 0 08.11.2008 02:11
Импорт из 'офисной БД' (Excel, Access) Gustav DAX: База знаний и проекты 4 07.06.2008 17:17
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:36.