Главная страница
    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.49 MB
Время: 0.046 c
15-1207128130
kiberg
2008-04-02 13:22
2008.05.18
список замен


2-1208271421
webpauk
2008-04-15 18:57
2008.05.18
PageControl, Hint


3-1197827256
Kley
2007-12-16 20:47
2008.05.18
Возврат товара


2-1208426824
Вход в папку
2008-04-17 14:07
2008.05.18
вход в папку в компоненте DirectoryListBox


15-1207547497
Slider007
2008-04-07 09:51
2008.05.18
С днем рождения ! 7 апреля 2008 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский