информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Pascal] Проверь корректность заполнения FieldDefs... Я сегодня пробовал, всё работает. 18.11.03 10:53  Число просмотров: 1445
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
<programming>
[Pascal] Delphi7. Как ClientDataSet отвязать от провайдера? 17.11.03 07:02  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
По необходимости перелез на 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... После этого должны поехать (лыжи ;-))
[Pascal] Результаты: 18.11.03 10:46  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Трейсю: после входа в SavetToFile вызывает GetActive и выскакивает из процедуры, поскольку оно естессно "не эктив" и не могет быть "эктив", т.к. нету прова.

> После того, как заполнил FieldDefs вызови CreateDataSet, а
> потом сделай SaveToFile... После этого должны поехать (лыжи
> ;-))

Пытаюсь сделать.
CreateDataSet вылетает по ексепшну с ообщением "поле такое-то (не первое!) не найдено!". Копаю дальше.
[Pascal] Проверь корректность заполнения FieldDefs... Я сегодня пробовал, всё работает. 18.11.03 10:53  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
[Pascal] Через Ж..., причем по всем кишкам последовательно 19.11.03 09:16  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Короче, трабла была с несоответствием сырца и DCU-хи. Надо было:

-создать пустой датасет
-задать филддефсы
-вызвать Create Dataset из контекстного меню (а не ф-цию в тексте!)


Вот, такой, вот черезжопинг!
[Pascal] Не знаю, не знаю... Выравниваем кишку (внутри)... :) 19.11.03 10:09  
Автор: 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
<"чистая" ссылка>

> Ну как бы то что ты сохранишьописаниялукапных полей —
> ничего плохогов этом нет.

Да и как? В филддефсе и типа такого данных нет!
[Pascal] Это не Лукап! Круче: 24.11.03 14:04  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Покуда я юзаю только Автоинк и Стринг - все нормально, но стоит создать поле типа Date...
[Pascal] ftDate «нехороший» тип данных ;-) Попробуй заюзать ftDateTime... 24.11.03 14:21  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
[Pascal] П-ц, однако! 25.11.03 05:02  
Автор: 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
И далее - после каждого изменения.

Вот, так - и пишет и читает и активирует.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach