Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

как отследить sql запрос   Найти похожие ветки 

 
cherman ©   (2005-10-28 12:10) [0]

Есть приложение которое работает с IB. в базе используется лревовилная таблица. нужно вывести все поля (ветви подветви) но не в TreeView. Ниже приведен код где parent - идентификатор родителя а prosm - строка которая содержит идентификаторы уже проспотренных(выведенных) ветвей, соответственно при выборке уже просмотренные исключаются (переменная prosm) , но при выполнение запроса (сам запрос проходит без ошибок ) параметр (sql запрос  ... and where id_naprav not in (:prosm)) игнорируется тоесть ограничения ни как не работают  . Может проблема в создании строки - параметра или кодиковки (в бд кодировка win1251). Помогите разабраться в этом plz.
   parent:=0;
   prosm:="0";
   label1:
   IBQuery1.SQL.Clear;
   IbQuery1.SQL.Add("select * from napravlenie where id_parent=:parent and id_naprav not in (:prosm)" );
   ibquery1.ParamByName("parent").AsInteger:=parent;
   IBquery1.ParamByName("prosm").asstring:=",";
   IBquery1.ParamByName("prosm").asstring:=prosm;
   IBQuery1.Open;
   IBQuery1.First;
   while not IBQUERy1.Eof do
   begin
     Memo1.Lines.add(IBquery1.Fieldbyname ("name_naprav").AsString);
     prosm:=prosm+","+ IBquery1.Fieldbyname("id_naprav").AsString;
     Memo1.Lines.Add(prosm);
     If IBQuery1.FieldByName("potomki_naprav").asinteger=1 then
     begin
       parent:=IBquery1.FieldByname("id_naprav").AsInteger;
       IBQuery1.Close;
       goto label1;
     end
     else
     begin
       IBquery1.Next;
     end;
   end;
   parent:=IBquery1.FieldbyName("id_parent").asinteger;
   IBQUeRY1.Close;
   IBQuery1.SQL.Clear;
   IbQuery1.SQL.Add("select * from napravlenie where id_naprav=:parent");
   ibquery1.ParamByName("parent").AsInteger:=parent;
   IBQuery1.Open;
   parent:=IBQuery1.Fieldbyname("id_parent").asinteger;
   IBquery1.Close;
   prosm:="0,2,3";
   goto    label1;


 
Seg   (2005-10-28 12:16) [1]

  IBquery1.ParamByName("prosm").asstring:=",";
  IBquery1.ParamByName("prosm").asstring:=prosm;


Вот это непонятно. Что за двойная инициализация?


 
msguns ©   (2005-10-28 12:17) [2]

ALTER PROCEDURE DRGOODS_GET_ALLCHILD (
   GID INTEGER)
RETURNS (
   PID INTEGER,
   ID INTEGER,
   FLAG CHAR(1),
   NAME VARCHAR(1024))
AS
begin
 /* Процедура извлечения из древовидного справочника всех
   потомков указанного узла */

 /* Внешний цикл по непосредственным потомкам */
 FOR SELECT G.gdpid, G.gdid, G.gdgroup, G.gdname
   FROM DRGOODS G
   WHERE G.gdpid=:gid
   INTO :pid, :id, :flag, :name
 DO
   BEGIN
     suspend;         /* Передача вы вых. НД */
     /* Проверка на наличие потомков у полученного пряиого потомка */
     IF (EXISTS(
        SELECT GDID FROM drgoods
          WHERE GDPID=:id))
     THEN
       BEGIN    /* Запуск этой же процедуры рекурсивно */
         FOR SELECT pid, id, flag, name
           FROM DRGOODS_GET_ALLCHILD(:id)
           INTO :pid, :id, :flag, :name
         DO
           BEGIN
            suspend;
           END
       END
   END
end


 
Seg   (2005-10-28 12:20) [3]

prosm:="0,2,3";

ботва еще может быть из-за кавычек, которые есть в символьной строке.


 
cherman ©   (2005-10-28 12:25) [4]

to seg
древовидная структура. первый sql запрос для вывода потомка - углубление а второй для выхода на уровень выше.


> IBquery1.ParamByName("prosm").asstring:=",";
>   IBquery1.ParamByName("prosm").asstring:=prosm;

но ведь параметр уже использованных записывется в prosm увеличивается с каждой просмотренной ветвью и соответственно строка параметра все время увеличивается

prosm:=prosm+","+ IBquery1.Fieldbyname("id_naprav").AsString;

и если использовать  
IBquery1.ParamByName("prosm").asstring:=",";
IBquery1.ParamByName("prosm").asstring:=prosm;
то что записывать в prosm если прости идентификаторы то получится
... and where id_naprav not in (,3345676)


 
cherman ©   (2005-10-28 12:33) [5]

и еще есть ли в delphi возможность отследить sql запрос (его текст с параметрами уже в иде чисел или строк а не :param) который передается серверу для выполнения


 
Seg   (2005-10-28 12:39) [6]

sql запрос (его текст с параметрами уже в иде чисел или строк

Query1.SQL.Text


 
cherman ©   (2005-10-28 12:49) [7]

to serg

при использовании Query1.SQL.TEXT;
Memo1.Lines.Add(IBQuery1.sql.Text);
выводит
select * from naprav where id_parent=:parent and id_naprav not in (:prosm);
а мне надо не :parent а их числовые значения для определения параметра prosm


 
msguns ©   (2005-10-28 12:57) [8]

>cherman ©   (28.10.05 12:49) [7]
>а мне надо..

Может все-таки глянешь [2] ?
А мне надо полсотни до завтра.
Детский сад какой-то..


 
Desdechado ©   (2005-10-28 13:03) [9]

списки IN нельзя передавать параметром


 
Digitman ©   (2005-10-28 13:16) [10]


> cherman ©   (28.10.05 12:33) [5]


см. TIBSQLMonitor


 
Seg   (2005-10-28 13:46) [11]

Тогда затолкай текст запроса сначала в переменную, потом добавь параметры, а потом уже в запрос.


 
cherman ©   (2005-10-28 14:15) [12]

to Seg
Спасибо большое так и сделал и все заработало!!!


 
Seg   (2005-10-28 14:39) [13]

Это называется "динамический" SQL. Поздравляю.



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
3-1130145891
Viktop
2005-10-24 13:24
2005.12.11
Memo в DBGrid


3-1130329917
Patrick
2005-10-26 16:31
2005.12.11
Связанные таблицы


14-1132305664
pupkin
2005-11-18 12:21
2005.12.11
Подскажите компоненты для наведения красоты


2-1132644365
DDDeN
2005-11-22 10:26
2005.12.11
Получение HTML со страницы


14-1132214056
Карелин Артем
2005-11-17 10:54
2005.12.11
Определение пола автоматом.