Я вижу Вашу проблему..
то, Что произошло, - то, что кто-то перепутал идею архитектуры MVC.
MVC имеет три части.. модели, представления и контроллеры.. Установленная проблема, кажется, объединила два из них ни на каком серьезном основании. представления и контроллеры являются отдельными частями логики.
так... Вы не хотите иметь несколько контроллеров представления..
Вы хотите иметь несколько представлений и контроллер, который выбирает между ними. (у Вас могло также быть несколько контроллеров, если у Вас есть несколько приложений)
, представления не должны принимать решения. Контроллер (контроллеры) должен сделать это. Следовательно разделение задач, и логика и способы сделать Вашу жизнь легче.
Так.. удостоверьтесь, что Ваше представление просто делает это, производит хороший veiw данных. позвольте своему контроллеру решить, что сделать с данными, и которые просматривают для использования.
(и когда мы говорим о данных, мы говорим о модели... хороший стандартный способ быть сохраненными, полученными доступ, измененными.. другая отдельная часть логики, которую мы можем распределить далеко и забыть о)
Если 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
завершит выполнение, тогда вы получите их запись.
В вашем примере, поскольку вы используете 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
.
Это адаптация моего кода для вас. Я был вдохновлен сайтом 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