Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Уважаемые знатоки Access. Есть задача создания базы регистрации событий. В целом ничего сложного, но имеется требование присвоения регистрационных номеров каждой записи, при этом каждый календарный год должен начинаться с новой регистрации, т.е. с единицы. Каким образом посоветуете организовать данный процесс и возможно ли такое в принципе?
7 апр 18, 20:47    [21321021]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
DarkMan
Member

Откуда:
Сообщений: 460
Lekks
Уважаемые знатоки Access. Есть задача создания базы регистрации событий. В целом ничего сложного, но имеется требование присвоения регистрационных номеров каждой записи, при этом каждый календарный год должен начинаться с новой регистрации, т.е. с единицы. Каким образом посоветуете организовать данный процесс и возможно ли такое в принципе?

Когда то очень давно , была такая книШка Секреты Access 97 , вот там я скомуниздил такой код .
+

    Public Sub adhAutoCounterData()
   ' DoCmd.GoToRecord A_FORM, "ИмяФормы", A_NEWREC
    Dim db As Database
    Dim r As DAO.Recordset
    Dim Temp As String
    Dim Temp2 As String
    Set db = CurrentDb()
   
    Set r = db.OpenRecordset("Таблица", DB_OPEN_TABLE)
    Temp = Format(Now, "yyyymm")
    Temp2 = 0
    Do Until r.EOF
    If Left(r("Поле"), 6) = Temp Then
    If Val(Mid(r("Поле"), 8)) > Temp2 Then Temp2 = Val(Mid(r("Поле"), 8))
    End If
    r.MoveNext
    Loop
    If Temp2 = 0 Then
    Temp2 = Temp + "-01"
    Else
    If Temp2 < 9 Then
    Temp2 = Temp + "-0" + Mid(Str$(Temp2 + 1), 2)
    Else
    Temp2 = Temp + "-" + Mid(Str$(Temp2 + 1), 2)
    End If
    End If
    Forms("имяФормы")("Поле") = Temp2
    r.Close

End Sub


Принцип действия такой. Отыскивает последний номер договора , а затем форматирует в зависимости от даты например 20180410-01 , 20180410-02 и так далее . Мне кажется Вам подойдет . Допилите под свои нужды или на основании примера соорудите что нить свое.
7 апр 18, 21:08    [21321050]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
DarkMan
Member

Откуда:
Сообщений: 460
Соответственно в новом 2019 году первая запись будет 20190101-01 .
7 апр 18, 21:10    [21321051]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 453
Lekks, давненько решал такую проблему, правда там посложнее - несколько точек и у них у каждой должна быть своя нумерация внутренних накладных.
В таблице с описанием этих точек сделал два поля - одно с номером, другое с годом, если поле которое не совпадает с текущим годом - номер обнуляется.
+
Public Function Nomer_Nkl(Kiosk As Long, kiosk4 As Recordset, fldDate As Date) As String
Dim j As Integer, k As Integer, i As Integer, ki As String, a As Long  'Kiosk4 As Recordset,
Dim Nakl_God1 As Long, Nakl_God2 As Long, nom As Long

