Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TDataSet.Как оптимально скопировать всего одну запись в новый.


Abcdef123 ©   (2013-04-10 10:32:00) 

Здравствуйте, Мастера!
Заранее прошу прощения за вопрос. Чувствую, что примитивный, но вот в голову ничего не приходит, как можно сделать оптимально и красиво.
В общем, в приложении есть некий датасет, показываем данные в гриде, и по правому клику мне надо текущую запись скопировать в декларированный, но не созданный пока второй датасет (Датасет2 = Nil); и потом далее другой процесс идет, в который мы передаем вот этот датасет2 (то есть интересна только текущая строка первого датасета.
Вопрос: можно ли как то это сделать, оперируя только методами и свойствами компонента TDataSet? И если можно, то как это сделать?
Примечание: Grid -Как средство отображения данных датасет1 желательно не использовать для определения текущей записи, так как предполагается в будущем использовать этот код и с другими компонентами.
Заранее благодарна.


Плохиш   (2013-04-11 10:43:00) [1]

Удалено модератором


Ega23   (2013-04-11 09:16:00) [2]

Удалено модератором


Вовик   (2013-04-11 08:50:00) [3]

Удалено модератором


Anatoly Podgoretsky   (2013-04-11 01:57:00) [4]

Удалено модератором


Вова   (2013-04-10 23:30:00) [5]

Удалено модератором


Anatoly Podgoretsky   (2013-04-10 21:07:00) [6]

Решение от обратного


Jeer   (2013-04-10 14:57:00) [7]

Лучше котлеты научиться жарить вкусные, тогда программист и  сам придет.


Плохиш   (2013-04-10 14:13:00) [8]

Но лучше, всё-таки, нанять программиста.


Ega23   (2013-04-10 12:57:00) [9]


> ПОдскажите, плиз, что вы имеете в виду, когда говорите "Нужно
> создавать его наследника" или поправьте, что в описанном
> мною мне надо исправить.


TDataSet - абстрактный класс. Его потомки - уже реальные, TQuery, TClientDataSet, TADODataSet и т.д. Вот одного такого потомка и надо создать.


O'ShinW   (2013-04-10 12:47:00) [10]

как-то так

 CDS := TClientDataSet.Create(nil);
 try
   Screen.Cursor := crHourGlass;
   CDS.FieldDefs.BeginUpdate;
   CDS.FieldDefs := DS.FieldDefs; вот из этого dataset  (DS. )берем поля
   CDS.FieldDefs.Add('BASE', ftFloat); а это еще поля если надо
   CDS.FieldDefs.Add('UP_ABON', ftFloat);
   CDS.FieldDefs.Add('UP_CNT', ftFloat);
   CDS.FieldDefs.Add('MONEY', ftFloat); //ftString, 50);
   CDS.FieldDefs.Add('NOTE', ftString, 50);
   CDS.FieldDefs.EndUpdate;
   CDS.CreateDataSet;
   CDS.DisableControls;
   DS.DisableControls;
   DS.First;
   while not(DS.Eof) do
   begin
     if not(DS.FieldByName('DT_WORK').IsNull) then
     begin
       CDS.Insert;
       for i := 0 to DS.FieldCount - 1 do  а тут поля копируем
         CDS.Fields[i].Value := DS.Fields[i].Value;


O'ShinW   (2013-04-10 12:41:00) [11]

юзать TClientDataSet
Создать, если не создан
Задефайнить ему поля исходя из DS исходного
и текущую запись туда закопировать
совместимость по TDataSet имеется.


Abcdef123   (2013-04-10 12:40:00) [12]

[3] Я написала в самом первом сообщении, что объявила  DatSet2, но как объект это пока нил.То есть объявила так:
DatSet2: TDataSet;
Это значит, совет [1] неподходящий?
Я честно говоря, еще больше в непонятках оттого, что вы написали, я ж не работаю к самим классом  TDataSet, я пытаюсь работать с представителем этого класса  DatSet2. ПОдскажите, плиз, что вы имеете в виду, когда говорите "Нужно создавать его наследника" или поправьте, что в описанном мною мне надо исправить.


clickmaker   (2013-04-10 12:22:00) [13]

> выдает ошибку Abstract Error

правильно. Потому что TDataSet - абстрактный класс. Нужно создавать его наследника


Abcdef123   (2013-04-10 12:16:00) [14]

To [1] Возможно, что вы не обратили внимание на то, что DataSet2 = Nil на этом этапе. Так что уже на пункте 0 выдаст ошибку о несуществовании объекта (акцес авиалейшен). Хорошо, я добавила перед пуктом 0 создание датасет     DataSet2:= TDataSet.Create(Application); В этом случае удается выполнить пункты 0 и 1, но на пункте 2 снова ошибка cannot operate operate on a closed dataset. Хорошо, я добавила перед пунктом 2 DataSet2.Open. Но, теперь на пункте 2 выдает ошибку Abstract Error.
Как быть?

И еще... вы написали применить DisableControls к датасет2, может вы имели в виду датасет1?


Ega23   (2013-04-10 10:41:00) [15]

0. DataSet2.DisableControls;
1. пробежаться по филдам первого, создать такие же во втором.
2. DatSet2.Insert
3. пробежаться по значениям полей первого, вставить во второй.
4. DatSet2.Post
5. DataSet2.EnableControls;


Наверх

Титульная страница Поиск, карта сайта Написать письмо