Форум: "Базы";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c