|
|
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Есть рекурсивная функция для обхода дерева. (Открыть рекордсет, для каждой записи вызвать эту функцию, закрыть рекордсет). Дерево достаточно большое. Когда открывается 50 рекордсетов, выдается сообщение "Ошибка 3048. Открытие дополнительных баз невозможно". Подскажите, как это побороть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 10:42 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
T_Volkova_81Ошибка 3048. Открытие дополнительных баз невозможно". Подскажите, как это побороть?Если дело именно в "Открытии дополнительных баз " (то есть, вы для открытия Recordset открываете там же Database), то попробуйте в своей рекурсивной функции не делать открытие Database. Откройте ее снаружи и прередайте в фунцию в качестве параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 10:54 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Я делаю CurrentDB.OpenRecordset. Разве при этом открывается база? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:12 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Если я не ошибаюсь, CurrentDB каждый раз открывает базу заново. Можно попробовать занести CurrentDB в переменную и дальше пользоваться только ею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:24 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Владимир СанычЕсли я не ошибаюсь, CurrentDB каждый раз открывает базу заново. Можно попробовать занести CurrentDB в переменную и дальше пользоваться только ею. В подтверждение предположения ВС (если речь не идет о MSA < 2000) из справки Note In previous versions of Microsoft Access, you may have used the syntax DBEngine.Workspaces(0).Databases(0) or DBEngine(0)(0) to return a pointer to the current database. In Microsoft Access 2000, you should use the CurrentDb method instead. The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database. The CurrentDb method enables you to create more than one variable of type Database that refers to the current database. Microsoft Access still supports the DBEngine(0)(0) syntax, but you should consider making this modification to your code in order to avoid possible conflicts in a multiuser database. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:27 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
T_Volkova_81Я делаю CurrentDB.OpenRecordset. Разве при этом открывается база?При этом создается новая ссылка на объект CurrentDb, очевидно, на это есть ограничения. Попробуйте все-таки передать базу параметром, в этом случае вам наверняка удастся пройти по дереву чуть дальше - пока не уткнетесть в ограничение по числу открытых таблиц ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:29 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Спасибо, сейчас попробую. А какое ограничение на число открытых таблиц (офис 97)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:38 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Попробовал, у меня при подобной рекурсии: ошибка 3048 - при числе итераций 250 (это ваш варант с CurrentDb) ошибка 3014 - при числе итераций 2040 (это вариант с открытием бд снаружи) MSA2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:39 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
T_Volkova_81А какое ограничение на число открытых таблиц (офис 97)?Ограничения такого рода перечислены в справке MSA (по-моему, в разделе "Спецификации"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:45 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
вместо CurrentDB пользуйтесь DBEngine.Workspaces(0).Databases(0). закрывайте ненужные recordset и уничтожайте переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:46 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Владимир СанычЕсли я не ошибаюсь, CurrentDB каждый раз открывает базу заново. ... думаю, что так сказать нельзя. То, что CurrentDB занимает одну из ссылок в наборе Databases - это да. При достижении предела в 250 ссылок на databases идет ошибка. Но это не значит, что currentdb вновь открывает базу. По крайней мере никаких следов второго открытия базы в .ldb нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 12:14 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Нет, что-то это не сильно помогло. Решила привести код. БД для учета технологического маршрута. Для изготовления номенклатуры проводится несколько операций. На каждой операции, в свою очередь, может расходоваться другая номенклатура. Таблицы: Номенклатура(сч,Наименование,Обозначение,...) Операции(сч,Наименование,Обозначение,...) МКНоменклатуры(сч,НомерОперации,Операция,КудаВходит(Номенклатура),Участок,...) 'маршрутная карта номенклатуры СоставОпераций(сч,Номенклатура,Операция,Расход,КоэффициентРегнерации,...) 'нормы расхода номенклатуры на операцию Код: plaintext 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:10 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
CurrentDb- ошибка вылетаkf при i-j=50, сейчас - 63. Думаю рекордсет копировать в массив и тут же закрывать, затем цикл по массиву. Может быть, кто-нибудь еще идею подскажет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:29 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Поищи алгоритм обхода дерева без рекурсии, он точно есть (в универе помнится на дискретной матиматике его приводил препод), аглогимт был для бинарного дерева, а любое дерево можно однозначно преобразовать в бинарное и обратно, алгоритм есть тоже вот его я даже помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:41 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
А если поиграть с параметрами рекордсета? Set rs = db.OpenRecordset(sqls,dbopendynaset,dbreadonly) или Set rs = db.OpenRecordset(sqls,dbopensnapshot) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:43 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
лучше реализовать рекурсию в запросе и выводить в первый же рекордсет уже готовые данные о дереве и сответственно выводить куда нужно. если алготим формирования рекурсивных данных достаточно сложен можно сделать код который будет последовательно формировать временную таблицу инсертами и апдейтами, а потом просто выберешь ее в рекордсет а вообще текстовое поле в таблице описывающем дерево сданными типа ID NODE parentpath1 корень 1\2 Первый элемент 1\2\3 Второй элемент 1\3\4 Первый суб первого эл-та 1\2\4\ позволит быстро найти дочек начиная с любого узла при помощи Like ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:58 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
http://am.rusimport.ru/MSAccess/topic.aspx?ID=321 А вообще какая конечная задача данной процедуры??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 13:59 |
|
||
|
Рекурсия и рекордсет
|
|||
|---|---|---|---|
|
#18+
Владимир СанычА если поиграть с параметрами рекордсета? Set rs = db.OpenRecordset(sqls,dbopendynaset,dbreadonly) или Set rs = db.OpenRecordset(sqls,dbopensnapshot) я бы ваще открыл либо 4 табличных рекордсета с нужными индексами на уровне модуля, и только Seek-ал бы по ним, либо, на том же уровне модуля, 2 праильно отсортированных динасета и бегал бы по ним файндом ("пока не") и букмарками (по возвращению на уровень рекурсии из вложения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 14:01 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=33655693&tid=1659840]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 392ms |

| 0 / 0 |
