|
![]() |
#1 |
Участник
|
С моей точки зрения "правильно" - это понятие относительное для условий задачи. В одном случае важна скорость разработки, а пользователя можно обучить, в другом надо делать, чтобы быстро работало. В одном случае периодичность пакетного режима нужна - и тогда надо делать очередь доступную с сервера, в другом не нужно (и надо думать как запретить эту периодичность). В одном случае файлы большие, в другом - маленькие.
Что я видел: 1. Отдельный интерфейс для загрузки заданий на сервер, включая использование готовых хранилищ (сетевая папка, встроенный документооборот, ftp, sharepoint) - фактически мы разбиваем на два интерфейса, клиентский и периодическое задание. Это подходит к случаю, когда нам нужна именно периодичность. 2. Загрузка и обработка внутри диалога (например выводим поле в котором сообщение <файл не загружен> и dialog.addMenuItem, на форму/runbase наследника который загружает с прогрессом, возможностью отмены и прочим). Можно сделать отдельную форму подсунуть ее в диалог. 3. Теоретически можно сделать в getFromDialog и бороться с упомянутыми тобой недостатками - вызывать info.yield, WinApi::SetActiveWindow и так далее (я, правда, все это подзабыл) |
|
![]() |
#2 |
Участник
|
Цитата:
остальное на твое усмотрение. если ты считаешь "выбешивать пользователя долго висящим диалогом" правильным решением - ок, я понял твои усмотрения. т.е. нет правильного решения для всех случаев? ![]() это был мой первый вариант в первом сообщении. Цитата:
В свое время я все на 1Сников наезжал, что они на вопрос "как" постоянно отвечали "можно сделать". Ну, вот настали времена... Ок, расскажите "как правильно добавить действия, которые должны быть выполнены на клиенте (например, импорт из Excel) в современных версиях Аксапты?" должны быть выполнены на клиенте - это не блажь, это реальное условие. Импорт из Excel это всего лишь пример. Ровно как это написано в вопросе.
в общем, ДОЛЖНЫ БЫТЬ выполнены на клиенте. |
|
![]() |
#3 |
Banned
|
Цитата:
Сообщение от mazzy
![]() Ок, расскажите "как правильно добавить действия, которые должны быть выполнены на клиенте (например, импорт из Excel) в современных версиях Аксапты?" должны быть выполнены на клиенте - это не блажь, это реальное условие. Импорт из Excel это всего лишь пример. Ровно как это написано в вопросе. X++: public boolean runsImpersonated() { // false means that the batch must run on a client. return false; } Цитата:
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 вызывал клиентский код? В принципе кто запрещает ![]() |
|
|
За это сообщение автора поблагодарили: mazzy (10). |
![]() |
#4 |
Участник
|
Цитата:
Сообщение от ax_mct
![]() Правильно так
X++: public boolean runsImpersonated() { // false means that the batch must run on a client. return false; } Не очень понятна фраза "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." Спасибо, попробую порыть в этом направлении. |
|
![]() |
#5 |
Участник
|
Цитата:
Сначала ответь на поставленный вопрос, потом обзирай. Цитата:
Сообщение от ax_mct
![]() Правильно так
X++: public boolean runsImpersonated() { // false means that the batch must run on a client. return false; } Во-первых, этот метод работает только начиная с 2009, где ввели таски в пакетном задании. Во-вторых, похоже, этот метод требует минимум трех классов: = управляющий класс, который собственно и создает пакетное задание = клиентский класс для выполнения действий на клиенте = серверный класс для выполнения действий на сервере метод runsImpersonated() не решает задачу передачи данных с клиента на сервер. по-прежнему, можно передавать данные через таблицу, создавая тикет для сессии, и занимаясь обслуживанием сессионных данных (удаление устаревших, нумератор сессии, уникальность нумератора в случае отказов и т.п.) Мало того, этот метод сильно усложняет saveLast. Либо я чего-то кардинально не понимаю. Похоже, что для работы не обязательно создавать клиентский пакетник. Хотя и можно. Похоже, что клиентская таска может выполняться сразу после запуска, а не по расписанию.Тут пока много непонятного. Кто-нибудь ходил этим путем? Есть рекомендации? ============ пока вариант с двумя классами и со свойством runOn кажется более простым. там только одна сложность - как передать расписание запуска второму классу и сбросить эти параметры с первого. Последний раз редактировалось mazzy; 01.06.2019 в 14:07. |
|
|
За это сообщение автора поблагодарили: ax_mct (2). |
![]() |
#6 |
Banned
|
Цитата:
Если это одна операция и просто нужен код работающий на сервере то это можно и так сделать. В рамках одного и того же RunBaseBatch. Если это несколько операций и у нас есть отдельные независимые RunBaseBatch которые должны быть запущены последовательно то на ум приходит то что называется batch task когда мы ручками создаем строки в Batch tasks и определяем Conditions. Это требует canGoBatchJournal = true и особенностей вызова параметров у RunBaseBatch. ![]() Но вот как эти Batch tasks работают с legacy client RunBaseBatch - не знаю. По идее должны. |
|
![]() |
#7 |
Участник
|
Цитата:
Что непонятно в исходной формулировке? Что непонятно в исходном вопросе? Цитата:
Сообщение от mazzy
![]() Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте? |
|
![]() |
#8 |
Участник
|
оставлю отдельным сообщением:
|
|
![]() |
#9 |
Banned
|
Цитата:
Сообщение от mazzy
![]() Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте? Сейчас правильный способ видится таким: * разбить процесс на два runBaseBatch класса: первый будет иметь свойство RunOn=Client, второй - RunOn=Server * первый в методе run должен будет выполнить клиентские действия, создать второй класс на сервере и передать ему параметры и данные Но что-то как-то слишком сложно. Очень напоминает overprogramming. Может существует другой способ? -Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. -Как и куда правильно вставить действия, которые должны выполняться на клиенте Непонятно почему запуск клиентского RunBaseBatch (оставленный как legacy) когда клиент работает как пакетный сервер не покрывает все три условия. В исходном вопросе непонятно зачем нужен второй RunBaseBatch на сервере. Каким путем? Клиентский пакетник создает серверный пакетник и передает ему параметры и данные? Дык если нужен последующий пакетник то речь об BatchTasks. А если просто вызов серверного кода в том же запуске то о том и речь что пакетник то зачем. Грубо например BlbBlaServer::runOnServer(Args, DataReferenceParmId) Я тупой ![]() |
|
![]() |
#10 |
Участник
|
Думаю, нет. Практически всегда практически для любого решения так обще поставленной задачи можно придумать случай, когда оно будет неправильным а правильным другое.
Цитата:
Обрати внимание, что вопрос был НЕ "можно ли", а "как"?
|
|
Теги |
как правильно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|