Использование SQL для поиска среди потомков


procedure TForm1.FindColoredBoxes (ColorName : String; StartingID : Integer);
var DescendantString : String; begin DescendantString := HierarchyObject.GetDescendants(StartingID);
with Query1 do begin DisableControls; Close; with SQL do begin Clear; Add('SELECT *');
Add('FROM BoxList T1');
Add('WHERE T1.BoxColor = "' + ColorName + '"');
{ Предполагается, что идентификаторы в DescendantString разделяются запятыми } if DescendantString <>
'' then Add('AND T1.BoxID IN (' + DescendantString ')');
end; Open; EnableControls; end; end;

Пример: если вас интересуют художники всех специализаций, можно найти в иерархии родителя всех художников, на программном уровне получить идентификаторы всех потомков этого объекта и использовать их в критерии. Запись однозначно определяется по ее идентификатору, каким бы специали зированным он ни был. Когда вам потребуется выбрать общую категорию, данная запись будет извлечена среди прочих. Благодаря иерархической структуре данных вам даже не нужно знать, сколько потомков имеет объект «Художник» — вы автоматически получаете их все.

Если иерархия представлена компонентом TOutline или TTreeView, вы можете воспользоваться навигационными средствами этих компонентов для перебора потомков любого объекта. В противном случае объект придется загружать в память и установить связи-указатели между родителями и детьми или же воспользоваться итерационными или рекурсивными методиками, описываемыми ниже.



Содержание раздела