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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.05.2019, 18:34   #1  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
С моей точки зрения "правильно" - это понятие относительное для условий задачи. В одном случае важна скорость разработки, а пользователя можно обучить, в другом надо делать, чтобы быстро работало. В одном случае периодичность пакетного режима нужна - и тогда надо делать очередь доступную с сервера, в другом не нужно (и надо думать как запретить эту периодичность). В одном случае файлы большие, в другом - маленькие.

Что я видел:

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

2. Загрузка и обработка внутри диалога (например выводим поле в котором сообщение <файл не загружен> и dialog.addMenuItem, на форму/runbase наследника который загружает с прогрессом, возможностью отмены и прочим). Можно сделать отдельную форму подсунуть ее в диалог.

3. Теоретически можно сделать в getFromDialog и бороться с упомянутыми тобой недостатками - вызывать info.yield, WinApi::SetActiveWindow и так далее (я, правда, все это подзабыл)
Старый 31.05.2019, 18:53   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
С моей точки зрения "правильно" - это понятие относительное для условий задачи.
Необходимые условия я перечислил в заголовке и в самом первом сообщении.
остальное на твое усмотрение.

если ты считаешь "выбешивать пользователя долго висящим диалогом" правильным решением - ок, я понял твои усмотрения.

Цитата:
Сообщение от belugin Посмотреть сообщение
В одном случае файлы большие, в другом - маленькие.
т.е. нет правильного решения для всех случаев?


Цитата:
Сообщение от belugin Посмотреть сообщение
1. Отдельный интерфейс для загрузки заданий на сервер
это был мой первый вариант в первом сообщении.

Цитата:
Сообщение от belugin Посмотреть сообщение
2. Загрузка и обработка внутри диалога (например выводим поле в котором сообщение <файл не загружен> и dialog.addMenuItem, на форму/runbase наследника который загружает с прогрессом, возможностью отмены и прочим). Можно сделать отдельную форму подсунуть ее в диалог.
обрати внимание, что вопрос был НЕ "можно ли", а "как"?

Цитата:
Сообщение от belugin Посмотреть сообщение
3. Теоретически можно сделать
В свое время я все на 1Сников наезжал, что они на вопрос "как" постоянно отвечали "можно сделать".
Ну, вот настали времена...


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

должны быть выполнены на клиенте - это не блажь, это реальное условие. Импорт из Excel это всего лишь пример. Ровно как это написано в вопросе.
  • должны быть выполнены на клиенте из-за аппаратных ЭЦП, какого-нибудь ХАСПа или подобные системы "безопасности" и "шифрования".
  • должны быть выполнены на клиенте потому что там стоит драйвер камеры, с которой надо принять вход или счетчик посетителей или пос-терминалы с которых аксапта получает Z-отчеты или еще какое-нибудь оборудование.
  • должны быть выполнены на клиенте, поскольку только на этой машине установлен дорогуще-лицензионный кодек чего-нибудь во что-нибудь.

в общем, ДОЛЖНЫ БЫТЬ выполнены на клиенте.
__________________
полезное на axForum, github, vk, coub.
Старый 31.05.2019, 20:17   #3  
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   #4  
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   #5  
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   #6  
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   #7  
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   #8  
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   #9  
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)

Я тупой
Старый 31.05.2019, 23:52   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
т.е. нет правильного решения для всех случаев?
Думаю, нет. Практически всегда практически для любого решения так обще поставленной задачи можно придумать случай, когда оно будет неправильным а правильным другое.


Цитата:
Обрати внимание, что вопрос был НЕ "можно ли", а "как"?
ok. Я не буду больше говорить, что можно сделать, если требования по моему не достаточно ограничены, чтобы существовало одно правильное решение.
Теги
как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 03:19.