#ms-access #vba
#ms-access #vba
Вопрос:
У меня есть основная форма с подчиненной формой под ней. В основной форме есть опция «перезаписать», в которой я могу ввести значение в txtComments, и затем оно будет вводить значение в поле subform.comments только в том случае, если его флажок имеет истинное значение (например, установлен флажок)
В нынешнем виде я использую этот код, который работает только для выбранной строки данных, а не для всего набора данных подчиненной формы:
(примечание: я упростил имена полей и значений)
Private Sub Command118_Click()
Dim rst As Recordset, i As Integer
Set rst = Subform.RecordsetClone
i = 0
rst.MoveFirst
Do While Not rst.EOF
i = i 1
rst.Edit
If [SubformCheckbox] = True Then
[SubformComments] = [txtComments]
Else
[SubformComments] = 0
End If
rst.Update
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub
Ответ №1:
Вы использовали неправильные переменные. Попробуйте это:
If rst![SubformCheckbox] = True Then
rst![SubformComments] = [txtComments]
Else
rst![SubformComments] = 0
End If
Если вы хотите не трогать непроверенные записи, измените цикл следующим образом:
With rst
Do While Not .EOF
If ![SubformCheckbox] = True Then
.Edit
![SubformComments] = [txtComments]
.Update
End If
.MoveNext
Loop
End With
Для повышения производительности вы можете отфильтровать набор записей, оставив только отмеченные строки, а затем обновить их все в цикле, но наилучшая производительность будет достигнута, если вы будете использовать UPDATE
SQL-запрос для обновления таблицы напрямую, вообще не используя recordset .
Комментарии:
1. Однако, могу ли я заставить оператор Else оставить существующие поля комментариев в покое?
2. например. Если он найдет строку флажка с истинным значением, добавьте форму TXTComment в основную форму, иначе ничего не делайте
3. Если это сработало для вас, вы должны проверить ответ как правильный
4. извините за это, проверено сейчас 🙂
5. Отредактировал ответ