Текущий архив: 2008.05.18;
Скачать: CL | DM;
ВнизКак вставить результат процедуры в селект Advantage Database Найти похожие ветки
← →
jiny (2007-12-05 22:14) [0]Доброе время суток ,
проблема собственно в сабже,
добавлю лишь то, что я хотел бы видеть на выходе :
select kategs.*,<результат процедуры> as kat_level
from kategs kats
← →
jiny (2007-12-05 22:15) [1]забыл конкретизировать где именно : во Views
← →
jiny (2007-12-06 09:15) [2]Видимо я один пишу на Advantage :(
← →
Johnmen © (2007-12-06 09:16) [3]Видимо криво сформулирован вопрос.
← →
jiny (2007-12-06 13:15) [4]Не спорю, возможно и такое,
попробую иначе :
строю дерево категорий , имея только одну, которую выбрал клиент, вобщем имею ID_KAT, допустим равен "4", на FireBird эту задачу успешно решил, но заказчик решил использовать в качестве БД - Advantage Local Server. Знания данной БД ограничевается скромными SQL - запросами и связкой таблиц во View, могу процедуры несложные делать, т.к. литературы с примерами по нему мало. Вот на такой, казалось бы банальной кочке споткнулся. Создал процедуру, определяющую уровень ветки (KAT_LEVEL)
запускаю процедуру - все нормально работает, определяет уровень ветки (Execute Procedure sp_KatLevelCheck(:id_kat)
) . Далее создаю view vw_SprKategs, где нужно лишь добавить значение KAT_LEVEL для каждой категории, но так как FB уже не получается (select kat.*,(select kat_level from sp_KatLevelCheck) from spr_kategs kat order by name_kat
) - ругается на лексику. Пробовал так : select kat.*, Execute procedure sp_KatLevelCheck(kt.id) from spr_kategs kat order by name_kat) - но ничего не получается, неправильный синтаксис использования операндов. Перерыл весь хелп и инет, и только тогда решил обратиться к Вам, уважаемые эксперты, может кто подскажет решение, либо, где можно достать подробную литературу по использованию ХП в Advantage, потому как на сайте изготовителя такой инфы нет, а то что есть не раскрыто в полной мере.
← →
jiny (2007-12-06 13:19) [5]поправка к написаному выше :
вместо
но так как FB уже не получается (select kat.*,(select kat_level from sp_KatLevelCheck) from spr_kategs kat order by name_kat
)
читать вот это :
но так как в FB уже не получается (select kat.*,(select kat_level from sp_KatLevelCheck(kat.id)) as kat_level from spr_kategs kat order by name_kat
)
← →
Johnmen © (2007-12-06 13:27) [6]Давай смотреть.
1. Реальный запрос, который работает в FB
2. Сообщение об ошибке в ALS на запрос из 1.
← →
jiny (2007-12-06 14:39) [7]Жаль здесь картинки нельзя вставлять, ну да ладно, привожу код сообщения при использовании следующего метода :
select kat.*,
(execute procedure sp_ChooseKat(1)) as kat_level
from kategs kat;
Expected lexical element not found: identifier or expression -- Location of error in the SQL statement is 24 (line: 2, column: 10) [Parsing expression (column 2 in the select clause)]
вот собсна и все. Понимаю что ошибка чисто синтаксическая но как правильно реализовать в хелпе по Advantage не нашел.
← →
jiny (2007-12-06 14:41) [8]и
select sp_ChooseKat(1) as kat_level
from kategs kat;
тоже не работает, грит что скалярную функцию с именем sp_ChooseKat не нашел :(
← →
Johnmen © (2007-12-06 14:52) [9]Давай всё-таки начнем с работающего в FB запроса.
Где он?
← →
jiny (2007-12-06 19:11) [10]Ну здесь ведь не FB вариант кода обсуждается а именно синтаксис Advantage, ну если это поможет - не жалко :) :
состоит из нескольких процедур и расчитана на 3 узла дерева,
писалась на скорую руку и прошу не пинать за корявость
больше пока не перерабатывал, времени не было,
но главное, что работает.
CHECK_KAT_LEVELCREATE PROCEDURE CHECK_KAT_LEVEL (
ID_KAT INTEGER)
RETURNS (
KAT_LEVEL INTEGER)
AS
DECLARE VARIABLE TMPVAR2 INTEGER;
DECLARE VARIABLE TMPVAR1 INTEGER;
begin
select coalesce(kateg.id_parent,0) from kateg where id=:ID_KAT into :TmpVar1;
if (:TMPVAR1=0) then
begin
KAT_LEVEL=1;
end
else
begin
select coalesce(id_parent,0) from kateg where id=:TMPVAR1 into :TmpVar2;
If (:TMPVAR2=0) then
begin
Kat_Level=2;
end
else
Kat_Level=3;
end
/* Procedure Text */
suspend;
end
View vw_kategsCREATE VIEW VW_KATEGS(
ID,
ID_PARENT,
NAME_KAT,
KAT_LEVEL,
KLIENTCOUNT)
AS
select id,
id_parent,
name_kat ,
(select kat_level from check_kat_level(VKateg.id)),
(select count(id_kl) from klient_kateg where id_kat=vKateg.id)
from
kateg VKateg;
процедура которая выводит предварительное дерево с повторениями и пр.
MAKE_A_KAT_TREECREATE PROCEDURE MAKE_A_KAT_TREE (
ID_KL INTEGER)
RETURNS (
ID INTEGER,
KATLEVEL INTEGER,
O_ID_KL INTEGER,
NAME_KAT VARCHAR(70),
ID_PARENT INTEGER)
AS
DECLARE VARIABLE TMP1 INTEGER;
DECLARE VARIABLE TMP2 INTEGER;
DECLARE VARIABLE TMPPARENT2 INTEGER;
DECLARE VARIABLE TMP3 INTEGER;
DECLARE VARIABLE TMPPARENT3 INTEGER;
DECLARE VARIABLE KAT_LEVEL INTEGER;
DECLARE VARIABLE TMPVAR1 INTEGER;
DECLARE VARIABLE TMPVAR2 INTEGER;
begin
/* Procedure Text*/
for select vw_kategs.id,vw_kategs.id,name_kat,kat_level,id_parent from vw_kategs where id in (select id_kat from klient_kateg where id_kl=:ID_KL) into
:O_ID_KL,:ID,:NAME_KAT,:KATLEVEL,:id_parent do
begin
O_ID_KL=:ID_KL;
suspend;
if (:KATLEVEL=3) then
begin
Select id,id_parent from kateg kat3 where id=:ID_PARENT into :TMP2, :TMPPARENT2;
select id,id,name_kat,kat_level,id_parent from vw_kategs where id=:TMP2 into :O_ID_KL,:id,:name_kat,:katlevel,:id_parent;
O_ID_KL=:ID_KL;
suspend;
select id,id,name_kat,kat_level,id_parent from vw_kategs where id=:TMPPARENT2 into :O_ID_KL,:id,:name_kat,:katlevel,:id_parent;
O_ID_KL=:ID_KL;
suspend;
end
else
if (:KATLEVEL=2) then
begin
Select id from kateg kat2 where id=:ID_PARENT into :TMP1;
select id,id,name_kat,kat_level,id_parent from vw_kategs where id=:TMP1 into :O_ID_KL,:id,:name_kat,:katlevel,:id_parent;
O_ID_KL=:ID_KL;
suspend;
end
else
if (:KATLEVEL=1) then
begin
O_ID_KL=:ID_KL;
suspend;
end
end
end
Финальная процедура формирования дерева
с учетом предков узла
MAKE_A_FULL_KATTREECREATE PROCEDURE MAKE_A_FULL_KATTREE (
ID_KL INTEGER)
RETURNS (
O_ID_KL INTEGER,
O_ID_KAT INTEGER,
O_ID_PARENT INTEGER,
O_NAME_KAT VARCHAR(70),
O_KAT_LEVEL SMALLINT)
AS
DECLARE VARIABLE TMP1 INTEGER;
DECLARE VARIABLE TMP2 INTEGER;
begin
/* Procedure Text */
for select distinct KATLEVEL,KATLEVEL,ID,NAME_KAT,id_parent
from make_a_kat_tree(:ID_KL) kat1 where KATLEVEL=1 order by name_kat into
:O_ID_KL,:O_KAT_LEVEL,:O_ID_KAT,:O_NAME_KAT,:O_ID_PARENT do
begin
Tmp1=:O_ID_KAT;
O_ID_KL=:ID_KL;
suspend;
for select distinct KATLEVEL,KATLEVEL,ID,NAME_KAT,id_parent
from make_a_kat_tree(:ID_KL) kat2 where KATLEVEL=2 and id_parent=:tmp1
order by name_kat into
:O_ID_KL,:O_KAT_LEVEL,:O_ID_KAT,:O_NAME_KAT,:O_ID_PARENT do
begin
Tmp2=:O_ID_KAT;
O_ID_KL=:ID_KL;
suspend;
for select distinct KATLEVEL,KATLEVEL,ID,NAME_KAT,id_parent
from make_a_kat_tree(:ID_KL) kat2 where KATLEVEL=3 and id_parent=:tmp2 order by name_kat into
:O_ID_KL,:O_KAT_LEVEL,:O_ID_KAT,:O_NAME_KAT,:O_ID_PARENT do
begin
O_ID_KL=:ID_KL;
suspend;
end
end
end
end
Ну вот, коряво, зато работает :)
финально используется только последняя процедура, которая реализует в себе все другие.
← →
Плохиш © (2007-12-06 21:05) [11]Хм, почему бы не прочитать документацию?
http://www.advantagedatabase.com/web/tech_tips_detail.aspx?key=23DEC8D500E010421DB05DF8EEA4C5CE
← →
Johnmen © (2007-12-07 09:37) [12]Странно... Я вроде бы очень понятно спросил
Давай всё-таки начнем с работающего в FB запроса.
Где он?
код процедур меня не интересует.
← →
jiny (2007-12-07 16:37) [13]для Johnmen © (07.12.07 09:37) [12] э
> Странно... Я вроде бы очень понятно спросил
> Давай всё-таки начнем с работающего в FB запроса.
> Где он?
в базе данных, где ж еще...
Плохишь в принципе прав, за недостатком знаний ХП ALS, лучше воспользоваться UDF, придется так и сделать.
Страницы: 1 вся ветка
Текущий архив: 2008.05.18;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.046 c