powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос на выбор потдерева из дерева на FOX PRO 6.0
25 сообщений из 43, страница 1 из 2
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34201462
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такова: есть таблица, в которой организвана иерархия. Иерархия глубокая (может достигнуть 100000 записей), и каждый родитель может иметь неколько (теоритически неограниченое количество дочерних записей) Таблица имеет поля: ID, PID, LEVEL, NAME.
Нужно по заданому ID вывести все дочерние для него записи.

Итак что мы имеем. Вариант с ограниченой глубиной не подходит ( этот )

Просканировав в течении 3-х дней форум, я убедился что здесь ОЧЕНЬ много интересных решених похожей задачи, но все они написаны для sql server, что возможно при знании синтаксиса, возможно перевести на fox pro. К сожалению я достаточными знаниями для этого не обладаю.
Вот наиболее понравившееся:

Aleksey-KCREATE FUNCTION dbo._CLENT_Tree (@CLIENT_ID INT)
RETURNS @ListC TABLE (CLIENT_ID INT, NAME CHAR(40), Parent_ID INT, Level TINYINT)
AS
BEGIN
DECLARE @LEVEL TINYINT
IF ISNULL(@CLIENT_ID, 0) = 0
BEGIN
SET @LEVEL = 0
INSERT INTO @ListC (CLIENT_ID, NAME, Parent_ID, Level)
SELECT CLIENT_ID, Name, ISNULL(Parent_ID, 0), Level
FROM CLIENT WHERE Level = @LEVEL
END
ELSE
BEGIN
INSERT INTO @ListC (CLIENT_ID, NAME, Parent_ID, Level)
SELECT CLIENT_ID, Name, ISNULL(Parent_ID, 0), Level
FROM CLIENT WHERE CLIENT_ID = @CLIENT_ID
SELECT @LEVEL = Level FROM @ListC
END
WHILE @@ROWCOUNT > 0
BEGIN
SET @LEVEL = @LEVEL + 1
INSERT INTO @ListC (CLIENT_ID, NAME, Parent_ID, Level)
SELECT p.CLIENT_ID, p.Name, ISNULL(p.Parent_ID, 0), p.Level
FROM CLIENT p INNER JOIN @ListC t ON p.Parent_ID = t.CLIENT_ID
AND t.Level = @LEVEL - 1
END
RETURN
END

aleks2create table tree (PID int, ID int )

-- Все потомки @ID, включая родителя @ID
create function Childs(@ID int)
returns @t table (id int not null primary key, level int not null, UNIQUE CLUSTERED(level, id))
AS begin
declare @level int
set @level=0

insert into @t VALUES(@ID,0)

while @@rowcount>0 begin
set @level=@level+1
insert into @t
select t.ID, @level
from @t w inner join tree t on w.ID=t.PID
where w.level=@level-1
end
end

Сразу в панику вводит символ @ и # :(
Пожалуйста подскажите как перевести данный код на фокс про? или хотябы пару строк чтоб разобраться в синтаксисе.
Если есть какието решения для ФОКСА буду только рад видеть.

ХЕЛП!
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34201743
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема не в том, чтобы перевести на VFP с T-SQL (это дело 5-ти минут так, как язык VFP значительно более богаче, чем T-SQL), а в том, что в VFP НЕТ такого программного объекта, как функция, возвращающая набор данных, которую можно было использовать в запросе наравне с курсором или таблицей (т.е. после FROM).

С уважением, Алексей
P.S.
@ - признак переменной. Имена всех переменные (а в T-SQL все переменные создаются только с областью видимости LOCAL) должны начинаться с @. В VFP они заменяются переменными с областью видимостью LOCAL.
# - признак временности объекта (в данных примерах - временные таблицы). Временные объекты такого рода имеют видимость, ограниченную областью создания (в данных примерах - функция), уничтожаются сами при выходе из этой области создания, а также не имеют ограничения на создания любыми пользователями. В VFP можно заменить на курсоры, создаваемые командами CREATE CURSOR ....
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34201954
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='0001' && первоначальная установка (поиск по заданному идентификатору)
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable SELECT * FROM myTable WHERE ID=m.lcID
	SELECT ID FROM myTable WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34202791
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот модифицировал вашу функцию под свой вариант и попробовал испраить все ошибки:

