Конференция "Прочее" » Поиск по "иерархической" БД
 
  • Труп Васи Доброго © (23.01.09 09:16) [0]
    Привет всем! Нужна идея/мысль/намёк как производить поиск по таблице, содержащей иерархические данные?
    Я что то впал в ступор. Сама таблица есть, отображение через Тривью есть, теперь вот встала проблема поиска...
    Как бы "ппоправильнее" его сделать? Данные - по сути похожи на адрес (пусть будет база почтовых адресов для определённости).
    Сама загвоздка вот в чём: Допустим я ищу "Иванов*", если бы в базе была только одна такая запись, то проблем нет - раскрыл ветку, содержащую это слово до нужного уровня и всё. А вот как "правильнее" показать на дереве результат поиска, если таких слов несколько, да ещё некоторые содержат ветки с таким же словом? Например как "правильнее" показать "Ивановская область" - "Мухосранский район" - "г. Задрищенск" - "ул.Иванова"???
    Открыть две ветки - глупо, она же по сути одна. Просто открыть ветку до "ул. Иванова", как бы неявно теряется результат "Ивановская область"
    И как вообще организовать сам поиск???
  • Sergey13 © (23.01.09 09:24) [1]
    > [0] Труп Васи Доброго ©   (23.01.09 09:16)
    > "Ивановская область" - "Мухосранский район" - "г. Задрищенск" - "ул.Иванова"???
    Дуэль. Только дуэль. Такое смывается только кровью. Так обгадить мою малую Родину!!!
    8-)

    > Открыть две ветки - глупо, она же по сути одна
    А зачем показывать результаты поиска прямо в дереве? Можно ведь и в отдельном окошке с раскрученой в строку иерархией, похожей на ту, которой ты меня обидел. И пусть юзер выберет нужное.
  • Jeer © (23.01.09 09:39) [2]

    > Сама загвоздка вот в чём: Допустим я ищу "Иванов*",
    ..
    Открыть две ветки - глупо, она же по сути одна


    Нет загвоздки - компьютер ничего не знает о понятии "глупость" и не будет за тебя домысливать, что существуют еще категории "ФИО" и "Область" и тп


    > как производить поиск по таблице, содержащей иерархические
    > данные?


    Поиск можно производить как по Dataset-у, так и по TreeView.
    Что и почему удобнее - решать тебе на месте.

    Если у тебя на мильен записей найдется сто тыщ "*Иван*" - что бум делать ?
  • Труп Васи Доброго © (23.01.09 09:46) [3]
    Да как то не красиво, не хотелось бы нагружать приложение (кое по сути будет справочником для выбора "адреса") лишними окнами.
    Есть дерево, сбоку ДБГрид с содержимым выбранного узла, добавление удаление узлов есть, всё логично и красиво. Но нужен поиск! Вот и прошу идею как лучше сделать. Сначала хотел сделать как поиск в реестре и выдавать результат по очереди (типа "далее") но это криво. Юзер может не знать что конкретно он ищет и пока от доnextскается до последнего результата - забудет что было в начале, придётся опять искать. Так что такой поиск отпадает. Надо сразу все "результаты на лицо", а там пусть выбирает что ему надо, улица или область.
    З.Ы. Про малую родину не обижайся, я вообще в Урюпинске живу, а его в каждой дыре обкакивают :)
  • Труп Васи Доброго © (23.01.09 09:48) [4]
    > Если у тебя на мильен записей найдется сто тыщ "*Иван*"
    > - что бум делать ?

    Так вот это я и пытаюсь придумать! Что посоветуешь?
  • YurikGL © (23.01.09 09:55) [5]
    А у меня при нажатии на кнопку "Отфильтровать" подменяется запрос с подстановкой фильтра типа такого:
     dmm.DSWithCPodrazd.SelectSQL.Text:='select * from Podrazd where '+
      'upper(shortnaimenovan||naimenovan) like upper('+#39+'%'+
      st+'%'+#39+') order by naimenovan';


    А на форме написано: "Внимание! При действующем не пустом фильтре дерево
    подразделений отображается некорректно т.к. там отсутствуют
    подразделения, которые не попали в фильтр."
  • Sergey13 © (23.01.09 09:55) [6]
    > [3] Труп Васи Доброго ©   (23.01.09 09:46)
    > нагружать приложение (кое по сути будет справочником для
    > выбора "адреса") лишними окнами

    Дык отдельное окно - это по вкусу. Можно и просто грид какой-нибудь на выезжающей панели например. Т.е. проблема скорее дизайнерская.
  • YurikGL © (23.01.09 09:55) [7]
    А у меня при нажатии на кнопку "Отфильтровать" подменяется запрос с подстановкой фильтра типа такого:
     dmm.DSWithCPodrazd.SelectSQL.Text:='select * from Podrazd where '+
      'upper(shortnaimenovan||naimenovan) like upper('+#39+'%'+
      st+'%'+#39+') order by naimenovan';


    А на форме написано: "Внимание! При действующем не пустом фильтре дерево
    подразделений отображается некорректно т.к. там отсутствуют
    подразделения, которые не попали в фильтр."
  • Труп Васи Доброго © (23.01.09 09:56) [8]
    > Поиск можно производить как по Dataset-у, так и по TreeView.

    По дереву искать нельзя, я не заполняю его сразу (нафига это нужно), а по мере раскрытия ветвей.
  • Сергей М. © (23.01.09 10:20) [9]

    > Труп Васи Доброго ©   (23.01.09 09:56) [8]


    При "мильёне" потенциально существующих в НД Ивановых неразумно показывать их всех одновременно в деревянном контроле.

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

    Юзер выбирает строку в этом табличном контроле, а ты создаешь и открываешь-показываешь в деревянном контроле маршрут к соответствующему Иванову.
  • Jeer © (23.01.09 10:20) [10]

    > Труп Васи Доброго ©   (23.01.09 09:56) [8]
    >
    > > Поиск можно производить как по Dataset-у, так и по TreeView.
    >
    >
    > По дереву искать нельзя, я не заполняю его сразу (нафига
    > это нужно),


    Тараканы у каждого - свои :)

    Насчет отображения:
    Я отношу иерархии к справочным материалам и содержание их должно быть максимально лаконичным.
    Отображение иерархии делал в строку с разделителем, например в твоем случае:
    Ивановская область\Мухосранский район\г. Задрищенск\ул.Иванова
    Ивановская область\Сладкий район\г. Передрищенск\ул.Иванова-Петрова

    Но для этого надо иметь весь тривью и подниматься вверх по иерархии - либо городить на сервере процедуры.
  • Sergey Masloff (23.01.09 10:24) [11]
    Я аналогичную проблему решил следующим образом:
    Поиск идет в базе (только среди "листьев")
    Есть ограничение на максимальное число результатов поиска (управляется самим пользователем)

    Результатом отбора является список найденых элементов.
    Дерево раскрывается (при необходимости достраиваясь) до первого из найденых.
    При необходимости пользователь "гуляет" по списку найденых (визуально находится под деревом) при этом достраиваются и раскрываются нужные ветки.

    P/S Мне кажется вопрос сформулирован абсолютно неправильно. Что нужно автору я понял (может быть неправильно) только из обсуждения
  • Труп Васи Доброго © (23.01.09 10:52) [12]
    > Тараканы у каждого - свои :)

    Причём тут тараканы? Повторю - это справочник!!! Основное его назначение это выбор "адреса" для объекта в другой таблице. Вот и представь себе, что оперетор сидит, вводит данные, добрался до адреса, тычет кнопку "справочник" а он не мгновенно открывается, как сейчас, а подвисает, пока построится полностью всё дерево из сотен тысяч узлов, и всё для того, чтобы ткнуть один и закрыть справочник. Для следующей записи ситуация повторится.
    ИМХО это не есть разумно.
    Я так понимаю все склоняются к мысли что надо делать дополнительный грид с результатами. (Идея с выезжающей боковой панелью мне понравилась, стырю!)
    В принципе это и мне вначале пришло в голову, но решил спросить мнения уважаемых людей.
  • test (23.01.09 10:59) [13]
    Я такое зделал хранимой процедурой, если одно поле в результирующем наборе то через while, если нет то можно по связи таблицы с собой.

    select a.name,b.name,c.name,d.name from
    tablename a
    join tablename b on
    a.pred_id = b.id
    join tablename с on
    b.pred_id = c.id
    join tablename в on
    c.pred_id = d.id
    where a.id = 3

    или

    select a.name+" "+b.name+" "+c.name+" "+d.name from
    tablename a
    join tablename b on
    a.pred_id = b.id
    join tablename с on
    b.pred_id = c.id
    join tablename в on
    c.pred_id = d.id
    where a.id = 3

    Подходит только если количество уровней известно заранее.
  • test (23.01.09 11:06) [14]
    test   (23.01.09 10:59) [13]
    Если вложенность не имеет конкретных границ, то тогда через создания курсора и while.
  • Труп Васи Доброго © (23.01.09 11:13) [15]
    > Если вложенность не имеет конкретных границ, то тогда через
    > создания курсора и while.

    Вложенность, как и тип объекта не имеют ограничений, поэтому для вывода "полного адреса" используется рекурсия в ХП
    З.Ы. Я как бы не про то спрашивал.
  • Правильный$Вася (23.01.09 11:16) [16]
    а что, нельзя заренее указать, что он ищет именно район, а не улицу/деревню/забор?
    т.е. категорию поиска сузить, а не просто название шарить
  • test (23.01.09 11:17) [17]
    Труп Васи Доброго ©   (23.01.09 11:13) [15]
    Почему бы сразу не получить данные из БД в нормальном виде?
  • Jeer © (23.01.09 11:26) [18]

    > Труп Васи Доброго ©   (23.01.09 10:52) [12]
    >
    > > Тараканы у каждого - свои :)
    >
    > Причём тут тараканы? Повторю - это справочник!!!


    Еще раз - тараканы у каждого, свои.
    Это ты так решил залить все в одну таблицу и получить мильены адресов, да еще и иерархически их строить.
    Другие вполне могут делать по другому и работать у них будет по другому.
    Может даже эффективнее.
  • Труп Васи Доброго © (23.01.09 11:27) [19]
    > Почему бы сразу не получить данные из БД в нормальном виде?

    Для начала поясни что значит "нормальный вид"? В каком виде должены быть получены данные справочника адресов, учитывая, что ты изначально не знаешь, что именно нужно юзеру, конкретная квартира или он город ищет?
 
Конференция "Прочее" » Поиск по "иерархической" БД
Есть новые Нет новых   [134453   +33][b:0][p:0.002]