2016-08-15 2 views
0

Я работаю над базой данных с двумя основными таблицами и связанной таблицей, которая содержит внешние ключи из двух таблиц. Я создал форму в Access, и цель формы - использовать раскрывающийся список, чтобы выбрать 1 вариант из одной таблицы, и использовать поле списка множественного выбора, чтобы позволить пользователям выбирать несколько параметров из другой таблицы. Затем пользователь щелкнул кнопку, и мой код (см. Ниже) должен создать запись в связанной таблице для каждой выбранной опции в списке. Например:Доступ к VBA Преобразование массива в отдельные записи

Пользователь создает новую запись в форме, выбирает «Обеспечение качества» из раскрывающегося списка и выбирает 2 варианта из списка. Когда пользователь нажимает кнопку «cmdAddCompToCurr», в связанной таблице должны быть созданы 2 записи.

Когда я тестирую кнопку, это не совсем правильно. Код не преобразует массив, созданный из выбора блока списка, в отдельные идентификационные номера. Независимо от того, какие элементы я выбираю из списка, я всегда получаю одинаковый идентификационный номер в связанной таблице.

Код:

Private Sub Command0_Click()

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim i As Variant 

Set db = CurrentDb() 
Set rs = db.OpenRecordset("tbl_CurCom_Link", dbOpenDynaset) 

If List89.ItemsSelected.Count = 0 Then 
    MsgBox "No components were selected" 
    GoTo Endme 

End If 

If List89.ItemsSelected.Count >= 1 Then 
    i = List89.ListCount 
    fld_ComponentID = List89.Column(0, 0) 
    fld_ComponentCode = List89.Column(1, 0) 
    fld_ComponentTitle = List89.Column(2, 0) 
    fld_CompRevision = List89.Column(3, 0) 

End If 

For Each i In List89.ItemsSelected 
    rs.AddNew 
    rs!fld_CurriculumID = fld_CurriculumID 
    rs!fld_ComponentID = fld_ComponentID 
    rs.Update 

Следующая Endme: End Sub

ответ

1

Основная проблема вы назначили вашу fld_ComponentID переменную перед (и снаружи) вашего for петля. Это означает, что он устанавливается только один раз, перед циклом, и каждая итерация цикла будет использовать это же значение. Кроме того, поскольку он жестко закодирован до .Column(0, 0), он получает все, что находится в первой строке, независимо от того, что на самом деле пользователь выбирает.

Вместо этого переместите fld_ComponentID определение внутри цикла for, а также динамически ссылки .Column(0, i), а именно:

fld_ComponentID = List89.Column(0, i) 
    rs!fld_ComponentID = fld_ComponentID 

Однако вы заметите переменную сама становится излишним, так что вы можете просто:

rs!fld_ComponentID = List89.Column(0, i) 

И обратите внимание, что предыдущий блок IF...END IF фактически является избыточным, поэтому его можно полностью удалить.

Вы не указали fld_CurriculumID в любом месте. Будьте осторожны, что без Option Explicit это автоматически сгенерирует переменную со значением по умолчанию, которая будет не выбросить ошибку и редко то, что кто-то намеревается. Для полного ответа ниже я предположил, что соответствующий элемент управления называется txtCurriculumID.

После нескольких изменений потока управления, а также, альтернатива ваших подразделов может быть:

Dim db As DAO.Database 
    Dim rs As DAO.Recordset 
    Dim i As Variant 

    Set db = CurrentDb() 
    Set rs = db.OpenRecordset("tbl_CurCom_Link", dbOpenDynaset) 

    If List89.ItemsSelected.Count = 0 Then 
     MsgBox "No components were selected" 
    Else 
     For Each i In List89.ItemsSelected 
      rs.AddNew 
      rs!fld_CurriculumID = txtCurriculumID.Value 
      rs!fld_ComponentID = List89.Column(0, i) 
      rs.Update 
     Next i 
    End If 
+0

Спасибо, Джон! Это сработало отлично! – Aaron

Смежные вопросы