Hallo zusammen
Wieder einmal ich. Mit diesem Code, angepasst von einem Listing und Beispiel auf www.access-basics.de "kopiere" ich einen Datensatz in der Tabelle tblDossiers inklusive die Einträge, die in einer Zuordnungstabelle stehen und auf eben diesen Datensatz verweisen:
Private Sub BtnFrmDosKOP_Click()
Dim db As DAO.Database
Dim lngDosID As Long
Dim strSQL As String
Set db = CurrentDb
strSQL = "INSERT INTO tblDossiers SELECT DosStatIDRef, DosSalIDRef, DosKunIDRef, DosTypIDRef, DosMitIDRef, DosProBasIDRef, DosAngebotGueltigBis, DosSpezKon, DosOrdnerAngebot, DosERPistSAP, DosAktiv FROM tblDossiers" & _
"WHERE DosID = " & Me!DosID
db.Execute strSQL, dbFailOnError
If db.RecordsAffected = 1 Then
lngDosID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
strSQL = "INSERT INTO tblZuordnDossierArtikel SELECT ZuoDosArtModBasIDRef, ZuoDosArtSoftwIDRef, ZuoDosArtSaaSIDRef, ZuoDosArtDienstlIDRef, ZuoDosArtHardIDRef, ZuoDosArtAnzahl, ZuoDosArtPreisEURnet, ZuoDosArtPreisCHFbrut, " & _
lngDosID & " AS ZuoDosArtDosIDRef " & _
"FROM tblZuordnDossierArtikel WHERE ZuoDosArtDosIDRef = " & Me!DosID
db.Execute strSQL, dbFailOnError
End If
Me.Requery
Me.Recordset.FindFirst "DosID = " & lngDosID
End Sub
Es funktioniert, aber mich nervt, dass ich alle Felder manuell auflisten musste. Wenn ich mal was hinzufüge in der tblDossier oder tblZuordnDossierArtikel muss ich das nachführen im VBA Editor. Und SELECT * FROM geht hier ja nicht, da ja die ID des Datensatzes nicht mitkopieren darf.
Gäbe es eine Möglichkeit, hier eine Verbesserung zu machen?
Freue mich auf eure Feedbacks,
Grüsse
Micharius
Hallo,
ZitatWenn ich mal was hinzufüge in der tblDossier oder tblZuordnDossierArtikel
Die Verbesserung sollte da ansetzen. In einer fertigen Datenbank sollte es nicht notwendig sein Felder ergänzen zu müssen. Es sei denn, man hat etwas vergessen. Aber da müssen dann noch andere Dinge angepasst werden.
Wenn das Ergänzen von Feldern regelmäßig vorkommt, sollte man mal einen Blick auf das Datenmodell werfen.
Hi Klaus
Da hast du natürlich recht, und beim Erfassen der entsprechenden Zeile habe ich mir schon fast gedacht, dass ein entsprechender Kommentar folgen wird ;)
Momentan bin ich noch weit davon entfernt, ein routinierter Access Entwickler zu sein. Kommt dazu, dass bei mir Fortschritt eines solchen Projektleins immer wieder Ideen kommen, was man noch hinzufügen oder verbessern könnte. Da bin ich mir bewusst, sollte eigentlich nicht so sein, aber das ist der Weg des Lernens (bei mir).
Grüsse
Micharius
I.d.R sollte man auf gespeicherte Abfragen zurückgreifen und beim Ausführen ggf. Parameterwerte übertragen.
'==============================================================================
'in einem globalen Modul, statt unnötig immer wieder CurrentDb zu verwenden
Private pThisDb As DAO.Database
Public Property Get ThisDb(Optional forceReinitialization As Boolean) _
As DAO.Database
If pThisDb Is Nothing Or _
forceReinitialization Then
Set pThisDb = CurrentDb()
End If
Set ThisDb = pThisDb
End Property
'==============================================================================
Private Sub BtnFrmDosKOP_Click()
Const APP_QRY1 As String = "NameDerAnfuegeabfrageMitParameter"
Const APP_QRY2 As String = "NameDerAnderenAnfuegeabfrageMitParametern"
Dim lngDosID As Long
'.. und noch eine ordentliche Fehlerbehandlung einbauen
BeginTrans
With ThisDb.QueryDefs(APP_QRY1)
.Parameters("ParameterName") = Me.DosID
'oder auch für den ersten Parameter
'.Parameters(0) = Me.DosID
.Execute dbFailOnError
If .RecordsAffected = 1 Then
lngDosID = this.OpenRecordset("SELECT @@IDENTITY")(0)
Else
Rollback
Exit Sub
End If
End With
With ThisDb.QueryDefs(APP_QRY2)
.Parameters("ParameterName") = Me.DosID
.Parameters("AndererParametername") = lngDosID
.Execute dbFailOnError
End With
CommitTrans
Me.Requery
Me.Recordset.FindFirst BuildCriteria("DosID", dbLong, lngDosID)
End Sub
Hab' Dank, Lachtaube, das sieht wieder einmal sehr vielversprechend aus!
Lieber Gruss
Micharius