|
14 Кб. |
|
| Пытаюсь сделать автоматическую нумерацию по маске ххх-09-М, где ххх- порядковый номер 001-09-M, 002-09-M, 003-09-M и так далее. Попытался написать это используя пример нумератора договоров выложенный здесь, вот что получилось:
Option Compare Database
Private Sub Поле_ввода_AfterUpdate()
Поле_кода = NomerZK_auto()
End Sub
Function NomerZK_auto() As String
Dim NZK As DAO.Recordset
Dim NZKsled
Set NZK = CurrentDb.OpenRecordset("Таблица1")
If Not NZK.EOF Then
NZK.MoveLast
Set NZK = CurrentDb.OpenRecordset("Таблица1")
End If
NZK.AddNew
NZKsled = (Left(NZK![Поле_кода], 3))
NomerZK_auto = String(3 - Len(NZKsled), 0) & (NZKsled + 1) & "09-M"
NZK.Update
NZK.Close
End Function
Но пишет, что NZKposl=Null. В общем не работает. Кто-нибудь помогите, пожалуйста, понять где я ошибся. | |
|
| |
|
|
|
| а кто такой NZKposl ? в коде его нет...
вообще какая-то каша,
вот например:
Set NZK = CurrentDb.OpenRecordset("Таблица1")
If Not NZK.EOF Then
NZK.MoveLast
Set NZK = CurrentDb.OpenRecordset("Таблица1")
End If
|
перевожу на русский:
открыть рекордсет по таблице Таблица1 и присвоить его переменной NZK
если была попытка выйти за последнюю запись рекордсета то
перейти на последнюю запись рекордсета
открыть рекордсет по таблице Таблица1 и присвоить его переменной NZK
конец если
|
где логика?
еще
NZK.AddNew
NZKsled = (Left(NZK![Поле_кода], 3))
NomerZK_auto = String(3 - Len(NZKsled), 0) & (NZKsled + 1) & "09-M"
|
Вы добавляете запись в рекордсет
берете значение поля Поле_кода из новой добавленной записи (если значение по умолчанию для поля не задано, то будет null)
потом вы к этому значению добавляете 1 и собираете все в код. зачем добавлять 1 если поле и так должно содержать код для новой записи (если там вообще есть значение)
Кстати у вас не вылетает сообщение об ошибке про неверное использование NULL на строке
NZKsled = (Left(NZK![Поле_кода], 3))
?
На мой взгляд было бы проще создать числовое поле содержащее номе по порядку, его увеличивать при добавлении записи (используя для этого dmax(....) +1, а уж пользователю можно выводить собранное значение, и отформатированное нужным образом значение, тогда порядковый номер не нужно будет каждый раз вычленять из собранного.
Кроме того как только вы выйдите за пределы 999 (т.е. трехзначного номера, то код будет работать неверно) | |
|
| |
|
17 Кб. |
|
| Ну примерно так, только это решение для одно пользовательского варианта | |
|
| |
|
23 Кб. |
|
| Спасибо! osmor
Ваш совет оказался полезен. я тут насочинял после Вашей критики:
Function NomerZK_auto() As String
Dim NZK As DAO.Recordset
Dim NZKsled
Set NZK = CurrentDb.OpenRecordset("Таблица1")
NZK.MoveLast
Set NZK = NZK
NZKsled = (Left(NZK![Поле_кода], 3))
NZK.AddNew
NomerZK_auto = Format((NZKsled + 1), "000") & "-09-M"
NZK.Close
End Function
Но Ваш вариант, честно говоря, мне больше понравился надо только что-то придумать чтобы пропущенные значения находились и нумерация после 10 шла дальше а то он дважды 10 номер предлагает. | |
|
| |
|
|
|
| пропуски так просто не получится....
а с 10 это я сглупил
поменяйте тип поля NPP в таблице на длинное целое вместо тектового | |
|
| |