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

Вниз

Как создать поле в ClientDatSet   Найти похожие ветки 

 
Вася   (2006-06-12 19:49) [0]

Всем здравствуйте!
Поскажите плиз как создать поле в ClientDataSet, че-то у меня никак не получается! Да и  доку по вопросу не могу найти. Если знаете где данная тема освещается(ну типа ClientDataSet для "Чайников":) дйте ссылочку.
Заранее спасибо.


 
Johnmen ©   (2006-06-12 20:24) [1]

Даблклик на ClientDataSet - редактор полей.


 
API ©   (2006-06-13 08:33) [2]

как создать поле в ClientDataSet

Как и в любом другом DataSet"е:

var
 F: TField;
begin
 F := TIntegerField.Create(DataSet);
 F.FieldName := "MyField";
 F.Index := DataSet.FieldCount;
 F.DataSet := DataSet;

 F := TStringField.Create(DataSet);
 F := TWideStringField.Create(DataSet);
 F := TDateTimeField.Create(DataSet);
 <...>

 F.FieldKind := <[fkData, fkCalculated, fkInternalCalk, fkLookup]>;
 (и прочие свойства)

P.S. Но ДО открытия/создания набора данных.


 
Вася   (2006-06-13 10:24) [3]

Вообщем-то я себе этот процесспредставлял по другому. Дело в том что имеется уже готовый датасет и у него уже есть таблицы. При их создании человек не пользовался ни единой строчкой кода, и я так понимаю все делалось мышкой. Пытаюсь создать поле: правой кнопкой по fields-> addField. Создаю поле, при попытке активировать clientdataset он ругается со словами Field "моеполе" not found.


 
Ega23 ©   (2006-06-13 10:57) [4]


 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;


Вот, например...


 
novill ©   (2006-06-13 10:57) [5]


> Вася

А ты CreateDataset делал?


 
sniknik ©   (2006-06-13 11:16) [6]

> при попытке активировать clientdataset он ругается со словами Field "моеполе" not found.
пытаешся создать поле не имеющее отражения(поля) в получаемом рекордсете? сделай его вычисляемым (Calculated). там же мышкой.


 
sniknik ©   (2006-06-13 11:17) [7]

> А ты CreateDataset делал?
ну судя по всему он не создает новый, а получает его откудато.


 
novill ©   (2006-06-13 15:09) [8]

Да, уже написали, надо пользоваться на fields, а fielddefs


 
Вася   (2006-06-13 23:24) [9]

Имеется ПУСТОЙ дадасет, который загружет в себя выбранный пользователем *.cds файл. Вообщем-то создание поля можно и отложить, на данный момоент столкнулся с такой проблеммой. При загрузке файла в датасет он отображет все корректно, После редактирования полей и ClientDataSet.Post фаил сохраняется на диск, НО, после его загрузке, поля которые мы редактировавли добавляются в конец фаила. и высвечиваются не корректно. Например до редактирования
1. -----------
2.-----------
3-----------
4.----------, а после редактирования 1,3 и сохранения получается вот так:
2.----------
4.----------
1.----------
3.---------. Как этого избежать?


 
Johnmen ©   (2006-06-13 23:33) [10]

1. cds файл содержит описание всех полей НД. Естественно, что при загрузке его будет сообщ.об ошибке об отсутствующих полях в файле cds, но присутствующих в ClientDataSet.
2. Насчёт редактирования ЗНАЧЕНИЙ полей, приводящего к " поля которые мы редактировавли добавляются в конец фаила" - это гон...:)


 
sniknik ©   (2006-06-13 23:59) [11]

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

если у тебя этот номер (1,2,3,4) в данных (поле под него создано, данные в нем) то просто сделай по нему индекс, это гарантия определенного индексом порядка.

или можно попробовать отключить логирование изменений (logchanges), так понимаю это изза них старые записи остаются, просто им меняется признак, а изменения делаются в копии с признаком "новая", и копия естественно добавляется к концу рекордсета.


 
sniknik ©   (2006-06-14 00:01) [12]

Johnmen ©   (13.06.06 23:33) [10]
почему гон? вполне возможно... допускаю во всяком случае подобное поведение, оно логично.


 
sniknik ©   (2006-06-14 00:03) [13]

вернее, его (подобное поведение) можно обьяснить логикой.


 
Johnmen ©   (2006-06-14 00:12) [14]


