20.11.2008, 11:50 | #1 |
Участник
|
Нельзя изменить изменено другим пользователем
Есть такая проблема в одной строке закупки(может и не одной, но покрайней мере в одной) не получается сменить поле подтверждено(дата).
Пишет, Цитата:
Сообщение (11:49:18)
Значение, введенное в поле "Подтверждено" таблицы "Строки закупки" ("18.11.2008") нельзя сохранить, поскольку оно изменено другим пользователем (новое значение - ""). Используйте функцию "Восстановить", чтобы подставить новое значение. Невозможно отредактировать запись в "Строки закупки" ("PurchLine"). Одно или более полей в записи изменено другим пользователем, или в форме выбраны не все поля. Воспользуйтесь функцией "Восстановить". В этой закупке одна строка. На таблице PurchLine изменил update. Вынес doupdate() повыше X++: public void update(boolean dropInvent = false) { PurchLineType purchLineType; ; this.doupdate(); //purchLineType = this.type(); //purchLineType.update(dropInvent); } AOC перезагружал. Мож кто сталкивался с подобным.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 20.11.2008 в 11:53. |
|
20.11.2008, 12:03 | #2 |
Участник
|
А функция "Восстановить" (тобишь, F5) не помогает?
__________________
Ivanhoe as is.. |
|
20.11.2008, 12:34 | #3 |
Участник
|
Посмотрите для этой записи значение поля RecVersion.
Если оно равно 0, то попробуйте изменить его на любое другое (в оснастке sql сервера)
__________________
Axapta v.3.0 sp5 kr2 |
|
20.11.2008, 12:35 | #4 |
Участник
|
Да, забыл написать: Ошибка появляется как раз на doupdate().
Пробовал. Но дело то не в этом. Я знаю я работаю один с этой записью. Код остался только в upadate(). Всё остальное что могло вызваться закоментировал.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 12:49 | #5 |
MCTS
|
Цитата:
Наиболее распространенная ошибка следующая: Пользователь пытается сохранить изменения -> при сохранении записи запускается цепочка методов write, update и т.д. -> в одном из методов есть find текущей записи и ее update() с использованием отдельной переменной -> соответственно, когда очередь доходит до сохранения курсора формы, запись уже была изменена в коде. -> Ядро считает, что запись изменена другим пользователем и выдает ошибку. Резюме: внимательно смотрите Ваш код, с 99% вероятностью ошибка аналогична описанной.
__________________
Dynamics AX Experience |
|
20.11.2008, 12:53 | #6 |
Участник
|
Цитата:
Но на этой ошибка воспроизводиться, а на других нет. У нас Oracle.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 13:01 | #7 |
Участник
|
А если не через интерфейс, а в коде поменять дату - получится?
__________________
Axapta v.3.0 sp5 kr2 |
|
20.11.2008, 13:17 | #8 |
Участник
|
Цитата:
А форму я писал, создал новую(чистую).
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 13:22 | #9 |
Участник
|
Кодом получилось.
Ситуация ушла. Теперь всё нормально меняется. Но интересно что же это было.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 13:22 | #10 |
MCTS
|
Для чистоты эксперемента лучше все-таки посмотреть со стороны Oracle, обновляется ли запись таблицы PurchLine до возникновения ошибки, или нет.
__________________
Dynamics AX Experience |
|
20.11.2008, 13:25 | #11 |
MCTS
|
А на методах modifiedField() на таблице и датасоурсе никакого кода не было?
__________________
Dynamics AX Experience |
|
20.11.2008, 13:28 | #12 |
Участник
|
Я думаю если я ещё раз скажу нет, вы мне не поверите
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 15:13 | #13 |
Участник
|
Вообщем чё оказалось.
В систему был добавлен новый тип документа по закупке. При разноске была написана такая штука. X++: _purchLine.ConfirmedDlv = priceDisc.deliveryDays() + _ReadyDate; priceDisc.deliveryDays() тип Days На входе date = 0, days = 14. Через отладчик и через Axapt-у ConfirmedDlv = 0 или пусто соответственно. Захожу в базу Oracle вижу там где дата действительно пустая 01.01.1900, а в нашей испорченой 15.01.1900. Поправил код X++: _purchLine.ConfirmedDlv = _ReadyDate ? priceDisc.deliveryDays() + _ReadyDate : _ReadyDate; Вот такой механизм ломания табличных строк. Странно что захотел воспроизвести пример на новой таблице. Создал таблицу с датой(тип PurchLineDlvDate) и job. X++: static void Job27(Args _args) { Table1 t1; date d; Days d1; ; d1 = 14; ttsbegin; t1.selectForUpdate(true); while select firstonly t1 { t1.TransDate = d1 + d; t1.update(); } ttscommit; } ... какая-то
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 20.11.2008 в 15:28. |
|
20.11.2008, 15:24 | #14 |
Участник
|
Можно воспроизвести эту ошибку (изменена другим пользователем).
Создать таблицу. Создать строку с пустой датой. Зайти в оракл исправить 01.01.1900 на 15.01.1900, и в Axapt-e попытаться сменить дату руками. Наслаждаемся ошибкой
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2008, 15:43 | #15 |
Участник
|
А можете посмотреть, какие запросы на сервер уходят?
__________________
Axapta v.3.0 sp5 kr2 |
|
20.11.2008, 16:13 | #16 |
Участник
|
Вот такой
X++: UPDATE PURCHLINE SET
CONFIRMEDDLV=:in1,
MODIFIEDDATE=:in2,
MODIFIEDTIME=:in3,
MODIFIEDBY=:in4,
RECVERSION=:in5
WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER(:in6)) AND (RECID=:in7))
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
|
|