Как заполнить источник записей значениями из набора записей ADO? - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь получить набор записей, содержащий данные, скопированные из другого набора записей, плюс два дополнительных столбца. Я упоминал об этом раньше в другом вопросе . Теперь где-то в следующем коде есть проблема, которую я не могу определить.

Если вы прочитали пост, на который я ссылался, вы уже видели этот код. Я только изменил часть, где я добавляю поля в набор записей, так как я думаю, что где-то есть ошибка. Теперь он выглядит точно так же, как мой код, за исключением того, что имена были изменены.

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
'
    .Fields.Append "val0", adInteger
    .Fields.Append "val1", adInteger
    .Fields.Append "val2", adVarChar, 80
    .Fields.Append "val3", adVarChar, 80
    .Fields.Append "val4", adVarChar, 30
    .Fields.Append "val5", adVarChar, 30
    .Fields.Append "val6", adVarChar, 10
    .Fields.Append "val7", adVarChar, 10
    .Fields.Append "val8", adVarChar, 50, adFldIsNullable
    .Fields.Append "val9", adDBTimeStamp
    .Fields.Append "val10", adVarChar, 50
    .Fields.Append "val11", adSmallInt
    .Fields.Append "val12", adVarChar, 100
    .Fields.Append "val13", adVarChar, 255, adFldIsNullable
    .Fields.Append "val14", adVarChar, 255, adFldIsNullable
    .Fields.Append "val15", adInteger
    .Fields.Append "val16", adInteger
    .Fields.Append "val17", adSmallInt
    .Fields.Append "val18", adSmallInt

    'new Fields for temporary purposes
    .Fields.Append "val19", adBoolean
    .Fields.Append "val20", adVarChar, 50

    .CursorLocation = adUseClient
    .Open , , adOpenDynamic, adLockOptimistic, 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("val1") = RS("some_value")
    cpRS.Fields("val2") = RS("some_value2")
    '...
    'fill the two columns that don't come from the query with default values
    cpRS.Fields("val19") = False
    cpRS.Fields("val20") = ""
    cpRS.Update
    RS.MoveNext
Loop

Set Me.Recordset = cpRS

RS.Close
Set RS = Nothing
'cpRS.Close  - I removed this
Set cpRS = Nothing

Теперь есть какое-то странное поведение (по крайней мере для меня). При отладке я вижу, что набор записей ADO заполняется данными из набора записей DAO. Там нет ошибки, и все значения верны. Однако, когда форма открывается, заполняются только некоторые ячейки. Остальные ячейки содержат "#Name?" что заставляет меня думать, что а) тип данных, который я установил для полей, неправильный, или б) форма не знает, какие значения поместить в поля, поскольку есть несколько источников, которые пытаются ее заполнить (я думаю, что я читал о эта ошибка #Name? была связана с такой ошибкой некоторое время назад, но я не уверен в этом, и я не знаю, где происходит двойное назначение).

Структура примерно следующая: Форма содержит подчиненную форму. Subform содержит несколько текстовых полей с именами значений, которые я добавляю в набор записей ADO в качестве источника управления (так мой предшественник обрабатывал заполнение форм, я не знаю, является ли это обычным способом выполнения этой задачи). Источник записей не задан, потому что я установил набор записей ADO в качестве источника записей в событии Form_Load (откуда и взят код).

Надеюсь, этого достаточно, чтобы найти проблему, в противном случае дайте мне знать, и я постараюсь предоставить больше информации.

РЕДАКТИРОВАТЬ: я думаю, что я должен добавить, что есть только один столбец, который делает его в подчиненной форме, которая имеет тип adVarChar (val4 из кода)

1 Ответ

1 голос
/ 03 июля 2019

.ControlSource - это свойство элемента управления (например, текстовое поле), а не свойство поля набора записей.

Связывает поле набора записей с формой / отчет-контролем.

Если вы называете поля набора записей adodb такими же, как поля dao при добавлении. в Controlsource не требуется никаких изменений:

.Fields.Append "NameOfDaoField0", adInteger

или используйте

Me.Controls("MyTextbox").ControlSource = "valX"

где valX - добавленное новое имя поля (val0, val1, ... в вашем случае).

Не должно иметь значения, где в коде.

...