Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
есть база в sql, в ней 7 таблиц которые отвечают за 7 разных меню.
нужно на перле написать запрос \или не запрос\ для вывода меню, но в виде дерева

menu1
|-submenu1
|-submenu2
|--submenu21
....
|-submenuN
...
menu2
|-submenuN
...
|----submenu3

и так далее...
какие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на меню
$url_menu = $Data{'url_menu'};
$menu = $Data{'menu'};
print "<a href=$url_menu>$menu</a>";
16 май 05, 13:47    [1543750]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
*
Guest
vidoq
какие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на меню
Вариант 1. Добавить поле parent_id (id родителя)
Вариант 2. Nested sets - http://www.getinfo.ru/article610.html + http://www.getinfo.ru/article689.html
16 май 05, 13:50    [1543767]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
про parent_id все понятно! мне сразу так сказали сделать!
просто я понять не могу как это сделать!!!
добавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!

Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!
16 май 05, 13:57    [1543803]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
*
Guest
vidoq
добавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!
А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.
Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!
Бред какой.
16 май 05, 14:15    [1543911]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
*
А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.

блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...

*
Бред какой.

да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!
16 май 05, 14:27    [1544001]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
*
Guest
vidoq
*
А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.

блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...
Начинать надо с простого. Вам похоже вообще программирование пока не знакомо. А вы сразу за такие дела берётесь.
*
Бред какой.
да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!
А там что, не на perl'е примеры? И если есть встроенные - так используйте - сюда то зачем пришли? Носом в мануал - и вперёд, использовать встроенные функции.
16 май 05, 14:43    [1544107]     Ответить | Цитировать Сообщить модератору
 Re: (PERL) perl+ms sql создание дерево меню из данных sql  [new]
*
Guest
И вообще по первой ссылке приведена теория. На чём вы её будете реализовывать (хоть на BC++) - никакого значения не имеет.
16 май 05, 14:45    [1544118]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
добавил поле parent и еще одно level
parent - к кому принадлежит
level - глубина меню

далее хотелось использовать так

select * from menu where parent='$parent' and level='$level' order by parent, level

далее подключаем базу ... загоняем строки в хэшь.

далее я пишу
$x = $parent <= 0;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; #простая таблица выводит порядковый номер, название меню и к кому меню пренадлежит если 0 то меню главное если 1 то подглавное ... итд...

print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
retrun $x;
} else { retrun $x-1*$x;

}

в конце концов он мне выводит первую строчку из базы вида
(1)название меню(0)
и все, + в отладке пишет что неможет передовать $x... вроде как я понял!!!

что добавить как доработать?
17 май 05, 15:37    [1548191]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
BonJorno
Member

Откуда:
Сообщений: 80
а лучше зайди в ветку mssql, там этого добра много обсуждается. А perl тут вобщем-то сбоку-припёку. Грамотная процедура выдаст тебе меню в любом виде, а клиент может быть любой.
18 май 05, 07:25    [1549855]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
нет я конечно понимаю, просто с запросом то чего и откуда брать как сортировать у меня все впорядке.
а вот perl то как раз мне больше нужен чем mssql.
запрос то из перла делать, знал бы как делать вопросов бы не было!
18 май 05, 07:39    [1549869]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
у менян тут опечатка в коде
нужно так

select * from menu where parent='$parent' and level='$level' order by parent, level

...

$x = $parent <= 0;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; 
print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
return $x;
} else { return ($x-1)*$x;

}

