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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.07.2006, 12:00   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
RecordSortedList forUpdate
Как-то можно присобачить RecordSortedList, чтобы хранить записи, с возможностью их последующего обновления?

делаю вот-так:

Код:
    ttsbegin;
    loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.selectForUpdate(true);
        table1.FieldCheckBox = NoYes::Yes;
        table1.update();

        loop = _recSortedList.next(table1);
    }
    ttscommit;
Вылетает стандартное сообщение об ошибке, что запись не выбиралась на обновление, используйте ttsbegin/ttscommit и выбирайте запись для обновления.

Как сие починить?
Старый 18.07.2006, 12:20   #2  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Я эту проблему решал так:
- удалял из сорт листа запись (которую надо обновить)
- обновлял курсор записи
- вставлял запись в сорт лист
ttsbegin/ttscommit не нужны - работа идет с памятью а не с БД

Или можно еще курсор таблицы объявить временным, Table.SetTmp() и работать с ним как с сорт листом, в таком случае и update() будет возможен.
Старый 18.07.2006, 12:20   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
А что мешает сделать так?:
X++:
loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.FieldCheckBox = NoYes::Yes;
        _recSortedList.ins(table1, true);
        loop = _recSortedList.next(table1);
    }
Правда не знаю насколько корректно при выборке сразу же пихать туда записи, однако - можно сделать копию RecordSortedList и работать с ней

2 e@gle: Удалять записи необязательно, если новая запись заведомо (настроен параметр sortOrder) заменит исходную запись
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 18.07.2006 в 12:23.
Старый 18.07.2006, 12:28   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Похоже я плохо объяснил.
У меня есть набор записей (грубо говоря, RecId), которые мне нужно обновить - проставить, допустим, галку в поле FieldCheckBox (для всех записей из RSL)

Именно обновить, в БД.

А после этого мне RSL уже не нужен.
То есть, я не хочу заново перевыбираться запись из таблицы и при этом ее обновить.

Возможно, я просто плохо понимаю работаю с RecordSortedList.
insertDatabase() - он обновит записи? или попрбует их вставить?

И вообще, у меня этот объект на клиенте, там insertDatabase() делать нельзя. Ну, это не проблема вообще - можно перенести и на сервер.
Старый 18.07.2006, 12:45   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от kashperuk
Возможно, я просто плохо понимаю работаю с RecordSortedList.
insertDatabase() - он обновит записи? или попрбует их вставить?
Попробует вставить новые
__________________
Isn't it nice when things just work?
Старый 18.07.2006, 13:10   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Более того, попробовал написать вот так:
Код:
    ttsbegin;
    loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.selectForUpdate(true);
        table1.MarginDocuReceived = NoYes::Yes;
        _recSortedList.ins(table1, true);

        loop = _recSortedList.next(table1);
    }

    loop = _recSortedList.first(table1);
    //Вот здесь в дебаггере видим, что table1 выбрана для обновления (в Watch Recid = 2323322, forUpdate)
    while (loop)
    {
        table1.update();
        //Но все равно вот здесь вылетает та же ошибка
        loop = _recSortedList.next(table1);
    }
    ttscommit;
Старый 18.07.2006, 13:12   #7  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от kashperuk
Похоже я плохо объяснил.
У меня есть набор записей (грубо говоря, RecId), которые мне нужно обновить - проставить, допустим, галку в поле FieldCheckBox (для всех записей из RSL)

Именно обновить, в БД.

А после этого мне RSL уже не нужен.
То есть, я не хочу заново перевыбираться запись из таблицы и при этом ее обновить.
Попробуй после доставания из листа и перед record.update() вставить record.skipTTSCheck(true)
Если транзакция одна и курсор из которого набивались записи в лист был forupdate, то никаких глюков не будет