LOCAL ARRAY laID(1,1)
LOCAL lcID
LOCAL PE INT
lcID='3202676'
create table tmpTable (id int)
DO WHILE !EMPTY(m.lcID)
INSERT INTO tmpTable values (PE)
where PE IN (
SELECT ID FROM __client m
WHERE ID=m.lcID
SELECT ID FROM __client WHERE id_parent=m.lcID INTO ARRAY laID
m.lcID=IIF(_tally>0,laID(1,1),''))
ENDDO

или

LOCAL ARRAY laID(1,1)
LOCAL lcID
LOCAL PE INT
lcID='3202676'
DO WHILE !EMPTY(m.lcID)
INSERT INTO tmpTable
SELECT ID FROM __client m
WHERE ID=m.lcID
SELECT ID FROM __client m WHERE id_parent=m.lcID INTO ARRAY laID
m.lcID=IIF(_tally>0,laID(1,1),'')
ENDDO

Оба варианта после пары пропушеных ошибок выводят список всех записей из таблицы __client


Щас убегаю, вечером напишу что получилось сделать с функцией aleks2'a
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34203829
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JevgeniyВот модифицировал вашу функцию под свой вариант и попробовал испраить все ошибки:
Оба варианта после пары пропушеных ошибок выводят список всех записей из таблицы __client

Какие ошибки?
Что значит после пары пропущенных ошибок ?
ЧЕм второй вариант отличается от предложенного мною ?
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34204595
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
LOCAL PE INT
lcID='3202676' 
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable &&<--syntax error
		SELECT ID FROM __client m
			WHERE ID=m.lcID &&<-- после выполнения запроса появляется эта: Unrecognized command verb
	SELECT ID FROM __client m WHERE id_parent=m.lcID INTO ARRAY laID&&<--lcid столбец не найжен, ошибка после выполнения
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO 

Пропущеных ошибок - всмысле проигнорированых. Запрос выводит весь список из исходной таблицы
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34204599
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытался как-то использовать вариант aleks2'a , но к сожалению ничего путнего из этого не вышло :(
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34205338
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://sdm.viptop.ru/articles/sqltrees.html

Почитал тут инфу, может кто-нибудь знает как сделать что-то подобное, только чтоб выводило ТОЛЬКО ДОЧЕРНИЕ ЭЛЕМЕНТЫ для данного узла?

Вот набросал алгоритм по которому отбирается потдерево:
Код: plaintext
1.
2.
3.
4.
5.
6.
 1 . Пользователь вводит ID, система выясняет level этой записи (поле level). Создаем временную таблицу.
 2 . Цикл. 
Условие выхода: "на данном уровне нет записей. которые ссылались бы хоть на 1 элемент с предыдущего уровня" 
Тело цикла: "level+1. Все записи PID которых равен хотябы одному ID на предыдущем уровне добавить в конец временной таблицы."
 3 . Вывод временной таблицы на экран. 
 4 . Создание отчета (into cursor query... report form thereport preview)

Помогите пжалуста составить код для данного алгоритма.
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34205754
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
*Function RET_S
LPARAMETERS _id
LOCAL _s
_s=TRANSFORM(_id)
IF SEEK(_id,'table','id') AND table.parent_id# 0 
_s=_s+","+RET_S(table.parent_id)
ENDIF 
RETURN _s
Выдает всех родителей. Только изменить чтоб выдавало всех потомков.
Код: plaintext
1.
SELECT * from __client WHERE ","+transform(ID)+","$","+RET_S( 2670749 )+","
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34211736
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jura.KПопробуй вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='0001' && первоначальная установка (поиск по заданному идентификатору)
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable SELECT * FROM myTable WHERE ID=m.lcID
	SELECT ID FROM myTable WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  

Очень интересно причем здесь tmpTable, какую она играет роль?
И хотелось бы слышать какие-нибудь коментарии по этому...
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34213379
tvxtvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эта тривиальная задача решается рекурсивной процедурой, кому интересно, пишите, выложу....
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34213426
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='3202676' 
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable &&<--syntax error
		SELECT ID FROM __client 
		WHERE ID=m.lcID &&<-- после выполнения запроса появляется эта: Unrecognized command verb
	SELECT ID FROM __client m WHERE id_parent=m.lcID INTO ARRAY laID&&<--lcid столбец не найжен, ошибка после выполнения
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO 

Пропущеных ошибок - всмысле проигнорированых. Запрос выводит весь список из исходной таблицы
Jevgeniy
Очень интересно причем здесь tmpTable, какую она играет роль?
И хотелось бы слышать какие-нибудь коментарии по этому...


Надо делать так в одну строчку или с использованием ;

