03.05.2012, 08:18 | #1 |
HAI; CAN HAS STDIO?
|
отладка AX2012
отлаживаю проект в AX2012, не я писал.
новая форма, какие-то временные таблицы. по идее пользователь должен выбрать несколько записей на форме и они вставятся как misc charges к определённой строке PurchLine. делаю, нажимаю ОК, получаю ошибку типа "Cannot edit a record in Purchase order lines (PurchLine). An update conflict occurred due to another user process deleting the record or changing one or more fields in the record." хорошо, делаю как сделал бы в 2009, ставлю брейкпойнт в классе Info в методе add чтобы узнать, откуда ноги растут. дебаггер ловит брейкпойнт, но в стеке самый нижний метод это PurchLine.Update()! не вызывается же update() на таблице сам по себе? ясно что я пойду длинным путём и посмотрю, что же в коде происходит на этой форме, которая не работает. но почему в дебаггере не видно, откуда вызывается update() на PurchLine??? исполнение бизнес-логики в CIL отключено.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
03.05.2012, 08:51 | #2 |
Участник
|
|
|
03.05.2012, 09:05 | #3 |
Участник
|
|
|
03.05.2012, 09:33 | #4 |
Сам.AX
|
Может там update_recordset/RecordSortedList используется, или что то подобное?
Вот этот способ должен помочь.
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам." Поль Валери Последний раз редактировалось driller; 03.05.2012 в 10:28. |
|
03.05.2012, 18:42 | #5 |
Британский учённый
|
Я такую картину видел при рекурсии. Т.е. если методы вызываются повторно, то они не дублируются в стеке, а перемещаются наверх списка.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
04.05.2012, 06:33 | #6 |
HAI; CAN HAS STDIO?
|
посмотрел, что там делается на самом деле, а вызов там очень простой: update_recordset.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
01.03.2019, 22:36 | #7 |
Banned
|
|
|
02.03.2019, 05:28 | #8 |
Участник
|
|
|
02.03.2019, 21:58 | #9 |
Участник
|
Буквально на днях делал Job для обновления PurchLine, и тоже заметил эту ошибку Пытался решить через:
X++: while select forUpdate purchLine { .... purchLine.update(); } Помог вот такой код: X++: while select pessimisticLock purchLine { .... purchLine.update(); } |
|
13.03.2019, 16:31 | #10 |
Участник
|
I would use reread if I were you.
|
|
13.03.2019, 18:45 | #11 |
Участник
|
But, I was me and you were you
|
|
15.03.2019, 15:28 | #12 |
Участник
|
Конкретно для строк закупок проблема связана с модулем хранения версий закупок. Всякие PurchTableVersion, PurchTableHistory, PurchLineHistory...
Там может получиться так, что при обновлении первой строки закупки будет установлен признак IsModified для всех остальных строк этой же закупки. В результате и получаем конфликт обновления Т.е., во-первых, ошибка "плавающая". Может быть, а может не быть. Во-вторых, первая строка всегда обновляется корректно. Проблема возникает при обновлении второй строки. Точнее, той порции строк, которые Axapta считывает "за раз" в свой кеш. И тут только reread() помогает PS: Посмотрел, где же я на это натыкался. Ситуация обратная. Признак IsModifed снимается у всех строк вот в этом методе \Classes\VersioningPurchaseOrder\archivePurchLine Соответственно, можно во все циклы по PurchLine добавлять условие X++: if (purchLine.IsModified)
{
purchLine.reread();
}
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 15.03.2019 в 15:55. |
|
|
|