Последний раз редактировалось db; 18.07.2006 в 13:14.
Старый 18.07.2006, 14:11   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
а если так :
Добавляем в глобал статический метод, а затем при работе с RecordSortedList просто вызываем этот метод с уже переданной отредактированной записью.

Он сам перевыберет из базы обновит значения и запишет.

Одно неудобство - метод предполагает что есть индекс по RecId - иначе очень долго выборка пойдет. Ну это можно довинтить...

PHP код:
  // использовать только если есть 100 %-я уверенность что данные выбранные вне транзакции не изменились
static void updateInTransaction(common _commonboolean _doUpdate false)
    {
        
common  locCommon;
        
SysDictTable    locSysDictTable;
        ;
        
locCommon null;
        
locSysDictTable = New SysDictTable(_common.TableId);
        if (!
locSysDictTable)
            return;

        
locCommon locSysDictTable.makeRecord();

        
ttsBegin;
        
select ForUpdate locCommon
        where
            locCommon
.RecId   == _common.RecId// &&
            // locCommon.TableId == _common.TableId;
        
if (locCommon.recID)
        {
            
buf2buf(_commonlocCommon);

            if (
_doUpdate)
                
locCommon.doUpdate();
            else
                
locCommon.update();
        }
        
ttsCommit;
    } 
Старый 18.07.2006, 14:32   #9  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Logger
а если так :
Добавляем в глобал статический метод, а затем при работе с RecordSortedList просто вызываем этот метод с уже переданной отредактированной записью.

Он сам перевыберет из базы обновит значения и запишет.

Одно неудобство - метод предполагает что есть индекс по RecId - иначе очень долго выборка пойдет. Ну это можно довинтить...
Ну вы блин даете

Курсор это не какая то волшебная конструкция, которая обновляет запись непонятным образом минуя SQL. Когда вы пишете update(), то просто генерится команда update .. set .. where критерии по уникальному индексу. У каждой таблицы аксапты есть уникальный индекс, даже если он явно не указан (аксапта создаст его сама, приделав RecId к какому нибудь индексу или просто создаст индекс по RecId)

Соответсвенно вышеописанный способ с глобальным методом попытка закодить то что уже в ядре и так есть

Про forupdate. Сервер БД не запрещает выбирать записи без forupdate, а потом изменять их. Это лишь определяет момент наложения блокировки - сразу при выборке или потом при обновлении. Кому интересно - читайте доки по вашей СУБД

Авторы аксапты решили (начиная с 3.0) что хорошим тоном будет являться накладывать блокировку сразу при выборке. Поэтому и появилась проверка на транзакцию и на forupdate. Но возможность выключить проверку осталась - skipTTSCheck(true)
Старый 18.07.2006, 14:32   #10  
Red Stranger is offline
Red Stranger
Участник
 
102 / 19 (1) ++
Регистрация: 01.04.2005
Цитата:
Сообщение от kashperuk
Как-то можно присобачить RecordSortedList, чтобы хранить записи, с возможностью их последующего обновления?

делаю вот-так:

Код:
    ttsbegin;
    loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.selectForUpdate(true);
        table1.FieldCheckBox = NoYes::Yes;
        table1.update();

        loop = _recSortedList.next(table1);
    }
    ttscommit;
Вылетает стандартное сообщение об ошибке, что запись не выбиралась на обновление, используйте ttsbegin/ttscommit и выбирайте запись для обновления.

Как сие починить?
Если я правильно понял Вашу проблему, то
Код:
    ttsbegin;
    loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.selectForUpdate(true);
        table1.reread();
        table1.FieldCheckBox = NoYes::Yes;
        table1.update();

        loop = _recSortedList.next(table1);
    }
    ttscommit;
Старый 18.07.2006, 14:45   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от db
Когда вы пишете update(), то просто генерится команда update .. set .. where критерии по уникальному индексу. У каждой таблицы аксапты есть уникальный индекс, даже если он явно не указан (аксапта создаст его сама, приделав RecId к какому нибудь индексу или просто создаст индекс по RecId)

