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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.02.2010, 17:37   #1  
AxTimur is offline
AxTimur
Участник
 
21 / 11 (1) +
Регистрация: 08.08.2008
Grid+Ctrl+MouseDown как поймать событие ?
Хотелось бы при выборе на GRID-е нескольких записей ловить событие снятие или установки выбора
Старый 25.02.2010, 17:40   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
какая то странная задача, а по подробней можно?
изначально что нужно? возможно это решается более простым путем
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 25.02.2010, 17:51   #3  
AxTimur is offline
AxTimur
Участник
 
21 / 11 (1) +
Регистрация: 08.08.2008
Post
X++:
for (_DocuCard = DocuCard_ds.getFirst(true)? DocuCard_ds.getFirst(true): DocuCard_ds.cursor();
         _DocuCard;
         _DocuCard = DocuCard_ds.getNext())
{
...........
}
мне надо заранее знать что попадает в этот цикл. А по поводу задачи ... слишком много слов ) без обид
Старый 25.02.2010, 17:59   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AxTimur Посмотреть сообщение
X++:
for (_DocuCard = DocuCard_ds.getFirst(true)? DocuCard_ds.getFirst(true): DocuCard_ds.cursor();
         _DocuCard;
         _DocuCard = DocuCard_ds.getNext())
{
...........
}
мне надо заранее знать что попадает в этот цикл. А по поводу задачи ... слишком много слов ) без обид
ну ок
по поводу грида, и определения, что выделено, а что нет, я насчет таких возможностей не слышал.. да и не понятно как например опеределить, закончил человек выделять или нет...

что приходит в голову:
1. выполнить цикл for по дата сору дважды, первый раз для того что вам нужно для проверки, второй раз, для непосредственно выполнения.
2. выполнить этот цикл один раз, заполнить по нему временную таблицу. и далее на основе данных временной таблице выполнять все нужные операции.

по мне лучше второй вариант

З.Ы. может конечно для ваших целей, ни то, ни другое не подойдет.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 25.02.2010, 19:07   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от lev Посмотреть сообщение
1. выполнить цикл for по дата сору дважды, первый раз для того что вам нужно для проверки, второй раз, для непосредственно выполнения.
Поддерживаю! В одной своей задачке с целью предотвращения выгрузки в Excel гигантского количества данных - так что потом ни сохранить, а если и сохранить, то не открыть получившийся файл - не далее, как сегодня, влупил такой фрагмент с двойным пробегом:
X++:
    cntAll=0;    // первоначальный подсчёт записей
    for ( common = gridDataSource.getFirst(1) ? gridDataSource.getFirst(1) : gridDataSource.cursor();
          common ;
          common = gridDataSource.getNext() )
    {
        cntAll++;
    }

    // эмпирически подобранная формула, исходя из размера файла примерно 20 МБ (грубо 20 млн. байт)
    cntRecommended = decRound(20000000. / sumBytes * 4.,-2); // округляем до сотен

    cntFrom = 1;

    // если записей очень много, то предложение вывести в несколько подходов
    if (cntAll > cntRecommended)
    {
        dialog = new Dialog('Слишком много записей для вывода');

        dialogText = dialog.addText(strFmt('Запрошенная выборка содержит %1 записей. ' +
            'Вывод такого количества записей за один раз может привести к проблемам ' +
            'при сохранении и последующем открытии получившегося файла Excel.\n\n' +
            'Однако, Вы можете выгрузить все данные несколькими порциями, ' +
            'запуская процедуру выгрузки несколько раз ' +
            'и каждый следующий раз увеличивая значения в полях "От записи" и "до записи" на размер порции. ' +
            'Рекомендуемый сейчас размер порции - %2 записей. ' +
            'Поэтому рекомендуется установить 1 и %2 для первой выгрузки, %3 и %4 - для второй и т.д.\n\n' +
            'Вы также можете задавать границы порций, исходя из своих собственных соображений.\n\n' +
            'ВАЖНО! Перед многоразовой выгрузкой следует отсортировать строчки таблицы заявок по возрастанию кодов заявок ' +
            'и не менять этот порядок до окончания всего процесса! Если Вы не уверены, что уже выполнили такую сортировку - ' +
            'нажмите "Отмена" и начните еще раз.'
            , cntAll, cntRecommended, cntRecommended+1, cntRecommended*2));

        dialogText.displayHeight(21);
        dialogText.displayLengthValue(50);

        dialog.addGroup('Вывести в Excel').columns(2);
        dialogFrom = dialog.addFieldValue(Types::Integer, 1, 'От записи');
        dialogTo = dialog.addFieldValue(Types::Integer, cntRecommended, 'до записи');

        dialog.run();
        if (! dialog.closedOk())
            return;

        cntFrom = dialogFrom.value();
        cntTo   = dialogTo  .value();
    }

    cnt=0; // ПОВТОРНЫЙ (основной) ПРОБЕГ по датасорсу
    for ( common = gridDataSource.getFirst(1) ? gridDataSource.getFirst(1) : gridDataSource.cursor();
          common ;
          common = gridDataSource.getNext() )
    {
        cnt++;
        if (cntAll > cntRecommended)
        {
            if ((cnt < cntFrom) || (cnt > cntTo)) continue;
        }

        if (cnt mod 100 == 0) print strFmt('Уже выведены записи с %1 по %2', cntFrom, cnt);

    .......................................
    }
sumBytes - некоторый условный суммарный размер записи в байтах, подсчитанный по длинам строк, инты - 4 байта, даты и реалы - по 8, енумы - по длине максимальной метки. Литерал 4 (или 0.25) - экспериментально подобранный множитель, учитывающий отклонение теории от практики.

Вот какая картинка возникает через пару минут (отработка первого цикла) при выделении всех записей грида без фильтрации:

Название: TooManyRecords.JPG
Просмотров: 481

Размер: 44.3 Кб

Возможно, не очень оптимально, но я доволен. И по мне - так лучше потратить лишние пару минут, чем ринуться сразу выводить 56 тыщ строк по 130 (!) колонок. С другой стороны, пользователи очень не часто пытаются вывести всё имеющееся и "наказываются" таким сообщением. Обычные же выборки по паре-тройке тысяч записей практически не раздражают своей недолгой продолжительностью (пусть и с двойным пробегом).
За это сообщение автора поблагодарили: sukhanchik (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Filter-by-Grid Blog bot DAX Blogs 2 30.05.2012 13:39
Dynamics AX: DAX 4.0 Filter by Grid [Update] Blog bot DAX Blogs 0 27.04.2007 17:10
Advanced programming: Grid data and view manipulations batiskaf_new DAX: Программирование 15 21.06.2006 11:44
Сохранение настроек GRID (ширина и порядок колонок) liza DAX: Программирование 1 25.07.2003 22:20

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

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

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