|
30.05.2019, 20:10 | #1 |
Banned
|
Цитата:
Сообщение от mazzy
Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте? Сейчас правильный способ видится таким: * разбить процесс на два runBaseBatch класса: первый будет иметь свойство RunOn=Client, второй - RunOn=Server * первый в методе run должен будет выполнить клиентские действия, создать второй класс на сервере и передать ему параметры и данные Но что-то как-то слишком сложно. Очень напоминает overprogramming. Может существует другой способ? Клиентом пишем в базу. Можно при желании уменьшить обращения но это уже оптимизация редко нужная. Временная DB таблица или staging если нужна история. Сервер берет из базы. В пакетнике или нет, не так важно. Смысла жонглировать классами - не вижу. Практически всегда вдруг возникает требование видеть историю или статус валидации, а это staging. А там где staging все приходит к ParmId и Line Status и может еще пара параметров типа даты и пр. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
30.05.2019, 20:16 | #2 |
Участник
|
Прям руками? В отдельную таблицу?
Почему не saveLast? если saveLast, то в какое место класса RunBase вставить вызов? если использовать стандартный вызов saveLast, то в какое место вставить импорт из Excel? |
|
31.05.2019, 02:47 | #3 |
Banned
|
Цитата:
Выделял бы RunId на каждый запуск и именно его бы и передавал помимо фильтров. Операция загрузки данных на сервер в staging конечно руками и не так важно где этот код. С точки зрения дизайна решения предварительная загрузка данных с клиента на сервер мне кажется наиболее прямым решением. Можно и просто копировать файл на сервер, а не писать в базу. Но предварительная операция как загрузка на сервер как принцип. То есть разбиваем на операции, а не классы. Если что-то реальное сложное то я бы даже предлагал бы wizard с шагами до кнопки OK пакетника. И солидно, и голова меньше болит когда логика по шагам. |
|
31.05.2019, 03:04 | #4 |
Banned
|
Потому что страшно. Что он там и как сохраняет с какими таймаутами и размерами не подконтрольно. Может там TempDB потом взорвется или еще что. Не предназначено saveLast для данных в принципе.
Руками в свою таблицу и передача RecId как ссылки на загруженные в DB данные - оно более как то и спокойнее и проще. |
|
31.05.2019, 08:35 | #5 |
Участник
|
Хорошо, возвращаемся к исходному вопросу:
RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, Последний раз редактировалось mazzy; 31.05.2019 в 08:45. |
|
31.05.2019, 10:26 | #6 |
Участник
|
Цитата:
Еще, насколько я помню, при передаче больших файлов на сервер надо порциями передавать большой контейнер, чтобы он уместился в буфер RPC. |
|
31.05.2019, 10:56 | #7 |
Участник
|
getFromDialog в стандарте вызывается из метода closeOk/checkCloseOk
другими словами, getFromDialog вызывается ДО закрытия диалога если в getFromDialog добавить долгую обработку, то диалог будет висеть перед пользователем очень долгое время и не реагировать ни на какие нажатия, что приводит пользователя в ступор. если getFromDialog добавить долгую обработку И SysOperationProgress/RunBaseProgress, то Аксапта уводит окно с диалогом в background и пользователь как правило больше диалог достать не может а если во время длинной операции внутри getFromDialog произойдет ошибка, то пользователь увидит инфолог, но диалог не закроется и не будет виден пользователю. можно я повторю вопрос: RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel. Цитата:
Сообщение от belugin
Если кто-то запустит не в пакетном режиме, то для того, чтобы использовать saveLast надо как-то разделять SysLastValue по разным фактам запуска.
Еще, насколько я помню, при передаче больших файлов на сервер надо порциями передавать большой контейнер, чтобы он уместился в буфер RPC. Теперь мой вопрос понятен? RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel. |
|
31.05.2019, 15:33 | #8 |
Banned
|
Цитата:
Одного единственного номера достаточно как HeaderRecId запуска для всех файлов. Это конечно от UI если предполагается ручной выбор файла и одноразовый пакетник. Если это папка то на клиенте ей делать нечего так как Batch это сервер. Извиняюсь если сбиваю с темы расчленения RunBaseBatch. |
|
31.05.2019, 18:03 | #9 |
Участник
|
Цитата:
И даже добавил пример импорт Excel. Если честно, я думал, что это очевидно. Чтобы делать обработку на сервере (например, импорт), на сервере должны быть установлены соответствующие библиотеки: Платно-лицензионный Excel, специальные версии .net/dll для бесплатных библиотек, или другие лицензионные продукты (если мы говорим в общем случае). На сервер далеко не всегда можно поставить требуемые обработчики. именно я это я имел в виду под "действия, которые должны быть выполнены на клиенте". Пожалуйста, я постарался сформулировать вопрос предельно точно: RunBaseBatch: как правильно добавить действия, которые должны быть выполнены на клиенте? например, импорт из Excel. |
|
Теги |
как правильно |
|
|