|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Доброго дня. Извините, буду писать пространно. Прежде чем задавть вопрос я ознакомился со всеми рекомендациями на тему как фильтровать форму по отвязанному рекордсету. Например, это и это . Имею Ms Access 2003 (11.8166.8172) SP3, проект adp, БД на MSSQL 2005 Express. Имеется форма. В ней листбокс с именем GR и подформа с именем "Номенклатура". подформу хочется фильтровать по листбоксу. Вот первоначальный вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Форма создается, вызывается .SetParam. Пока все идет нормально... Есть фильтрация по листбоксу Gr: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Тоже, собственно, все работает. Почему сделал фильтр на форме, а не оформил соответствующим образом ХП dbo.hpAutoWorkTools? Каждый вызов XП приводит к скану тяжелой таблицы, вообщем, работает медленно. И по полю [GrInd] эту таблицу не проиндексировать (т. к. там нет такого поля :) Оказалось, что в момент выполнения Код: plaintext 1.
Хорошо, отвяжем рекордсет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
И далее с удивлением увидим, что в момент выполнения Код: plaintext
Происходит восстановление Номенклатура.Form.Recordset.ActiveConnection и, бл, вызов хранимой поцедуры. Откуда восстанавливается значение ActiveConnection? Видимо, ConnectionString в Properties рекордсета лежит. Щас буду проверять и прибивать еще и Properties. Вот, после этого, скорее всего, при применении фильтра меня и будет ждать вылет аксесса, как это написано выше во второй ссылке. Отсюда вопросы. 1. Где я ошибаюсь? (блин, ошибки не вижу, но я не хочу восстановления ActiveConnection и вызова ХП) 2. Кто нибудь, кто фильтрует отвязанные рекордсеты в форме, может проведет ревизию фильтрации на предмет восстановления "связи" в отвязанном рекордсете? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 12:27 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 12:53 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Ёжик`офтопик 11.8166 - карму портить, нужно не менее 11.8204 тут мне дали линк Интересно... Линк на обновление дал сам ТС текущего топика. Который сам им же и нЕ воспользовался... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 12:56 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr, Нда, вы и дали нужный линк Пойду - погуляю. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 12:57 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Офтопик2 почти по сабжу: вылетает собака такая при отвязанных рекордсетах. И тут либо мозг ломать и много кодить (и не факт что накодить), либо пусть железяка работает, либо менять среду разработки. Я пока второе выбрал. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:01 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Я всякий раз перезапрашиваю сервер новым RecordSource'ом и не переживаю сервер. Это - его работа. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:02 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr, Отдельная проверка профайлером показывает: Код: plaintext 1. 2. 3. 4.
Вывод, пока не освобождены все интерфейсы ADODB.Connection соединение с сервером живет. Так вот Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
После Con.Open я вижу на сервере событие Audit Login А после Set Con=Nothing нет события Audit Logout . Отсюда вывод: Rs.Open осуществляет копирование ссылки на ADODB.Connection не менее чем в двух экземплярах. Один из них Rs.ActiveConnection. А где второй? Может знатоки АДО подскажут. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:18 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
mds_worldЁжик`офтопик 11.8166 - карму портить, нужно не менее 11.8204 тут мне дали линк Интересно... Линк на обновление дал сам ТС текущего топика. Который сам им же и нЕ воспользовался... :) У меня этих аксессов уже столько, что запутался, где что стоит. Но видимо хотфикс не поможет. 2 Программист-Любитель. Сервер, конечно работает, и пока вызов процедуры составляет где-то 0.1 сек. Но раз происходит скан таблицы - время выполнения будет расти линейно от размеров таблицы. И скоро пользователь будет любоваться песочными часами при передвижении по листбоксу. Хочется красоты. Понятно, что скан таблицы (происходит расчет остатков) не есть хорошо. Но я думал, что можно до определенного размера потерпеть и пока занаться другими неотложными делами. Так нет, блин, щас брошу все и буду организовавать таблицу остатков для ускорения расчета сумм... Ёжик`Офтопик2 почти по сабжу: вылетает собака такая при отвязанных рекордсетах. И тут либо мозг ломать и много кодить (и не факт что накодить), либо пусть железяка работает, либо менять среду разработки. Я пока второе выбрал. Видимо, к этому идет... Жаль. Я, конечно, тот еще программер на С#, но недавно засек время: Создание формы с гридом, где находятся результаты XП с параметрами на Access у меня занимает 5 минут,а на С# - 40 минут. Заказчик же даже слов таких не знает, но платит за результат... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:37 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Создание формы с гридом, где находятся результаты XП с параметрами на Access у меня занимает 5 минут,а на С# - 40 минут. Да!!! Слепил запрос в студии и кое-как наляпал код в ВБА. Запустил ВБА - поймал ошибку в ВБА - перекорячил ВБА код - перевыполнил перекоряченный код - не понравилось выполнение запроса - в студии переджоинил запрос, выполнил, вернулся в ВБА - перевыполнил вызов запроса. Пара итераций и сложная логика работает за 5 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:49 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr :) У меня этих аксессов уже столько, что запутался, где что стоит. Но видимо хотфикс не поможет. В данном случае хотфикс не поможет, но карму точно поправит. А я логер написал, и все про всех знаю ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 13:54 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Ёжик`, чё и я там есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 14:06 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
alvk, тьфу, тупанул, вопрос снимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 14:07 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
А зачем закрывать рекордсет после присваивания его свойству формы Recordset? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 14:09 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Ёжик`, Прикольно. Возьму на вооружение. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 14:12 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
IFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset? Да вообщем-то незачем. Это все Гетц. :) А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 14:16 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
IFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset? Честное пионерское не надо!? Я в "непонятках" и закрываю, и Nothing "леплю". Ещё пару слов,так сказать, для чайников. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 09:41 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset? Да вообщем-то незачем. Это все Гетц. :) А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо. Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 09:42 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Уважающий ВсехВасVladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset? Да вообщем-то незачем. Это все Гетц. :) А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо. Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же! Данный код был заимствован из примера, приведенного в первой ссылке в начале топика (это чтобы не было лишнего базара, о том что я неправильно использовал рекоменданции): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Закрывать Rs было стремно (сделаю Rs.Close и закроется Номенклатура.Form.Recordset - c DAO.Recordset так бы и случилось), но прокатило для ADODB.Recordset. Видимо, ADODB.Recordset.Close просто уменьшает счетчик ссылок на объект и не делает больше ничего. (ADODB.Recordset.Close - это просто вызов метода ::Release унаследованного от класса IUnkown - родоначальника всех COM) Объясню упрощенно: Ком-объекты в VBA ведут себя следующим образом: они уничтожаются и освобождают память тогда, когда не остается больше ссылок на них. То есть, если я напишу Set Rs=Nothing, я удалю одну ссылку на объект, но останется еще одна: Номенклатура.Form.Recordset, которая будет жить, пока открыта форма. Когда форма будет закрыта - ссылок на Recordset не останется и будет вызван деструктор этого объекта. А что будет, если я не напишу Set Rs=Nothing? Слава богу не на С++ пишем: Rs объявлена локальной переменной и после выхода из процедуры VBA сам закроет ссылку (то есть - сам присвоит Set Rs=Nothing). Это и называется "сбором мусора". И надо сказать, я давно не видел жалоб на утечку памяти, происходящую от VBA. Примеры Гетца исторически восходять к временам Access 2.0, когда еще не было Com. И я подозреваю, что в каждом новом издании тупо Copy-Past) Вывод: локальные Ком-объекты уничтожать после использования не надо, если вы готовы мириться, что они занимают память, пока продолжает выполняться процедура. На выходе из процедуры VBA сделает это за вас, и сделает корректно. На самом деле все чуть сложнее и в VBA каким-то хитрым образом, путем использования коллекций можно добиться сбоя в подсчете ссылок на объект. (кажется, Бенедикт демонстрировал в этом форуме что-то такое). Более подробно все это описано в хорошей книжке, которую советую прочитать всем, кто хочет разобраться с COM-объектами (понять их)) "Сущность технологии COM" Автор: Дональд Бокс ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 11:59 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKrУважающий ВсехВасVladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset? Да вообщем-то незачем. Это все Гетц. :) А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо. Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же! Данный код был заимствован из примера, приведенного в первой ссылке в начале топика (это чтобы не было лишнего базара, о том что я неправильно использовал рекоменданции): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Закрывать Rs было стремно (сделаю Rs.Close и закроется Номенклатура.Form.Recordset - c DAO.Recordset так бы и случилось), но прокатило для ADODB.Recordset. Видимо, ADODB.Recordset.Close просто уменьшает счетчик ссылок на объект и не делает больше ничего. (ADODB.Recordset.Close - это просто вызов метода ::Release унаследованного от класса IUnkown - родоначальника всех COM) Объясню упрощенно: Ком-объекты в VBA ведут себя следующим образом: они уничтожаются и освобождают память тогда, когда не остается больше ссылок на них. То есть, если я напишу Set Rs=Nothing, я удалю одну ссылку на объект, но останется еще одна: Номенклатура.Form.Recordset, которая будет жить, пока открыта форма. Когда форма будет закрыта - ссылок на Recordset не останется и будет вызван деструктор этого объекта. А что будет, если я не напишу Set Rs=Nothing? Слава богу не на С++ пишем: Rs объявлена локальной переменной и после выхода из процедуры VBA сам закроет ссылку (то есть - сам присвоит Set Rs=Nothing). Это и называется "сбором мусора". И надо сказать, я давно не видел жалоб на утечку памяти, происходящую от VBA. Примеры Гетца исторически восходять к временам Access 2.0, когда еще не было Com. И я подозреваю, что в каждом новом издании тупо Copy-Past) Вывод: локальные Ком-объекты уничтожать после использования не надо, если вы готовы мириться, что они занимают память, пока продолжает выполняться процедура. На выходе из процедуры VBA сделает это за вас, и сделает корректно. На самом деле все чуть сложнее и в VBA каким-то хитрым образом, путем использования коллекций можно добиться сбоя в подсчете ссылок на объект. (кажется, Бенедикт демонстрировал в этом форуме что-то такое). Более подробно все это описано в хорошей книжке, которую советую прочитать всем, кто хочет разобраться с COM-объектами (понять их)) "Сущность технологии COM" Автор: Дональд Бокс Большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 12:49 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr куда дальше двинулись то, тема интересная, по крайней мере в образовательных целях если не практических. (извините что так потребительски на Вашу проблему смотрю:) Пробовали ли как собирались ConnectionString в Properties рекордсета прибить? А что если фильтр рекордсета сделать, а не по форме? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 19:01 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr, У меня тоже вопросы. Мог бы проверить и сам, но надо заводить адп, форму и тд (сам работаю с мдб) 1. авторОказалось, что в момент выполнения Номенклатура.Form.FilterOn = True Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr) происходит перезапрос данных, то есть новый вызов с сервера dbo.hpAutoWorkTools. Исследовано профайлером. А что будет, если формировать источник данных на основе коннекта с UseClient? 2. автор Set Rs = New ADODB.Recordset Rs.Open "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd), Con, adOpenStatic, adLockOptimistic Set Rs.ActiveConnection = Nothing Спасибо. Извините за лень. А что будет, если попробовать Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2010, 21:18 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
vladKVladimirKr куда дальше двинулись то, тема интересная, по крайней мере в образовательных целях если не практических. (извините что так потребительски на Вашу проблему смотрю:) Пробовали ли как собирались ConnectionString в Properties рекордсета прибить? Не нашел в Properties ничего похожего. Зато, блин, есть милое свойство ADODB.Recordset.Source, которое "Нельзя изменить пока объект открыт" (Run-Time error). Есть подозрение, что форма тупо берет эту строку и посылает на сервер, причем не найдя Me.Recordset.ActiveConnection, делает это тупо под CurrentProject.AccessConnection. Проверить это легко. Видимо, щас сделаю и напишу. Пробовал фильтр по рекордсету, еще раньше чем все остальное. Применение фильтра к Recordset формы проходит без ошибок, НО не меняет картинку на экране. Скорее всего, потому, что в момент присвоения нового рекордсета свойству Form.Recordset форма копирует куда-то в себя массив букмарок рекордсета и дальше работает уже с этим массивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2010, 09:17 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
Guest33VladimirKr, У меня тоже вопросы. Мог бы проверить и сам, но надо заводить адп, форму и тд (сам работаю с мдб) 1. авторОказалось, что в момент выполнения Номенклатура.Form.FilterOn = True Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr) происходит перезапрос данных, то есть новый вызов с сервера dbo.hpAutoWorkTools. Исследовано профайлером. А что будет, если формировать источник данных на основе коннекта с UseClient? 2. автор Set Rs = New ADODB.Recordset Rs.Open "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd), Con, adOpenStatic, adLockOptimistic Set Rs.ActiveConnection = Nothing Спасибо. Извините за лень. А что будет, если попробовать Код: plaintext 1.
1. Дык, так и сделано. adUseClient. 2. Проверено в дебагере. Свойство Me.Recordset.ActiveConnection = Nothing пока не выполнится Me.Filter="....". А вот после присвоения фильтра происходит пересоздание рекордсета с использованием Recordset.Source и, видимо, CurrentProject.AccesConnection. Делает это форма сама, хотя ее и не просят. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2010, 09:37 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKr .....милое свойство ADODB.Recordset.Source, которое "Нельзя изменить пока объект открыт" (Run-Time error). Есть подозрение, что форма тупо берет эту строку и посылает на сервер, причем не найдя Me.Recordset.ActiveConnection, делает это тупо под CurrentProject.AccessConnection. Проверить это легко. Видимо, щас сделаю и напишу. Да, так и есть. Настоящий зверинец. Access считает, что лучше знает, ЧТО именно нужно пользователю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
После выполнения Код: plaintext
"Provider= Microsoft.Access.OLEDB.10.0 ;Persist Security Info=True;Data Source=VLADIMIRHOST\SQLEXPRESS;User ID=sa;Password=блабла;Initial Catalog=Auto;Data Provider=SQLOLEDB.1" То есть строку CurrentProject.AccessConnection. От, сцуко! А если бы мое соединение было вообще в другую базу, но с такойже хранимой процедурой? Я бы радостно работал, не заметив, что произошло изменение ActiveConnection и наворотил бы дров при записи данных. Будьте бдительны! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2010, 10:07 |
|
Отвязанный рекордсет фильтр по форме и ActiveConnection
|
|||
---|---|---|---|
#18+
VladimirKrА если бы мое соединение было вообще в другую базу, но с такойже хранимой процедурой? Я бы радостно работал, не заметив, что произошло изменение ActiveConnection и наворотил бы дров при записи данных. Будьте бдительны! сомнительно.. сервер на месте, бд тоже. пользователь, пароль.. все осталось ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2010, 10:24 |
|
|
start [/forum/topic.php?fid=45&msg=36741903&tid=1631155]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 297ms |
0 / 0 |