|
|
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Задача такова: есть таблица, в которой организвана иерархия. Иерархия глубокая (может достигнуть 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 Сразу в панику вводит символ @ и # :( Пожалуйста подскажите как перевести данный код на фокс про? или хотябы пару строк чтоб разобраться в синтаксисе. Если есть какието решения для ФОКСА буду только рад видеть. ХЕЛП! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2006, 22:51 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Проблема не в том, чтобы перевести на VFP с T-SQL (это дело 5-ти минут так, как язык VFP значительно более богаче, чем T-SQL), а в том, что в VFP НЕТ такого программного объекта, как функция, возвращающая набор данных, которую можно было использовать в запросе наравне с курсором или таблицей (т.е. после FROM). С уважением, Алексей P.S. @ - признак переменной. Имена всех переменные (а в T-SQL все переменные создаются только с областью видимости LOCAL) должны начинаться с @. В VFP они заменяются переменными с областью видимостью LOCAL. # - признак временности объекта (в данных примерах - временные таблицы). Временные объекты такого рода имеют видимость, ограниченную областью создания (в данных примерах - функция), уничтожаются сами при выходе из этой области создания, а также не имеют ограничения на создания любыми пользователями. В VFP можно заменить на курсоры, создаваемые командами CREATE CURSOR .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 08:31 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Попробуй вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 10:08 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Вот модифицировал вашу функцию под свой вариант и попробовал испраить все ошибки: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 13:07 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
JevgeniyВот модифицировал вашу функцию под свой вариант и попробовал испраить все ошибки: Оба варианта после пары пропушеных ошибок выводят список всех записей из таблицы __client Какие ошибки? Что значит после пары пропущенных ошибок ? ЧЕм второй вариант отличается от предложенного мною ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 16:31 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пропущеных ошибок - всмысле проигнорированых. Запрос выводит весь список из исходной таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 23:11 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Пытался как-то использовать вариант aleks2'a , но к сожалению ничего путнего из этого не вышло :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2006, 23:17 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
http://sdm.viptop.ru/articles/sqltrees.html Почитал тут инфу, может кто-нибудь знает как сделать что-то подобное, только чтоб выводило ТОЛЬКО ДОЧЕРНИЕ ЭЛЕМЕНТЫ для данного узла? Вот набросал алгоритм по которому отбирается потдерево: Код: plaintext 1. 2. 3. 4. 5. 6. Помогите пжалуста составить код для данного алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2006, 23:34 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2006, 16:14 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Jura.KПопробуй вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. Очень интересно причем здесь tmpTable, какую она играет роль? И хотелось бы слышать какие-нибудь коментарии по этому... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 23:59 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Эта тривиальная задача решается рекурсивной процедурой, кому интересно, пишите, выложу.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 14:36 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Jevgeniy Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Пропущеных ошибок - всмысле проигнорированых. Запрос выводит весь список из исходной таблицы Jevgeniy Очень интересно причем здесь tmpTable, какую она играет роль? И хотелось бы слышать какие-нибудь коментарии по этому... Надо делать так в одну строчку или с использованием ; Код: plaintext Теперь по поводу tmpTable в нее и копируется результат т.е. нужно сначала создать данную таблицу с использованием например Код: plaintext Код: plaintext А ошибка вышла из за того что у Вас не создана временная таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 14:46 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Данная функция соберёт всех потомков Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. можно вынести за пределы функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 16:37 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
tvxtvxЭта тривиальная задача решается рекурсивной процедурой, кому интересно, пишите, выложу.... Интересно! Пиши! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 18:40 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
__Владимир__ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. хм, странно. Все работает, но результат не выдает никакой. Не создает таблицу. Пробовал убрать условие создания таблицы - эффекта никакого. Я так понял, функция помещает записи в курсор tmpTable, вытался вывести содержимое этой таблицы после вызова данной функции - не показывает. Jura.K А ошибка вышла из за того что у Вас не создана временная таблица. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 19:27 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Увидел вот ЭТО и не удержался. автор Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 20:30 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Такое же выдавало и на function lparameters _PID , поэтому оно стало local _PID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 21:47 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. И зачем здесь точка с запятой? Иоткуда взялся этот знак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2006, 22:45 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov Код: plaintext 1. И зачем здесь точка с запятой? Иоткуда взялся этот знак? ну в противном случае выдает на предыдущей строке о синтаксической ошибке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 00:06 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Всмысле не на предыдущей, а на этой строке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 00:07 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Jura.K А ошибка вышла из за того что у Вас не создана временная таблица. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. значит структура таблицы не соответствует tmpTable тогда сделайте, только учтите что тип полей таблицы tmpTable должен соответствовать типу выбираемых в SELECTe полей Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 08:05 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
можно сделать так если конструкция INSERT INTO table SELECT * FROM table не работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 08:17 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Jevgeniy __Владимир__ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. хм, странно. Все работает, но результат не выдает никакой. Не создает таблицу. Пробовал убрать условие создания таблицы - эффекта никакого. Я так понял, функция помещает записи в курсор tmpTable, вытался вывести содержимое этой таблицы после вызова данной функции - не показывает. :( ОК Сделаем поподробней и с учётом пожеланий 1. создаем процедуру с именем P_ADD.PRG Туда пишем такой текст: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext Код: plaintext Код: plaintext 1. и ещё- зачем подменили _cur=sys(2015) на _cur=sys(1)? не ужно это делать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 11:58 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
Есть ошибка в запросе вот исправлено Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 13:24 |
|
||
|
Запрос на выбор потдерева из дерева на FOX PRO 6.0
|
|||
|---|---|---|---|
|
#18+
хм... может это подойдет? или поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 13:46 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34214726&tid=1590106]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 334ms |

| 0 / 0 |
