|
![]() |
#1 |
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). |
![]() |
#2 |
Участник
|
Цитата:
Сообщение от 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." Спасибо, попробую порыть в этом направлении. |
|
![]() |
#3 |
Участник
|
Цитата:
Сначала ответь на поставленный вопрос, потом обзирай. Цитата:
Сообщение от 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). |
![]() |
#4 |
Banned
|
Цитата:
Если это одна операция и просто нужен код работающий на сервере то это можно и так сделать. В рамках одного и того же RunBaseBatch. Если это несколько операций и у нас есть отдельные независимые RunBaseBatch которые должны быть запущены последовательно то на ум приходит то что называется batch task когда мы ручками создаем строки в Batch tasks и определяем Conditions. Это требует canGoBatchJournal = true и особенностей вызова параметров у RunBaseBatch. ![]() Но вот как эти Batch tasks работают с legacy client RunBaseBatch - не знаю. По идее должны. |
|
![]() |
#5 |
Участник
|
Цитата:
Что непонятно в исходной формулировке? Что непонятно в исходном вопросе? Цитата:
Сообщение от mazzy
![]() Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте? |
|
![]() |
#6 |
Участник
|
оставлю отдельным сообщением:
|
|
![]() |
#7 |
Banned
|
Цитата:
Сообщение от mazzy
![]() Предположим у нас есть RunBaseBatch.
Он делает что-то тяжелое. Мы конечно же хотим сделать так, чтобы он мог работать на пакетном сервере. Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. Как и куда правильно вставить действия, которые должны выполняться на клиенте? Сейчас правильный способ видится таким: * разбить процесс на два runBaseBatch класса: первый будет иметь свойство RunOn=Client, второй - RunOn=Server * первый в методе run должен будет выполнить клиентские действия, создать второй класс на сервере и передать ему параметры и данные Но что-то как-то слишком сложно. Очень напоминает overprogramming. Может существует другой способ? -Но этот класс забирает данные из какого-нибудь файла, который находится на клиенте. -Как и куда правильно вставить действия, которые должны выполняться на клиенте Непонятно почему запуск клиентского RunBaseBatch (оставленный как legacy) когда клиент работает как пакетный сервер не покрывает все три условия. В исходном вопросе непонятно зачем нужен второй RunBaseBatch на сервере. Каким путем? Клиентский пакетник создает серверный пакетник и передает ему параметры и данные? Дык если нужен последующий пакетник то речь об BatchTasks. А если просто вызов серверного кода в том же запуске то о том и речь что пакетник то зачем. Грубо например BlbBlaServer::runOnServer(Args, DataReferenceParmId) Я тупой ![]() |
|
Теги |
как правильно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|