> sniknik ©   (14.06.06 00:01) [12]


Ты не понял - он же про порядок ПОЛЕЙ, а не ЗАПИСЕЙ...:)


 
sniknik ©   (2006-06-14 00:18) [15]

а..., а на "рисунке" записи. думаю он "правильней".


 
Вася   (2006-06-14 01:37) [16]

sniknik [11]. Все так и происходит как вы описали. Фаил переписывается и измененные поля добавляются в конец фаила с тем-же индексом, причем поля в которых мы проводили изменения тоже остаются, но при загрузке не отображаются, хотя в фаиле есть и стоят на том-же месте что и до редактирования. Пробовал поставить False у LogChanges, не помогло.
Насчет индексов, индексы есть, и они не нарушаются как был у первой записи  индекс 1, так он и остается, просто при загрузке сам порядок отображения  записей меняется, но целостность данных остается. Может их после загрузки просто сортировать по индексу да и все? Но свойства sort у датасета я че-то не нашел.


 
Вася   (2006-06-14 01:43) [17]

На сечт log changes, программа не ругается, просто ничего не меняется.


 
sniknik ©   (2006-06-14 08:40) [18]

> Насчет индексов, индексы есть
где есть? в ClientDataSet? откуда знаеш?

> просто при загрузке сам порядок отображения  записей меняется
вот это точно "гон", при сушествующем и установленом индексе, порядок задает он а не то когда запись редактировали.

> Но свойства sort у датасета я че-то не нашел.
говорил же, индекс... (причем там свойство индексфиелднемес по моему аналогично sort также автоматом его делает при отсутствии)

> На сечт log changes, программа не ругается, просто ничего не меняется.
а каких изменений ты хотел? и когда? после того как оно уже поменялось местами, устанавливай фалсе/труе... поздно. это только на, и в процессе действовать должно, при редактировании, записи, чтении, причем при отсутствии того же индекса установленного. и потом это же теоретически, "выведено" логическим путем из предположения что порядок при редактировании меняется, предположение почему возможно... вполне впрочем правдоподобное, если подумать как этот ClientDataSet может работать.


 
Вася   (2006-06-14 11:02) [19]

Ну все равно не понятно, как с этой фигней бороться. Получается что хоть и есть автоинкренментное поле Index он все равно заводит и свои индексные поля и по ним и сортирует. И вообще почему отредатированные записи не пререписываются, а добавляются в конец фаила, причем записи которые редакировали остаються неизменными на всем месте просто не отображаются.


 
sniknik ©   (2006-06-14 15:01) [20]

> Получается что хоть и есть автоинкренментное поле Index он все равно заводит и свои индексные поля и по ним и
> сортирует.
автоинкрементное поле это только, и исключительно, автоинкрементное, ни функций индекса ни ключа (часто путают т.к. связка авто..+ключ часта, чуть ли не стандарт) не выполняет!

> И вообще почему отредатированные записи не пререписываются
[11] вполне правдоподобное обьяснение... хотя, так понимаю, логика не всех убеждает, а от пары проверок у них руки отваливаются... тогда по другому - "так написано, и не важно зачем, все одно не хочеш понимать. претензии к разработчикам". понятнее?

p.s. ты так и не сказал ГДЕ ты видиш индексы...


 
Вася   (2006-06-15 17:12) [21]

Вообщем насчет индексов я поспешил. Походу их там нету. Сдается мне все там примерно как в простом файле. Записи идут по порядку, только стоят определеннные пометки где начинается поле и где заканчивается. При перезаписи у датысет просто нет индекса чтоб поставить запись на прежнее место.


 
Johnmen ©   (2006-06-15 17:57) [22]

Индексы можно создать и использовать именно в компоненте TClientDataSet.
Индексы в файле не хранятся...



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

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

Наверх




Память: 0.53 MB
Время: 0.047 c
15-1153820130
Ling
2006-07-25 13:35
2006.08.20
Помогите найти


15-1153550602
Bogdan1024
2006-07-22 10:43
2006.08.20
отправить с сайта имэйл


1-1152018812
salexn
2006-07-04 17:13
2006.08.20
Рекурсивные процедуры


2-1154449222
Lexx_lamer
2006-08-01 20:20
2006.08.20
Написание компонентов Delphi


2-1154419487
Neket
2006-08-01 12:04
2006.08.20
SNMP