#sql #vba #ms-access
#sql #vba #ms-access
Вопрос:
Я хотел бы вставить несколько записей в таблицу, используя одну форму.
Желаемый результат:
DESTINATION_TABLE
DATE | PLACE | THEME | PARTICIPANT
dd.mm.yyyy A X 1
dd.mm.yyyy A X 2
dd.mm.yyyy B Y 3
МЕСТО и УЧАСТНИК должны быть выбраны из значений, содержащихся в других таблицах, в то время как ДАТА и ТЕМА вводятся с помощью текстовых полей. В таблицу одновременно должно быть вставлено только одно значение для ДАТЫ, МЕСТА и ТЕМЫ, но я хотел бы иметь возможность вставлять нескольких УЧАСТНИКОВ с новой строкой для каждого выбранного УЧАСТНИКА.
Добавление новых записей для ДАТЫ, МЕСТА и ТЕМЫ через форму работает (используя CurrentDb.Execute «ВСТАВИТЬ В…).
Как я могу создать форму, которая позволила бы мне выбрать УЧАСТНИКА из подчиненной формы (в идеале с флажками), отфильтрованной по значению на МЕСТЕ, и добавить запись в DESTINATION_TABLE для каждого выбранного УЧАСТНИКА?
Комментарии:
1. Это довольно широкий вопрос; можете ли вы немного сузить его?
2. @CaiusJard Прошу прощения, но я не знаю, как разбить эту проблему на подзадачи. У вас есть какие-либо предложения?
Ответ №1:
Один простой способ сделать это с вашими текущими настройками -:
- добавьте
Yes/No
поле в вашу таблицу участников, по умолчанию равноеNo
. Мы будем называть это полеSelected
-
Привяжите свою подчиненную форму к таблице участников, пользователь сможет проверять каждого участника из этого представления (используя
Selected
поле). -
Из какого бы события вы ни сохраняли свои данные (например, нажатие кнопки), создайте набор записей (
rs
) на основе выбранных участников из таблицы участников (SELECT * FROM PARTICIPANT WHERE Selected = True
. Выполните цикл по каждой записи в наборе записей (rs
) и выполните свой кодCurrentDb.Execute "INSERT INTO...)
, взяв значение участника (rs("Participant")
) из набора записей. - Как только цикл будет завершен, обновите таблицу участников, установив для
Selected
поля значениеNo
.CurrentDb.Execute "UPDATE PARTICIPANT SET Selected = False WHERE Selected = True"
- Обновите / запросите данные вашей вспомогательной формы, если это необходимо
Замените приведенные выше имена объектов на ваши.
Комментарии:
1. Спасибо @jbud, я попробую это как можно скорее. Создание этого цикла станет для меня хорошей возможностью обучения!
2. Быстрое обновление: шаги 1) и 2) из вашего решения сработали отлично, я смог получить нужную форму. Однако я заблудился, исследуя наборы записей (я никоим образом не знаком с VBA), поэтому я использовал другой, менее элегантный метод: я создал пустую временную таблицу, которую я заполнил с помощью DoCmd.RunSQL «ОБНОВИТЬ tmpTable СПРАВА ПРИСОЕДИНИТЬСЯ к участнику … ГДЕ участник. Checkbox = True», а затем «ВСТАВИТЬ В таблицу, ВЫБРАННУЮ […] ИЗ tmpTable». Я прекрасно понимаю, что это действительно ужасное решение, но оно делает свое дело… Еще раз спасибо @jbud за указание правильного направления!