В моей базе данных есть форма, которая отображает записи, отфильтрованные по аббревиатуре, которую вы можете выбрать в поле со списком.Теперь в некоторых случаях я захочу открыть другую форму с теми же записями, которые были показаны ранее, но на этот раз должно быть два дополнительных столбца, и записи (в частности, два новых столбца) должны быть доступны для редактирования.Пока что мой подход выглядит так: я извлекаю данные из предыдущей формы, помещаю их в новый набор записей и добавляю два столбца.Выглядит следующим образом:
Dim cpRS As New ADODB.Recordset, RS As DAO.Recordset, cb As checkBox, addr As String
'Creating copy of previously displayed result table
Set cpRS = New ADODB.Recordset
With cpRS
'all the fields needed. I shortened this because it's too long and has no important information
.Fields.Append "some_value", adInteger
.Fields.Append "some_value", adInteger
.Fields.Append "some_value", adSmallInt, , adFldIsNullable
'new Fields for temporary purposes
.Fields.Append "first_new_field_checkbox", adBoolean
.Fields.Append "second_new_field_textbox", adVarChar, 50
.CursorLocation = adUseClient
.Open , , adOpenKeyset, adLockPessimistic, 8
End With
'get result set of previous window by applying filter to the same query used before
Dim argv() As String
Dim argRest As String
Dim qdef As DAO.QueryDef
Dim restrictedQuery As String
'When opening this form I hand over OpenArgs which i restore here
'took the code out but "argv" and "argRest" will be used later
'this is the query that is used in the previous form. i need an extra where clause though so i had to rewrite it.
restrictedQuery = "some very long SQL statement I feel I don't need to put here because it doesn't contribute to the problem." & _
"If I'm incorrect, please let me know and I will rewrite it to protect the data in it"
Set qdef = CurrentDb.CreateQueryDef("")
qdef.SQL = restrictedQuery
Set RS = qdef.OpenRecordset
Set RS = CurrentDb.OpenRecordset(restrictedQuery, dbOpenSnapshot)
RS.MoveLast
RS.MoveFirst
If RS.RecordCount = 0 Then
MsgBox "some error text", vbOKOnly, "error title"
DoCmd.Close acForm, Me.Name
Exit Sub
End If
'populate new recordset with data from table in previous form
Do Until RS.EOF
'putting the data from the "old" recordset into the new one, shortened again, you get the idea
cpRS.AddNew
cpRS.Fields("some_value") = RS("some_value")
cpRS.Fields("some_value2") = RS("some_value2")
cpRS.Fields("first_new_field_checkbox") = False
cpRS.Fields("second_new_field_textbox") = ""
cpRS.Update
RS.MoveNext
Loop
Set Me.Recordset = cpRS
RS.Close
Set RS = Nothing
'cpRS.Close - I removed this
Set cpRS = Nothing
'error here:
Me.RecordSource = cpRS
Проблема в том, что записи в форме будут пустыми.(не совсем пустой. Если быть точным, в каждой ячейке в одной строке написано #Name?
). Я не совсем уверен, что я делаю неправильно.При отладке все работает, я вижу, как набор записей заполняется данными из моей предыдущей формы.Поэтому я предполагаю, что я просто не могу правильно назначить новый набор записей в качестве источника для формы.Вероятно, в строке Set Me.Recordset = cpRS
происходит неправильное назначение, но я не знаю, как это исправить, если это (единственная) проблема, то есть.
Вторая часть этого вопроса былаперемещен в другой поток для более ясной структуры.