Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

VB 6.0 - Autowert in Access

Anwender / 4 Antworten / Baumansicht Nickles

Hallo. Wiederaml ein Access-Problem: Wie kann ich in VB herausfinden, welche Zahl der Autowert in der Access-DB als nächstes generiert? Ich muss nach dem Befehl rs.AddNew wissen, welche ID generiert wird oder eben wurde.

bei Antwort benachrichtigen
Sovereign Sylvia Anwender „VB 6.0 - Autowert in Access“
Optionen

Hi anwender,
ich bezweifle, ob du herausfinden kannst, welcher Autowert als nächstes generiert wird. Wenn du dir aber von der ACCESS-Datenbank ein leeres Recordset holst, es mit ADDNEW füllst und dann wieder abspeicherst, bekommst du den neuen Autowert zurückgeliefert. Das Abspeichern geht etwa so:


'###################################################################################################################

Public Function Save_RS(XMTR As ADODB.Recordset, DBPathNFile As String, Optional ReturnID As Long, Optional PW As String) As Boolean
Dim p_cn As ADODB.Connection
Const pc_FuncName = "Save_RS"
On Error GoTo Errorhandler
Dim p_rs As New ADODB.Recordset, p_RetID As Long
Set p_cn = New ADODB.Connection
With p_cn
.ConnectionString = DB_Connect(DBPathNFile, PW)
.Open
End With
With XMTR
If .RecordCount > 0 Then
If .BOF = True Or .EOF = True Then
.MoveFirst
End If
End If
.ActiveConnection = p_cn
.UpdateBatch
If .RecordCount = 1 Then
If IsNumeric(.Fields(0).Value) = True Then
ReturnID = .Fields(0).Value
End If
End If
Set .ActiveConnection = Nothing
End With
p_cn.Close
Set p_cn = Nothing
Save_RS = True
Exit Function
Errorhandler:
Set p_cn = Nothing
Save_RS = False
Err.Raise Err.Number & vbCrLf & "DESCRIPTION: " & Err.Description & vbCrLf & "Version: " & AppVersion & vbCrLf & mc_modulename & vbCrLf & pc_FuncName
End Function
#####################################################################################################################


Best Grüsze
Sylvia


[Diese Nachricht wurde nachträglich bearbeitet.]

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen
Anwender Sovereign Sylvia „Hi anwender, ich bezweifle, ob du herausfinden kannst, welcher Autowert als...“
Optionen

Hi Sylvia
Danke für deine Antwort. Ich suche jedoch eine Möglichkeit den Autowert herauszufinden bevor ich einen neuen Datensatz anlege.
Woher weiss Access, welchen Wert als nächstes generiert werden muss? Access muss doch intern eine Art Liste führen. Die Frage ist nur, ob man darauf Zugriff bekommt.

Gruss Anwender

bei Antwort benachrichtigen
Sovereign Sylvia Anwender „Hi Sylvia Danke für deine Antwort. Ich suche jedoch eine Möglichkeit den...“
Optionen

Hi anwender,
in der Hilfe für VB6 fand ich unter der Rubrik "Microsoft Jet Database Engine Programmer's Guide" den folgenden kurzen Beitrag (Auszug):
"Auto-Increment Fields
[...] Because the value of the next Counter number is stored in the table-header page of the database file, when adding a record to a table that has a Counter data type (called an AutoNumber data type in Microsoft Access 95 and 97), Microsoft Jet locks that page. This occurs in Microsoft Jet 2.x when inserting a record into a table, but is not a problem when using Microsoft Jet 3.0 and 3.5."

Ich habe keine Ahnung, wo sich die Table Header Page befindet und wie man darauf zugreifen kann. Neben den sichtbaren Tabellen hat ACCESS (2000 in diesem Fall) noch weitere Tabellen, die System-Objecte beinhalten. Man kann aber nicht so einfach per Recordset-Methode darauf zugreifen (ich hab's probiert), und eine andere Methode weisz ich nicht.

Was ich vermute ist, dass der Autonumber-Wert nichts ist als eine fortlaufende Zählung aller neu hinzugefügten Records, unabhängig davon, ob die Records noch existieren oder bereits gelöscht wurden. Der Autonumber-Zähler fängt nämlich nicht wieder bei 1 an, nachdem alle in einer Tabelle vorhandenen Records gelöscht und ein neuer Record hinzugefügt wird.
Somit bietet sich eigentlich eine ziemlich einfache Lösung deines Problems an: Lade alle Records einer Tabelle in ein Recordset, wobei während des Ladens die Sortierung des Autonumber-Feldes absteigend erfolgt. Liesz den Autonumber-Wert des ersten Records im Recordset aus und addiere 1 - das wird dann der nächste Autonumber-Wert sein. Probier's mal aus und lass mich wissen, ob du damit klarkommst.

Grusz Sylvia




[Diese Nachricht wurde nachträglich bearbeitet.]

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen
Anwender Sovereign Sylvia „Hi anwender, in der Hilfe für VB6 fand ich unter der Rubrik Microsoft Jet...“
Optionen

Hi Sylvia

Leider funktioniert das mit "höchster Autowert + 1" nicht immer. Falls der letzte Datensatz gelöscht wurde, müsste es "+ 2" heissten, da Access auch die gelöschten Autowerte berücksichtigt.
Aber das mit der Table Header Page klingt interessant. Vielleicht lassen sich mehr Infos dazu finden. Mal sehen...

Gruss Anwender

bei Antwort benachrichtigen