Создать меню с 3 хранимыми процедурами - PullRequest
0 голосов
/ 28 июня 2011

У меня следующий запрос:

У меня есть 3 хранимые процедуры, которые дают мне информацию для создания меню веб-сайта, а именно:

1-я процедура (назовите ее sp_menu)

Эта процедура генерирует своевременную информацию в меню (может быть больше одного)

2-я процедура (назовите ее sp_submenu)

Эта процедура генерирует информацию о подменю этого меню (может быть больше одного)

3-я процедура (я назову sp_item)

Эта процедура генерирует информацию об элементах подменю (может быть больше одного)

Как я могу автоматически генерировать меню ASP.net с информацией, которую вы предоставляете?

Процесс доставки информации похож на этот:

sp_menu

MENU_ID --- MENU_NAME --- MENU_ORDER

1 --- Menú 1 --- 1

2 --- Menú 2 --- 2

3 --- Menú 3 --- 3

sp_submenu

MENU_ID --- SUBMENU_ID --- SUBMENU_NAME

1 --- 1 --- Подменю 1

1 --- 2 --- Подменю 2

2 --- 1 --- Подменю 3

3 --- 1 --- Подменю 4

3 --- 2 --- Подменю 5

sp_item

MENU_ID --- SUBMENU_ID --- ITEM_ID --- ITEM_NAME --- ORDER_ITEM

1 --- 1 --- 1 --- Item 1

1 --- 1 --- 2 --- Item 2

1 --- 2 --- 1 --- Item 3

2 --- 1 --- 1 --- Пункт 4

2 --- 1 --- 2 --- Пункт 5

2 --- 1 --- 3 --- Пункт 6

3 --- 1 --- 1 --- Элемент 7

3 --- 1 --- 2 --- Пункт 8

3 --- 1 --- 3 --- Пункт 9

3 --- 2 --- 1 --- Позиция 10

Это выглядит так:

Menú 1

--- Подменю 1

-------- Пункт 1

-------- Пункт 2

--- Подменю 2

-------- Пункт 3

Menú 2

--- Подменю 3

-------- Пункт 4

-------- Пункт 5

-------- Пункт 6

Menú 3

--- Подменю 4

-------- Пункт 7

-------- Пункт 8

-------- Пункт 9

--- Подменю 5

-------- Пункт 10

Меню ul (неупорядоченный список), подменю li (элемент списка) и item ul (неупорядоченный список)

Как автоматически получить заказ ASP.NET с VB (.NET 4.0)?

Помогите, пожалуйста, большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Во-первых, мне интересно, почему вы используете для этого три разных процесса (и я предполагаю три разных таблицы).Иерархическая таблица, например:

(для простоты используется целое число вместо предпочтительного типа первичного ключа uniqueidentifier)

Тестовая таблица:

create table menu_item
(
id int primary key 
,parent_id int foreign key references menu_item(id)
,[description] nvarchar(512)
,sort_order int not null default 0 
);

Заполнитетаблица с некоторыми тестовыми данными

insert into menu_item (id, parent_id, [description],sort_order) 
select 0, null, 'Menu Root', 0
union all
select 1, 0, 'Item 1', 0 
union all 
select 2, 0, 'Item 2', 1
union all
select 3, 0, 'Item 3', 2
union all
select 4, 1, 'Item 1.1', 0
union all
select 5, 1, 'Item 1.2', 1
union all
select 6, 4, 'Item 1.1.1', 0
union all
select 7, 4, 'Item 1.1.2', 1
union all
select 8, 2, 'Item 2.1', 0

И сохраненный процесс для извлечения иерархии в правильном порядке.

/*
Retrieve part of the menu hierarchy from table menu_item.
*/
create procedure menu_item_get_hierarchy
as
    set nocount on;

    with menu_hierarchy as
    (
        select id, parent_id, 0 as [level], cast('000000' as nvarchar(max)) as sort_key
        from menu_item m1
        where parent_id is null

        union all

        select m.id, m.parent_id, [level]+1, cast(sort_key + '.' + right('000000'+cast(m.sort_order as nvarchar(6)),6) as nvarchar(max))
        from menu_item m
        inner join menu_hierarchy h
        on m.parent_id = h.id
    )
    select  menu_item.[description], menu_hierarchy.*
    from menu_item inner join menu_hierarchy 
    on menu_item.id=menu_hierarchy.id
    order by sort_key, [description]

Единственная часть этого, которая мне не нравится, - это использованиестроковые операторы для генерации столбца sort_path, так как он довольно неэффективен, но я не могу придумать лучшего способа сделать это вне головы и количества строк, которые вы, вероятно, имеете в навигационной системене должно вызывать проблем с производительностью.Я уверен, что кто-то поделится некоторыми соображениями или альтернативами.

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

Надеюсь, это поможет.

0 голосов
/ 28 июня 2011

Вы не ожидаете весь код, не так ли?Если вы покажете, что вы пробовали до сих пор, мы можем вам помочь.

Но я дам вам старт: вы можете заставить это работать с тремя вложенными повторителями.

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