a = 1
If Kiosk > 0 Then
ki = Choose(Kiosk, "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "К", "Л")
Else
ki = "Z"
End If
'Set Kiosk4 = CurrentDb.OpenRecordset("Kiosk", dbOpenDynaset)

kiosk4.FindFirst "Код=" & Kiosk
Nakl_God1 = CLng(kiosk4.Fields("Nakl_God")) 'год который был в прошлой накладной
Nakl_God2 = CLng(Year(fldDate)) ' год, который будет в нынешней накладной
    kiosk4.Edit
        a = CLng(kiosk4.Fields("Nakl_Nomer"))
        If Nakl_God2 > Nakl_God1 Then kiosk4.Fields("Nakl_God") = Nakl_God2: a = 0  ' обновляем год накладной
        nom = a + 1
        kiosk4.Fields("Nakl_Nomer") = nom ' обновляем номер накладной
    kiosk4.Update


Nomer_Nkl = Nakl_God2 & ki & "_" & nom

End Function

код не очень оптимальный, но as is - даже комменты не стал не изменять - помоему понятен принцип.
8 апр 18, 00:26    [21321162]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
DarkMan,
как-то так:
Private Sub дата_AfterUpdate()
Me.заказ=Format(Me.дата, "yyyymmdd") & " - " & Format(DCount("заказ", "tbl", "year(дата)=" & Year(Me.дата)) + 1, "000")
End Sub
8 апр 18, 00:29    [21321165]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
DarkMan
Member

Откуда:
Сообщений: 460
sdku
DarkMan,
как-то так:
Private Sub дата_AfterUpdate()
Me.заказ=Format(Me.дата, "yyyymmdd") & " - " & Format(DCount("заказ", "tbl", "year(дата)=" & Year(Me.дата)) + 1, "000")
End Sub

да я заметил что там только месяц, но так как сообщение было уже отправлено , а редактировать нельзя , то я и не стал напрягаться.
Думаю ТС додумается подредактировать под свои хотелки. :)
8 апр 18, 00:40    [21321169]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
DarkMan,
Прошу прощения-я случайно ответил на Ваше сообщение-естессно оно для ТС
8 апр 18, 01:56    [21321187]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
DarkMan
Member

Откуда:
Сообщений: 460
sdku
DarkMan,
Прошу прощения-я случайно ответил на Ваше сообщение-естессно оно для ТС

Все ОК. Поправка действительно была к месту , да и Ваш вариант намного удобнее. Правда я уже писал , что когда то я скомуниздил этот код в книШке , а тогда не хватало ума переделывать , а сейчас как то и нет надобности. Работает и работает .


P.S Но правда ТС куда то пропал как всегда.
8 апр 18, 09:13    [21321306]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Ребят, всем спасибо. Быстренько попробовал на работе и тот и тот вариант. Работает все )) Буду в базу прописывать.
8 апр 18, 11:27    [21321381]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Всем привет. Снова проблема. Прописал вот так:

Private Sub Дата__регистрации_AfterUpdate()
Me.Рег_номер = Format(Me.Дата_регистрации, "yyyymmdd") & " - " & Format(DCount("Рег_номер", "Учет_нарушений", "year(Дата_регистрации)=" & Year(Me.Дата_регистрации)) + 1, "000")
End Sub


Сама таблица и форма: https://yadi.sk/d/Dm-tyuJpDF6YHA.

Не работает. Хотя раньше делал пробную, вроде работало как надо.
15 окт 18, 18:09    [21704415]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
сделайте как в приложенном файле и будет Вам Щастье

К сообщению приложен файл (tmp.rar - 26Kb) cкачать
16 окт 18, 00:47    [21704640]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
после обновления [myData]
16 окт 18, 00:48    [21704641]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
sdku,

Выдает ошибку:

К сообщению приложен файл (скрин.docx - 144Kb) cкачать
16 окт 18, 08:05    [21704717]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Все, поменял имена на RegNum и RegDate, заработало. Спасибо.
16 окт 18, 08:31    [21704729]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Озадачился автонумерацией с начальным значением. Итог:

+
    Private Sub Поле5_AfterUpdate()
    Dim a
    Dim b
    Dim c
    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.Open "tblTest", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
    If Not rst.EOF And Not rst.BOF Then rst.MoveLast Else rst.AddNew
    If Not IsNull(rst.Fields(2)) Then c = Year(rst.Fields(2)) Else c = Year(Date)
    a = Year(Me.Поле5)
    b = Me.Поле - 1
    If a = c Then
        Me.Registration = (b + (DCount("*", "tblTest", "year(RegDate)=" & a))) + 1 & "/" & a
    Else: Me.Registration = DCount("*", "tblTest", "year(RegDate)=" & a) + 1 & "/" & a
    Me.Поле7 = 1
    End If
