|
|
|
|
#1 |
|
Участник
|
Ниччего не получается
![]() Хочу сделать так, чтобы у отмеченных записей инвертировалось логическое поле 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 помещать внутрь цикла - не помогло. Помогите, пожалуйста. |
|
|
|
|
#2 |
|
Участник
|
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(); } P.S.: Если вы работает не просто с табличным курсором, а с источником данных, то у вас также есть возможность использовать метод fds.write(), который сам управляет транзакциями и отображением изменений. |
|
|
|
| За это сообщение автора поблагодарили: Geo (1). | |
|
|
#3 |
|
Участник
|
Огромное спасибо! Работает!
![]() И не говорите. Тыкаюсь, как слепой котенок... Пора, наверное, уже отойти от попыток освоения АХ методом медитирования над непонятным кодом, и что-нибудь почитать. Цитата:
А он (журнал баз данных) настроен на протоколирование изменений Archives таблицы PurchReqTable?
... Можно еще вопрос, вдогонку? ![]() С Вашим кодом, после отработки, в форме обновляется только одна запись (текущая), а не все выделенные. Чтобы все обновились, надо куда-нибудь нажать, при этом сбрасывается выделение. Но если поставить в конце вызов info("1"), например - то сразу все обновляются, и без сброса выделения. Как можно добиться этого без окошка инфолога? Я пробовал повесить *_ds.reread() и *_ds.refresh() на метод clicked() контрола - не помогло. |
|
|
|
|
#4 |
|
Участник
|
Цитата:
Методы _ds.reread() и _ds.refresh() в принципе обновляют только активную запись. Была попытка обновить каждую запись вызывая эти методы из цикла, но вот в чём дело: метод fds.getNext() хоть и возвращает курсор связанный со следующей записью, но активной её не делает. Не уверен, но попробуйте вместо fds.refresh(); сделать X++: purchReqTableLocal.dataSource().reread() purchReqTableLocal.dataSource().refresh() X++: fds.refreshEx(purchReqTableLocal) |
|
|
|
|
|