|
02.09.2021, 10:03 | #1 |
Участник
|
А как сделать select для common таблицы?
Если известна recId записи и tableId этой таблицы. Подскажите подход. К сожалению не сработало. |
|
02.09.2021, 10:09 | #2 |
Участник
|
|
|
02.09.2021, 10:21 | #3 |
Участник
|
Да, такая же ошибка, я проверил, для таблиц с OCCEnabled = No, reread не помогает, для них надо делать новый запрос в БД, видимо текущий курсор изменить уже нельзя, а нужно создавать новый.
__________________
Sergey Nefedov |
|
02.09.2021, 10:33 | #4 |
Участник
|
Получилось только так:
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 |
Участник
|
А при такой конструкции ошибка ?
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 |
Участник
|
А попробуйте вместо reread сделать
select _common where _common.recid == _common.recId;
__________________
Sergey Nefedov |
|
02.09.2021, 10:41 | #7 |
Участник
|
Цитата:
Потом я создал локальную common и написал так. X++: select common where common.TableId == _common.TableId && common.RecId == _common.RecId; |
|
02.09.2021, 10:56 | #8 |
Участник
|
Ну надежды на то что сработает условие _common.recid == _common.recId нет и не может быть. Это как масло масленое. А то что common нужно инициализировать (типизировать) перед использованием в принципе логично. Иначе система не будет знать к какой таблице делать запрос и дополнительно условие по TableId здесь не спасает (в SQL нет такого понятия как запрос сразу ко всем таблицам).
Не понятно почему не сработал reread |
|
|
За это сообщение автора поблагодарили: SRF (2). |
02.09.2021, 12:31 | #9 |
Участник
|
Цитата:
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 |
Участник
|
Цитата:
После этого решил проверить: X++: _common.reread() Зашел на другой терминал, начал выполнять - не сработало. Вернулся на первоначальный терминал и теперь и там не работает. Потом решил проверить это: Цитата:
После этого я снова решил проверить: X++: _common.reread() Последний раз редактировалось oleggy; 03.09.2021 в 09:24. |
|
03.09.2021, 09:35 | #11 |
Участник
|
Я понял из за чего ошибка генерируется у меня.
Данный код отрабатывает корректно: 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; Последний раз редактировалось oleggy; 03.09.2021 в 09:40. |
|
02.09.2021, 11:26 | #12 |
Administrator
|
Цитата:
X++: TableId myTableId; RecId myRecId; DictTable dictTable = new DictTable(myTableId); Common myRecord; myRecord = dictTable.myRecord(); select myRecord where myRecord.RecId == myRecID; 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. |
|
|
|