Значение с автонумерацией последней вставленной строки - Доступ MS / VBA

Я вижу Вашу проблему..

то, Что произошло, - то, что кто-то перепутал идею архитектуры MVC.

MVC имеет три части.. модели, представления и контроллеры.. Установленная проблема, кажется, объединила два из них ни на каком серьезном основании. представления и контроллеры являются отдельными частями логики.

так... Вы не хотите иметь несколько контроллеров представления..

Вы хотите иметь несколько представлений и контроллер, который выбирает между ними. (у Вас могло также быть несколько контроллеров, если у Вас есть несколько приложений)

, представления не должны принимать решения. Контроллер (контроллеры) должен сделать это. Следовательно разделение задач, и логика и способы сделать Вашу жизнь легче.

Так.. удостоверьтесь, что Ваше представление просто делает это, производит хороший veiw данных. позвольте своему контроллеру решить, что сделать с данными, и которые просматривают для использования.

(и когда мы говорим о данных, мы говорим о модели... хороший стандартный способ быть сохраненными, полученными доступ, измененными.. другая отдельная часть логики, которую мы можем распределить далеко и забыть о)

36
задан inetphantom 18 September 2018 в 12:10
поделиться

3 ответа

Если DAO используйте

RS.Move 0, RS.LastModified
lngID = RS!AutoNumberFieldName

Если ADO , используйте

cn.Execute "INSERT INTO TheTable.....", , adCmdText + adExecuteNoRecords
Set rs = cn.Execute("SELECT @@Identity", , adCmdText)
Debug.Print rs.Fields(0).Value

cn , который является допустимым соединением ADO, @@ Identity вернет последний Идентификатор (Autonumber) вставлен в это соединение.

Обратите внимание, что @@ Identity может вызвать проблемы, поскольку последнее сгенерированное значение может быть не тем, которое вас интересует. Для доступа движок базы данных, рассмотрим VIEW , который объединяет две таблицы, обе из которых имеют свойство IDENTITY , и вы INSERT INTO VIEW . Для SQL Server подумайте, есть ли триггеры, которые, в свою очередь, вставляют записи в другую таблицу, которая также имеет свойство IDENTITY .

BTW DMax не будет работать, как если бы кто-то другой вставлял запись сразу после того, как вы ее вставили, но до того, как ваша функция Dmax завершит выполнение, тогда вы получите их запись.

38
ответ дан 27 November 2019 в 05:26
поделиться

В вашем примере, поскольку вы используете CurrentDB для выполнения INSERT, вы усложнили себе задачу. Вместо этого это будет работать:

  Dim query As String
  Dim newRow As Long  ' note change of data type
  Dim db As DAO.Database

  query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");"
  Set db = CurrentDB
  db.Execute(query)
  newRow = db.OpenRecordset("SELECT @@IDENTITY")(0)
  Set db = Nothing

Раньше я делал INSERT, открывая набор записей AddOnly и получая оттуда идентификатор, но здесь это намного эффективнее. Обратите внимание, что для этого не требуется ADO .

48
ответ дан 27 November 2019 в 05:26
поделиться

Это адаптация моего кода для вас. Я был вдохновлен сайтом developpez.com (Найдите на странице: " Pour insérer des données, vaut-il mieux passer par un RecordSet or une Requête de type INSERT? ") . Они объясняют (немного по-французски). Этот способ намного быстрее, чем верхний. В примере этот способ был в 37 раз быстрее. Попробуйте.

Const tableName As String = "InvoiceNumbers"
Const columnIdName As String = "??"
Const columnDateName As String = "date"

Dim rsTable As DAO.recordSet
Dim recordId as long

Set rsTable = CurrentDb.OpenRecordset(tableName)
Call rsTable .AddNew
recordId = CLng(rsTable (columnIdName)) ' Save your Id in a variable
rsTable (columnDateName) = Now()        ' Store your data
rsTable .Update

recordSet.Close

LeCygne

5
ответ дан 27 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: