Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отвязанный рекордсет фильтр по форме и ActiveConnection / 25 сообщений из 28, страница 1 из 2
13.07.2010, 12:27
    #36737886
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Доброго дня.

Извините, буду писать пространно.
Прежде чем задавть вопрос я ознакомился со всеми рекомендациями на тему как фильтровать форму по отвязанному рекордсету. Например,
это и это .

Имею Ms Access 2003 (11.8166.8172) SP3, проект adp, БД на MSSQL 2005 Express.


Имеется форма. В ней листбокс с именем GR и подформа с именем "Номенклатура".
подформу хочется фильтровать по листбоксу. Вот первоначальный вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public DocSelect As clDocSelect
Public Sub SetParam(Ds As clDocSelect)
  Set DocSelect = Ds
  If DocSelect Is Nothing Then
    Exit Sub
  End If
  Номенклатура.Form.Recordsource = "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd)  
End Sub

Форма создается, вызывается .SetParam. Пока все идет нормально...
Есть фильтрация по листбоксу Gr:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Gr_AfterUpdate()
  If Gr =  0  Then
    Номенклатура.Form.Filter = ""
    Номенклатура.Form.FilterOn = False
  Else
    Номенклатура.Form.FilterOn = True
    Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr)
  End If
End Sub

Тоже, собственно, все работает.
Почему сделал фильтр на форме, а не оформил соответствующим образом ХП dbo.hpAutoWorkTools? Каждый вызов XП приводит к скану тяжелой таблицы, вообщем, работает медленно. И по полю [GrInd] эту таблицу не проиндексировать (т. к. там нет такого поля :)

Оказалось, что в момент выполнения
Код: plaintext
1.
    Номенклатура.Form.FilterOn = True
    Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr)
происходит перезапрос данных, то есть новый вызов с сервера dbo.hpAutoWorkTools. Исследовано профайлером.

Хорошо, отвяжем рекордсет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Sub SetParam(Ds As clDocSelect)
  Dim Rs As ADODB.Recordset
  Dim Con As ADODB.Connection
  Set DocSelect = Ds
  If DocSelect Is Nothing Then
    Exit Sub
  End If
  Set Con = New ADODB.Connection
  Con.ConnectionString = CurrentProject.AccessConnection.ConnectionString
  Con.CursorLocation = adUseClient
  Con.Open
    
  Set Rs = New ADODB.Recordset
  Rs.Open "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd), Con, adOpenStatic, adLockOptimistic
    
  Set Rs.ActiveConnection = Nothing
  'Set Rs = CurrentProject.Connection.Execute("exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd))
  Con.Close
  Set Con = Nothing
  Set Номенклатура.Form.Recordset = Rs
  Rs.Close
  Set Rs = Nothing
End Sub

И далее с удивлением увидим, что в момент выполнения

Код: plaintext
    Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr)

Происходит восстановление Номенклатура.Form.Recordset.ActiveConnection и, бл, вызов хранимой поцедуры.
Откуда восстанавливается значение ActiveConnection? Видимо, ConnectionString в Properties рекордсета лежит.
Щас буду проверять и прибивать еще и Properties. Вот, после этого, скорее всего, при применении фильтра меня и будет ждать вылет аксесса, как это написано выше во второй ссылке.
Отсюда вопросы.
1. Где я ошибаюсь? (блин, ошибки не вижу, но я не хочу восстановления ActiveConnection и вызова ХП)
2. Кто нибудь, кто фильтрует отвязанные рекордсеты в форме, может проведет ревизию фильтрации на предмет восстановления "связи" в отвязанном рекордсете?
...
Рейтинг: 0 / 0
13.07.2010, 12:53
    #36738019
Ёжик`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
офтопик
11.8166 - карму портить, нужно не менее 11.8204

тут мне дали линк
...
Рейтинг: 0 / 0
13.07.2010, 12:56
    #36738038
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Ёжик`офтопик
11.8166 - карму портить, нужно не менее 11.8204