Соответсвенно вышеописанный способ с глобальным методом попытка закодить то что уже в ядре и так есть
Мне кажется вы невнимательно прочитали мое сообщение.
Проблема может возникнуть при выборке по условию
locCommon.RecId == _common.RecId;
Старый 18.07.2006, 14:56   #12  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Logger
Мне кажется вы невнимательно прочитали мое сообщение.
Проблема может возникнуть при выборке по условию
locCommon.RecId == _common.RecId;
Может я действительно чего не втыкаю, тогда пжл проясните

У Вас в методе, если запись по RecId не нашлась, то ничего и не делается. В стандарте сформируется SQL команда Update с критериями по уникальному индексу. Если в базе к тому моменту записи с такими критериями не будет, то update просто "пролетит" мимо - результат то же самый - ничего не изменится
Старый 18.07.2006, 15:42   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от db
Может я действительно чего не втыкаю, тогда пжл проясните

У Вас в методе, если запись по RecId не нашлась, то ничего и не делается. В стандарте сформируется SQL команда Update с критериями по уникальному индексу. Если в базе к тому моменту записи с такими критериями не будет, то update просто "пролетит" мимо - результат то же самый - ничего не изменится
Я имел в виду что если нет индекса по RecId, то запрос с фильтром по RecId будет медленно работать. В каком виде уходит запрос на сервер привыполнении Update() - я не обсуждал.

А вообще изначально этот код был написан чтоб не делать большую транзакцию при обрбаотке здоровой таблицы.
Я попробовал использщовать для обсуждаемой задачи.

db, а почему вы так агрессивно реагируете на сообщения ? На вас тут никто не наезжал. Погода хорошая... В чем дело-то ?
Старый 18.07.2006, 16:32   #14  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Logger
db, а почему вы так агрессивно реагируете на сообщения ? На вас тут никто не наезжал. Погода хорошая... В чем дело-то ?
Извините, никого не хотел обижать

А, насчет агрессивно. Хм. Если бы видели мою агрессивную реакцию, то поняли бы что в данной ситуации я просто молчу ... Характер у меня такой, стервозный Спросите, например, у Recoilme. Он видел
Старый 18.07.2006, 16:48   #15  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Cool db - аццкий сотона, однако(-)
(-)
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 18.07.2006, 18:59   #16  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Angry
Цитата:
Сообщение от Red Stranger
Если я правильно понял Вашу проблему, то
Код:
    ttsbegin;
    loop = _recSortedList.first(table1);
    while (loop)
    {
        table1.selectForUpdate(true);
        table1.reread();
        table1.FieldCheckBox = NoYes::Yes;
        table1.update();

        loop = _recSortedList.next(table1);
    }
    ttscommit;
Неа, не помогло. Хотя, думал, что могло.

Ну, уже не суть важно

Забил, и сделал через Set - правда теперь приходится искать запись перед обновлением - по RecId, индекс по RecId есть, так что довольно быстро.

Всем спасибо
Старый 28.08.2006, 16:37   #17  
poul is offline
poul
Участник
 
16 / 11 (1) +
Регистрация: 11.08.2006
столкнулся с такой же проблемой... следующий вариант мне помог
Table1 table1;
Table1 table1update;
...
ttsbegin;
for (loop = _recSortedList.first(table1); loop; loop = _recSortedList.next(table1))
{
table1update.selectForUpdate(true);
table1update.data(table1);
table1update.FieldCheckBox = NoYes::Yes;
table1update.update();
}
ttscommit;
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Осторожно. RecordSortedList учитывает регистр символов Logger DAX: Программирование 9 23.01.2009 15:39
Как узнать по объекту RecordSortedList, из какой таблицы в нем записи? gl00mie DAX: Программирование 4 20.02.2008 15:39
axStart: RecordSortedList Blog bot DAX Blogs 0 21.12.2007 04:11
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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