2017-02-06 13 views
0

Фон: Я использую Access 2010 для управления и отслеживания налоговых счетов, которые исследуются и оплачиваются. Они получены в формате Excel и импортируются в базу данных, затем у меня есть куча запросов, которые я запускаю, чтобы идентифицировать элементы исследования. В любой момент времени есть тысячи счетов на разных этапах, но самая большая часть - это те, которые просто готовы платить. Я автоматизировал его, чтобы записи, помеченные как «номер партии» (идентификатор группы счетов в программной системе моей компании), выбранные из раскрывающегося списка, экспортируются в правильном формате для нашего программного обеспечения для оплаты. Из-за ограничений налогового органа округа я могу заплатить только 1500 счетов за раз.Обновление поля на основе указанного количества записей меньше итогового (например, 1000 из 5000 записей)

Вопрос/Проблема: Мне нужен [лучший] способ обновить «номер партии» на 1500 записей (или меньше) за раз, из набора записей, который намного больше. В принципе, я хочу иметь возможность вводить число и создавать группу (основанную на обновлении «номера партии») с помощью множества счетов в ней.

Пример: Если общее количество счетов, готовых платить 3900, то я хотел бы сделать следующее:

  • ПАРТИЯ-001 - 1500 счетов
  • ПАРТИЯ-002 - 1500 купюр
  • ПАРТИЯ-003 - 900 законопроектов

Что я пробовал: я гугле как сумасшедший, и удалось залатать вместе что-то, что делает, но с большим количеством записей он блокирует мой компьютер ... неудивительно, учитывая то, что он делает, но я должен был дать ему шанс! Он выполняет итерацию по всем записям и помещает логическое поле в значение True до тех пор, пока счет не будет достигнут. Затем я использую это логическое поле для фильтрации запроса обновления. Смотри ниже.

Private Sub cmdCreateBatch_Click() 

     DoCmd.SetWarnings False 

     Dim intRecordNum As Integer 
     Dim intBatchSize As Integer 

     Me.Recordset.MoveFirst 

     intBatchSize = Me.txtBatchSize 
     intRecordNum = Me.CurrentRecord 

     If intRecordNum < intBatchSize Then 

      Do Until intRecordNum > intBatchSize 
       Me.chkInclude = True 
       Me.Recordset.MoveNext 
       intRecordNum = Me.CurrentRecord 
      Loop 
     End If 

     DoCmd.OpenQuery "qryUpdateBatchNumber", acViewNormal, acEdit 
     DoCmd.OpenQuery "qryUpdateCheckBoxtoFalse", acViewNormal, acEdit 

     Me.Requery 

     MsgBox "Bill batch has been created." 

     DoCmd.SetWarnings True 

    End Sub 

Я все еще новичок в VBA, но с готовностью изучаю все, что могу! Я ценю любую помощь.

ответ

3

Я думаю, что, вероятно, подход, который нужно предпринять, состоял бы в том, чтобы запустить один запрос для работы, который 1500 записей необходимо добавить к пакету, а не переходить через ваши записи и обновлять их индивидуально до тех пор, пока вы не сделаете 1500. Предполагая, что ваш bills таблица имеет числовой первичный ключ, то вы могли бы использовать что-то вроде

select max(BillID) As BatchEnd from 
    (select top 1500 BillID from Bills 
    where BatchNumber Is Null and Status = {ready to batch} 
    order by BillID) As X 

Обратите внимания, что вам не придется беспокоиться о явном указании небольшой партии в конце; если не осталось 1500 записей, оставшихся без ответа, то top 1500 просто предоставит вам все оставшиеся незафиксированные записи. Найдя эту максимальную unbatched BillID, то вы даже не нужно, чтобы установить флаг (chkInclude), вы можете просто идти прямо на обновление

update Bills 
set BatchNumber = {whatever your next BatchNumber is}, 
    Status = {new status} 
where BatchNumber Is Null and BillID <= {variable where you stored BatchEnd} 
+0

Кто Дат, [** SKIPPY **] (HTTPS://en.wikipedia.org/wiki/Skippy_(peanut_butter)), [** SKIPPY **] (https://en.wikipedia.org/wiki/Skippy_ (peanut_butter)), ya !! –

+0

Я надеялся указать способ указать число в случае, если я хочу сделать менее 1500 по какой-либо причине; однако, я думаю, что это будет работать достаточно хорошо, и я всегда могу вручную создать пакет в этих случайных случаях. Спасибо за помощь. –

+0

Я думаю, что вы должны иметь возможность использовать свою переменную ввода в элементе '(select top {intBatchSize} BillID ...'). – Skippy