![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;