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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2011, 02:11   #1  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Ниччего не получается

Хочу сделать так, чтобы у отмеченных записей инвертировалось логическое поле Archives. Сделал метод вот такой:
X++:
public static void main(Args _args)
{
    FormRun         fr;
    FormDatasource  fds;
    PurchReqTable   purchReqTableLocal;
    ;

    if(!_args)
        throw error("Класс должен быть вызван с параметрами!");
    else
    {
        fr = _args.caller();
        //info(fr.name());

        if (fr)
        {
            fds = fr.dataSource();

            ttsbegin;
            for (purchReqTableLocal = fds.getFirst(true) ? fds.getFirst(true) : fds.cursor(); purchReqTableLocal; purchReqTableLocal = fds.getNext())
            {
                purchReqTableLocal.Archives = !purchReqTableLocal.Archives;
                purchReqTableLocal.doUpdate();
            }
            ttscommit;
            
            // делаем проверку, изменилось ли содержимое:
            for (purchReqTableLocal = fds.getFirst(true) ? fds.getFirst(true) : fds.cursor(); purchReqTableLocal; purchReqTableLocal = fds.getNext())
            {
                info(strfmt("%1, %2", purchReqTableLocal.PurchReqId, purchReqTableLocal.Archives));
            }
        }
    }
}

Не работает!
"Проверка" проходит нормально, отображаются правильные ключи отмеченных записей с правильным (как бы новым) значением изменяемого поля. Но записи реально не изменяются (убедился через журнал базы данных). При этом, если не отмечать несколько записей, а запускать для просто текущей - оно работает.
Пробовал ttsbegin и ttscommit помещать внутрь цикла - не помогло.

Помогите, пожалуйста.
Старый 11.02.2011, 08:53   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Cтранно что этот код вообще работает. Вы же НЕ блокируете курсор для обновления. Попробуйте перед изменением курсора перевыбрать его.
А ещё для того чтобы изменения отображались на форме нужно обновить(refresh) источник данных
X++:
for (purchReqTableLocal = fds.getFirst(true) ? fds.getFirst(true) : fds.cursor(); purchReqTableLocal; purchReqTableLocal = fds.getNext())
{
    ttsbegin;
    purchReqTableLocal.selectForUpdate(true);
    purchReqTableLocal.reread()
    purchReqTableLocal.Archives = !purchReqTableLocal.Archives;
    purchReqTableLocal.doUpdate();
    ttscommit;
    fds.reread();
    fds.refresh();
}
Цитата:
Сообщение от Geo Посмотреть сообщение
записи реально не изменяются (убедился через журнал базы данных)
А он (журнал баз данных) настроен на протоколирование изменений Archives таблицы PurchReqTable? Проверяйте лучше напрямую (обозревателем таблиц) в самой таблице PurchReqTable.

P.S.: Если вы работает не просто с табличным курсором, а с источником данных, то у вас также есть возможность использовать метод fds.write(), который сам управляет транзакциями и отображением изменений.
За это сообщение автора поблагодарили: Geo (1).
Старый 11.02.2011, 11:54   #3  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Огромное спасибо! Работает!

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Cтранно что этот код вообще работает.
И не говорите. Тыкаюсь, как слепой котенок...
Пора, наверное, уже отойти от попыток освоения АХ методом медитирования над непонятным кодом, и что-нибудь почитать.

Цитата:
А он (журнал баз данных) настроен на протоколирование изменений Archives таблицы PurchReqTable?
Да, настраивал, чтобы застраховаться от гипотетического изменения полей обратно при возвращении в форму.

...
Можно еще вопрос, вдогонку?
С Вашим кодом, после отработки, в форме обновляется только одна запись (текущая), а не все выделенные. Чтобы все обновились, надо куда-нибудь нажать, при этом сбрасывается выделение. Но если поставить в конце вызов info("1"), например - то сразу все обновляются, и без сброса выделения.

Как можно добиться этого без окошка инфолога? Я пробовал повесить *_ds.reread() и *_ds.refresh() на метод clicked() контрола - не помогло.
Старый 11.02.2011, 12:21   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Geo Посмотреть сообщение
после отработки, в форме обновляется только одна запись (текущая), а не все выделенные.
Кажется понял почему не работает обновление.
Методы _ds.reread() и _ds.refresh() в принципе обновляют только активную запись. Была попытка обновить каждую запись вызывая эти методы из цикла, но вот в чём дело: метод fds.getNext() хоть и возвращает курсор связанный со следующей записью, но активной её не делает.

Не уверен, но попробуйте вместо fds.refresh(); сделать
X++:
purchReqTableLocal.dataSource().reread()
purchReqTableLocal.dataSource().refresh()
Ещё есть метод refreshEx(), который обновляет не текущую позицию, а заданную в параметре. Вроде бы даже так должно работать
X++:
fds.refreshEx(purchReqTableLocal)
Странно, но аналога для reread - rereadEx() нет.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Вывод в форме "Авансовый отчет" (EmplAdvTable_RU) полей из EmplTable Zepp DAX: Программирование 5 20.06.2007 15:44
Как в форме CustTrans через query отобрать записи у которых AmountCur != 0 ( когда в QueryBuildRange ставишь value(strFmt('!0')); - не работает!) rkorchagin DAX: Программирование 12 02.04.2007 17:58
Как из формы Form2 обновить записи на форме Form1? Hidden DAX: Функционал 15 24.05.2005 11:53
Уже существующий query подложить под форму или отчет? somebody DAX: База знаний и проекты 6 27.05.2003 15:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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