Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!
ZitatDa gibt es vermutlich eine Fehlermeldung.
MName = "AutoEingabe_" & MatBez
' Set rs = cDB.OpenRecordset("SELECT Materialnummer, Bezeichnung FROM tbl_Material")
' rs.AddNew
' rs!Materialnummer = MatNr
' rs!Bezeichnung = MName
' rs.Update
'
' rs.Close
cDB.Execute "INSERT INTO tbl_Material (Materialnummer, Bezeichnung) " _
& "VALUES('" & MatNr _
& "', '" & MName & "')", dbFailOnError
ID = Nz(DLookup("Artikel_ID", "tbl_Material", "Materialnummer = '" & MatNr _
& "' AND Bezeichnung = '" & MName & "'"), 0)Zitat von: Doming am August 03, 2026, 12:36:26Ursprünglich habe ich es mit dem (jetzt auskommentierten) SQL-Ausdruck versucht, dann mit rs.Addnew, aber beide Male verweigert mir die Tabelle einen Neueintrag.Was genau bedeutet "verweigert mir die Tabelle einen Neueintrag"?
Private Function LadeMaterialDikt() As Scripting.Dictionary
On Error GoTo Fehler
Dim rs As DAO.Recordset
Dim dict As Object
Dim MNr As String
Dim ID As Long
Set dict = CreateObject("Scripting.Dictionary")
Set rs = CurrentDb.OpenRecordset("SELECT Artikel_ID, MaterialNummer FROM tbl_Material", dbOpenSnapshot)
Do Until rs.EOF
MNr = rs!Materialnummer
ID = rs!Artikel_ID
If Not dict.Exists(MNr) Then dict.Add MNr, ID
rs.MoveNext
Loop
Set LadeMaterialDikt = dict
Ende:
On Error Resume Next
rs.Close
Set rs = Nothing
Set dict = Nothing
End FunctionPublic Sub Zeich2Mat1()
Dim MatDikt As Scripting.Dictionary
Dim cDB As DAO.Database
Dim rs As DAO.Recordset
Dim MNr As String
Dim b As Long
Dim MatID As Long
Set MatDikt = LadeMaterialDikt()
Set cDB = CurrentDb
Set rs = cDB.OpenRecordset("SELECT FS_MatID, MatNR " _
& "FROM tbl_Zeichnung_LCL " _
& "WHERE MatNr <> '0'", dbOpenDynaset, dbOptimistic)
DBEngine.BeginTrans
Do Until rs.EOF
MNr = Nz(rs!MatNr, "0")
If MNr <> "0" Then
b = b + 1
rs.Edit
If MatDikt.Exists(MNr) Then
rs!FS_MatID = MatDikt(MNr)
Else
MatID = NeuMaterial(MNr, rs!Dateiname)
MatDikt.Add MNr, MatID
End If
rs.Update
End If
If b > 1 And b Mod 1000 = 0 Then 'Unterbrechnung der Schleife weil sonst Speicher voll
DBEngine.CommitTrans
DBEngine.BeginTrans
DBEngine.Idle dbRefreshCache
End If
rs.MoveNext
Loop
DBEngine.CommitTrans
Ende:
On Error Resume Next
rs.Close
Set rs = Nothing
Set MatDikt = Nothing
Debug.Print Now, "Zeich2Mat abgeschlossen"
End SubPublic Function NeuMaterial(MatNr As String, MatBez As String) As Long
On Error GoTo Fehler
Dim cDB As DAO.Database
Dim rs As DAO.Recordset
Dim MName As String
Dim ID As Long
Set cDB = CurrentDb
MName = "AutoEingabe_" & MatBez
Set rs = cDB.OpenRecordset("SELECT Materialnummer, Bezeichnung FROM tbl_Material")
rs.AddNew
rs!Materialnummer = MatNr
rs!Bezeichnung = MName
rs.Update
rs.Close
' cDB.Execute "INSERT INTO tbl_Material (Materialnummer, Bezeichnung) " _
' & "VALUES('" & MatNr _
' & "', '" & MName & "')", dbFailOnError
ID = Nz(DLookup("Artikel_ID", "tbl_Material", "Materialnummer = '" & MatNr _
& "' AND Bezeichnung = '" & MName & "'"), 0)
If ID > 0 Then
Debug.Print Now, "Neumaterial " & MatNr, ID
cDB.Execute "UPDATE tbl_Material SET RefID = " & ID & " WHERE Artikel_ID = " & ID
cDB.Execute "INSERT INTO tbl_Index(FS_Mat, IX) VALUES (" & ID & ", 0)"
NeuMaterial = ID
DoEvents
Else
MsgBox "Keine ID gefunden"
End If
Ende:
rs.Close
Set rs = Nothing
cDB.Close
Set cDB = Nothing
end function Ursprünglich habe ich es mit dem (jetzt auskommentierten) SQL-Ausdruck versucht, dann mit rs.Addnew, aber beide Male verweigert mir die Tabelle einen Neueintrag.
Zitat von: Knobbi38 am Juli 30, 2026, 19:20:25Wo genau ist also dein Problem oder ist das eine Auftragsarbeit? Und du verwendest immer noch ACC2K3 im MDB Format?Nein, dass ist keine Auftragsarbeit, sondern meine eigene DB, die ich vor 18 Jahren ohne viel Kenntnisse begonnen habe. Und ja, ich arbeite immer noch mit ACC03 im MDB-Format.