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

Вниз

Simple ClientDataSet   Найти похожие ветки 

 
EugeneP ©   (2004-01-19 13:11) [0]

Добрый день,
подскажите, plz, как лучше сделать (и почему не работает):
изначально надо было получить данные из DataSet в ClientDataSet, отсоединиться от источника данных, редактировать данные только в ClientDataSet, а потом его руками преобразовать в SQL комманды (insert/update).
Трабла получилась в том, что не получается редактировать содержимое ClientDataSet (ради эксперимента через простейший грид), так как все поля в ClientDataSet - ReadOnly. Пробовал менять руками FieldDefs - не помогает (дает редактировать, но вываливаетя при Post).
Подскажите, мож я неправильно настроил ClientDataSet, у меня уже никаких вариантов не осталось... Заранее спасибо


 
MV   (2004-01-19 14:02) [1]

Ну, вот рабочий пример - формируем набор данных, грузим его в клиентский набор, потом сжимаем его и выгружаем в файл...
------------------------

var dtTable : TpFIBDataSet;
cdsTable : TClientDataSet;
i : integer;
dtSize : Integer;
cmpStream : TCompressionStream;
memStream : TMemoryStream;
memCmpStream : TMemoryStream;
SavedCursor : TCursor;
begin
dtTable := TpFIBDataSet.Create(Self);
cdsTable := TClientDataSet.Create(Self);
memStream := TMemoryStream.Create;
memCmpStream := TMemoryStream.Create;
cmpStream := TCompressionStream.Create(clMax, memCmpStream);
SavedCursor := Cursor;
Cursor := crSQLWait;

try
lblMsg.Caption := "Загрузка данных ...";
dtTable.Database := fDM.dbMain;
dtTable.Transaction := fDM.dbMain.DefaultTransaction;
dtTable.SelectSQL.Text := SqlString;
dtTable.Open;

// Копируем структуру данных
cdsTable.FieldDefs.Assign(dtTable.FieldDefs);

// Добавляем поле Old_Ключевой_ID - для обработки в Import - модуле
cdsTable.FieldDefs.Add("OLD_" + dtTable.Fields[0].FieldName, ftInteger);

cdsTable.CreateDataSet;

while not dtTable.Eof do begin
cdsTable.Insert;
for i := 0 to dtTable.Fields.Count - 1 do // Значения полей
cdsTable.FieldByName(dtTable.Fields[i].FieldName).Value :=
dtTable.Fields[i].Value;
cdsTable.Post;
dtTable.Next;
lblMsg.Caption := "Выборка - запись №" + IntToStr(cdsTable.RecordCount);
Application.ProcessMessages;
end;

lblMsg.Caption := "Упаковка - символов:" + IntToStr(cdsTable.DataSize);
lblMsg.Caption := "Выборка";
Application.ProcessMessages;
cdsTable.SaveToStream(memStream,dfBinary); // Данные - в память
memStream.Position := 0;

lblMsg.Caption := "Сжатие";
Application.ProcessMessages;
cmpStream.CopyFrom(memStream, memStream.Size); // Сжать и в файл
FreeAndNil(cmpStream); // Для освобождения буфера сжатого потока и
// правильного его позиционирования
dtSize := memCmpStream.Size;

lblMsg.Caption := "Экспорт";
Application.ProcessMessages;
OutputFile.Write(dtSize, SizeOf(dtSize));

memCmpStream.Position := 0;
OutputFile.CopyFrom(memCmpStream, dtSize);
finally
dtTable.Free;
cdsTable.Free;
if Assigned(memStream) then FreeAndNil(memStream);
if Assigned(memCmpStream) then FreeAndNil(memCmpStream);
if Assigned(cmpStream) then FreeAndNil(cmpStream);
Cursor := SavedCursor;
end;

end;


 
MV   (2004-01-19 14:11) [2]

Ой, пардон - редактировать надо было...

Ну, вот настройки в .dfm - вроде ничего нет особенного:

object cdsDataSet: TClientDataSet
Aggregates = <>
Params = <>
Left = 112
Top = 65534
end

Редактирую так, например:

cdsDataSet.First; // К примеру
cdsDataSet.Edit;
cdsDataSet.FieldByName("OLD_CLIENT_ID").AsInteger :=
cdsDataSet.FieldByName("Client_Id").AsInteger;
cdsDataSet.Post;

И все...



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

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

Наверх




Память: 0.47 MB
Время: 0.019 c
1-29460
Eugenio
2004-01-30 09:00
2004.02.10
Отловить скроллинг StringGrid-а


14-29575
alxx
2004-01-14 10:57
2004.02.10
Кто-нибудь подключал КПК через ИК GPRS к мегафону?


14-29613
Думкин
2004-01-19 06:14
2004.02.10
С днем рождения! 19 января.


3-29255
Burafchick
2004-01-18 22:51
2004.02.10
Как установить QReport в Delphi 7


1-29414
Боян Георгиев
2004-01-31 11:42
2004.02.10
F1Book дает ошибка! Помогите