singlepost

Вопрос по Access. << На главную или назад  

Ситуация следующая:
проводится анкетирование сотрудников организации. Ответы на их вопросы вносятся в форму, из которой переносятся в таблицу. Есть форма, позволяющая просматривать все записи таблицы.
Но нужны ещё три формы, позволяющие пользователю редактировать данные в таблице. То есть в каждую из этих форм должны попасть записи таблицы, отвечающие каким-то определённым критериям (скажем, если какое-нибудь поле в записи null, то такая запись должна выводиться в форму, в форме открытыми для редактирования останутся только те поля, в которых null, а остальные – закрыты).

Форма Добавление -> Таблица <-> Формы отбор и редактирование
______________________ \|/
__________________Форма Просмотр

Если делать выборку записей через запросы, то при внесении изменений как изменить данные в главной таблице?

Добавление->Табл->Отбор по крит1;редакт->Итог-Просмотр
_________________->отбор по крит 2;редакт->
_________________->отбор по крит3;редакт->

Спасибо.

50 ответов в теме “Вопрос по Access.”

  1. 5
    Мария Барулина ответил:

    Леонид и Артём, спасибо! Завтра же опробую :-)

  2. 4
    Леонид Максимов ответил:

    ну вот сегодня и наступило :)

    объяснять как создавать формы не буду. перейду сразу к делу:

    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

  3. 3
    Леонид Максимов ответил:

    могу помочь, но сейчас лень. может завтра.

  4. 2
    Артём Новиков ответил:

    Точно не помню, как это делается (давненько аксессом не занимался), так что не судите строго))). но примерно так:
    1.создаешь несколько запросов с разными условиями выборки.
    2.создаешьформу на ней листбокс/группу радиобуттонов/т.п. со списком условий
    3.при обновлении листбокса пишешь процедуру, чтоб менялся источник данных формы
    можно, в принципе, при обновлении менять сразу сам запрос. но это геморройнее получится

  5. 1
    Саня Какбэя ответил:

    на здоровье)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.