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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.05.2019, 20:10   #1  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере.
Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте.

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

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

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

Может существует другой способ?
Тяжелое, не тяжелое, а действия принципиально те же. Хватаем и тащим. И табуретки и пианино.

Клиентом пишем в базу. Можно при желании уменьшить обращения но это уже оптимизация редко нужная. Временная DB таблица или staging если нужна история.

Сервер берет из базы. В пакетнике или нет, не так важно.

Смысла жонглировать классами - не вижу. Практически всегда вдруг возникает требование видеть историю или статус валидации, а это staging. А там где staging все приходит к ParmId и Line Status и может еще пара параметров типа даты и пр.
За это сообщение автора поблагодарили: mazzy (2).
Старый 30.05.2019, 20:16   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Клиентом пишем в базу.
Прям руками? В отдельную таблицу?

Почему не saveLast? если saveLast, то в какое место класса RunBase вставить вызов?

если использовать стандартный вызов saveLast, то в какое место вставить импорт из Excel?
__________________
полезное на axForum, github, vk, coub.
Старый 31.05.2019, 02:47   #3  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Прям руками? В отдельную таблицу?

Почему не saveLast? если saveLast, то в какое место класса RunBase вставить вызов?

если использовать стандартный вызов saveLast, то в какое место вставить импорт из Excel?
Если пользователь выбирает файл на клиенте в диалоговой форме (RunBase.prompt) то я бы сделал эту форму статической (AOT формой) и добавил операцию загрузки данных на сервер как отдельный шаг и только тогда позволял бы нажимать OK (в пакетнике или нет, не важно).

Выделял бы RunId на каждый запуск и именно его бы и передавал помимо фильтров.
Операция загрузки данных на сервер в staging конечно руками и не так важно где этот код.

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

То есть разбиваем на операции, а не классы. Если что-то реальное сложное то я бы даже предлагал бы wizard с шагами до кнопки OK пакетника. И солидно, и голова меньше болит когда логика по шагам.
Старый 31.05.2019, 03:04   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Почему не saveLast?
Потому что страшно. Что он там и как сохраняет с какими таймаутами и размерами не подконтрольно. Может там TempDB потом взорвется или еще что. Не предназначено saveLast для данных в принципе.

Руками в свою таблицу и передача RecId как ссылки на загруженные в DB данные - оно более как то и спокойнее и проще.
Старый 31.05.2019, 08:35   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
...и передача RecId как ссылки на загруженные в DB данные
Хорошо, возвращаемся к исходному вопросу:

RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel подготовку списка RecId и передачу списка на сервер для дальнейшей обработки.
__________________
полезное на axForum, github, vk, coub.

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

Еще, насколько я помню, при передаче больших файлов на сервер надо порциями передавать большой контейнер, чтобы он уместился в буфер RPC.
Старый 31.05.2019, 10:56   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
getFromDialog ... выгружает на
getFromDialog в стандарте вызывается из метода closeOk/checkCloseOk
другими словами, getFromDialog вызывается ДО закрытия диалога

если в getFromDialog добавить долгую обработку, то диалог будет висеть перед пользователем очень долгое время и не реагировать ни на какие нажатия, что приводит пользователя в ступор.

если getFromDialog добавить долгую обработку И SysOperationProgress/RunBaseProgress, то Аксапта уводит окно с диалогом в background и пользователь как правило больше диалог достать не может

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

можно я повторю вопрос:
RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel.


Цитата:
Сообщение от belugin Посмотреть сообщение
Если кто-то запустит не в пакетном режиме, то для того, чтобы использовать saveLast надо как-то разделять SysLastValue по разным фактам запуска.

Еще, насколько я помню, при передаче больших файлов на сервер надо порциями передавать большой контейнер, чтобы он уместился в буфер RPC.
Угу-угу.

Теперь мой вопрос понятен?

RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel.
Миниатюры
Нажмите на изображение для увеличения
Название: 2009.PNG
Просмотров: 169
Размер:	33.3 Кб
ID:	12325  
Изображения
 
__________________
полезное на axForum, github, vk, coub.
Старый 31.05.2019, 15:33   #8  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel.
Я бы предлагал сделать эти действия снаружи RunBaseBatch и передавать талончик туда на вход как параметр. Своя AOT форма на которой кнопка загрузить файл с прогресс-баром и кнопка вызова RunBaseBatch куда мы передаем номер взвешенного мяса для оплаты на кассе.
Одного единственного номера достаточно как HeaderRecId запуска для всех файлов.

Это конечно от UI если предполагается ручной выбор файла и одноразовый пакетник.
Если это папка то на клиенте ей делать нечего так как Batch это сервер.

Извиняюсь если сбиваю с темы расчленения RunBaseBatch.
Старый 31.05.2019, 18:03   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
размещать файл на пакетнике или выделенном сетевом ресурсе с доступом для AOS
Цитата:
Сообщение от belugin Посмотреть сообщение
записывать путь на сервере
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Когда файл перемещается на сервер
я ж не зря написал "действия, которые должны быть выполнены на клиенте"
И даже добавил пример импорт Excel.

Если честно, я думал, что это очевидно.
Чтобы делать обработку на сервере (например, импорт), на сервере должны быть установлены соответствующие библиотеки: Платно-лицензионный Excel, специальные версии .net/dll для бесплатных библиотек, или другие лицензионные продукты (если мы говорим в общем случае). На сервер далеко не всегда можно поставить требуемые обработчики.

именно я это я имел в виду под "действия, которые должны быть выполнены на клиенте".

Пожалуйста, я постарался сформулировать вопрос предельно точно:

RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel.
__________________
полезное на axForum, github, vk, coub.
Теги
как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 18:33.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.