Как создать макрос для генерации номера записи на основе финансового года? (Access 2013)

Как создать макрос для генерации номера записи на основе финансового года? (Access 2013)

Я хотел бы создать номер записи, который будет основан на финансовом году и будет автоматически увеличиваться... Что-то вроде: 2015001, 2015002, 2015003, 2015004; 2016001, 2016002 и т. д.

У меня уже есть поле [FiscalYr] (вычисляемый тип данных) в таблице [Projects], основанное на следующем выражении:

IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate])).  

Поле [EntryDate] — это поле даты/времени со значением по умолчанию Date(). Это работает так, как мне бы хотелось.

Есть ли способ взять этот номер [FiscalYr] и поместить его перед 3-значным числом, которое начинается с 001 и увеличивается на 1 в зависимости от предыдущей записи, с числом, сбрасываемым на 001 в начале каждого нового финансового года? Наш финансовый год начинается 1 октября и заканчивается 30 сентября.

Я хочу, чтобы число генерировалось независимо от того, введена ли информация в таблицу [Проекты] или форму [Форма проектов]. Я не хочу, чтобы оно генерировалось только в том случае, если информация введена в форму. Я видел несколько сообщений в Интернете, предлагающих лучший способ сделать что-то подобное — использовать макрос Before Change, но большинство примеров, которые я могу найти, основывают значительную часть своего кода макроса на дате, и я уже разобрался с проблемой даты (я думаю).

Я бы справился с макросом, который одновременно создавал бы финансовый год из [EntryDate] и число, если это проще, чем работать с моим существующим полем [FiscalYr]. Я всего лишь случайный пользователь Access, так что если я говорю тарабарщину, извините — я думаю, что знаю достаточно, чтобы быть опасным.

Большое спасибо, Андреа.


Обновление 09.12.2015:

Я отказался от идеи макросов.

Используя советы из блога Скоттгема (https://scottgem.wordpress.com/2009/11/25/последовательная-нумерация/), мне удалось запустить последовательную систему нумерации, но я все еще борюсь с необходимостью сбросить номер на 1 в начале нового финансового года. Я не уверен, проблема в том, как я генерирую значение финансового года, или в чем-то совершенно другом.

Вот что у меня получилось:

Название таблицы: Проекты

В разделе «Проекты» у меня есть следующие поля, связанные с этой проблемой:

  • ProjectNo: число - длинное целое
  • Последовательность: число - длинное целое
  • EntryFiscalYr: вычисляется - длинное целое число; выражение выглядит следующим образом:IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate]))
  • EntryDate: дата/время; значение по умолчанию: Date()

Название формы: Форма проекта

В форме «Проекты» у меня есть следующие элементы управления:

  • Последовательность: текстовое поле, источником управления является поле «Последовательность» в таблице «Проекты», установлено значение «Невидимый»
  • CreateProjNo: кнопка, событие при нажатии:

     Private Sub CreateProjNo_Click()
        Me.Sequence = Nz(DMax("[Sequence]", "Projects"), 0) + 1
        DoCmd.RunCommand acCmdSaveRecord
     End Sub
    
  • ProjectNo: текстовое поле, источник управления данными:

     =[EntryFiscalYr] & Format([Sequence],"000")
    

Это отображается так, как мне бы хотелось: 2016001, 2016002 и т. д.

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

Я пытался:

 Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”,”[EntryFiscalYr]) = “ &(Me.[EntryFiscalYr])),0)+1

 Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”, ” [EntryFiscalYr] = ‘“ & Me.[EntryFiscalYr] & “’”),0)+1

Я также пробовал Me.[txtEntryFiscalYr]вместо Me.[EntryFiscalYr]. Ни одна из этих попыток не сработала.

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

Кроме того, ProjectNo, который генерируется в форме Projects, не обновляется в поле ProjectNo в таблице Projects, но я понимаю, что в этом и суть. Это правильно?

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

Спасибо!

решение1

Это код, на котором я в конце концов остановился. Он использует кнопку в моей форме. Надеюсь, это поможет другим, кто может столкнуться с теми же проблемами.

Private Sub CreateProjNo_Click()
Me.EntryFiscalYr = IIf(Month([EntryDate]) >= 10, Year([EntryDate]) + 1, Year([EntryDate]))
Me.Dirty = False

If IsNull(Me.Sequence) Then
Me.Sequence = Nz(DMax("[Sequence]", "Projects", "[EntryFiscalYr] = " & Me.[EntryFiscalYr]), 0) + 1
Me.Dirty = False
End If

End Sub

Для получения более подробной информации о том, как я пришел к этому решению, я бы рекомендовал перейти по этой ссылке: http://answers.microsoft.com/en-us/office/forum/office_2013_release-access/access-2013-how-do-i-generate-a-record-number/22fa42e1-dd89-4683-b1d0-72b112281c1c

Связанный контент