powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пару вопросов по ADODB (Find+Move и Open+Close)
10 сообщений из 10, страница 1 из 1
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33356647
ElektriK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопросы такие:
1) При использование метода Find все работает отлично и находится нужная запись. Тут все ясно. Но далее мне например нужно переместиться по записям вперед или назад, для этого есть на форме кнопка, использующая метод MoveNext и тп. Так вот после использования метода Find, а затем MoveNext я перемещаюсь не на следующую запись, идущую после записи найденной по Find, а перемещается на след. запись, идущую за той на которой стоял указатель до использования метода Find. Поясню: Например я нахожусь на записи 1, далее через поиск нахожу например 15-ю запись, на форме отображаются именно данные 15-ой записи... Далее жму следующую запись, но вопреки моим ожиданиям перехожу не на 16-ю, а на 2-ю :(
Чую что вопрос легко решается, но чета туплю...

2) Если в код загрузки формы поместить код открытия соединения с БД, а также создание рекордсета, то после выгрузки данной формы соединение автоматически закрывается?
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33356791
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Через что проводим навигацию, и через что ищем запись? Это один и тот-же рекордсет или разные вещи?
2. Коннекшн остается открытым даже если форма выгрузилась и даже если на него не ссылались. Видимо это особенность объектов ADO.
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33356819
ElektriK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Worobjoff1. Через что проводим навигацию, и через что ищем запись? Это один и тот-же рекордсет или разные вещи?
Навигация с помощью кнопок. Код примерно такой:
Private Sub cmdMoveNext_Click()
rstMain.MoveNext

If rstMain.EOF = True Then
rstMain.MoveLast
MsgBox "Äîñòèãíóòà ïîñëåäíÿÿ çàïèñü", vbInformation
End If

With frmLodgerInfo
.lblFlat.Caption = rstMain.Fields("FlatNumber").Value
.txtSurname.Text = RTrim(rstMain.Fields("Owner").Value)
.txtSquare.Text = rstMain.Fields("Square").Value
.txtMenNumber.Text = rstMain.Fields("MenNumber").Value
.txtOwnerNumber.Text = rstMain.Fields("OwnerNumber").Value
.txtCount.Text = (20 * 1000 + CSng(rstMain.Fields("FlatNumber").Value))
End With
End Sub

Рекордсет один и тот же...
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33356897
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите весь код.
На всякий случай - пример, на котором убедился, что Find не сбивает букмарк рекордсета.
Код: 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.
Option Explicit

Dim Conn1 As ADODB.Connection
Dim WithEvents rs As ADODB.Recordset
Dim bnd1 As BindingCollection

Private Sub btnFind_Click()
   If rs.RecordCount =  0  Then Exit Sub
   rs.MoveFirst
   rs.Find "ID = " & Text2
   If rs.EOF Then rs.MoveFirst
End Sub

Private Sub btnNext_Click()
   If rs.RecordCount =  0  Then Exit Sub
   rs.MoveNext
   If rs.EOF Then rs.MoveLast
End Sub

Private Sub btnPrev_Click()
   If rs.RecordCount =  0  Then Exit Sub
   rs.MovePrevious
   If rs.BOF Then rs.MoveFirst
End Sub

Private Sub Form_Initialize()
   Set Conn1 = New ADODB.Connection
   Set rs = New ADODB.Recordset
   Set bnd1 = New BindingCollection
End Sub

Private Sub Form_Load()
   Conn1.CursorLocation = adUseClient
   Conn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db2.mdb;Persist Security Info=False"
   rs.Open "SELECT * FROM Таблица1", Conn1, adOpenStatic, adLockBatchOptimistic, adCmdText
   bnd1.Clear
   Set bnd1.DataSource = rs
   bnd1.Add Me.Label1, "Caption", rs.Fields( 0 ).Name
   bnd1.Add Me.Text1, "Text", rs.Fields( 1 ).Name, Text1.DataFormat
End Sub

Private Sub rs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   If rs.EOF Or rs.BOF Then Exit Sub
   Label2 = rs.Fields( 1 )
End Sub
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33356957
ElektriK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffПриведите весь код.
Весь код... хм...
По порядку: На форме есть кнопки навигации по записям и кнопка поиска. Код кнопки навигации я привел выше. Кнопка поиск загружает еще одну форму-форму поиска... и уже там указав параметры поиска я перехожу непосредственно к поиску следующим кодом:

