Много-много проблем с MS Access - PullRequest
2 голосов
/ 11 апреля 2020

Я создаю базу данных Access для одного из администраторов моего университета, чтобы отслеживать информацию преподавателей. Есть раздел для отслеживания того, какой факультет в каком комитете. Это отношения многих ко многим, так как преподаватели могут работать не только в комитетах, а в комитетах, очевидно, имеется более одного преподавателя. Вот скриншот моих отношений с Junction Table. У меня есть таблица демографических данных c (факультет) с таблицей комитетов и промежуточной таблицей между ними:

Many to many relationship

То, что я хочу получить, это заполненный список с множественным выбором с комитетами я могу выбрать для заполнения Junction Table. Это работает, если у меня в окне списка установлено только одно выделение. Если у меня установлено значение «Несколько выборок», я получаю сообщение об ошибке «Необходимо ввести значение в поле jctDemographicsCommitteess.committeeID».

Кто-нибудь знает, как заставить это работать?

Поле списка находится в подчиненной форме с источником записи, являющимся таблицей соединений. Кроме того, когда я установил ListBox, я установил для «Сохранить это значение в этом поле:» значение CommitteeID.

Дайте мне знать, если вам нужна дополнительная информация!

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Я думаю, что использование набора комбинированных блоков в непрерывной подчиненной форме - это путь к go.

Начните с создания формы, основанной на соединительной таблице. В ее свойствах измените " Вид по умолчанию "от" Единой формы "до" Непрерывных форм ". Добавьте поле со списком в эту форму и установите Control Source равным CommitteeID, а RowSource должен быть основан на таблице комитета, а в качестве связанной колонки - CommitteeID. Установите Количество столбцов равным 2, а ширину столбцов равным 0; 6.

Go вернуться к вашей форме, которая основана на таблице демографии. На панели инструментов должна быть опция для вставки подчиненной формы / подчиненного отчета. Добавьте его в раздел сведений формы «Демография», и, когда мастер начнет направлять вас, выберите «Использовать существующую форму», выберите только что созданную вложенную форму и, когда появится вопрос, какие поля использовать для связи, выберите « DEM_ID "to" DemographicID ".

В итоге вы должны получить что-то вроде этого: enter image description here

Я добавил кнопку" Удалить "рядом с комбо поле, которое просто имеет следующий код:

CurrentDb.Execute "DELETE * FROM Junction WHERE DemographicID=" & Me.DemographicID & " AND CommitteeID=" & Me.CommitteeID
Me.Requery

С уважением,

0 голосов
/ 11 апреля 2020

Я пошел и взял какой-то код, который долго писал go, чтобы помочь. Я немного прибрался, но оставил вещи для вас самим. Извините, я ленивый, но у вас есть бесплатный код. Это тщательно документировано с помощью встроенных заметок / комментариев.

Удачного кодирования!

Private Sub SampleListBoxLoop()
    On Error GoTo SampleListBoxLoopErr
    Dim arr(0 To 4) As String ' you might need to vchange this too
    Dim lCol As Long, lRow As Long
    Dim vbsql As String

    With Me.ListBox
        'I wrote this in Access97. Not sure if listbox looping is still backwards or not - find out!
        'Looping through multi column list boxes is transposed.
        'Which is why we loop through columns first
        For lCol = 0 To .ColumnCount + 1 'needs to be plus due to column header
            If .Selected(lCol) Then
                'You'll need to change the next line based on your scenario. 
                'Since I gave you free code, you'lll have to figure this one out for yourself :P
                For lRow = 0 To 4 'this is to 4 due to Ubound of array and not row count since row count changes with each run
                    'Assign to the array transposed so that it is filled in normally.
                    arr(lRow) = Nz(.Column(lRow, lCol))
                Next lRow
            End If
        Next lCol

        'needed for deselecting
        For lRow = 0 To .ListCount - 1
            .Selected(lRow) = False
        Next lRow
    End With

    If arr(0) <> "" Then 'Cannot run this if empty array
        'Build your SQL statements herre
        CurrentDb.Execute vbsql, dbFailOnError
    End If  

    Me.Requery
    Me.ListBox.Requery
    Me.Subform.Requery

Exit_Sub:
    Exit Sub

SampleListBoxLoopErr:
    If DBEngine.Errors.Count > 1 Then
        'ODBC Error
        For Each errany In DBEngine.Errors
            msgbox "ODBCExecute: Err# " & errany.Number & " raised by " _
             & errany.Source & ": " & errany.Description, _
             vbCritical, "cmdExecuteAttached()"
        Next errany
    Else  'Access Error
        msgbox "ODBCExecute: Err# " & ERR.Number & " raised by " _
         & ERR.Source & ": " & ERR.Description, _
         vbCritical, "cmdExecuteAttached()"
    End If
    GoTo Exit_Sub
    Resume
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...