Код: plaintext
INSERT INTO tmpTable SELECT ID FROM __client WHERE ID=m.lcID 

Теперь по поводу tmpTable в нее и копируется результат
т.е. нужно сначала создать данную таблицу с использованием например
Код: plaintext
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
или
Код: plaintext
SELECT * FROM __client WHERE .F. INTO CURSOR tmpTable READWRITE
правда не помню работает такая конструкция в 6.0, но с 7.0 точно работает
А ошибка вышла из за того что у Вас не создана временная таблица.
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34213940
Данная функция соберёт всех потомков
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function P_ADD
lparameters _PID
local _cur
 if !used("tmpTable")
  CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
 endif 
 _cur=sys( 2015 )
 select * from myTable where id=_PID into cursor (_cur)
 go top in (_cur)
 do while !eof("_cur")
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (&_cur..ID,&_cur..PID,&_cur..LEVEL,&_cur..NAME)
  =P_ADD(&_cur..ID)
  skip in (_cur)
 enddo
 use in (_cur)
Участок
Код: plaintext
1.
2.
 if !used("tmpTable")
  CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
 endif

можно вынести за пределы функции
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214329
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tvxtvxЭта тривиальная задача решается рекурсивной процедурой, кому интересно, пишите, выложу....
Интересно! Пиши!
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214437
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Владимир__
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if !used("tmpTable")
  CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 20 ))
endif 
function P_ADD
lparameters _PID
local _cur
 _cur=sys( 1 )
 select * from __CLIENT where id=_PID into cursor (_cur)
 go top in (_cur)
 do while !eof("_cur")
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (&_cur..ID,&_cur..PID,&_cur..LEVEL,&_cur..NAME)
  =P_ADD(&_cur..ID)
  skip in (_cur)
 enddo
 use in (_cur)



хм, странно. Все работает, но результат не выдает никакой.

Не создает таблицу. Пробовал убрать условие создания таблицы - эффекта никакого.
Я так понял, функция помещает записи в курсор tmpTable, вытался вывести содержимое этой таблицы после вызова данной функции - не показывает.

Jura.K
А ошибка вышла из за того что у Вас не создана временная таблица.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
 
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='1' 
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable SELECT * FROM __client WHERE ID=m.lcID&&<-- syntax error
	SELECT ID FROM __client WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  
Выдает ошибку в том же месте (syntax error)
Код: plaintext
1.
INSERT INTO tmpTable SELECT * FROM myTable WHERE ID=m.lcID
а именно на SELECT * FROM;
:(
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214540
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увидел вот ЭТО и не удержался.
автор
Код: plaintext
1.
2.
3.
4.
5.
 select * from __CLIENT where id=_PID into cursor (_cur)
 go top in (_cur)
 do while !eof("_cur")
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (&_cur..ID,&_cur..PID,&_cur..LEVEL,&_cur..NAME)
  =P_ADD(&_cur..ID)


Код: plaintext
1.
2.
3.
4.
5.
6.
 select * from __CLIENT where id=_PID into cursor (_cur)
*** go top in _cur)  && не нужна в силу того, что в свежеполученном курсоре указатель ВСЕГДА стоит на первой записи
* do while !eof("_cur") 
scan
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (ID,PID,LEVEL,NAME)
  =P_ADD(ID)
endscan
И никаких тормозных макроподстановок и вычислений конца файла.
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214620
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 20 ))
&&function P_ADD
&&lparameters 
local _PID 
local _cur
 _cur=sys( 1 )
select * from __CLIENT where id=_PID into cursor (_cur);
scan
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (ID,PID,LEVEL,NAME)
  =P_ADD(ID)
endscan
на строке scan выдает ошибку "command contains unrecognized phrase/keyword"
Такое же выдавало и на function lparameters _PID , поэтому оно стало local _PID.
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214657
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
select * from __CLIENT where id=_PID into cursor (_cur);
scan


И зачем здесь точка с запятой? Иоткуда взялся этот знак?
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214725
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov
Код: plaintext
1.
select * from __CLIENT where id=_PID into cursor (_cur);
scan


И зачем здесь точка с запятой? Иоткуда взялся этот знак?
ну в противном случае выдает на предыдущей строке о синтаксической ошибке
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214726
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всмысле не на предыдущей, а на этой строке
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214940
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jura.K
А ошибка вышла из за того что у Вас не создана временная таблица.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
 
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='1' 
DO WHILE !EMPTY(m.lcID)
	INSERT INTO tmpTable SELECT * FROM __client WHERE ID=m.lcID&&<-- syntax error
	SELECT ID FROM __client WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  
