Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Verbesserung Code "Dossier kopieren"

Begonnen von Micharius, Oktober 25, 2018, 11:26:28

⏪ vorheriges - nächstes ⏩

Micharius

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

MzKlMu

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.
Gruß Klaus

Micharius

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

Lachtaube

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
Grüße von der (⌒▽⌒)

Micharius

Hab' Dank, Lachtaube, das sieht wieder einmal sehr vielversprechend aus!
Lieber Gruss
Micharius