тут мне дали линк
Интересно... Линк на обновление дал сам ТС текущего топика. Который сам им же и нЕ воспользовался...
...
Рейтинг: 0 / 0
13.07.2010, 12:57
    #36738041
Ёжик`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKr,

Нда, вы и дали нужный линк
Пойду - погуляю.
...
Рейтинг: 0 / 0
13.07.2010, 13:01
    #36738065
Ёжик`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Офтопик2 почти по сабжу: вылетает собака такая при отвязанных рекордсетах.

И тут либо мозг ломать и много кодить (и не факт что накодить), либо пусть железяка работает, либо менять среду разработки.
Я пока второе выбрал.
...
Рейтинг: 0 / 0
13.07.2010, 13:02
    #36738075
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Я всякий раз перезапрашиваю сервер новым RecordSource'ом и не переживаю сервер. Это - его работа.
...
Рейтинг: 0 / 0
13.07.2010, 13:18
    #36738131
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKr,

Отдельная проверка профайлером показывает:
Код: plaintext
1.
2.
3.
4.
Dim con as ADODB.Connection
Con.ConnectionString=блабла
Con.Open ' есть событие AuditLogin на сервере
Con.Close ' НЕТ события Audit Logout!!!
Set Con=Nothing ' Вот только после этого возникает Audit Logout

Вывод, пока не освобождены все интерфейсы ADODB.Connection соединение с сервером живет.

Так вот
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  
  Set Con = New ADODB.Connection
  Con.ConnectionString = CurrentProject.AccessConnection.ConnectionString
  Con.CursorLocation = adUseClient
  Con.Open
    
  Set Rs = New ADODB.Recordset
  Rs.Open "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd), Con, adOpenStatic, adLockOptimistic

  Set Rs.ActiveConnection = Nothing
  'Set Rs = CurrentProject.Connection.Execute("exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd))
  Con.Close
  Set Con = Nothing
  Set Номенклатура.Form.Recordset = Rs
  Rs.Close
  Set Rs = Nothing

После Con.Open я вижу на сервере событие Audit Login
А после Set Con=Nothing нет события Audit Logout .

Отсюда вывод:
Rs.Open осуществляет копирование ссылки на ADODB.Connection не менее чем в двух экземплярах.
Один из них Rs.ActiveConnection. А где второй?
Может знатоки АДО подскажут.
...
Рейтинг: 0 / 0
13.07.2010, 13:37
    #36738194
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
mds_worldЁжик`офтопик
11.8166 - карму портить, нужно не менее 11.8204

тут мне дали линк
Интересно... Линк на обновление дал сам ТС текущего топика. Который сам им же и нЕ воспользовался...

:) У меня этих аксессов уже столько, что запутался, где что стоит.
Но видимо хотфикс не поможет.

2 Программист-Любитель.

Сервер, конечно работает, и пока вызов процедуры составляет где-то 0.1 сек. Но раз происходит скан таблицы - время выполнения будет расти линейно от размеров таблицы. И скоро пользователь будет любоваться песочными часами при передвижении по листбоксу.

Хочется красоты.

Понятно, что скан таблицы (происходит расчет остатков) не есть хорошо. Но я думал, что можно до определенного размера потерпеть и пока занаться другими неотложными делами. Так нет, блин, щас брошу все и буду организовавать таблицу остатков для ускорения расчета сумм...

Ёжик`Офтопик2 почти по сабжу: вылетает собака такая при отвязанных рекордсетах.

И тут либо мозг ломать и много кодить (и не факт что накодить), либо пусть железяка работает, либо менять среду разработки.
Я пока второе выбрал.

Видимо, к этому идет... Жаль.
Я, конечно, тот еще программер на С#, но недавно засек время:
Создание формы с гридом, где находятся результаты XП с параметрами на Access у меня занимает 5 минут,а на С# - 40 минут.
Заказчик же даже слов таких не знает, но платит за результат...
...
Рейтинг: 0 / 0
13.07.2010, 13:49
    #36738251
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Создание формы с гридом, где находятся результаты XП с параметрами на Access у меня занимает 5 минут,а на С# - 40 минут.
Да!!!

