Delphi. Иерархические данные. DBTreeView своими руками. Копирование записей в БД с сохранением структуры

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

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

Я разложил задачу на этапы.

Сначала собирается список IDListChecked выделенных узлов.

Далее записи в базе копируются по этому списку — создается новое множество записей.

И наконец, восстанавливается первоначальная структура узлов. Если у узла был родитель и он в списке IDListChecked, тогда в базе поле idParent этого узла обновляется. Если родителя в списке собранных узлов не оказалось — тогда родителем становится выбранный узел.

Выглядит это примерно следующим образом.

Создадим SourceFolder и отметим её галочками. Выделим DestFolder и нажмем на кнопку Test, на которой создан обработчик копирования записей в базе и в результате получим следующее.

1

2

Узлы полностью скопировались, поменялся только родитель. Технически — сама процедура копирования оформлена в виде отдельного потока.

Начали!

В интерфейсной части у нас следующее

Главный метод Execute потока

Главный метод потока выглядит следующим образом

2 процедуры для формирования IDList

Копирование записей в БД

Это ключевая процедура, она копирует записи при помощи конструкции MySQL  Insert… Select…

Вспомогательная процедура — проверка на папку или файл

Собственно вставка всех новых узлов

Вспомогательная процедура поиска родителя по ID

Восстановление иерархии


Вызов в главном потоке

 

Добавить комментарий