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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.09.2021, 10:03   #1  
oleggy is offline
oleggy
Участник
 
256 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А потом - select * from common.
А как сделать select для common таблицы?
Если известна recId записи и tableId этой таблицы.
Подскажите подход.

Цитата:
Сообщение от SRF Посмотреть сообщение
Можно сделать примерно так, но получите дополнительное чтение в БД.

X++:
ttsbegin;
_common.selectForUpdate(true); 
_common.reread();
_common.(_fieldId) = _value;
_common.doUpdate();
ttscommit;
К сожалению не сработало.
Старый 02.09.2021, 10:09   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от oleggy Посмотреть сообщение
К сожалению не сработало.
А что значит не сработало?
Осталась та же самая ошибка? Появилась новая? Запись не обновилась?

Приведённый код точно рабочий. Пользуюсь таким давно. Проблем замечено не было
Старый 02.09.2021, 10:21   #3  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А что значит не сработало?
Осталась та же самая ошибка? Появилась новая? Запись не обновилась?

Приведённый код точно рабочий. Пользуюсь таким давно. Проблем замечено не было
Да, такая же ошибка, я проверил, для таблиц с OCCEnabled = No, reread не помогает, для них надо делать новый запрос в БД, видимо текущий курсор изменить уже нельзя, а нужно создавать новый.
__________________
Sergey Nefedov
Старый 02.09.2021, 10:33   #4  
oleggy is offline
oleggy
Участник
 
256 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Получилось только так:

X++:
static void job123(Args _args)
{
	...
	void updateFieldValue(Common _common, FieldId _fieldId, anytype _value)
	{
                DictField   dictField;
                DictTable   dictTable = new DictTable(_common.tableId);
                Common      common;
                ;
		...
		try
		{
			ttsBegin;
			common = dictTable.makeRecord();
			common.selectForUpdate(true);
			select common
				where common.RecId == _common.RecId;
			common.(_fieldId) = _value;
			ttsCommit;
		}
		catch
		{
			ttsAbort;
		}
		...
	}
	...
	;
	
	...
	updateFieldValue(APMParameters::find(), fieldnum(APMParameters, Field1), valueField1);
	...
}
За это сообщение автора поблагодарили: sukhanchik (2), SRF (1).
Старый 02.09.2021, 10:40   #5  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А при такой конструкции ошибка ?

X++:
ttsbegin;
_common.selectForUpdate(true); 
select _common where _common.recid == _common.recId;
_common.(_fieldId) = _value;
_common.doUpdate();
ttscommit;
__________________
Sergey Nefedov
Старый 02.09.2021, 10:12   #6  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А попробуйте вместо reread сделать

select _common where _common.recid == _common.recId;
__________________
Sergey Nefedov
Старый 02.09.2021, 10:41   #7  
oleggy is offline
oleggy
Участник
 
256 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от SRF Посмотреть сообщение
А попробуйте вместо reread сделать
select _common where _common.recid == _common.recId;
Причем этот запрос не работал. Та же ошибка.

Потом я создал локальную common и написал так.
X++:
select common 
    where common.TableId == _common.TableId 
        && common.RecId == _common.RecId;
И тоже не сработало. Что странно. Я в common не силен. Запись не выбиралась почему то.
Старый 02.09.2021, 10:56   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ну надежды на то что сработает условие _common.recid == _common.recId нет и не может быть. Это как масло масленое. А то что common нужно инициализировать (типизировать) перед использованием в принципе логично. Иначе система не будет знать к какой таблице делать запрос и дополнительно условие по TableId здесь не спасает (в SQL нет такого понятия как запрос сразу ко всем таблицам).

Не понятно почему не сработал reread
За это сообщение автора поблагодарили: SRF (2).
Старый 02.09.2021, 12:31   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ну надежды на то что сработает условие _common.recid == _common.recId нет и не может быть. Это как масло масленое
Хотя никто не запрещает сделать так
X++:
recId = _common.recid;
select forupdate _common where _common.recid == recId;

И по сути это тоже самое что и _common.reread(). Интересно сработает?