Private Sub cmdOk_Click()
Select Case Me.cmbKey.ListIndex
Case "0"
rstMain.Find "FlatNumber = '" & Me.txtValue.Text & "'", 0, adSearchForward, adBookmarkFirst
If rstMain.EOF Then
MsgBox "Çàïèñü íå íàéäåíà (êîíåö)"
Else
With frmLodgerInfo
.lblFlat.Caption = rstMain.Fields("FlatNumber").Value
.txtSurname.Text = RTrim(rstMain.Fields("Owner").Value)
End With
Me.Hide

End If

Case "1"
rstMain.Find "Owner LIKE '" & Me.txtValue.Text & "*'", 0, adSearchForward, adBookmarkFirst
varBookmark = rstMain.Bookmark
If rstMain.EOF Then
MsgBox "Çàïèñü íå íàéäåíà (êîíåö)"
Else
With frmLodgerInfo
.lblFlat.Caption = rstMain.Fields("FlatNumber").Value
.txtSurname.Text = RTrim(rstMain.Fields("Owner").Value)
End With
Me.Hide

End If

End Select

Теперь же используя кнопки навигации получается трабл описанный выше...

Код загрузки формы поиска:

Dim cnnMain As New ADODB.Connection
Dim strConnect As String
Dim strSQL1 As String
strConnect = App.Path & "\work.mdb"
cnnMain.Provider = "Microsoft.Jet.OLEDB.4.0"
cnnMain.Open strConnect, "Admin"
strSQL1 = "SELECT Main.FlatNumber, Main.Square, Main.MenNumber, Main.OwnerNumber, Owners.OwnerID, Owners.Owner FROM Months INNER JOIN ([Year] INNER JOIN (Owners INNER JOIN Main ON Owners.OwnerID=Main.OwnerID) ON Year.YearID=Main.YearID) ON Months.MonthID=Year.MonthID WHERE (((Months.Month)= " & strVarMonth1 & " ) AND ((Year.Year)= " & strVarYear & "))"

rstMain.Open strSQL1, cnnMain, adOpenKeyset, adLockBatchOptimistic, adCmdText
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33357045
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElektriKЭто - не весь код.
объявление рекордсета где?
И еще: в случае неудачного поиска корректировку позиции рекордсета кто делать будет?
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33357121
ElektriK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffЭто - не весь код.
объявление рекордсета где?
вот: объявляю при загрузке основной формы (НЕ форма поиска)

Dim rstMain As New ADODB.Recordset-в general declaration формы...

Private Sub Form_Load()
Me.Left = 10
Me.Top = 20 + frmMain.Height

Dim cnnMain As New ADODB.Connection
Dim strConnect As String
Dim strSQL1 As String

Dim strVarMonth1 As String
Dim strVarMonth2 As String
Dim strVarYear As String

strVarMonth1 = "'Àïðåëü'"
strVarYear = 2004

strConnect = App.Path & "\work.mdb"
cnnMain.Provider = "Microsoft.Jet.OLEDB.4.0"
cnnMain.Open strConnect, "Admin"
strSQL1 = "SELECT Main.FlatNumber, Main.Square, Main.MenNumber, Main.OwnerNumber, Owners.OwnerID, Owners.Owner FROM Months INNER JOIN ([Year] INNER JOIN (Owners INNER JOIN Main ON Owners.OwnerID=Main.OwnerID) ON Year.YearID=Main.YearID) ON Months.MonthID=Year.MonthID WHERE (((Months.Month)= " & strVarMonth1 & " ) AND ((Year.Year)= " & strVarYear & "))"

With frmLodgerInfo
.lblFlat.Caption = rstMain.Fields("FlatNumber").Value
.txtSurname.Text = RTrim(rstMain.Fields("Owner").Value)
End With
Exit Sub

WorobjoffИ еще: в случае неудачного поиска корректировку позиции рекордсета кто делать будет?
Как ее делают? Ежели у меня пробегает все записи и не находит, то попросту:
If rstMain.EOF Then
MsgBox "Запись не найдена"
Else
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33357211
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ссылку на рекодсет как передаете другой форме: через параметр процедуры или через свойство?
2. В случае неудачного поиска позиция рекодсета EOF и значит все поля должны обнулиться и невозможно редактирование.
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33357253
ElektriK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Worobjoff1. Ссылку на рекодсет как передаете другой форме: через параметр процедуры или через свойство?
Упс... Собственно видимо никак :(
Ежели есть пример какой нибудь по этому поводу, буду весьма признателен.
...
Рейтинг: 0 / 0
Пару вопросов по ADODB (Find+Move и Open+Close)
    #33357405
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim rsMain As ADODB.Recordset

'.....

Public Property Get RecorsetMain() As ADODB.Recordset
   Set RecorsetMain = rsMain
End Property

и в другой форме:
Код: plaintext
   Form1.RecorsetMain.MoveNext
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пару вопросов по ADODB (Find+Move и Open+Close)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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