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

Вниз

Порядок сохранения записей в ClientDataSet   Найти похожие ветки 

 
Shura ©   (2007-05-03 15:57) [0]

Всем привет.

Подскажите, пожалуйста, есть ли возможность изменения порядка отправки записей из клиентского набора на сервер. Например, необходимо, чтобы все записи, в которых поле1 is NULL были отпралены в базу первыми, а затем все остальные.
После вызова ApplyUpdate срабатывает BeforeUpdateRecord, в котором есть DeltaDS, хранящий все измененные записи. Как поменять внутри DeltaDS порядок этих записей ?


 
Правильный Вася   (2007-05-03 15:59) [1]

странная какая-то задача


 
clickmaker ©   (2007-05-03 16:01) [2]

зачем?


 
Ega23 ©   (2007-05-03 16:02) [3]

Отсортировать?


 
Shura ©   (2007-05-03 16:07) [4]

Может и странная, но все-таки есть возможность изменить порядок записей в ClientDataSet"e ? Индексы пробовал - не помогает.


 
Desdechado ©   (2007-05-03 16:17) [5]

> в которых поле1 is NULL были отпралены в базу первыми, а затем все остальные.
NULL до редактирования или после?

PS что мешает пройтись по записям самому, а не через ApplyUpdates ?


 
clickmaker ©   (2007-05-03 16:20) [6]


> изменить порядок записей в ClientDataSet"e

зачем это делать перед отправкой на сервер?


 
Shura ©   (2007-05-03 16:32) [7]

>NULL до редактирования или после?
NULL после редактирования

>PS что мешает пройтись по записям самому, а не через ApplyUpdates ?
Если можно пример кода как отправить изменения не через ApplyUpdates.

>зачем это делать перед отправкой на сервер?
Потому что сначала заносятся в базу родительские записи, а потом те, которые на них ссылаются.

Задача простая: пользователь на экране формирует дерево в ListView (мышкой перетаскивает узлы) не важно чего - работников, товаров и т. д. А потом, сформировав его нажимает "Сохранить". Дерево должно корректно сохраниться в базе. Записи, как я понял, отправляются в базу в порядке их изменения, но первая добавленная в дерево запись может быть не родительским узлом, а дочерним. Тогда получается ошибка - попытка добавить в базу первую добавленную запись, у которой задан родитель еще не описанный в базе.


 
clickmaker ©   (2007-05-03 16:54) [8]


> первая добавленная в дерево запись может быть не родительским
> узлом, а дочерним

как это? как добавить дочерний, не имея родителя?


 
Shura ©   (2007-05-03 17:04) [9]


> как это? как добавить дочерний, не имея родителя?

Имеется 2 списка: слева - общий, справа - дерево. Вправо добавляем несколько записей, а затем мышкой их ставим как надо. При этом каждое действие - добавить запись, переподчинить ее в дереве - это операция Insert, Edit, Post. Дальше проблема возникает вот когда. Добавляем по порядку 2 записи в дерево: запись1 и запись2. Мышкой тащим запись1 и подчиняем ее записи2. Теперь если попытаться сохранить изменения, то первой в базу пойдет запись1, как первая добавленная, а затем запись2. Но у записи1 уже есть ссылка на родителя - запись2, которая в базе пока отсутствует. Во как.


 
clickmaker ©   (2007-05-03 17:14) [10]


> Мышкой тащим запись1 и подчиняем ее записи2. Теперь если
> попытаться сохранить изменения, то первой в базу пойдет
> запись1, как первая добавленная, а затем запись2

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


 
Shura ©   (2007-05-03 17:24) [11]

Фишка в том, что я к дереву никак не привязан. А вот в ClientDataSet делаются изменения СРАЗУ и потом в том же порядке отправляются в базу. Не очень хочется алгоритм переделывать, но похоже придется. Сначала строим дерево, а потом на его основе меняем базу добавляем, изменяем. Жуть.


 
clickmaker ©   (2007-05-03 17:38) [12]

ну как вариант, модифицировать базу при изменениях в структуре дерева.
Лишние движения, но плюсы тоже есть. Гарантия от потери полностью сформированной структуры при внезапном сбое, например.


 
Shura ©   (2007-05-04 08:46) [13]

А все-таки интересно, где хранится последовательность изменений, которые отпраляются в базу и есть ли возможность этот порядок ручками поправить. Еще такая мысль была - создать временный DataSet, в него в нужном порядке запихнуть измененные записи и подменить им исходный DataSet. К сожалению не получилось, может кто подскажет как создать виртуальный набор данных ни к чему не привязанный.


 
Карелин Артем ©   (2007-05-04 09:23) [14]


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

Взять ни к чему не привязанный ClientDataSet )))


 
Shura ©   (2007-05-04 10:07) [15]

procedure TDM.dsp1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;
 DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
var TmpCDS : TCustomClientDataSet;
begin
  TmpCDS:=TCustomClientDataSet.Create(nil);
  TmpCDS.Open;
  TmpCDS.InsertRecord([]);
  TmpCDS.Free;
end;


При попытке выполнить TmpCDS.Open выдает ошибку Missing provider or data packet.


 
vovnuke ©   (2007-05-04 10:36) [16]

TmpCDS.CreateDataSet;


 
vovnuke ©   (2007-05-04 10:41) [17]

но надо предварительно структуру DataSet-а сформировать.


 
Карелин Артем ©   (2007-05-04 10:41) [18]


> Shura ©   (04.05.07 10:07) [15]

Ты поля создай сначала, потом [16]


 
Johnmen ©   (2007-05-04 11:42) [19]

М.б. я чего-то не понял, но зачем плодить ещё CDS, если один уже есть? И достаточно просто реализовать нормальную логику?


 
Shura ©   (2007-05-04 11:55) [20]

Так я выше проблему обрисовал. Переделывать логику не очень хотелось.


 
Alexander3   (2007-05-09 20:39) [21]

Очень жаль что нет ответа по сабжу.
Для меня например тоже актуально
Пример такой
Есть документ

Мастер запись 1
Подчиненная (по смыслу ) мастер запись добавленна после Мастер запись 2
Мастер запись 2

После ApplyUpdate
Мастер запись 1
Мастер запись 2
Подчиненная (по смыслу ) мастер запись добавленна после Мастер запись 2

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


 
Карелин Артем ©   (2007-05-10 10:50) [22]


> Alexander3   (09.05.07 20:39) [21]

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


 
Alexander 3   (2007-05-10 12:55) [23]

>PS что мешает пройтись по записям самому, а не через ApplyUpdates ?
Если можно пример кода как отправить изменения не через ApplyUpdates.
Было уже
Это клиентский набор изменения передаются через провайдер.



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
15-1185883532
AntifreezeeR
2007-07-31 16:05
2007.09.02
Ищу помощи, как новичок.


3-1178529064
bss
2007-05-07 13:11
2007.09.02
Как присвоить blob-полю значение NULL?


15-1186394190
palva
2007-08-06 13:56
2007.09.02
Снимок дня


2-1186407629
Василий
2007-08-06 17:40
2007.09.02
MainMenu в ToolBar e. А нет HotKeys. :(


1-1182316712
White Barsik
2007-06-20 09:18
2007.09.02
Последовательность бандов в QuickReport