End Sub
8 ноя 18, 20:27    [21728688]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
Lekks,
Почему нельзя для нумерации с какой-то конкретной цифры разместить кнопку(visible=true если запись новая и visible=false для других записей) и на её нажатие повесить аналогичную предложенной процедуру в которой Dcount()+1 заменить на конкретное значение
8 ноя 18, 22:19    [21728807]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Лапух
Member

Откуда:
Сообщений: 774
Lekks, может так прокатит?
Me.[№ппИ] = Nz(DMax("№ппИ", "Ингридиенты"), 0) + 1
или если в подчиненной форме
Me.[№ппИ] = Nz(DMax("№ппИ", "Ингридиенты", "КодБлюдаИ=" & Me.[КодБлюдаИ]), 0) + 1
Естественно имена полей и таблиц как у вас.[b][/b]
Если правильно понял, то именно так всегда делаю.
8 ноя 18, 22:38    [21728826]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
sdku
... повесить аналогичную предложенной процедуру в которой Dcount()+1 заменить на конкретное значение


не понял, если честно))) конкретное значение - какое?
9 ноя 18, 17:44    [21729963]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Лапух,

в моем случае нумерация не сквозная, а с началом (с первой записью) нового года вновь начинается с единицы:

К сообщению приложен файл. Размер - 11Kb
9 ноя 18, 17:53    [21729971]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
Lekks
Лапух,
в моем случае нумерация не сквозная, а с началом (с первой записью) нового года вновь начинается с единицы:
А ведь в примере что Вам предложен так и есть.Вы его тестировали? (Переставить системное время компьютера слабо)
9 ноя 18, 19:12    [21730060]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Лапух
Member

Откуда:
Сообщений: 774
Lekks,
Я бы в Источнике записей формы, основанной на запросе, и открытом в режиме конструктора, в свободном поле написал:

ТекущийГод: Year(Date())
или
ТекущийГод: Format(Date();"yyyy")

Вывел это поле на форму для наглядности.
А процедура на добавление №пп тогда бы выглядела примерно так:

Me.[№пп] = Nz(DMax("№пп", "ИмяТаблицы", "ТекущийГод=" & Me.[ТекущийГод]), 0) + 1
9 ноя 18, 19:29    [21730073]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
Вернее не системное время переставить, а ввести в поле "myDate" дату с годом для которого еще нет записей
9 ноя 18, 20:18    [21730104]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Лапух, в чем может быть проблема:
Me.Registration = Nz(DMax("Registration", "tblTest2", "RegDate=" & Me.[Поле5]), 0) + 1

К сообщению приложен файл. Размер - 29Kb
9 ноя 18, 22:01    [21730154]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Лапух
Member

Откуда:
Сообщений: 774
Lekks,
Ну видимо у вас в поле дата с месяцем и годом, а не просто год.
Даты обрамляют в решточки и указывать американский формат.
А вам как я понял нужна нумерация начинающаяся раз в год, а не на каждый день.
И кстати что за лень вам помешала дать нормальное имя для поля с датой?
С таких мелочей и начинаются ошибки и путаница.
9 ноя 18, 22:27    [21730165]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Лапух, все, спасибо. Решил сам, именно в годе проблема.

Private Sub Поле5_AfterUpdate()
    On Error GoTo Поле5_AfterUpdate_Error
    Me.Registration = Nz(DMax("Registration", "tblTest2", "Year(RegDate)= " & Year(Me.[Поле5])), Me.Поле7) + 1
    Me.Поле7 = 0
    
    
    On Error GoTo 0
    Exit Sub

Поле5_AfterUpdate_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Поле5_AfterUpdate, line " & Erl & "."

End Sub


А по поводу полей - это не лень, это просто тестовая табличка ))) Не счел целесообразным.. Ну может и не прав)))

К сообщению приложен файл. Размер - 9Kb
9 ноя 18, 22:31    [21730173]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Подскажите, пожалуйста, можно ли обратиться ко всем комбобоксам в форме одновременно (для установки количества и ширины Column)
10 ноя 18, 12:26    [21730364]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Predeclared
Member

