Итак, у меня есть пара форм. В родительской форме я собираю информацию о пользователе и добавляю поле 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.