Заказ звонка

Закрыть

*
*
*

Разбор иерархического классификатора

Страницы: 1
RSS
Разбор иерархического классификатора
Добрый день.
Мне необходимо выводить в отчет название материала (из классификатора).
НО классификатор иерархический, а элемент номенклатуры указывает на нижнюю ветвь классификатора материалов.
Подскажите пожалуйста, как в отчете (или в запросе) добраться до верхнего уровня (либо по номеру уровня, либо по какому-то еще условия) классификатора (таблица NMK_CLASSIF)?
Добрый день.
Ваши требования пока не очень понятны. Можете выложить скриншоты с пояснениями, какую информацию Вам надо получить и в каком виде представить.
Здравствуйте.
Для того, чтобы узнать, входит ли классификатор с ID @classif_id в другой с ID @prisp_id использовал такую рекурсивную функцию. В вашем случае ее надо немного адаптировать.

Код
cre ate function dbo.is_prisp(@classif_id int, @prisp_id int)
returns int
as
begin
    declare @res int;
   if (@classif_id = @prisp_id) 
      set @res = 1
   else if (@classif_id = -1)
      set @res = 0
   else begin
   sel ect @classif_id = nmk_classif.nmk_classif_parent 
        fr om nmk_classif where nmk_classif.nmk_classif_id = @classif_id
    exec @res = dbo.is_prisp @classif_id, @prisp_id
    end
    return (@res)   
end
Прошу прощения за кривость изложения вопроса и одновременно большое спасибо за функцию!
То что доктор прописал smile:)
Рано я стал радоваться smile:(
Функцию вышепредставленную в базу добавил, в запросе использовать попробовал - всё хорошо и красиво, а когда запрос с этой функцией в отчет пихаю, то появляется следующая ошибка.
Подскажите пожалуйста, что я делаю не так?
Рисунок
С ошибкой справился - необходимо было в свойствах функции выдать пользователю права на её выполнение.
Прописывать свою функцию в базу данных, не очень правильно. Да к тому же, возможно, что современные средства MS SQL смогут решить Вашу задачу только с помощью запросов. С иерархиями хорошо разбираются "древовидные" запросы. Вот Вам примерчик по классификатору складских карточек.
Код
WITH TREE (ID, PARENT_ID, NAME, FULLPATH )
AS
(
 SEL ECT 
  V_REGISTRATION_CARDS_CLASSIFIER.ID AS ID,
        V_REGISTRATION_CARDS_CLASSIFIER.PARENT_ID AS PARENT_ID,
        V_REGISTRATION_CARDS_CLASSIFIER.NAME AS NAME,
        CAST(V_REGISTRATION_CARDS_CLASSIFIER.NAME AS NVARCHAR(MAX)) AS FULLPATH
 FR OM 
  V_REGISTRATION_CARDS_CLASSIFIER 
 WH ERE 
  V_REGISTRATION_CARDS_CLASSIFIER.PARENT_ID = -1
  
 UNI ON ALL
 
 SEL ECT 
  CLSF.ID, 
  CLSF.PARENT_ID, 
  CLSF.NAME,
  CAST((T.FULLPATH + '\\' + CLSF.NAME) AS NVARCHAR(MAX))
 FR OM 
  V_REGISTRATION_CARDS_CLASSIFIER AS CLSF
  INNER JOIN TREE AS T ON CLSF.PARENT_ID = T.ID
)
SEL ECT * FR OM TREE
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)