#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. Старый поток, который я знаю, но как бы я это сделал, если бы у меня было фиксированное количество строк, которые нужно было создать, и мне просто нужно было изменить поле «оценка» для каждого?