Выдает ошибку в том же месте (syntax error)
Код: plaintext
1.
INSERT INTO tmpTable SELECT * FROM myTable WHERE ID=m.lcID
а именно на SELECT * FROM;
значит структура таблицы не соответствует tmpTable
тогда сделайте, только учтите что тип полей таблицы tmpTable должен соответствовать типу выбираемых в SELECTe полей
Код: plaintext
INSERT INTO tmpTable (ID, PID, LEVEL, NAME ) SELECT ID, PID, LEVEL, NAME FROM __client WHERE ID=m.lcID
Все это работает в VFP8.0, может быть такая инструкция в 6.0 не работает надо проверить поищу у себя 6.0 и скажу результат
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34214958
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно сделать так если конструкция INSERT INTO table SELECT * FROM table не работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
LOCAL ARRAY laID( 1 , 1 )
LOCAL lcID
lcID='1' 
SELECT __client 
DO WHILE !EMPTY(m.lcID)
             SCAN  
                      IF ID=m.lcID
             	INSERT INTO tmpTable (ID, PID, LEVEL, NAME) ;
                          VALUES ( __client.ID, __client.PID, __client.LEVEL, __client.NAME) 
                      ENDIF 
             ENDSCAN 
	SELECT ID FROM __client WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  
можно ускорить обработку если создать индекс по полю ID

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT __client 
SET ORDER TO ID
DO WHILE !EMPTY(m.lcID)
             IF SEEK(m.lcID)
                  DO WHILE ID=m.lcID
             	INSERT INTO tmpTable (ID, PID, LEVEL, NAME) ;
                          VALUES ( __client.ID, __client.PID, __client.LEVEL, __client.NAME) 
                   SKIP 
                   ENDDO 
             ENDIF 
	SELECT ID FROM __client WHERE PID=m.lcID INTO ARRAY laID
	m.lcID=IIF(_tally> 0 ,laID( 1 , 1 ),'')
ENDDO  
попробуйте если не сложно напишите получилось или нет
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34215570
Jevgeniy __Владимир__
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if !used("tmpTable")
  CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 20 ))
endif 
function P_ADD
lparameters _PID
local _cur
 _cur=sys( 1 )
 select * from __CLIENT where id=_PID into cursor (_cur)
 go top in (_cur)
 do while !eof("_cur")
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (&_cur..ID,&_cur..PID,&_cur..LEVEL,&_cur..NAME)
  =P_ADD(&_cur..ID)
  skip in (_cur)
 enddo
 use in (_cur)



хм, странно. Все работает, но результат не выдает никакой.

Не создает таблицу. Пробовал убрать условие создания таблицы - эффекта никакого.
Я так понял, функция помещает записи в курсор tmpTable, вытался вывести содержимое этой таблицы после вызова данной функции - не показывает.
:(
ОК
Сделаем поподробней и с учётом пожеланий
1. создаем процедуру с именем P_ADD.PRG
Туда пишем такой текст:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
lparameters _PID
local _cur
 _cur=sys( 2015 )
 select * from __CLIENT where id=_PID into cursor (_cur)
 scan
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (ID,PID,LEVEL,NAME)
  =P_ADD(ID)
 endscan
 use in (_cur)
2. Дальше, в командном окне создаём курсор
Код: plaintext
CREATE CURSOR tmpTable (ID INT, PID INT, LEVEL INT, NAME C( 100 ))
3. вызываем функцию с параметром ID родителя
Код: plaintext
=P_ADD( 1 )
4.Смотрим
Код: plaintext
1.
select tmpTable
browse

и ещё- зачем подменили _cur=sys(2015) на _cur=sys(1)? не ужно это делать!
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34215883
Есть ошибка в запросе
вот исправлено
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
lparameters _PID
local _cur
 _cur=sys( 2015 )
 select * from __CLIENT where pid=_PID into cursor (_cur)
 scan
  INSERT INTO tmpTable (ID,PID,LEVEL,NAME) Values (ID,PID,LEVEL,NAME)
  =P_ADD(ID)
 endscan
 use in (_cur)
...
Рейтинг: 0 / 0
Запрос на выбор потдерева из дерева на FOX PRO 6.0
    #34215963
NSFuimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... может это подойдет? или поможет
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос на выбор потдерева из дерева на FOX PRO 6.0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]