Оказывается Create Dataset из контекстного меню надо вызывать, как минимум, дважды!
Первый раз, когда в FildDefs'ах опишешь сохраняемые поля.
Затем только создаешь поля (Add All Fields) и добавляешь вручную лукапы. (Без Create Dataset Add All Fields не работает!)
После этого - снова Create
И далее - после каждого изменения.
По необходимости перелез на Delphi. Теперь мучаюсь вопросом, как отвязать ClientDataSet от провайдера. Суть в том, что мне надо создать "пустой" датасет, набить его данными вручную и сохранить в файл.
А эта тварь требует, чтобы у датасета был провайдер, а у провайдера (если я такового создаю) - датасет! Т.е. : "Сепулька - см. Сепулькарий. Сепулькарий см. Сепулька."
[Pascal] Delphi7. Как ClientDataSet отвязать от провайдера?18.11.03 11:16 Автор: Cyril <sc> Статус: Member
> По необходимости перелез на Delphi. Теперь мучаюсь > вопросом, как отвязать ClientDataSet от провайдера. Суть в > том, что мне надо создать "пустой" датасет, набить его > данными вручную и сохранить в файл. > > А эта тварь требует, чтобы у датасета был провайдер, а у > провайдера (если я такового создаю) - датасет! Т.е. : > "Сепулька - см. Сепулькарий. Сепулькарий см. Сепулька." странно что не получилось, так как предлагал HandleX
попробуй сделать так
Бросаем на форму ClientDataSet, Table
Datasource и DBGrid - чтобы сразу проверить, что все получилось
DataSource.Dataset := Clientdataset
DBGrid.datasource := Datasource
Table.TableName := местоположение файла с данными(например к-л dbf)
Table.TableType := тип файла
Table.Active := True;
После этого, нажимаем правой кнопкой на ClientDataSet
и выбираем Assign Local Data
открывается окно, где указываем в качестве источника Table
В DbGridе должны отобразиться данные таблицы
После этого можно сохранить данные в файл
нажав правую кнопку на ClientDataSet и выбрав SavetoFile
[Pascal] Как, как... Как обычно в Borland'е — через %опу ;-)17.11.03 10:05 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 17.11.03 10:11 Количество правок: 2
> По необходимости перелез на Delphi. Теперь мучаюсь > вопросом, как отвязать ClientDataSet от провайдера. Суть в > том, что мне надо создать "пустой" датасет, набить его > данными вручную и сохранить в файл.
Хе-х... Почитай справку по свойству Active... Там рассказывается порядок, как TClientDataset заполняется данными...
Потом почитай справку как работать с TClientDataset
Потом «Using a client dataset with file-based data» ;-)))
Из всего этого чтива я сделал такие выводы:
Для пустого TClientDataset надо сперва сконструировать поля данных... Можно через FieldDefs, можно «занять» их у другого TDataSet...
Потом сохранить их в пустой файл методом SaveToFile. В этом файле данных не будет, но будет описание полей ;-)
Ну а дальше ты вроде как понял — если нет Data Provider'a, то будет юзаться файл данных. Его надо указать, конечно же.
Вроде так, в справке там дохрена чего написано.
[Pascal] Чегой-то не лызе... (файл не пишется)18.11.03 03:15 Автор: Zef <Alloo Zef> Статус: Elderman
> > По необходимости перелез на Delphi. Теперь мучаюсь > > вопросом, как отвязать ClientDataSet от провайдера. > Суть в > > том, что мне надо создать "пустой" датасет, набить его > > данными вручную и сохранить в файл. > > Хе-х... Почитай справку по свойству Active... Там > рассказывается порядок, как TClientDataset заполняется > данными... > > Потом почитай справку как работать с TClientDataset > Потом «Using a client dataset with file-based data» ;-))) > > Из всего этого чтива я сделал такие выводы: > Для пустого TClientDataset надо сперва сконструировать поля > данных... Можно через FieldDefs, можно «занять» их у > другого TDataSet... > Потом сохранить их в пустой файл методом SaveToFile. В этом > файле данных не будет, но будет описание полей ;-) > > Ну а дальше ты вроде как понял — если нет Data Provider'a, > то будет юзаться файл данных. Его надо указать, конечно же. > > Вроде так, в справке там дохрена чего написано.
Сделал все вышеописанное, а пустой файл не пишется. Не ругается, но и не пишет...
Я, конечно, дальше и сам поковыряю, только трейсить-то в кодах придется, это же не VC, сырцов не прилагается. Так, что, если знаещь, в чем дело, подскажи...
[Pascal] Чегой-то не лызе... (файл не пишется)18.11.03 09:58 Автор: HandleX <Александр М.> Статус: The Elderman
> Сделал все вышеописанное, а пустой файл не пишется. Не > ругается, но и не пишет... > > Я, конечно, дальше и сам поковыряю, только трейсить-то в > кодах придется, это же не VC, сырцов не прилагается. Так, > что, если знаещь, в чем дело, подскажи...
После того, как заполнил FieldDefs вызови CreateDataSet, а потом сделай SaveToFile... После этого должны поехать (лыжи ;-))
Трейсю: после входа в SavetToFile вызывает GetActive и выскакивает из процедуры, поскольку оно естессно "не эктив" и не могет быть "эктив", т.к. нету прова.
> После того, как заполнил FieldDefs вызови CreateDataSet, а > потом сделай SaveToFile... После этого должны поехать (лыжи > ;-))
Пытаюсь сделать.
CreateDataSet вылетает по ексепшну с ообщением "поле такое-то (не первое!) не найдено!". Копаю дальше.
[Pascal] Проверь корректность заполнения FieldDefs... Я сегодня пробовал, всё работает.18.11.03 10:53 Автор: HandleX <Александр М.> Статус: The Elderman
> Короче, трабла была с несоответствием сырца и DCU-хи. Надо > было: > > -создать пустой датасет > -задать филддефсы > -вызвать Create Dataset из контекстного меню (а не ф-цию в > тексте!) > > Вот, такой, вот черезжопинг!
Смотри, вот как у меня... Работает!
procedure TForm1.Button1Click(Sender: TObject);
Var cData: TClientDataSet;
begin
cData := TClientDataSet.Create(Self);
Try
cData.FileName := 'C:\test.xml';
cData.FieldDefs.Add('FirstField', ftString, 20);
cData.FieldDefs.Add('SecondField', ftInteger);
cData.CreateDataSet;
cData.SaveToFile('', dfXML); //Проверь, создан ли файл... У меня создан...
Finally
cData.Free;
End;
end;
---
[Pascal] Продолжение спектакля:24.11.03 11:29 Автор: Zef <Alloo Zef> Статус: Elderman
Короче, все сделал, и все записывлось. Только одна отсебятинка: В нек-рых датасетах после CreateDataset добавил в Филд Едите лукапные поля (естессно, в ФилдДефсах их нет - мне же их сохранять не надо).
В таком виде все компилится и работает, пока я не пытаюсь грузиться из сохраненного файла. При загрузке валится с сообщением "Mismatch data packet". При этом те сеты, в к-рых поля и дефсы совпадают, грузятся нормально. Попытка грузить таблицы в "порядке лукапности" не помогает.
Можно, конечно сотворить дополнительные сеты с лукапами, для к-рых через прова подключить загружаемые сеты без лукапов.
А короче пути нет? Типа: часть полей сделать загружаемыми/сохраняемыми, а лукапные - нет.
[Pascal] Всё правильно :)24.11.03 14:12 Автор: HandleX <Александр М.> Статус: The Elderman
> В нек-рых датасетах после CreateDataset > добавил в Филд Едите лукапные поля (естессно, в ФилдДефсах > их нет - мне же их сохранять не надо). > В таком виде все компилится и работает, пока я не пытаюсь > грузиться из сохраненного файла. При загрузке валится с > сообщением "Mismatch data packet". При этом те сеты, в > к-рых поля и дефсы совпадают, грузятся нормально. Попытка > грузить таблицы в "порядке лукапности" не помогает. > > Можно, конечно сотворить дополнительные сеты с лукапами, > для к-рых через прова подключить загружаемые сеты без > лукапов. > > А короче пути нет? Типа: часть полей сделать > загружаемыми/сохраняемыми, а лукапные - нет.
Ну как бы то что ты сохранишьописаниялукапных полей — ничего плохогов этом нет. Чем потом их восстанавливать вручную, может просто считать их схемы данных (сохранённого файла)? TClientDataset не дурак, и лукапныезначенияв файл писать не будет ;-)
[Pascal] Не сохраняю я описания лукапов!25.11.03 04:37 Автор: Zef <Alloo Zef> Статус: Elderman
Похоже, это какой-то глюк компилера (визуализатора), состоящий в том, что в pas, dfm & dcu при внесении изменений в существующие поля происходит рассинхронизация. Например: Создаю датасет, объявляю в филддефсах 2 поля - автоинк и стринг, вызываю креэйт (из меню), создаю на основе дефсов оба поля (Add All Filds). Пишет и читает!
Стираю датасет. Создаю новый с тем же именем. Добавляю деф для поля Дата. (Порядок действий тот же) При Add All Filds орет: Нет поля "Дата"! Но поле, тем не менее создает. В .cds его пишет. Но при попытке чтения - падает.
То же самое, но датасет создаю с другим именем. Работает!!! И пишет и читает!
[Pascal] Разобрался. Резюме: "Долгая дорога в %опу"25.11.03 06:59 Автор: Zef <Alloo Zef> Статус: Elderman
Оказывается Create Dataset из контекстного меню надо вызывать, как минимум, дважды!
Первый раз, когда в FildDefs'ах опишешь сохраняемые поля.
Затем только создаешь поля (Add All Fields) и добавляешь вручную лукапы. (Без Create Dataset Add All Fields не работает!)
После этого - снова Create
И далее - после каждого изменения.