![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Ситуация:
Я выбираю данные из таблицы, с двумя полями ID (ключевое Integer) и Name (Char(15)), используя компонент TClientDataSet. Код:
cdsSelect: TClientDataSet;
...
with cdsSelect do
begin
if Active then
cdsSelect.Close;
CommandText := 'Select ID, Name from TestTable';
Open;
end;Данные помещаю в локальный набор данных на форме: Код:
cdsLocal.Data := cdsSelect.Data; В определенный момент я вставляю новую запись: Код:
with cdsLocal do
begin
Insert;
FieldByName('ID').AsInteger := 1;
Post;
end;На Post возникает ошибка EDBClient 'Key violation'. Хочу обратить внимание, что я работаю именно с локальным набором, не имеющим связи с БД (портфель). Я пытался менять совойства: Код:
FieldDefs[0].Attributes := []; FieldDefs[0].Required; Fields[0].Required := False; Fields[0].ProviderFlags := []; Кто знает, в чем может быть проблема? |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Конечно есть. Собственно из-за этого он и ругается.
Но у меня задача клонировать в наборе запись вместе с ее ключом. Сохранять в базу я это дело не буду. "Быстрым" решением стало, заменить присвоение Data := Date на тупую пробежку по всему набору источнику и вставку записей в приемник Insert, Post. Структура приемника идентична, но формируется ручками: Код:
for i := 0 to Source.FieldDefs.Count - 1 do
Dest.FieldDefs.Add(Source.FieldDefs[i].Name,
Source.FieldDefs[i].DataType,
Source.FieldDefs[i].Size);
Dest.CreateDataSet;
with Source do
begin
Source.First;
while not Eof do
begin
Dest.Insert;
for i := 0 to Fields.Count - 1 do
Dest.Fields[i].Value := Fields[i].Value;
Dest.Post;
Source.Next;
end;
end;Работает это процентов на 80 медленнее, а быстрым называется только потому, что воткнуто быстро. =) Как красиво выйти из сложившейся ситуации, я и ломаю голову. Хочется быстро поместить данные в локальный набор и иметь возможность организовать контроль вводимой пользователем информации, когда с сервера, когда на клиенте. Короче самому рулить набором как вздумается. Есть мнения? |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
Решил проблему следующим образом:
Создал локальный набор данных с заранее определенными полями. Настроил как мне надо. Данные присваиваю так: Код:
if cdsDest.Active then cdsDest.EmptyDataSet; cdsDest.Open; cdsDest.AppendData(cdsSource.Data, True); Копируются только данные, а свойства полей остаются нетронутыми. |
|
#6
|
||||
|
||||
|
Цитата:
|