|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Здравствуйте, необходима Ваша помощь. Использую VFPOLEDB под c#. Есть таблица, в которой хранит данные программа написанная еще в 90-е, возможности менять структуру нет. Приходится работать с тем, что есть. Упрощенных фрагмент таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Данные в таблице хранятся по цепочке, порядок имеет занчение. Алгоритм получения данных таков: Например, что бы получить все данные в нужном порядке по sh = 1001 нужно: 1. Изначально мы знаем только точка входа rec = 1 2. Далее из первой строки получаем номер следующей строки recnext = 5 3. Из строки 5 получаем номер следующей строки recnext = 7 4. В строке 7 получаем номер следующей строки recnext = 0, если recnext = 0 останавливаемся. В итоге нужно получить: Код: sql 1. 2. 3. 4. 5. 6. 7.
Как вариант подойдет и последняя строка в цепочке: Код: sql 1. 2. 3. 4. 5.
Следует отметить, что взять сразу строку с recnext = 0, не прокатывает. В неиспользуемых и ссылающихся строках просто обнуляется ячейка recnext, или просто если это первая запись по счету, то recnext у нее будет равен 0. Возможно выполнить данную задачу запросами sql к таблице? Либо буду благодарен предложенному Вами алгориму. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 15:08 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodey, Как вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 16:50 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Jonny540, Спасибо, то что надо! Завтра попробую на рабочей таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 18:02 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodey, если по уму, там еще надо проверку на EOF() вставить, мало ли что в рабочей таблице будет Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 18:36 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Из того факта, что сама таблица старая не следует что и решать ее надо старыми методами. Ведь указали же, что подключение идет из C# через VFPOLEDB. Как Вы там все эти старые циклы крутить будете? Кстати, почему не использовать SCAN..ENDSCAN? mr.zlodey Описанная задача - это классическая задача на иерархические (древовидные) структуры. ID-ParentID. Способов решения достаточно много. Например, если предельная глубина вложенности не может превышать 10 уровней, то можно и одним запросом (довольно громоздким) все решить. А если "по классике", то Вам надо делать последовательные запросы, пополняя некую итоговую структуру. Кстати, из описания непонятно, rec - это такое поле или физический номер записи? И еще один момент. Как Вы отличаете "не используемые" записи, от записей, у которых нет иерархии. Т.е., если я правильно понял, в обоих случаях recnext = 0, но какие-то из этих записей используются, хотя не имеют иерархии, а какие-то - нет. И как их отличить? Вообще-то, Вам надо получить только одну "цепочку" (одну итоговую запись) или все итоговые записи всех цепочек? Тот факт, что номера следующих записей в цепочке всегда идут по возрастанию - это совпадение (пример) или такая структура? Например, может запись с rec = 10 иметь значение recnext = 9. Т.е. существуют ли (могут ли существовать) записи у которых указано значение recnext, но при этом recnext < rec? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 20:22 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
ВладимирМ, Для выполнения кода выше в C# использовал OleDbCommand. Не знаю на счет полной поддержки языка, но код выше работает точно. ВладимирМНапример, если предельная глубина вложенности не может превышать 10 уровней, то можно и одним запросом (довольно громоздким) все решить. А если "по классике", то Вам надо делать последовательные запросы, пополняя некую итоговую структуру. Буду весьма благодарен примеру такого запроса. Есть у меня мысли по этому поводу, но на данный момент я рассматриваю варианты. ВладимирМКстати, из описания непонятно, rec - это такое поле или физический номер записи? И еще один момент. Как Вы отличаете "не используемые" записи, от записей, у которых нет иерархии. Т.е., если я правильно понял, в обоих случаях recnext = 0, но какие-то из этих записей используются, хотя не имеют иерархии, а какие-то - нет. И как их отличить? Вообще-то, Вам надо получить только одну "цепочку" (одну итоговую запись) или все итоговые записи всех цепочек? rec - это физический номер записи, добавил его для наглядности. Вы правильно поняли, в обоих случаях recnext = 0. Есть еще таблица, в которой хранятся все используемые номера строк точек входа. Других способов отличить нет. Иметь полную цепочку записей более дальновидно, но в данный момент мне достаточно итоговых записей всех цепочек. ВладимирМТот факт, что номера следующих записей в цепочке всегда идут по возрастанию - это совпадение (пример) или такая структура? Например, может запись с rec = 10 иметь значение recnext = 9. Т.е. существуют ли (могут ли существовать) записи у которых указано значение recnext, но при этом recnext < rec? Нет, recnext в rec = 10 не может ссылаться на записи выше, в таком случае recnext может быть не меньше 11. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 21:47 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodeyНе знаю на счет полной поддержки языка, но код выше работает точно. За исключением BROWSE ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2012, 21:52 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodeyВладимирМНапример, если предельная глубина вложенности не может превышать 10 уровней, то можно и одним запросом (довольно громоздким) все решить. А если "по классике", то Вам надо делать последовательные запросы, пополняя некую итоговую структуру. Буду весьма благодарен примеру такого запроса. Есть у меня мысли по этому поводу, но на данный момент я рассматриваю варианты.если у вас N уровней: Код: sql 1. 2. 3. 4. 5. 6. 7.
, потом по номерам записей достать данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 05:31 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Опять начались пушечные залпы... Бедные воробьи :) tanglirесли у вас N уровней Число N заранее неизвестно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 07:53 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
ВладимирМНапример, если предельная глубина вложенности не может превышать 10 уровней , то можно и одним запросом (довольно громоздким) все решить. ТС Буду весьма благодарен примеру такого запроса . Есть у меня мысли по этому поводу, но на данный момент я рассматриваю варианты. яесли у вас N уровней: < запрос >Ну и к чему вы написали своё Jonny540Число N заранее неизвестно.? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 08:14 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
tanglir, А как Вы собираетесь писать запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 08:55 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Товарищи, не ссорьтесь. Спасибо всем за примеры, все они мне будут мне полезны. Запишу в блоге, если не сейчас, то обязательно пригодится в будущем. На C# данная задача решается с помощью одного запроса и цикла while. Нужно рассмотреть варианты, выбрать самый быстрый и удобный. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 09:06 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodeyИзначально мы знаем только точку входа Глубина вложенности заранее неизвестна. И что делать, если она > 10? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 09:10 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodey, Так какого черта ты тут воду мутишь??? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 09:13 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7.
Я думал о таком варианте, но проблема в том, что N у разных sh может быть различное. Можно на C# сделать конструктор запросов. Но тут возникают сложности в плане как быть уверенным в максимальной длине цепочки, заранее необходимо подсчитать количество элементов в цепочке, при том что recnext = 0 может быть как и у удаленных звеньев так и у единственного звена в цепочке, то возникает много вопросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 09:19 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
mr.zlodey, N - предельная глубина. Если длина цепочки меньше, то для всех элементов, располагающихся за последним в цепочке, вернётся NULL. ЗЫ. Но это всё, конечно, костыль, сделанный для: 1)тех диалектов SQL, где нет рекурсивных запросов; И 2)случаев, где глубина рекурсии гарантированно ограничена этим самым N. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 10:18 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 12:40 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
Доброго времени суток ВладимирМ, По собственному скудоумию, спер Ваш подход для получение списка листьев на стандартной древовидной структуре ID,PARENTID Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Быстродействие, естественно, очень не устраивает.Может есть другие варианты для получения листьев? И еще. Собственно мучаюсь с OLE treview, как получить список листьев отмеченных галочками? Получить список отмеченных в treview и для каждого выполнить код что выше- страшно представить сколько будет выполняться. Заранее благодарен ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2013, 09:35 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
rock-n-rollСобственно мучаюсь с OLE treview, как получить список листьев отмеченных галочками?"по мотивам старого кода", так сказать Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
+забыл написать проверку для случая, когда корень сам является отмеченным листом. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2013, 12:09 |
|
Пройти по цепочке записей
|
|||
---|---|---|---|
#18+
rock-n-rollДоброго времени суток ВладимирМ, По собственному скудоумию, спер Ваш подход для получение списка листьев на стандартной древовидной структуре ID,PARENTID Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Быстродействие, естественно, очень не устраивает.Может есть другие варианты для получения листьев? Структура id/ParentId крайне не удобная с точки зрения реляционной модели данных. В смысле, с точки зрения выполнения запросов Select-SQL. Поэтому для ускорения выборок необходимо вводить некие дополнительные (дублирующие) сущности. Не обязательно в саму исходную таблицу, но желательно хотя бы в результирующую выборку. Например, можно ввести сущность "уровень (вложенности)" Кроме того, как правило, одна групповая команда выполняется быстрее, чем несколько последовательных. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
rock-n-rollСобственно мучаюсь с OLE treview, как получить список листьев отмеченных галочками? Получить список отмеченных в treview и для каждого выполнить код что выше- страшно представить сколько будет выполняться Если Вы уже пометили узлы галочками, то зачем же их повторно отбирать запросами? У Вас же должна быть взаимно-однозначная связь между узлом объекта TreeView и ID записи таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2013, 23:02 |
|
|
start [/forum/topic.php?fid=41&msg=38312147&tid=1582981]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 169ms |
0 / 0 |