Ситуация следующая:
проводится анкетирование сотрудников организации. Ответы на их вопросы вносятся в форму, из которой переносятся в таблицу. Есть форма, позволяющая просматривать все записи таблицы.
Но нужны ещё три формы, позволяющие пользователю редактировать данные в таблице. То есть в каждую из этих форм должны попасть записи таблицы, отвечающие каким-то определённым критериям (скажем, если какое-нибудь поле в записи null, то такая запись должна выводиться в форму, в форме открытыми для редактирования останутся только те поля, в которых null, а остальные – закрыты).
Форма Добавление -> Таблица <-> Формы отбор и редактирование
______________________ \|/
__________________Форма Просмотр
Если делать выборку записей через запросы, то при внесении изменений как изменить данные в главной таблице?
Добавление->Табл->Отбор по крит1;редакт->Итог-Просмотр
_________________->отбор по крит 2;редакт->
_________________->отбор по крит3;редакт->
Спасибо.
8 июля 2008 в 1:04
Леонид и Артём, спасибо! Завтра же опробую
8 июля 2008 в 0:02
ну вот сегодня и наступило
объяснять как создавать формы не буду. перейду сразу к делу:
1. если ваш запрос, который осуществляет отбор данных таблицы по критерию, будет обновляемым, то никаких дополнительных телодвижений совершать не потребуется. пример запроса, который можно указать в свойстве RecordSource (Источник записей) формы:
select * from Ваша_таблица where Ваши_критерии
если ваши критерии отбора достаточно просты (сравнение с константами или другими полями этой же таблицы, проверка на is null, и т.п.), то результирующий набор записей будет обновляемым.
2. на событии Current (текущая запись) формы следует изменять доступность контролов. как-нибудь так:
Private Sub Form_Current()
On Error GoTo fin_
Dim ctl As Access.Control
For Each ctl In Me.Controls
On Error Resume Next
If VBA.Len(ctl.ControlSource) = 0 Then
On Error GoTo fin_
Else ' control has controlsource, value and ability to be enabled or disabled
On Error GoTo fin_
If ctl.Enabled Xor IsNull(ctl.Value) Then ctl.Enabled = Not ctl.Enabled
End If
Next ctl
fin_:If VBA.Err Then VBA.MsgBox "Error in Form_Current." & vbCrLf & VBA.Err.Source & ": " & VBA.Err.Description, vbExclamation, Me.Name: Resume fin_
End Sub
простите за отсутствие выравнивания, но его съел вконтакте.ру (да оно и не обязательно для столь маленького куска кода).
если ваша форма имеет подформы, то, я полагаю, обработку доступности контролов для подформ вы напишете сами.
вместо доступности контролов можно использовать их блокировку – заменить в приведенном выше коде строчку
If ctl.Enabled Xor IsNull(ctl.Value) Then ctl.Enabled = Not ctl.Enabled
на
If ctl.Locked Xor Not IsNull(ctl.Value) Then ctl.Locked = Not ctl.Locked
7 июля 2008 в 23:00
могу помочь, но сейчас лень. может завтра.
7 июля 2008 в 15:02
Точно не помню, как это делается (давненько аксессом не занимался), так что не судите строго))). но примерно так:
1.создаешь несколько запросов с разными условиями выборки.
2.создаешьформу на ней листбокс/группу радиобуттонов/т.п. со списком условий
3.при обновлении листбокса пишешь процедуру, чтоб менялся источник данных формы
можно, в принципе, при обновлении менять сразу сам запрос. но это геморройнее получится
7 июля 2008 в 14:00
на здоровье)