18 май 05, 07:42    [1549870]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
#!!!!
# select * from menu order by parent, level
#!!!!
my @top;
my %recs;
while($O->FetchRow()){
        my %Data = $O->DataHash();
        my $dataRef=\%Data;
        my $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach my $dataRef (values %recs){
        my $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
#id - уникальный номер
#parent - родитель \верхний =0 т.к. он без родителя\
#url_menu - ссылка на меню
#menu - название меню
print "<ol>";
for my $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        my $menu=shift;
        my %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}


---
"Raffiniert ist der Herr Gott, aber boshaft ist Er nicht." Albert Einstein
18 май 05, 10:42    [1550388]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
интересное кино, скрипт поставил -> спасибо.

----------------
начало скрипта
----------------
#connecting to sql server -> to database
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

$O->Sql("select * from menu where parent='$parent' order by parent, level");
@top;
%recs;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach $dataRef (values %recs){
        $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
print "<ol>";
for $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        $menu=shift;
        %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}

но проблема в том что он не отображает меню как надо!

он отображает в виде:
1. Технико-экономическое планирование
2. Технико-экономическое планирование
3. Технико-экономическое планирование
4. Технико-экономическое планирование
5. Технико-экономическое планирование
6. Технико-экономическое планирование
7. Технико-экономическое планирование

причем само "Технико-экономическое планирование" - стоит в id=42 \это самое последнее меню\
а вед до id=42 есть еще меню. Хотя кол-во определенно верно (7).

но и под меню еще не выводятся..(((
18 май 05, 12:46    [1551062]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
Небольшой bugfix:
$O->Sql("select * from menu order by parent, level");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
foreach $id (@all_ids ){
        $dataRef=$recs{$id}
        $parent=$dataRef->{parent};
        if(defined $recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }
}
18 май 05, 12:59    [1551134]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
Ещё bugfix:
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
18 май 05, 13:03    [1551153]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
сделал все как ты написал!
только вот проблемка...

когда он выводит меню, то он выводит все id начиная с 1 до 49 \их всего столько\
причем 1-7 меню он выводит нормально, со всеми подменю...
а остальные он начинает новый рекурсивный запрос, и занова проходится по id хотя берет он их уже с parent - вроде.
я думал как бы все это сделать, так и не додумал..(((
18 май 05, 14:52    [1551878]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
Ляпни сюда аттачментом архив с полным кодом скрипта + пример вывода.
А то, блин, игра "черный ящик" получается :)
18 май 05, 19:21    [1553007]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
вот держи, описалово внутри!

К сообщению приложен файл (scripts.rar - 6Kb) cкачать
19 май 05, 08:35    [1553639]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
По поводу глюков сравнения - надо локальные переменные объявлять как my

К сообщению приложен файл (test.pl - 3Kb) cкачать
19 май 05, 10:40    [1554101]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
блин а ты прав)
спасибо.
только вот проблема то та осталась, он все равно выводит мне меню равно всем id из базы!
т.е. меню то отображается все \ну ты видел\
а вот дальше уже идет зацикливание и выводятся все остальные ид...(((
как сделать? смотрели смотрели на скрипт, короче ничегог плохого в нем не увидели. в базе тоже все отлично, левых ссылок и ссылок на самого себя нет.
короче не знаем что и делать.

К сообщению приложен файл (test.rar - 4Kb) cкачать
19 май 05, 13:22    [1555142]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
Я протупил. Нужно чуть исправить:
foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
#!!!!!
        if(ref $recs{$parent}){ #!!!! тут я ошибся :(
#!!!!
               push @{$recs{$parent}->{children}}, $dataRef;
        }
}
Приношу извинения за столь глючные решения :(
19 май 05, 13:35    [1555233]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
да не насчет глючных - это пустяки!
а вот то что он все равно не работает .... это да)))
bugfix не помог, может что то другое в нем поменять?
все равно также выводит огромное меню....(((
19 май 05, 14:34    [1555590]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
       print "<li><a href=test.pl?current=$hash{id}&depth=2>$hash{menu}</a>";
Смысл:
current - какое подменю развернуть
depth - как глубоко - сколько подуровней показывать

P.S. Вот эта строка if(ref $recs{$parent}){ должна была привести к выводу только 7 корневых пунктов.

К сообщению приложен файл (test.pl - 5Kb) cкачать
19 май 05, 14:49    [1555675]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
XM
Member

Откуда: ненадолго из запоя
Сообщений: 1264
Ещё fix:
push @top, $dataRef unless ($dataRef->{parent});
19 май 05, 14:51    [1555695]     Ответить | Цитировать Сообщить модератору
 Re: (Perl) perl+ms sql создание дерево меню из данных sql  [new]
vidoq
Member

Откуда: Россия.
Сообщений: 93
СУПЕР!!!
все стало нормально работать!!!
СПАСИБО тебе ХМ:)

база - id, parent, url_menu, menu
если кому то нужен код общий вот он:
------------------------------------
use Win32::ODBC ;
use CGI ;
$q = new CGI ;

print <<EOF ;   
Content-type: text/html\n\n
<html>
<head>
<title>site map axion.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
	background-image: url(http://www.axion.com/samples/images/backgrnd.gif);
}
.style5 {font-size: 14px}
.style8 {
	color: #000000;
	font-weight: bold;
}
.style9 {color: #990000}
.style10 {font-weight: bold}
.style11 {color: #990000; font-weight: bold; }
.style12 {font-size: 18px; font-weight: bold; }
.style13 {color: #660000}
-->
</style></head>
<body>
EOF

#connecting to sql server -> to database----------------------------------------------------------------#
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

#creating menu------------------------------------------------------------------------------------------#
$O->Sql("select * from menu order by parent");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef->{parent});
        push @all_ids, $id;
}

foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
        if(ref $recs{$parent}){
        push @{$recs{$parent}->{children}}, $dataRef;
        }
}

#menu---------------------------------------------------------------------------------------------------#
print "<ol>";
for $menu (@top){
    out_menu($menu);
}
print "</ol>";

sub out_menu{
    my $menu=shift;
    my %hash=%{$menu};

       print "<li><a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}
19 май 05, 15:59    [1556090]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить