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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.09.2021, 12:02   #1  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
Передача датасорса в класс (пакетный режим)
Добрый день!

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

При запуске класса table.datasource() = null
Если formdatasource попытаться запаковать через array, то на prompt все останавливается без ошибок.
Пересобрать formdatasource тоже невозможно (либо я не понимаю как).
Ну и если отдельно сохранить queryRun и markRecords, то в queryRun нет возможности получить значение по порядковому номеру.

Есть какая то возможность реализовать передачу, чтобы не запускать предварительное формирование set на клиенте?
Старый 20.09.2021, 12:17   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Я правильно понимаю, что вы можете собрать RecId выделенных записей и сохранить их в Set, (который легко пакуется/распакуется), не не хотите этого делать? Если да, то что не так с использованием Set-a?
Старый 20.09.2021, 12:20   #3  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
Проблема в том, что set будет формироваться на клиенте, т.е. пользователю придется ждать пока он сформируется. По возможности хотелось бы все перенести на сервер.
Старый 20.09.2021, 12:30   #4  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
А каким образом пользователи вручную помечают столько записей, что даже просто считать их стандартной конструкцией типа

X++:
for (custTable = _formDS.getFirst(true);
         custTable;
         custTable = _formDS.getNext())
    {
занимает слишком много времени?

Они сначала фильтруют записи в гриде, а потом кликают в верхнем левом углу, чтобы выделить всё? Тогда уж надо запрос из формы копировать, а не выделенные записи.
Старый 20.09.2021, 12:43   #5  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
В общем случае функция запускается по 1-2 записям и на клиенте она отрабатывает достаточно быстро.
Но раз в определенный промежуток времени выделяется большой объем (последний раз было более 100к).

Хотелось сделать единый входящий параметр и максимально уменьшить время ожидания пользователя.
Просто раз это можно делать на клиенте, то подумал что и на сервере должно быть не сложно.
Старый 20.09.2021, 12:48   #6  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от DesparioN Посмотреть сообщение
... выделяется большой объем (последний раз было более 100к)...
Каким образом? Что конкретно делает пользователь руками, чтобы выделить 100к записей?
За это сообщение автора поблагодарили: vmoskalenko (5), Pandasama (2).
Старый 20.09.2021, 13:10   #7  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
"сначала фильтруют записи в гриде, а потом кликают в верхнем левом углу, чтобы выделить всё"
Старый 20.09.2021, 13:14   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Я бы тогда разделил 2 функции "Обработать все" и "Обработать выделенное". Под "все" подразумеваются все записи с учетом фильтра. Ну и обучил бы пользователей - что Обработать все работает быстрее, чем Обработать выделенное. На появление кнопки, которая "работает быстрее" - пользователи обычно легко ведутся
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Stitch_MS (2).
Старый 20.09.2021, 14:52   #9  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
Понятно, что есть альтернативные варианты решения.
Меня заинтересовало можно ли в каком то виде передать именно formdatasource.
Старый 20.09.2021, 15:50   #10  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Датасорс "жив", пока "жива" его форма. Стоит пользователю закрыть форму - и нет датасорса. Поэтому передавать датасорс с выделенными 100к записями просто чревато. Это не говоря уже о том, что пакетный режим по определению не должен зависеть от пользовательской сессии, а только от данных в базе.
Старый 20.09.2021, 17:17   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от DesparioN Посмотреть сообщение
Проблема в том, что set будет формироваться на клиенте, т.е. пользователю придется ждать пока он сформируется. По возможности хотелось бы все перенести на сервер.
Если вас так волнует, что пользователи будут ждать заполнения Set на клиенте, не давайте им вообще выделять записи через Grid - пусть запускают нечто (периодическую операцию, например) и через штатный механизм фильтрации (кнопка Выбор, расширенный фильтр, все дела) отбирают записи, подлежащие обработке. Крыжить записи на форме - это для случаев, когда записей мало, а критерии выбора трудно формализуемы. Если пользователи отфильтровывают записи и потом выделяют их все, то это - избыточный шаг, они даже не видят все записи, которые хотят обработать, потому что на форму для отрисовки Grid тянется лишь несколько десятков записей из выборки.
Выделять все записи для обработки через Grid - это все равно что слать в СУБД запрос на выбор 100500 записей, получать их по сети, потом куда-то там сохранять их уникальные идентификаторы, передавать их обратно по сети в СУБД и слать запрос "обнови как записи вот с такими идентификаторами таким-то образом". Так ведь никто с СУБД не работает - все стараются сразу послать запрос "обнови таким-то образом записи, которые удовлетворяют таким-то критериям".
Тем более это актуально в случае пакетной обработки: обычно форму клиент открывает на одном сервере, а пакетная обработка запускается на другом, и между ними нужно передать данные, что именно следует обрабатывать. В этом плане запаковать запрос с критериями фильтрации проще и быстрее, чем запаковать Set/Map с идентификаторами каждой записи.

Если же записей обычно немного, то посмотрите на штатный подход передачи их с формы в класс-обработчик - FormLetter::getFormRecord().
За это сообщение автора поблагодарили: dn (6), sukhanchik (4), Manner (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передача нескольких датасорсов формы в класс обработчик Start DAX: Программирование 5 06.11.2015 23:02
Передача нескольких строк в класс smailik DAX: Программирование 4 30.08.2013 11:28
Старая песня про Excel и пакетный режим jonny DAX: Программирование 4 19.07.2012 14:45
Пакетный режим vs Excel Proktolog DAX: Программирование 5 28.12.2008 14:21
передача переменной из класса в класс fialka DAX: Программирование 3 11.01.2007 10:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:13.