Слепил запрос в студии и кое-как наляпал код в ВБА.

Запустил ВБА - поймал ошибку в ВБА - перекорячил ВБА код - перевыполнил перекоряченный код - не понравилось выполнение запроса - в студии переджоинил запрос, выполнил, вернулся в ВБА - перевыполнил вызов запроса.

Пара итераций и сложная логика работает за 5 минут.
...
Рейтинг: 0 / 0
13.07.2010, 13:54
    #36738280
Ёжик`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKr
:) У меня этих аксессов уже столько, что запутался, где что стоит.
Но видимо хотфикс не поможет.
В данном случае хотфикс не поможет, но карму точно поправит.
А я логер написал, и все про всех знаю
...
Рейтинг: 0 / 0
13.07.2010, 14:06
    #36738331
alvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Ёжик`,

чё и я там есть?
...
Рейтинг: 0 / 0
13.07.2010, 14:07
    #36738336
alvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
alvk,

тьфу, тупанул, вопрос снимаю.
...
Рейтинг: 0 / 0
13.07.2010, 14:09
    #36738341
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
А зачем закрывать рекордсет после присваивания его свойству формы Recordset?
...
Рейтинг: 0 / 0
13.07.2010, 14:12
    #36738355
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Ёжик`,

Прикольно.
Возьму на вооружение.
...
Рейтинг: 0 / 0
13.07.2010, 14:16
    #36738373
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
IFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset?

Да вообщем-то незачем. Это все Гетц. :)

А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо.
...
Рейтинг: 0 / 0
14.07.2010, 09:41
    #36739854
Уважающий ВсехВас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
IFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset?

Честное пионерское не надо!? Я в "непонятках" и закрываю, и Nothing "леплю".
Ещё пару слов,так сказать, для чайников.
...
Рейтинг: 0 / 0
14.07.2010, 09:42
    #36739859
Уважающий ВсехВас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset?

Да вообщем-то незачем. Это все Гетц. :)

А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо.


Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же!
...
Рейтинг: 0 / 0
14.07.2010, 11:59
    #36740329
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
Уважающий ВсехВасVladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset?

Да вообщем-то незачем. Это все Гетц. :)

А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо.


Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же!

Данный код был заимствован из примера, приведенного в первой ссылке в начале топика (это чтобы не было лишнего базара, о том что я неправильно использовал рекоменданции):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Dim Rs As ADODB.Recordset
  Dim Con As ADODB.Connection

  Set Rs = New ADODB.Recordset
  ...
  Set Номенклатура.Form.Recordset = Rs
  Rs.Close
  Set Rs = Nothing
  Con.Close
  Set Con = Nothing

Закрывать 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" Автор: Дональд Бокс
...
Рейтинг: 0 / 0
14.07.2010, 12:49
    #36740453
Уважающий ВсехВас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKrУважающий ВсехВасVladimirKrIFKА зачем закрывать рекордсет после присваивания его свойству формы Recordset?

Да вообщем-то незачем. Это все Гетц. :)

А так, сборщик мусора и освобождения интерфейсов в VBA работает хорошо.


Ну та же просьба.Ещё пару слов,так сказать, для чайников. Если не трудно,конечно же!

Данный код был заимствован из примера, приведенного в первой ссылке в начале топика (это чтобы не было лишнего базара, о том что я неправильно использовал рекоменданции):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Dim Rs As ADODB.Recordset
  Dim Con As ADODB.Connection

  Set Rs = New ADODB.Recordset
  ...
  Set Номенклатура.Form.Recordset = Rs
  Rs.Close
  Set Rs = Nothing
  Con.Close
  Set Con = Nothing

Закрывать 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" Автор: Дональд Бокс

Большое спасибо!
...
Рейтинг: 0 / 0
14.07.2010, 19:01
    #36741690
vladK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKr

куда дальше двинулись то, тема интересная, по крайней мере в образовательных целях если не практических. (извините что так потребительски на Вашу проблему смотрю:)

Пробовали ли как собирались ConnectionString в Properties рекордсета прибить?

А что если фильтр рекордсета сделать, а не по форме?
...
Рейтинг: 0 / 0
14.07.2010, 21:18
    #36741903
Guest33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
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.
Set Me.Recordset.ActiveConnection = Nothing
...
Рейтинг: 0 / 0
15.07.2010, 09:17
    #36742305
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
vladKVladimirKr

куда дальше двинулись то, тема интересная, по крайней мере в образовательных целях если не практических. (извините что так потребительски на Вашу проблему смотрю:)

Пробовали ли как собирались ConnectionString в Properties рекордсета прибить?

Не нашел в Properties ничего похожего. Зато, блин, есть милое свойство ADODB.Recordset.Source, которое "Нельзя изменить пока объект открыт" (Run-Time error). Есть подозрение, что форма тупо берет эту строку и посылает на сервер, причем не найдя Me.Recordset.ActiveConnection, делает это тупо под CurrentProject.AccessConnection.
Проверить это легко. Видимо, щас сделаю и напишу.

Пробовал фильтр по рекордсету, еще раньше чем все остальное. Применение фильтра к Recordset формы проходит без ошибок, НО не меняет картинку на экране. Скорее всего, потому, что в момент присвоения нового рекордсета свойству Form.Recordset форма копирует куда-то в себя массив букмарок рекордсета и дальше работает уже с этим массивом.
...
Рейтинг: 0 / 0
15.07.2010, 09:37
    #36742349
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
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.
Set Me.Recordset.ActiveConnection = Nothing


1. Дык, так и сделано. adUseClient.
2. Проверено в дебагере. Свойство Me.Recordset.ActiveConnection = Nothing пока не выполнится
Me.Filter="....". А вот после присвоения фильтра происходит пересоздание рекордсета с использованием Recordset.Source и, видимо, CurrentProject.AccesConnection. Делает это форма сама, хотя ее и не просят.
...
Рейтинг: 0 / 0
15.07.2010, 10:07
    #36742408
VladimirKr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
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.
  Con.ConnectionString = "Provider=SQLOLEDB.1;Password=блабла;Persist Security Info=True;User ID=sa;Initial Catalog=Auto;Data Source=VLADIMIRHOST\SQLEXPRESS"
  Con.CursorLocation = adUseClient
  Con.Open
    
  Set Rs = New ADODB.Recordset
  
  Rs.Open "exec dbo.hpAutoWorkTools " + MsDate(DocSelect.DocDt) + "," + MsNum(DocSelect.DocInd) + ",0", Con, adOpenStatic, adLockBatchOptimistic
    
  Set Rs.ActiveConnection = Nothing
  Set Con = Nothing
  
  Set Номенклатура.Form.Recordset = Rs

После выполнения
Код: plaintext
    Номенклатура.Form.Filter = "[GrInd]=" + CStr(Gr)
Смотрим на ?Номенклатура.Form.Recordset.ActiveConnection и видим:

"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 и наворотил бы дров при записи данных.
Будьте бдительны!
...
Рейтинг: 0 / 0
15.07.2010, 10:24
    #36742438
KrukVN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отвязанный рекордсет фильтр по форме и ActiveConnection
VladimirKrА если бы мое соединение было вообще в другую базу, но с такойже хранимой процедурой? Я бы радостно работал, не заметив, что произошло изменение ActiveConnection и наворотил бы дров при записи данных.
Будьте бдительны!
сомнительно..
сервер на месте, бд тоже. пользователь, пароль.. все осталось
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отвязанный рекордсет фильтр по форме и ActiveConnection / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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