|
Внешние источники данных IDENTITY_INSERT имеет значение OFF | ☑ | ||
---|---|---|---|---|
0
TeMochkiN
21.01.20
✎
14:56
|
Здравствуйте!
Платформа 8.3.15.1830 (x64) Хочу с помощью менеджера записи изменить значение одного поля, но выдается следующая ошибка: {ОбщийМодуль.ОбработчикиСобытий.Модуль(666)}: Ошибка при вызове метода контекста (Записать) ЗаписьТаблицыВнешнейБД.Записать(); по причине: Ошибка внешней базы данных: ошибка при выполнении запроса по причине: Ошибка ODBC. SQLSTATE: 23000 Номер ошибки: 544 Описание: [Microsoft][SQL Server Native Client 11.0][SQL Server]Невозможно вставить явное значение для столбца идентификаторов в таблице "build_main", когда параметр IDENTITY_INSERT имеет значение OFF. Собственно, вот кусок кода, где возникает ошибка: ЗаписьТаблицыВнешнейБД = ВнешниеИсточникиДанных.УчетВесовогоМатериала.Таблицы.ОсновнаяТаблицаУчета.СоздатьМенеджерЗаписи(); ЗаписьТаблицыВнешнейБД.НомерСтроки = СтрокаТЗ.НомерСтроки; ЗаписьТаблицыВнешнейБД.Прочитать(); ЗаписьТаблицыВнешнейБД.ЗагруженоВ1С = 1; ЗаписьТаблицыВнешнейБД.Записать(); Основные свойства таблицы: Тип данных таблицы внешнего источника данных - НеобъектныеДанные Поле ключа - НомерСтроки Только чтение - Ложь У всех столбцов, кроме "ЗагруженоВ1С", свойство Только чтение установлено в значение Истина Из-за чего может возникать ошибка? Я так понимаю, что сама ошибка говорит о том, что я якобы пытаюсь вставить новую строку с установленным значением ключевого поля. Почитал описание процедуры Записать(), там действительно написано, что изменение записи происходит путем удаления текущей записи и вставки новой измененной. Так а почему оно не работает тогда? Поле ключа ведь обозначено как только для чтения, зачем 1С его заполняет, по логике, должна добавиться новая запись, с новым ID, но этого не происходит. Но этого и не хотелось бы, хочется, чтобы обычный UPDATE по ключу сработал. Никто не знает как с этим разобраться? |
|||
1
МихаилМ
21.01.20
✎
15:19
|
это поле нумеруется субд автоматически при добавлении записи и запись в него запрещена.
|
|||
2
scanduta
21.01.20
✎
15:20
|
(0) Ну потому что IDENTITY_INSERT имеет значение OFF, а ты пытаешься изменить номер строки
|
|||
3
TeMochkiN
21.01.20
✎
15:21
|
(1) (2) я знаю, поэтому и выставил на все поля, в том числе ключевое, свойство только чтение в значение Истина, у меня для изменения разрешено только поле ЗагруженоВ1С
|
|||
4
ДенисЧ
21.01.20
✎
15:23
|
(3) Ну и что? Ты пытаешься руками заполнить поле IDENTITY. А это делать сильно не советуется.
|
|||
5
TeMochkiN
21.01.20
✎
15:24
|
(4) так я ж его заполнил, чтобы считать нужную запись
|
|||
6
ДенисЧ
21.01.20
✎
15:24
|
(5) Ну и что? IDENTITY, тупо по определению, заполняет сам сервер. И серверу наплевать, что ты там и где заполнил.
|
|||
7
TeMochkiN
21.01.20
✎
15:24
|
(4) а после считывания изменяю только то поле, которое можно редактировать
|
|||
8
TeMochkiN
21.01.20
✎
15:26
|
(6) хорошо, поставлю вопрос по-другому, как изменить конкретную запись в таблице внешнего источника? Менеджер записи для этого не подходит?
|
|||
9
ДенисЧ
21.01.20
✎
15:27
|
(8) SET IDENTITY_INSERT ON
|
|||
10
TeMochkiN
21.01.20
✎
15:34
|
в общем, просто update никак не сделать через внешние источники данных, верно?
ведь SET IDENTITY_INSERT ON можно использовать только подключившись через ADO? |
|||
11
scanduta
21.01.20
✎
15:37
|
Так не пробовал?
(10) https://wonderland.v8.1c.ru/blog/redaktirovanie-dannykh-vo-vneshnikh-istochnikakh/ Изменение данных При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь. Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля(). |
|||
12
TeMochkiN
21.01.20
✎
15:50
|
(11) вот я как раз для всех полей таблицы, кроме "ЗагруженоВ1С" и установил ТолькоЧтение = Истина, поэтому при изменении должно обновляться только поле "ЗагруженоВ1С"
УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля() работает для таблиц с объектными данными но я не пробовал через набор записей выполнить изменение. хотя, почитав описание, ожидаю тот же самый результат ВнешнийИсточникДанныхТаблицаНаборЗаписей.<Имя внешнего источника>.<Имя таблицы внешнего источника данных> (ExternalDataSourceTableRecordSet.<External source name>.<External data source table name>) Записать (Write) Доступен, начиная с версии 8.3.5. Синтаксис: Записать(<Замещать>) Параметры: <Замещать> (необязательный) Тип: Булево. Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям. Значение по умолчанию: Истина. Описание: Выполняет запись набора записей в базу данных внешнего источника данных. В зависимости от переданного параметра может быть выполнено добавление записей или замещение. Если указано замещение, то перед выполнением записи будет выполнено удаление всех существующих записей в соответствии с текущими установками отбора. Доступность: Сервер, толстый клиент, внешнее соединение. Использование в версии: Доступен, начиная с версии 8.3.5. |
|||
13
TeMochkiN
21.01.20
✎
15:50
|
при замещении опять не update делается, а delete и insert
|
|||
14
TeMochkiN
21.01.20
✎
15:51
|
походу, update никак не сделать через внешние источники данных
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |