2012-05-12 2 views
1

Я использую следующую цепочкуTClientDataSet ошибка «Попытка изменить поле только для чтения»

TADOQuerry->TDataSetProvider->TClientDataSet 

для меня данные для элементов и элементов ItemType таблицы и работать с ним в автономном режиме. Пункт SQL свойство TADOQuery не содержится простой запрос

select i.ID,i.Name, i.TypeID, i.Qnty, i.Price, it.TypeName 
from Items i join ItemType it on (it.ID = i.TypeID) 

ItemType даже проще:

select * from ItemType 

сейчас - для cdsItems я изменить TypeName поле, чтобы быть полем просмотровых и приковать его к cdsItemType - ничего необычного - и связал cdsItems с сеткой. Но когда я пытаюсь изменить данные с помощью combobox в сетке - это вызывает ошибку «Попытка изменить поле только для чтения».

Я установил для всех полей как TCliendDataSet ReanOnly: = false. Кроме того, после того, как я получил данные в TClientDataSets - используя for-I, я снова установил все поля ReadOnly: = False. Но даже я до сих пор получил «Попытка изменить поле только для чтения».

База данных - это MS SQL Server 2005 Express Edition.

+0

Вы пытались установить значение «только для чтения» на false в полях ADOQuery? –

+0

- как в дизайне, так и во время выполнения – DreadAngel

+0

Когда вы изменили поле TypeName в cdsItems в поле поиска, вы также изменили запрос, чтобы больше не включать поле TypeName? –

ответ

2

НАЙДЕНО!

Исправлена ​​ошибка, где находится в типе TypeId колонке GetItems запроса (ADOQuery типа) - когда я загрузил все поля в нем - TypeID, где добавляется в качестве TAutoIncField - когда я изменил его на TIntegerField - все идет хорошо.

+0

Удивительный ответ. Чтобы исправить мою проблему, я отредактировал как .pas, так и .dfm, чтобы переопределить определение TField как TIntegerField вместо TAutoIncField, чтобы Delphi позволял мне присваивать значения в поле TClientDataSet. Я имею в виду, почему я не могу этого сделать, если захочу !? – nolaspeaker