Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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_LEVEL
CREATE 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_kategs
CREATE 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_TREE
CREATE 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_KATTREE
CREATE 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.51 MB
Время: 0.02 c
2-1208631399
Rasputin
2008-04-19 22:56
2008.05.18
поиск окна и родительских окон


2-1208858129
AlexAA
2008-04-22 13:55
2008.05.18
Открыть файл .exe


2-1207667537
kernel
2008-04-08 19:12
2008.05.18
Обработка сообщений (WM_SYSCOMMAND) в консольном приложении


2-1208536526
worldmen
2008-04-18 20:35
2008.05.18
Загрузить файл из Worda и редактировать.


2-1208350194
lamponaftik
2008-04-16 16:49
2008.05.18
Need хелп=)