Последний раз редактировалось S.Kuskov; 02.09.2021 в 12:36.
Старый 03.09.2021, 09:22   #10  
oleggy is offline
oleggy
Участник
 
256 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Хотя никто не запрещает сделать так
X++:
recId = _common.recid;
select forupdate _common where _common.recid == recId;
И по сути это тоже самое что и _common.reread(). Интересно сработает?
Сегодня решил проверить. Да сработало.

После этого решил проверить:
X++:
_common.reread()
И сработало. Я не поверил ведь вчера оно не срабатывало.
Зашел на другой терминал, начал выполнять - не сработало. Вернулся на первоначальный терминал и теперь и там не работает.

Потом решил проверить это:
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ну надежды на то что сработает условие _common.recid == _common.recId нет и не может быть. Это как масло масленое.
Все работает. Не знаю почему она вчера у меня не отрабатывала. Сегодня работает.

После этого я снова решил проверить:
X++:
_common.reread()
И снова заработало. Очень странно.

Последний раз редактировалось oleggy; 03.09.2021 в 09:24.
Старый 03.09.2021, 09:35   #11  
oleggy is offline
oleggy
Участник
 
256 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Я понял из за чего ошибка генерируется у меня.
Данный код отрабатывает корректно:
X++:
ttsBegin;
select forupdate _common
	where _common.recid == _common.recid;
_common.(_fieldId) = _value;
_common.doUpdate();
ttsCommit;
Если я сразу его меняю на:
X++:
ttsBegin;
_common.selectForUpdate(true);
_common.reread();
_common.(_fieldId) = _value;
_common.doUpdate();
ttsCommit;
Код так же продолжает корректно работать.
Если я в коде убираю _common.reread(), т.е. хочу сгененрировать ошибку:
X++:
ttsBegin;
_common.selectForUpdate(true);
//_common.reread(); // <-- убираю
_common.(_fieldId) = _value;
_common.doUpdate();
ttsCommit;
Естественно возникает эта ошибка. И если я снова возвращаю:
X++:
ttsBegin;
_common.selectForUpdate(true);
_common.reread(); // <-- возвращаю
_common.(_fieldId) = _value;
_common.doUpdate();
ttsCommit;
ошибка не пропадает а остается.
Помогает снова обойти эту ошибку изменение кода на:
X++:
ttsBegin;
select forupdate _common
	where _common.recid == _common.recid;
_common.(_fieldId) = _value;
_common.doUpdate();
ttsCommit;
Добавлю что речь про AX09.

Последний раз редактировалось oleggy; 03.09.2021 в 09:40.
Старый 02.09.2021, 11:26   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,282 / 3491 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от oleggy Посмотреть сообщение
А как сделать select для common таблицы?
Если известна recId записи и tableId этой таблицы.
Подскажите подход.
Вариант 1
X++:
TableId     myTableId;
RecId       myRecId;
DictTable  dictTable = new DictTable(myTableId);
Common  myRecord;

myRecord = dictTable.myRecord();
select myRecord
where myRecord.RecId == myRecID;
Вариант 2
X++:
TableId     myTableId;
RecId       myRecId;
Query       query;
QueryBuildDataSource qbds;
QueryRun                     qr;

query = new Query();
qbds = query.addDataSource(myTableId);
qbds.addRange(fieldnum(Common, RecId)).value(queryvalue(myRecId));
qr = new QueryRun(query);
if (qr.next())
{
      myRecord = qr.getNo(1);
}
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 02.09.2021 в 11:33.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX2009 странный баг, в любой форме отображается только 1-я запись oleggy DAX: Администрирование 4 24.06.2021 21:30
Невозможно выбрать запись, ...База данных SQL обнаружила ошибку actNaturally DAX: Администрирование 4 11.12.2014 12:56
axforum blogs: Ошибка обновления Организации при установке UpdateRollup Blog bot DAX Blogs 0 11.04.2013 20:11
Не корректно сохраняет запись в inventTable Starling DAX: Программирование 8 31.03.2008 15:30
Ошибка при импорте демоданных (Axapta 3.0 CIS SP1) KocDm DAX: Администрирование 2 11.08.2005 12:04

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:53.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.