Консультация № 79028
20.03.2007, 08:29
0.00 руб.
0 2 2
Здраствуйте! Как можно выбрать последний id из таблицы в MS Acces 2000 и, увеличив его на 1, вставить в поле формы, а затем, заполнив форму различными данными, вставить в таблицу как новую строку с этим ID (увеличенным на 1, т.е. следующим).

Обсуждение

Неизвестный
20.03.2007, 12:11
общий
это ответ
Здравствуйте, Попов Николай!
Я не пишу программы в Access - базу использую только для хранения данных, а пользовательская программа написана на VB, поэтому не могу подсказать, в какую процедуру встроить обработчик ( наверное Form_Activate ), но по принципу получения последнего ID и обработки в программе на VB напишу.
Как я понял, ID - ключевое уникальное поле имеет тип длинное целое ( LONG ).
Пример для DAO :
Public dbf As Database
Public r_2 As Recordset
Public nomer As Long
Set dbf = CurrentDB ( )
‘если запуск не из модуля текущей базы, то поставить путь к базе, например
‘ Set dbf = wrk.OpenDatabase( "c:\Maslo\Maslo.mdb", False )
Set r_2 = dbf.OpenRecordset( "select max ( ID ) as nom from BASE" , dbOpenDynaset )
If r_2.RecordCount > 0 Then
If IsNull ( r_2!nom ) Then
nomer = 1
Else
If IsEmpty( r_2!nom ) Then
nomer = 1
Else
nomer = r_2!nom + 1
End If
End If
Else
nomer = 1
End If
Form.Text1 = nomer
‘на форме поле номера не редактируется - свойство Enabled = False
Form.Text2 = ""
‘какое-то текстовое значение
Form.Show vbmodal
dbf.execute "insert into BASE ( ID , Pole1 ) values ( " & nomer & ",‘" & Form.Text2 & "‘ ) "

Для ADO немного по другому :
Dim dbf As ADODB.Connection
Dim r_2 As ADODB.Recordset
Dim nomer As Long
Set dbf = CurrentProject.Connection
‘если запуск не из модуля текущей базы, то поставить путь к базе, например
‘ dbf.Open "Persist Security Info=False;DSN=База данных MS Access ;DBQ=Pr.mdb ;DefaultDir= ;DriverId=25 ;FIL=MS Access ;MaxBufferSize=2048 ;PageTimeout=300 ;UID=admin;"

nomer = 1
r_2.Open "select max ( ID ) as nom from BASE" , dbf
If NOT ( r_2.EOF or r_2.BOF ) Then
If NOT IsNull ( r_2!nom ) Then
If NOT IsEmpty( r_2!nom ) Then
nomer = r_2!nom + 1
End If
End If
End If
r_2.Close
Form.Text1 = nomer
Form.Text2 = ""
Form.Show vbmodal
dbf.execute "insert into BASE ( ID , Pole1 ) values ( " & nomer & ",‘" & Form.Text2 & "‘ ) "
dbf.Close

Если есть вопросы, пишите jones@hte.vl.net.ua
С уважением.
Неизвестный
20.03.2007, 23:13
общий
это ответ
Здравствуйте, Попов Николай!
Подобные вещи делать совсем даже и не рекомендуется.
представьте, что с базой работают двое.
последний ID = 15
первый прочитал его и заполняет потихоньку форму,
подошем второй юзер, и тоже прочитал id = 15
ну и при сохранении данных получится каша.

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

вот и все

с уважением, Игорь
Форма ответа