Intereting Posts
jTable в GUI (java) не отображает все данные из базы данных! ошибка в TableModel? Почему этот запрос заставляет замораживать всю мою базу данных? Как сделать ALTER в таблице PostgreSQL и сделать столбец уникальным? Почему этот запрос mysql (с нулевой проверкой) настолько медленнее, чем этот другой? имеет ли миллионы таблиц и миллионы строк внутри них обычную практику в разработке баз данных MySQL? Когда мы можем использовать номер идентификатора вместо его имени в PostgreSQL? Запрос ежедневных запросов с ограничениями по дате в течение нескольких недель Запрос Sql для вставки даты и времени в SQL Server SQL – возвращает 0s, если не существует группы Как использовать CASE в SQL для моего примера? Изменение параметров набора символов NLS на Oracle 11g XE Выберите данные базы данных и имена таблиц в iSQL plus LINQ to Entities разделяет строку на результат Выбирать оператор с несколькими полями «где», используя одинаковое значение без дублирования текста Вложенный запрос выбора MySql с предложением «где в»

Поле счетчика в MS Access, как сгенерировать?

Как я могу создать поле счетчика, подобное этому 0001A, 0002A … потому что в стандарте это 0,1,2,3,4 …. как это изменить?

Добавляя к превосходному ответу @ HansUp, вы можете скрыть столбец IDENTITY и в то же время выставить форматированный столбец с помощью SQL VIEW : тогда вы можете отменить привилегии в таблице, чтобы пользователи работали с VIEW и не «видели» таблицу например, демо:

копировать + вставлять в любой модуль VBA, не ссылаться и не запрашивать UI / объектную модель Access, создает новый mdb во временной папке, например, используйте Excel:

 Sub YourView2() On Error Resume Next Kill Environ$("temp") & "\DropMe.mdb" On Error GoTo 0 Dim cat Set cat = CreateObject("ADOX.Catalog") With cat .Create _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & _ Environ$("temp") & "\DropMe.mdb" With .ActiveConnection Dim Sql As String Sql = _ "CREATE TABLE YourTable ( " & _ "ID INTEGER IDENTITY(1, 1) NOT NULL UNIQUE, " & _ "data_col VARCHAR(20) NOT NULL);" .Execute Sql Sql = _ "CREATE VIEW YourView AS " & _ "SELECT FORMAT$(ID, '0000') & 'A' AS formatted_ID, " & vbCr & _ " data_col " & vbCr & _ " FROM YourTable;" .Execute Sql Sql = _ "INSERT INTO YourView (data_col) VALUES ('one');" .Execute Sql Sql = _ "INSERT INTO YourView (data_col) VALUES ('day');" .Execute Sql Sql = _ "INSERT INTO YourView (data_col) VALUES ('when');" .Execute Sql Sql = "SELECT * FROM YourView;" Dim rs Set rs = .Execute(Sql) MsgBox rs.GetString End With Set .ActiveConnection = Nothing End With End Sub 

Я думаю, что это было бы еще лучше, если бы вы включили образцы DDL GRANT / REVOKE для управления привилегиями

Вот обновленный код для этого:

 Sub YourView2() On Error Resume Next Kill Environ$("temp") & "\DropMe.mdb" Kill Environ$("temp") & "\DropMeToo.mdw" On Error GoTo 0 ' Create workgroup and db Dim cat As ADOX.Catalog Set cat = CreateObject("ADOX.Catalog") With cat .Create _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Jet OLEDB:Engine Type=4;" & _ "Data Source=" & _ Environ$("temp") & "\DropMeToo.mdw;" & _ "Jet OLEDB:Create System Database=-1" .Create _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Jet OLEDB:Engine Type=4;" & _ "Data Source=" & _ Environ$("temp") & "\DropMe.mdb;" & _ "Jet OLEDB:System Database=" & _ Environ$("temp") & "\DropMeToo.mdw;" ' Add table with data and user with privileges With .ActiveConnection Dim Sql As String Sql = _ "CREATE TABLE YourTable ( " & _ "ID INTEGER IDENTITY(1, 1) NOT NULL UNIQUE, " & _ "data_col VARCHAR(20) NOT NULL);" .Execute Sql Sql = _ "CREATE VIEW YourView AS " & _ "SELECT FORMAT$(ID, '0000') & 'A' AS formatted_ID, " & vbCr & _ " data_col " & vbCr & _ " FROM YourTable WITH OWNERACCESS OPTION;" .Execute Sql .Execute "CREATE USER onedaywhen pwd Chri5tma5;" .Execute "GRANT ALL PRIVILEGES ON YourView TO onedaywhen;" .Execute "REVOKE ALL PRIVILEGES ON YourTable FROM onedaywhen;" End With End With ' Test user can connect Dim con As ADODB.Connection Set con = New ADODB.Connection With con .ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Jet OLEDB:Engine Type=4;" & _ "Data Source=" & _ Environ$("temp") & "\DropMe.mdb;" & _ "Jet OLEDB:System Database=" & _ Environ$("temp") & "\DropMeToo.mdw;" & _ "User ID=onedaywhen;Password=pwd;" .Open On Error Resume Next ' Attempt to insert to table (no privileges) Sql = _ "INSERT INTO YourTable (data_col) VALUES ('one');" .Execute Sql If Err.Number <> 0 Then MsgBox _ Err.Number & ": " & _ Err.Description & _ " (" & Err.Source & ")" End If On Error GoTo 0 Dim rs On Error Resume Next ' Attempt to read table (no privileges) Sql = _ "SELECT * FROM YourTable;" Set rs = .Execute(Sql) If Err.Number <> 0 Then MsgBox _ Err.Number & ": " & _ Err.Description & _ " (" & Err.Source & ")" End If On Error GoTo 0 ' From here, work only with VIEW Sql = _ "INSERT INTO YourView (data_col) VALUES ('one');" .Execute Sql Sql = _ "INSERT INTO YourView (data_col) VALUES ('day');" .Execute Sql Sql = _ "INSERT INTO YourView (data_col) VALUES ('when');" .Execute Sql Sql = "SELECT * FROM YourView;" Set rs = .Execute(Sql) MsgBox rs.GetString Set con = Nothing End With End Sub 

Простейшим решением было бы использовать стандартное поле autonumber (длинное целое число). Пусть Access поддерживает эти значения для вас. Затем в любое время, когда вам нужны эти значения в вашем формате «0001A», используйте функцию Format (), чтобы добавить начальные нули и объединить «A».

Это тривиально легко. Если ваше поле autonumber имеет идентификатор ID, вы можете сделать это преобразование с помощью этого запроса:

 SELECT Format(ID, "0000") & "A" AS formatted_ID FROM YourTable; 

Аналогичным образом вы можете применить одно и то же выражение к свойству источника управления текстового поля в форме или отчете.

Одно решение, которое работает только для форм!

  1. создайте функцию GetId (), которая вычисляет ваш счетчик (обычно используя DMax)
  2. Используйте событие Before insert в вашей форме, чтобы установить значение поля с помощью GetId ()

Недостаток: в многопользовательской среде, если другой User2 начинает добавлять запись после User1, но сохраняет ее до того, как User1 сохранит его, будет дубликат проблемы. Вам нужно будет использовать событие FormError для восстановления идентификатора и возобновления процесса сохранения.