|
Подскажите !!! Поиск записи в форме.
|
|||
---|---|---|---|
#18+
При использовании кода (в adp-проекте): Private Sub FindRecord(strSearchKod As String) Dim frm As Form Dim rsClone As New ADODB.Recordset Set frm = Forms!Форма.Form frm.Requery Set rsClone = frm.RecordsetClone rsClone.Find "код = " & Chr(39) & strSearchKod & Chr(39) frm.Bookmark = .Bookmark Set rsClone = Nothing Set frm = Nothing End Sub формируется следующая ошибка: Ошибка 3021' Either BOF or EOF or the current record has been deleted. Requested operation requires a current record. Подскажите в чем дело: -в запросе ((запрос на обновление) источнике формы, в которой проводится поиск) или в том, что несколько пользователей пытаются редактировать одну и туже запись или ... в чем ?????. Может подскажете как еще можно организовать поиск конкретной записи средствами VBA ? Docmd.FindRecord не подходит (поле в котором проводится поиск скрыто). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2002, 16:37 |
|
Подскажите !!! Поиск записи в форме.
|
|||
---|---|---|---|
#18+
я так думаю проиходит следующее: Private Sub FindRecord(strSearchKod As String) Dim frm As Form Dim rsClone As New ADODB.Recordset 'New тут необязательно Set frm = Forms!Форма.Form frm.Requery 'Обновление такого плана носит асинхронный характер, т.е. выполнение кода продолжается, не дожидаясь окончания выборки данных Set rsClone = frm.RecordsetClone rsClone.Find "код = " & Chr(39) & strSearchKod & Chr(39) 'Попытка найти запись в наборе, в то время как этой записи еще нет в числе тех, что приехали на клиента(асинхронная выборка) и как следствие - потеря текущей записи frm.Bookmark = .Bookmark 'соответственно происходит ошибка Set rsClone = Nothing Set frm = Nothing End Sub ___________ Что можно посоветовать. Посмотрите мой пример по адресу: http://am.rusimport.ru/MsAccess/show.asp?ID=15 Там используется событие рекордсета окончания выборки для дальнейшего продолжения кода. В принципе можно не дожидаться окончания выборки, а циклично проверять приехала ли искомая запись(забыл имя соотв.события рекордсета). Другой вариант организовать синхронную выборку: frm.Requery Docmd.gotorecord,,, aclast таким образом гарантировано приезжают все записи, а потом уже можно вести поиск ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2002, 19:47 |
|
Подскажите !!! Поиск записи в форме.
|
|||
---|---|---|---|
#18+
Сергей БОЛЬШОЕ СПАСИБО. Попробовал Docmd.gotorecord,,, aclast, работает!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2002, 15:20 |
|
Подскажите !!! Поиск записи в форме.
|
|||
---|---|---|---|
#18+
Попробовал вместо: frm.Requery Docmd.gotorecord,,, aclast использовать: RunCommand acCmdRefresh Короче и красивше, правда? Кстати я везде использую RunCommand вместо DoCmd, и особенно вместо MenuItem Внимание, грабли! В хелпе написано, что использование form.requery быстрее: при acCmdRefresh происходит закрытие источника и его повторное открытие, тогда как при form.requery только перечитываются данные. Так вот, когда в таблицу вставлялись данные (из другой формы), после чего я делал form.requery, после чего Recordset.Find по ключу находил не то, что я его просил найти. Долго крестился, пока не дошло, что, вероятно, Recordset ищет по индексу, а по form.requery индекс не обновлялся (какой индекс? не знаю какой, где-то на клиенте, очевидно! похоже, Recordset имеет копию индекса у себя?) C acCmdRefresh всё в порядке стало. Очевидно, что Савва ищет запись после изменения данных (иначе зачем Requery?). Если бы он искал по ключевому полю, он наступил бы и на эти грабли. Ув. Сергей, не прокомментируете мои излияния? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2002, 12:38 |
|
|
start [/forum/topic.php?fid=45&msg=32043709&tid=1683058]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
129ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 225ms |
0 / 0 |