Откуда: And God I know I'm one
Сообщений: 847
+
Доброе утро товарищи комбобоксы!
Начинаем комплекс утренней гимнастики.
:)

Одновременно нет.

Можно ссылки на комбобоксы добавить в свою коллекцию,
описать процедуру, в которой перебирать члены коллекции,
и присваивать нужные значения свойств.

В этом случае один вызов этой процедуры будет имитировать "одновременное" обращение.
10 ноя 18, 13:43    [21730409]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5667
Lekks,
Можно перебрать
Sub my()
Dim ctl As Control
For Each ctl In Me.Controls
	If ctl.ControlType = acСomboBox Then 'или какой другой тип, например acТextBox
	                With ctl 'устанавливайте доступные свойства
 				.SetFocus  
 				.Enabled = True
 				.Height = 400
				.SpecialEffect = 0
			End With
        End If
	Next ctl
End Sub
10 ноя 18, 15:13    [21730452]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Predeclared
Одновременно нет... процедуру, в которой перебирать члены коллекции...

...один вызов этой процедуры будет имитировать "одновременное" обращение.


sdku
Lekks,
Можно перебрать


Да, я именно это и имел ввиду. Не смог разобраться как их обозначать как объект. Спасибо!!!
10 ноя 18, 19:16    [21730560]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Привет. Проблема такого рода:

Select Case PSOTsotr
        Case False
            Me.Registration = Nz(DMax("RegNum", "Accounting", "Year(RegDate)= " & Year(Me.[RegiDate])), (Me.StartNum)) + 1
            Me.StartNum = 0
        Case True
            Me.Registration = Nz(DMax("RegNumOf", "Accounting", "Year(RegDate)= " & Year(Me.[RegiDate])), (Me.StartNum)) + 1
            Me.StartNum = 0
    End Select


В данном коде по полю RegNum таблицы Accounting Dmax нумерует нормально, а по полю RegNumOf той же таблицы, начиная с 9 присваивает номер 10 и на этом все... последующие номера - тоже 10. Поля текстовые.
Подскажите что не так?

P.S. при написании запроса в SQL - DMax (CLng ([RegNumOf]), "Accounting") дает верный результат. Но с чем это связано, почему по двум однотипным полям считает по разному - это неясно. И как правильно написать в VBA тоже не знаю.
7 дек 18, 10:38    [21756735]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 206
Если вы сделаете сортировку по текстовому полю, то увидите, что "10" меньше "9" (даже меньше "2"), т.к. сравнивается 1-й символ, затем 2-й и т.д.
Странно, что ваш код вообще работает. Ведь DMax("RegNumOf"...) возвращает строку,
а "9"+1 вернет "91" (конкатенация), а не 10.
Вы уверены, что "RegNum" тоже текстовое?

Вам надо открывать Recordset на запросе с сортировкой CLng([RegNumOf]) (или Val([RegNumOf]) ) по убыванию читать значение из 1-й записи с преобразованием строки в число.

Кстати, Year(RegDate)= 2018 выглядит проще, чем RegDate Between #01/01/2018# And #12/31/2018#, но работает значительно медленнее.
7 дек 18, 12:05    [21756836]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Кривцов Анатолий
Вы уверены, что "RegNum" тоже текстовое?


RegNum тоже текстовое. И это как бы не мой код, мне его выше в топике подсказали.
7 дек 18, 17:18    [21757379]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Поможет ли изменение формата полей на числовой? И как все-таки правильно написать в VBA выражение
DMax (CLng ([RegNumOf]), "Accounting") и можно ли вообще?
7 дек 18, 17:33    [21757403]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы порядковой нумерации в Access2007  [new]
Lekks
Member

Откуда:
Сообщений: 147
Lekks
Поможет ли изменение формата полей на числовой?


Помогло. Волнует - не вылезет ли из-за этого ошибка в дальнейшем?
7 дек 18, 17:39    [21757409]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft Access Ответить