Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.16;
Скачать: CL | DM;

Вниз

Снятие аттрибута ReadOnly с полей в TClientDataSet   Найти похожие ветки 

 
Rem ©   (2003-12-18 17:11) [0]

Проблема вот в чем:
- данные через TADOQuery запрашиваются из БД; запрос связанный - из нескольких таблиц;
- через TDataSetProvider (локальный) данные передаются в TClientDataSet
ClientDataSet.SetProvider(Provider);
ClientDataSet.Open;
- и в результате у TClientDataSet некоторые поля имеют аттрибут ReadOnly, так как обратная их запись невозможна (они вытянуты первичным запросом из других таблиц)

Установка ReadOnly := false для ClientDataSet и полей не помогает, так как это свойство установлено у курсора более низкого уровня. Интерфейс доступа к данным IDSBase напрочь отказывается это делать.

И при попытке изменить эти поля выскакиевает Exception "Can"t modify read-only field".

Для чего это надо? Загруженные единожды данные хранятся в памяти компбьютера и периодически обновляются: периодически считывается изменившаяся(иеся) строка(и) из БД - и переписывается(ются) в ClientDataSet для отображения пользователю.

Может, кто в курсе, что делать? Заранее благодарен!


 
Rem ©   (2003-12-18 17:55) [1]

И?...


 
Polevi ©   (2003-12-18 17:58) [2]

не очень хороший вариант, но на крайний случай можешь пошаманить с ClientDataset.XmlData - убрать оттуда тег ридонли и присвоить другому ClientDataset.XmlData


 
Mik Prokoshin   (2003-12-19 06:43) [3]

Сними ReadOnly у полей нижележащей таблицы. Но получишь потом проблемы при записи таблиц в БД.


 
Rem ©   (2003-12-19 14:11) [4]

2 Mik Prokoshin

Они не снимаются, в том то и дело. Как ADO, так и ClientDataSet работают с данными через COM, а интерфесы наборов данных не позволяют снимать этот аттрибут, ругаются.

Но я все же решил эту проблему. ClientDataSet использует два интерфеса: DSBase - для хранения данных, и DSCursor - для доступа к данным. И как раз DSCursor не позволяет записывать данные в свои ReadOnly поля. А DSBase это все равно. Поэтому можно получить прямой доступ к данным через интерфейс DSBase:

var
Packet: TDataPacket;

UpdateDS.DSBase.StreamDS(Packet);
if BaseDS.Locate("Код", a_sID, []) then
begin
BaseDS.DSCursor.GetRecordNumber(iRecNum);
BaseDS.DSBase.RefreshRecords(Packet, iRecNum, 0, nil);
end
else
BaseDS.DSBase.AppendData(Packet, true);


Правда, после обновления/записи данных надо вручную обновить курсор. Но это уже просто:

BaseDS.UpdateCursorPos;
BaseDS.Resync([]);


Так что вот как-то так... Спасибо всем!... :)



Страницы: 1 вся ветка

Текущий архив: 2004.01.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
1-49500
Gnom
2004-01-03 17:30
2004.01.16
редактирование текста


1-49483
Blacklord2003
2003-12-28 15:22
2004.01.16
Как сделать подсветку синтаксиса в TRichEdit


6-49671
Sadya
2003-11-14 11:26
2004.01.16
No such host known


1-49590
men
2004-01-05 14:24
2004.01.16
edit


1-49501
IgoX
2004-01-03 20:31
2004.01.16
DBGRID & POPUPMENU