ВСТАВИТЬ В таблицу из формы с флажками

#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:

Один простой способ сделать это с вашими текущими настройками -:

  1. добавьте Yes/No поле в вашу таблицу участников, по умолчанию равное No . Мы будем называть это поле Selected
  2. Привяжите свою подчиненную форму к таблице участников, пользователь сможет проверять каждого участника из этого представления (используя Selected поле).

  3. Из какого бы события вы ни сохраняли свои данные (например, нажатие кнопки), создайте набор записей ( rs ) на основе выбранных участников из таблицы участников ( SELECT * FROM PARTICIPANT WHERE Selected = True . Выполните цикл по каждой записи в наборе записей ( rs ) и выполните свой код CurrentDb.Execute "INSERT INTO...) , взяв значение участника ( rs("Participant") ) из набора записей.

  4. Как только цикл будет завершен, обновите таблицу участников, установив для Selected поля значение No . CurrentDb.Execute "UPDATE PARTICIPANT SET Selected = False WHERE Selected = True"
  5. Обновите / запросите данные вашей вспомогательной формы, если это необходимо

Замените приведенные выше имена объектов на ваши.

Комментарии:

1. Спасибо @jbud, я попробую это как можно скорее. Создание этого цикла станет для меня хорошей возможностью обучения!

2. Быстрое обновление: шаги 1) и 2) из вашего решения сработали отлично, я смог получить нужную форму. Однако я заблудился, исследуя наборы записей (я никоим образом не знаком с VBA), поэтому я использовал другой, менее элегантный метод: я создал пустую временную таблицу, которую я заполнил с помощью DoCmd.RunSQL «ОБНОВИТЬ tmpTable СПРАВА ПРИСОЕДИНИТЬСЯ к участнику … ГДЕ участник. Checkbox = True», а затем «ВСТАВИТЬ В таблицу, ВЫБРАННУЮ […] ИЗ tmpTable». Я прекрасно понимаю, что это действительно ужасное решение, но оно делает свое дело… Еще раз спасибо @jbud за указание правильного направления!