Текущий архив: 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.48 MB
Время: 0.042 c