Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

Порядок сохранения записей в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.042 c
2-1186696558
koha
2007-08-10 01:55
2007.09.02
Код на обсуждение


3-1178531718
stud
2007-05-07 13:55
2007.09.02
есть ли аналог


15-1186320574
@!!ex
2007-08-05 17:29
2007.09.02
Два дня не был на форуме...


15-1185785539
StriderMan
2007-07-30 12:52
2007.09.02
.NET vs Java


4-1173165948
vir
2007-03-06 10:25
2007.09.02
Получить хенл окна имеющего фокус.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский