Создайте несколько записей в одной форме. Для каждой записи изменяется только одно поле

#vba #loops #ms-access

#ms-access #vba #ms-access-2010 #ms-access-2007 #ms-access-2013

Вопрос:

Там, где я работаю, мы получаем электронные счетчики от клиентов и пытаемся устранить ошибки, которые у них есть. За раз мы получим 4-8 счетчиков, у которых одна и та же проблема, одинаковые спецификации, одинаковое все, единственное, что отличается между каждым счетчиком, — это серийный номер. Я хочу иметь возможность вводить каждый серийный номер и общие спецификации в одной форме для создания нескольких записей.

Вот изображение того, что у меня есть для формы. Я смог создавать записи только для одного серийного номера за раз, но я хотел бы сделать это все сразу, чтобы ускорить и упростить ввод данных.

Форма ввода счетчика

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

-Крис

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

1. Что сообщает вашей форме, что вы «закончили» — не видно кнопки сохранения или добавления. Если вы сделаете элементы управления в своей форме «несвязанными», и у вас есть кнопка «Сохранить», вы можете перебирать каждое поле serial # и, если оно не пустое, сохранять запись в своей базе данных.

2. Используйте связанную форму и в событии BeforeUpdate установите свойство defaultValue для полей с «фиксированным» содержимым. При переходе к новой записи поля будут отображать значение по умолчанию.

Ответ №1:

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

Итак, в приведенном ниже макете вы должны указать, сколько записей вы хотите (красное поле), например, 10 записей:

введите описание изображения здесь

Затем вы должны предоставить данные, которые будут повторяться для этих 10 записей (синие поля):

введите описание изображения здесь

Затем вы нажмете кнопку, которая создаст указанное количество записей с повторяющейся информацией:

введите описание изображения здесь

Тогда было бы просто заполнить уникальный серийный номер для каждой из записей в сгенерированном вами пакете.

Вот VBA, который я использовал для кнопки Добавления:

 Private Sub cmdAddRecords_Click()

    batchAdd Me.txtRecords
    Me.tblMeters_sub.Requery

End Sub
  

… и batchAdd подпрограмма, которую он вызывает:

 Public Sub batchAdd(records As Integer)

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Integer
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tblMeters")

    i = 1

    Do While i <= records
    
        rs.AddNew
        rs!SerialNumber = ""
        rs!MeterFirmware = Me.MeterFirmware
        rs!MeterCatalog = Me.MeterCatalog
        rs!Customer = Me.Customer
        rs!MeterKh = Me.MeterKh
        rs!MeterForm = Me.MeterForm
        rs!MeterType = Me.MeterType
        rs!MeterVoltage = Me.MeterVoltage
        rs.Update
        
        i = i   1

    Loop
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing

End Sub
  

Вот ссылка на макет (если вы хотите посмотреть поближе).

Обновить

В ответ на ваш запрос о том, можно ли фильтровать подчиненную форму, чтобы она не превращалась просто в большой список всех счетчиков, вы можете добавить в таблицу tblMeters другое поле, в котором будут указаны дата и время добавления записей в таблицу:

введите описание изображения здесь

Затем вам нужно будет добавить еще одну строку к batchAdd подразделу, которая поместит системное время и дату в это новое поле:

 ...

Do While i <= records

    rs.AddNew
    rs!SerialNumber = ""
    rs!MeterFirmware = Me.MeterFirmware
    rs!MeterCatalog = Me.MeterCatalog
    rs!Customer = Me.Customer
    rs!MeterKh = Me.MeterKh
    rs!MeterForm = Me.MeterForm
    rs!MeterType = Me.MeterType
    rs!MeterVoltage = Me.MeterVoltage
    rs!DateAdded = Now                  ' <-- HERE!
    rs.Update
    
    i = i   1

Loop

...
  

Затем вам нужно будет изменить свойство источника записи подчиненной формы (Конструкторский вид> выбрать подчиненную форму> Таблица свойств> Вкладка «Данные»> Источник записи):

введите описание изображения здесь

Поместите туда следующий SQL:

 SELECT TOP 15 tblMeters.SerialNumber, tblMeters.MeterFirmware, tblMeters.MeterCatalog, 
tblMeters.Customer, tblMeters.MeterType, tblMeters.MeterForm, tblMeters.MeterKh, 
tblMeters.MeterVoltage, tblMeters.DateAdded 
FROM tblMeters 
ORDER BY tblMeters.DateAdded DESC;
  

… который упорядочит записи по полю даты / времени (самое последнее вверху), а затем отобразит только первые 15 из этих записей. Если вам нужно другое количество записей, измените TOP 15 бит на другое число по вашему выбору.

Когда вы нажимаете «Добавить», ваш новый пакет записей должен быть добавлен в начало списка, и в списке должно быть не более 15 записей (или любое другое количество, которое вы укажете TOP ... )

Имейте в виду, что когда я тестировал это, быстрое нажатие кнопки «Добавить» несколько раз, казалось, заставляло sql не беспокоиться о TOP ... фильтре, но пока между каждым нажатием кнопки «Добавить» проходит секунда или больше, казалось, что все работает нормально.

Надеюсь, это поможет.

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

1. Спасибо за помощь, Мэтт. Я действительно ценю это. Одна вещь, которую я заметил, заключалась в том, что подчиненная форма сохраняет каждую введенную прошлую запись и в основном превращается во весь список счетчиков. При добавлении новых счетчиков форма просто добавляет новые записи в нижнюю часть вложенной формы. Мне было интересно, есть ли способ очистить предыдущие записи и отображать только новые записи каждый раз, когда я хочу внести запись. Я немного исследовал наборы записей и не смог найти конкретного объяснения / решения, поэтому, если бы вы могли помочь, это было бы очень ценно. Еще раз спасибо!

2. Крис, чтобы обойти это, вы можете сделать одно из нескольких действий. Если ваше правило заключается в том, что КАЖДЫЙ раз, когда вы открываете эту форму для ДОБАВЛЕНИЯ записей, вы можете использовать событие Form_Open, чтобы найти самый высокий ‘ID’ в данный момент в вашей таблице, затем установите фильтр формы на ‘[ID]> nnn’

3. @MattHall, все сработало, и ваше решение — это именно то, что я искал. Я даже смог включить выпадающие меню для стандартных значений, чтобы сделать форму более надежной и ускорить ввод данных. Как стажер, это всего лишь побочный проект, который я взял самостоятельно, потому что я видел, что это нужно исправить. Я еще не показал моему руководителю ничего из этого, он будет поражен. Большое спасибо за помощь!

4. Не беспокойтесь, рад, что смог помочь. Я ни в коем случае не эксперт, но не стесняйтесь писать мне по электронной почте, если хотите пораскинуть мозгами… matthew.richard.hall@gmail.com

5. Старый поток, который я знаю, но как бы я это сделал, если бы у меня было фиксированное количество строк, которые нужно было создать, и мне просто нужно было изменить поле «оценка» для каждого?