Использование запроса в форме «On-Open» - MS Access - PullRequest
0 голосов
/ 13 марта 2020

Итак, у меня есть пара форм. В родительской форме я собираю информацию о пользователе и добавляю поле UserID. Кроме того, в родительской форме есть несколько кнопок, которые может щелкнуть вводящий данные, диктуя несколько различных категорий.

Когда средство ввода данных нажимает кнопку категории, механизм открывает дочернюю форму UserCategory. Я включил logi c в событие On-Click кнопки (а также событие On-Open дочерней формы), чтобы значение UserID передавалось из записи родительской формы, а значение CategoryID определялось по нажатию кнопки и также передается дочерней форме. Комбинация UserID и CategoryID уникальна для базовой таблицы UserCategory и представляет собой ключ таблицы, однако первичным ключом является другое поле - UserCategoryID (которое имеет отношение 1: 1 между комбинацией UserID и CategoryID) ,

Таким образом, требование заключается в том, что если форма получает комбинацию UserID и CategoryID, которая уже находится в таблице, то форма должна ссылаться на эту запись. Тем не менее, форма будет go впереди и создаст новую запись, когда ее значения уже представлены. Я сталкивался с этой проблемой раньше, когда создавал связанные формы, и проблема возникла из-за того, что таблица не соответствовала соотношению 1: 1 между FK и PK соответствующей таблицы. Во всех случаях мне удалось устранить проблему, применяя соотношение 1: 1 с помощью инструмента базы данных взаимосвязей. Однако в этом сценарии пользователь может принадлежать нескольким категориям, а категория может иметь несколько пользователей - иными словами, поле UserID равно 1: M, а поле CategoryID равно 1: M, но их комбинация равна 1: 1. Я не знаю, есть ли способ обеспечить эти отношения.

Одно из возможных решений, о которых я подумал, - это создать запрос в событии On-Open формы. Он будет использовать UserID и CategoryID для выбора UserCategoryID из таблицы, которая затем будет введена в поле формы. Я включил свои первоначальные мысли о дизайне запроса. Прошу прощения за синтаксис - начинающий VBA.

Любая помощь приветствуется

РЕДАКТИРОВАТЬ - Logi c на стороне прохожего:

Private Sub FLower_Click()
    Dim catType As Integer
    catType = 2

    DoCmd.OpenForm "frm_RespondentUseCat", OpenArgs:=2


End Sub

Logi c на стороне Passee

Private Sub Form_Open(Cancel As Integer)
    Dim catType As Integer
    catType = Forms.frm_RespondentUseCat!OpenArgs

    Dim userID As Integer
    userID = Forms!Respondent.RespondentID.Value

    Dim strSQL As String
    strSQL = "SELECT * From RespondentUseCategories WHERE RespondentID = " & userID & " AND UseCategoryID = " & catType & ";"

    Dim results As DAO.Recordset
    Set results = CurrentDb.OpenRecordset(strSQL)

    If results.RecordCount > 0 Then
        Set Forms("frm_RespondentUseCat").Recordset = results

    Else
        Me.UseCategoryID.Value = catType
        Me.RespondentID.Value = userID

    End If

End Sub

По сути, прохожий (то есть родительская форма с кнопкой) просто пропустит тип категории, отражающий, какая кнопка была нажата. Со стороны пассажира форма выполнит некоторый код в случае открытия. Сначала он соберет тип категории, затем попытается прочитать значение userID (RespondentID) из родительской формы (Respondent). Затем он будет использовать эти два значения для получения соответствующей записи из таблицы UserCategory (RespondentUseCategories). Если здесь есть какие-либо данные, то мы используем их как набор записей для формы, а если нет, то заполняем собранные значения userID и categoryID и позволяем самому заполнению UserCateogryID. Это похоже на правильный подход, однако, когда я попробовал контрольный пример, в котором существует запись (например, уже встречавшаяся комбинация ID пользователя и категории), дочерняя форма остается незаполненной. Я предполагаю, что есть ошибка в VBA.

1 Ответ

0 голосов
/ 14 марта 2020

создайте двойной ключ в таблице UserCategory, используя UserID и CategoryID, как показано здесь: https://www.access-programmers.co.uk/forums/threads/how-to-put-two-primary-keys-in-one-table.225908/

Теперь Access выдаст ошибку, если кто-нибудь найдет способ попробовать и добавить неуникальные комбинации UserID и CategoryID. Далее, используя дизайнер, я ожидаю, что вы получите что-то вроде: enter image description here

текстовые поля заметок были заменены на списки со списками, а UsersForm - это весь заголовок, потому что подчиненная форма показывает детали. Источник записи пользовательской формы - «Пользователи», а источником записи подчиненной формы - «Пользовательская категория». Форма и подчиненная форма связаны только UserID. На этом этапе доступ выдает ошибку, если кто-то пытается ввести неуникальную комбинацию пользователя и категории, но я не хочу иметь возможность вводить неверные данные, поэтому я пришел к следующему: в свойствах данных набора UserCategorysForm и разрешают ввод данных, и разрешают добавления, а нет - вводщик данных должен использовать кнопки для добавления записей, затем установить кнопки для добавления комбинации пользователь / категория, если она не существует, и удалить эту комбинацию, если она существует.

    Private Sub cmbUserName_AfterUpdate()
Me.Filter = "UserID = " & Me.cmbUserName.Value
Me.FilterOn = True
End Sub

'TODO ADD CODE TO CHANGE BUTTON CAPTION BASED ON WHETHER BUTTON WILL ADD OR REMOVE CATEGORY
Private Sub cmdCommand_Click()
AddRemoveRecordFromUserCategoryTable 1
End Sub
Private Sub cmdScience_Click()
AddRemoveRecordFromUserCategoryTable 2
End Sub
Private Sub AddRemoveRecordFromUserCategoryTable(ID As Integer)
DoCmd.SetWarnings False
If IsNull(DLookup("UserCategoryID", "UserCategory", "UserID = " & Me.cmbUserName.Value & " AND CategoryID = " & ID)) Then
DoCmd.RunSQL ("INSERT INTO UserCategory (UserID, CategoryID) VALUES(" & Me.cmbUserName.Value & ", " & ID & ")")
Else
DoCmd.RunSQL ("DELETE * FROM UserCategory WHERE UserID = " & Me.cmbUserName.Value & " AND CategoryID = " & ID)
End If
DoCmd.SetWarnings True
Me.Refresh
End Sub

теперь форма проверяет, есть ли комбинация пользователь / категория в таблице, прежде чем добавить ее, и вместо этого удаляет запись, предотвращая добавление дублирующих комбинаций. команда удара удаляет запись (не показана). попадание в науку добавляет запись. enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...