Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Еще раз про автоматическую нумерацию
 
 автор: ДенНик   (09.02.2009 в 14:48)   личное сообщение
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. В общем не работает. Кто-нибудь помогите, пожалуйста, понять где я ошибся.

  Ответить  
 
 автор: osmor   (09.02.2009 в 15:33)   личное сообщение
 
 

а кто такой 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 (т.е. трехзначного номера, то код будет работать неверно)

  Ответить  
 
 автор: osmor   (09.02.2009 в 15:55)   личное сообщение
17 Кб.
 
 

Ну примерно так, только это решение для одно пользовательского варианта

  Ответить  
 
 автор: денник   (09.02.2009 в 18:29)   личное сообщение
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 номер предлагает.

  Ответить  
 
 автор: osmor   (09.02.2009 в 18:32)   личное сообщение
 
 

пропуски так просто не получится....
а с 10 это я сглупил
поменяйте тип поля NPP в таблице на длинное целое вместо тектового

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList