![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать поле в ClientDatSet [D7]
Вася © (2006-06-12 19:49:00)Всем здравствуйте!
Поскажите плиз как создать поле в ClientDataSet, че-то у меня никак не получается! Да и доку по вопросу не могу найти. Если знаете где данная тема освещается(ну типа ClientDataSet для "Чайников":) дйте ссылочку.
Заранее спасибо.
Johnmen (2006-06-15 17:57:00) [1]Индексы можно создать и использовать именно в компоненте TClientDataSet.
Индексы в файле не хранятся...
Вася (2006-06-15 17:12:00) [2]Вообщем насчет индексов я поспешил. Походу их там нету. Сдается мне все там примерно как в простом файле. Записи идут по порядку, только стоят определеннные пометки где начинается поле и где заканчивается. При перезаписи у датысет просто нет индекса чтоб поставить запись на прежнее место.
sniknik (2006-06-14 15:01:00) [3]> Получается что хоть и есть автоинкренментное поле Index он все равно заводит и свои индексные поля и по ним и
> сортирует.
автоинкрементное поле это только, и исключительно, автоинкрементное, ни функций индекса ни ключа (часто путают т.к. связка авто..+ключ часта, чуть ли не стандарт) не выполняет!
> И вообще почему отредатированные записи не пререписываются
[11] вполне правдоподобное обьяснение... хотя, так понимаю, логика не всех убеждает, а от пары проверок у них руки отваливаются... тогда по другому - "так написано, и не важно зачем, все одно не хочеш понимать. претензии к разработчикам". понятнее?
p.s. ты так и не сказал ГДЕ ты видиш индексы...
Вася (2006-06-14 11:02:00) [4]Ну все равно не понятно, как с этой фигней бороться. Получается что хоть и есть автоинкренментное поле Index он все равно заводит и свои индексные поля и по ним и сортирует. И вообще почему отредатированные записи не пререписываются, а добавляются в конец фаила, причем записи которые редакировали остаються неизменными на всем месте просто не отображаются.
sniknik (2006-06-14 08:40:00) [5]> Насчет индексов, индексы есть
где есть? в ClientDataSet? откуда знаеш?
> просто при загрузке сам порядок отображения записей меняется
вот это точно "гон", при сушествующем и установленом индексе, порядок задает он а не то когда запись редактировали.
> Но свойства sort у датасета я че-то не нашел.
говорил же, индекс... (причем там свойство индексфиелднемес по моему аналогично sort также автоматом его делает при отсутствии)
> На сечт log changes, программа не ругается, просто ничего не меняется.
а каких изменений ты хотел? и когда? после того как оно уже поменялось местами, устанавливай фалсе/труе... поздно. это только на, и в процессе действовать должно, при редактировании, записи, чтении, причем при отсутствии того же индекса установленного. и потом это же теоретически, "выведено" логическим путем из предположения что порядок при редактировании меняется, предположение почему возможно... вполне впрочем правдоподобное, если подумать как этот ClientDataSet может работать.
Вася (2006-06-14 01:43:00) [6]На сечт log changes, программа не ругается, просто ничего не меняется.
Вася (2006-06-14 01:37:00) [7]sniknik [11]. Все так и происходит как вы описали. Фаил переписывается и измененные поля добавляются в конец фаила с тем-же индексом, причем поля в которых мы проводили изменения тоже остаются, но при загрузке не отображаются, хотя в фаиле есть и стоят на том-же месте что и до редактирования. Пробовал поставить False у LogChanges, не помогло.
Насчет индексов, индексы есть, и они не нарушаются как был у первой записи индекс 1, так он и остается, просто при загрузке сам порядок отображения записей меняется, но целостность данных остается. Может их после загрузки просто сортировать по индексу да и все? Но свойства sort у датасета я че-то не нашел.
sniknik (2006-06-14 00:18:00) [8]а..., а на "рисунке" записи. думаю он "правильней".
Johnmen (2006-06-14 00:12:00) [9]
> sniknik © (14.06.06 00:01) [12]
Ты не понял - он же про порядок ПОЛЕЙ, а не ЗАПИСЕЙ...:)
sniknik (2006-06-14 00:03:00) [10]вернее, его (подобное поведение) можно обьяснить логикой.
sniknik (2006-06-14 00:01:00) [11]Johnmen © (13.06.06 23:33) [10]
почему гон? вполне возможно... допускаю во всяком случае подобное поведение, оно логично.
sniknik (2006-06-13 23:59:00) [12]вообщето номер по порядку записи нигде не гарантируется, кроме разве что самых простых файловых форматов, да и там проблемы, стоит наложить индекс и весь порядок сбивается.
если у тебя этот номер (1,2,3,4) в данных (поле под него создано, данные в нем) то просто сделай по нему индекс, это гарантия определенного индексом порядка.
или можно попробовать отключить логирование изменений (logchanges), так понимаю это изза них старые записи остаются, просто им меняется признак, а изменения делаются в копии с признаком "новая", и копия естественно добавляется к концу рекордсета.
Johnmen (2006-06-13 23:33:00) [13]1. cds файл содержит описание всех полей НД. Естественно, что при загрузке его будет сообщ.об ошибке об отсутствующих полях в файле cds, но присутствующих в ClientDataSet.
2. Насчёт редактирования ЗНАЧЕНИЙ полей, приводящего к " поля которые мы редактировавли добавляются в конец фаила" - это гон...:)
Вася (2006-06-13 23:24:00) [14]Имеется ПУСТОЙ дадасет, который загружет в себя выбранный пользователем *.cds файл. Вообщем-то создание поля можно и отложить, на данный момоент столкнулся с такой проблеммой. При загрузке файла в датасет он отображет все корректно, После редактирования полей и ClientDataSet.Post фаил сохраняется на диск, НО, после его загрузке, поля которые мы редактировавли добавляются в конец фаила. и высвечиваются не корректно. Например до редактирования
1. -----------
2.-----------
3-----------
4.----------, а после редактирования 1,3 и сохранения получается вот так:
2.----------
4.----------
1.----------
3.---------. Как этого избежать?
novill (2006-06-13 15:09:00) [15]Да, уже написали, надо пользоваться на fields, а fielddefs
sniknik (2006-06-13 11:17:00) [16]> А ты CreateDataset делал?
ну судя по всему он не создает новый, а получает его откудато.
sniknik (2006-06-13 11:16:00) [17]> при попытке активировать clientdataset он ругается со словами Field "моеполе" not found.
пытаешся создать поле не имеющее отражения(поля) в получаемом рекордсете? сделай его вычисляемым (Calculated). там же мышкой.
novill (2006-06-13 10:57:00) [18]
> Вася
А ты CreateDataset делал?
Ega23 (2006-06-13 10:57:00) [19]
FCDS:=TClientDataSet.Create(nil);
With FCDS do
begin
With FieldDefs.AddFieldDef do
begin
DataType := ftGuid;
Size:=38;
Name := 'EventGUID';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'AccID';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftDateTime;
Name := 'DatIn';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'CLSID';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'CLSEveCod';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'ObjID';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftGuid;
Size:=38;
Name := 'TranGUID';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size:=255;
Name := 'EventStr';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size:=10;
Name := 'DatInDateStr';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size:=10;
Name := 'DatInTimeStr';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size:=255;
Name := 'PersNam';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size:=64;
Name := 'AccNam';
end;
With FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'TSID';
end;
CreateDataSet;
end;
Вот, например...
Вася (2006-06-13 10:24:00) [20]Вообщем-то я себе этот процесспредставлял по другому. Дело в том что имеется уже готовый датасет и у него уже есть таблицы. При их создании человек не пользовался ни единой строчкой кода, и я так понимаю все делалось мышкой. Пытаюсь создать поле: правой кнопкой по fields-> addField. Создаю поле, при попытке активировать clientdataset он ругается со словами Field "моеполе" not found.