|
|
|
| Имеется форма "Калибровка". В ней подчиненная форма "протокол" с 2-мя подчиненными формами ХХХ и ААА. Этакая матрешка. Для пердачи значения из ХХХ в "протокол" использую такую конструкцию.
Private Sub form_current()
If IsLoaded("Калибровка") Then
Forms![Калибровка].Controls![протокол].Form.Controls![Поле87] = Me![кл_т]
End If
End Sub
Вопрос. Как можно из формы ААА (какая либо привязка по полям отсутствует), табличного типа, выбрать значения ПоляYY для формы "протокол" из нескольких строк, по очереди, для использования их для дальнейших рассчетов.
Количество данных в этой форме уже заранее известно и выбираться должны все значения с первой до последней записи.
Не доходит, как можно переключать строки ПоляYY в ААА из "протокол"а. | |
|
| |
|
|
|
| у формы есть свойсво Recordset (в MDB -DAO, в ADP - ADO)
берите его и методами Recordset (MoveFirst, MoveNext ...) получаете значения полей | |
|
| |
|
|
|
|
| Заходя на форум чувствую себя пещерным человеком. Имею книгу "Acceess 2000 в подлиннике" под редакцией И. Харитоновой и В.Михеевой. Пытался разобраться с recordset, но до конца не понял. Усвоил, что это набор записей какого либо объекта. Освоить не получается. В книге практически отсутствуют примеры. Отсюда и проблемы с синтаксисом. Подскажите где подсмотреть. В моем примере значения в А и В считываются, проверял в пошаговом режиме. Может надо добавить совсем немного? Или изменить подход в корне? А как, не знаю.
Private Sub Кнопка263_Click()
Dim A As Double
Dim B As Double
[ХХХ].Visible = True
Controls![ХХХ].SetFocus
Let A = [ХХХ].Controls![YY]
'DoCmd....ЧТО ЖЕ ЗДЕСЬ НАПИСАТЬ????? для переключения записи в ХХХ
Let B = [ХХХ].Controls![YY]
End Sub
Простите пещерного человека. | |
|
| |
|
|
|
| Вы делаете типичную ошибку...
Прежде всего нужно запомнить что форма это ТОЛЬКО ОТОБРАЖЕНИЕ данных, а сами данные находятся в ТАБЛИЦАХ. т.е Если вы хотите работать с данными, то обращайтесь к ним непосредственно, а не к их отображению в форме.
здесь у вас не увидел ничего про рекордсет
Рекодсет это виртуальное представление некого набора данных
или как сказал один очень умный человек
"Рекордсет - узкая прорезь через которую видно 1 строку таблицы, но ее можно гонять по этой таблице вверх-вниз"
И так задача получить поля из всех строка набора записей предсталенного в подчиненной форме для того что бы произвести с ними некие действия.
Набор записей в форме можно получить обратившись к свойству Recordset формы. Как было сказано выше в MDB свойство Recordset формы содержит DAO рекордсет. (нужно подключить библиотеку DAO или вместо dim rst as dao.recordset использовать
dim rst as object
)
т.е.
'описываем переменную для рекордсета
dim rst as dao.recordset
dim lngTemp as Long
' получаем рекордсет который содержит записи подформы
set rst = me.имяКонтролаПодФормы.form.recordset
'проверяем наличие записей в рекордсете
if rst.recordcount <> 0 then
'переходим к первой записи
rst.movefirst
'пока не будет достигнут конец рекордсета, т.е. свойство EOF не станет истиной т.е. TRUE
do while Not rst.eof
' берем значение из полей с именем "Поле1" и "Поле3" (считая что такие поля есть в
наборе данных. НЕ В ФОРМЕ!!!! а в источнике т.е. таблице или запросе которые
являются источником данных) перемножаем их делим на 1.8 и результат сохраняем
во временную переменную, что бы затем приплюсовать данные из следующей строки
lngTemp = lngTemp + (rst![Поле1]*rst![Поле3]/1.8)
'переходим к следующей записи
rst.movenext
loop
'Выводим полученный результат - сумма произведений полей "Поле1" и "Поле3"
деленное на 1.8 для всех полей подформы
msgbox lngTemp
end if
|
Надеюсь на первых порах понятно.. но без чтения документации по DAO (и потом еще и DAO) непрожить.
Если что не понятно - спрашивайте.
ЗЫ. возможны опечатки | |
|
| |
|
|
|
| Ура! Получилось! Огромное Вам спасибо, жить хочется, тупик пробит.
Вот как у меня заработало.
Private Sub Кнопка263_Click()
Dim rst As Object
Dim cnt As Integer
Dim nt As String
Dim nv As String
Controls![пф шкала расчет протокол].Requery 'без Requery могут быть ошибки
cnt = 0 'счетчик записей
Set rst = Me.[пф шкала расчет протокол].Form.Recordset
If rst.RecordCount <> 0 Then
rst.MoveFirst
Do While Not rst.EOF
nt = "т" & cnt 'генерация имен полей в которые будут передаваться значения из
nv = "в" & cnt 'предварительного расчета [т0]...[т11] и [в0]...[в11]
cnt = cnt + 1
Me(nt) = rst![значение] 'заполнение полей
Me(nv) = rst![деление]
If cnt = 12 Then
GoTo end1
End If
rst.MoveNext
Loop
End If
end1: [кол] = cnt 'количество расчетных точек (от 3 до 12, больше не бывает)
End Sub | |
|
| |