Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datensätze von verknüpften Tabellen kopieren

Begonnen von MaxP, September 27, 2019, 15:49:41

⏪ vorheriges - nächstes ⏩

MaxP

Hallo zusammen,

ich habe in einer DB folgende Tabellen

  • LV, Autowert: LV-ID
  • Gewerke, Autowert: Gewerke_ID
  • Titel, Autowert: Titel_ID
  • Pos, Autowert: Pos-ID
Diese sind mit ihrer nachstehenden Tabelle über 1:n verknüpft. Ferner besteht jeweils eine ref. Integrität, Aktualisierungs- u. Löschweitergabe.

Nun möchte ich die Möglichkeit schaffen, ein komplettes LV (Leistungsverzeichnis) 1:1 zu kopieren. Es soll nur nach der neuen Projekt_ID, die nur in der Tabelle LV gespeichert wird, gefragt werden. Alle Tabellen besitzen das Feld LV-ID.

Gibt es in solchen Fällen einen speziellen "Trick", um alle betroffenen DS in einem Rutsch zu kopieren?

Oder muss man jede einzelne Tabelle über Anfüge- u. Aktualisierungsabfrage bearbeiten? (Denn in dem Wust stecke ich gerade.) Schließlich bekommen alle DS einen neuen Autowert, der in die verknüpfte Tabelle übertragen werden muss.

Gruß
Max
Win 10 pro 64 bit, Access 2003

ebs17

Auf einen Rutsch würde bedeuten, die Tabellen würden in einer Abfrage zusammengefasst und diese würde übergeben.

Zitat1:1 zu kopieren
... heißt dagegen, die Einzeltabellen beizubehalten. Tabellen müssen einzeln befüllt werden.
Mit freundlichem Glück Auf!

Eberhard

MaxP

Hallo,

ich habe da ein Beispiel aus dem Netz (v. A. Minhorst) ausgegraben und versucht, dieses auf meine o.g. Tabellen anzuwenden:

Dim db As DAO.Database
Dim LVID As Integer
Dim strSQL As String
Dim varBVNR As Long

Set db = CurrentDb

varBVNR = InputBox("Neue BV-Nr eingeben.")

strSQL = "INSERT INTO LV ([BV-Nr], [LV-Bez], [LV-Bez-Zusatz]) SELECT " & varBVNR & ", [LV-Bez], [LV-Bez-Zusatz] FROM LV WHERE [LV-ID] = " & Me![LV_Wahl]
db.Execute strSQL, dbFailOnError
LVID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)

strSQL = "INSERT INTO tbl_Gewerke ([Gewerk_KatID], [LV-ID], [Gewerk_Sort]) SELECT [Gewerk_KatID], " & LVID & ", [Gewerk_Sort] FROM tbl_Gewerke WHERE [LV-ID] = " & Me![LV_Wahl]
db.Execute strSQL, dbFailOnError
GwID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)

strSQL = "INSERT INTO tbl_Titel ([Titel_Bez], [Gewerk_ID], [LV-ID], [Titel_Sort]) SELECT [Titel_Bez], " & GwID & ", [LV-ID], [Titel_Sort] FROM tbl_Titel WHERE [LV-ID] = " & Me![LV_Wahl]
db.Execute strSQL, dbFailOnError
TiID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)

strSQL = "INSERT INTO tbl_Pos ([LV-ID], [Gewerk_ID], [Titel_ID], Menge, Einheit, Pos-Text) SELECT [LV-ID], [Gewerk_ID], " & TiID & ", Menge, Einheit, Pos-Text FROM tbl_Pos WHERE [LV-ID] = " & Me![LV_Wahl]
db.Execute strSQL, dbFailOnError


Die ersten 3 SQLs habe ich getestet. Dabei ist mir folgendes aufgefallen:
- Der Tab. LV wurde 1 DS hinzugefügt (ist okay)
- Der Tab. Gewerke wurden 3 von 3 DS hinzugefügt (ist okay)
- Der Tab. Titel wurden 8 von 8 DS hinzugefügt. Allerdings alle unter derselben (ersten) Gewerk_ID statt unter 3 verschiedenen.

Den 4. SQL-Code habe ich noch nicht getestet und nur der Vollständigkeit wegen dazugeschrieben.
Die Tab. Pos besitzt ins. 23 DS unter 8 Titel

Was muss ich ändern, damit beim Duplizieren der Titel und vermutlich bei den Positionen die entsprechenden Fremdschlüssel richtig eingefügt werden?

Gruß
Max
Win 10 pro 64 bit, Access 2003

ebs17

Ach, Du möchtest in gleiche Tabellen kopieren, wobei sich neue Schlüssel ergeben?

Ich würde nach Möglichkeit nicht Einzeldatensätze erzeugen, sondern je Tabelle genau eine Anfügeabfrage anwenden wollen. Prinzip: Importtabelle in m:n-Beziehung auflösen
Mit freundlichem Glück Auf!

Eberhard

MaxP

Hallo,

sorry, ich habe mir das Beispiel angeschaut, aber komme damit nicht zurecht. (Bin kein VBA-Profi)

Ich mache doch für alle 4 Tabellen jeweils eine Anfügeabfrage. Die erzeugen sicherlich jeweils Einzeldatensätze, die jedoch über die Schlüssel verknüpft sind.

Ich wähne mich kurz vorm Ziel, habe aber noch den o.g. Fehler im Code.

Gruß
Max
Win 10 pro 64 bit, Access 2003

MaxP

Hallo,
nun habe ich mir einen funktionierenden Code gebastelt, der die 4 verknüpften Tabellen berücksichtigt:


Private Sub Befehl7_Click()
Dim db As DAO.Database
Dim LVID As Integer
Dim strsql As String
Dim varBVNR As Long
Dim DLGW, DLTI As Integer
Dim GWID_alt, GwID, TiID, TiID_alt As Integer
Dim i, j As Byte

Set db = CurrentDb
varBVNR = Me!BVNR

strsql = "INSERT INTO LV ([BV-Nr], [LV-Bez], [LV-Bez-Zusatz]) SELECT " & varBVNR & ", [LV-Bez], [LV-Bez-Zusatz] FROM LV WHERE [LV-ID] = " & Forms!frm_LvArchiv!LV_Wahl
db.Execute strsql, dbFailOnError
LVID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)

DLGW = DCount("*", "tbl_Gewerke", "[LV-ID] = " & Forms!frm_LvArchiv!LV_Wahl)
For i = 1 To DLGW

strsql = "INSERT INTO tbl_Gewerke ([Gewerk_KatID], [LV-ID], [Gewerk_Sort]) SELECT [Gewerk_KatID], " & LVID & ", [Gewerk_Sort] FROM tbl_Gewerke WHERE [LV-ID] = " & Forms!frm_LvArchiv!LV_Wahl & " and Gewerk_Sort = " & i
db.Execute strsql, dbFailOnError

GwID = DLookup("Gewerk_ID", "tbl_Gewerke", "[LV-ID] = " & LVID & " and Gewerk_Sort = " & i)
GWID_alt = DLookup("Gewerk_ID", "tbl_Gewerke", "[LV-ID] = " & Forms!frm_LvArchiv!LV_Wahl & " and Gewerk_Sort = " & i)

DLTI = DCount("*", "tbl_Titel", "[Gewerk_ID] = " & GWID_alt)
For j = 1 To DLTI

strsql = "INSERT INTO tbl_Titel ([Titel_Bez], [Gewerk_ID], [LV-ID], [Titel_Sort]) SELECT [Titel_Bez], " & GwID & ", " & LVID & ", [Titel_Sort] FROM tbl_Titel WHERE [Gewerk_ID] = " & GWID_alt & " And Titel_Sort = " & j
db.Execute strsql, dbFailOnError

TiID = DLookup("Titel_ID", "tbl_Titel", "[Gewerk_ID] = " & GwID & " and Titel_Sort = " & j)
TiID_alt = DLookup("Titel_ID", "tbl_Titel", "[Gewerk_ID] = " & GWID_alt & " and Titel_Sort = " & j)

strsql = "INSERT INTO tbl_Pos ([LV-ID], [Gewerk_ID], [Titel_ID], [Menge], [Einheit], Pos_Kurztxt, [Pos-Text], Nur_EP, Pos_Sort, Pos_Nachtrag, Erstellt) SELECT " & LVID & ", " & GwID & ", " & TiID & ", [Menge], [Einheit], Pos_Kurztxt, [Pos-Text], Nur_EP, Pos_Sort, Pos_Nachtrag, Erstellt FROM tbl_Pos WHERE [Titel_ID] = " & TiID_alt
db.Execute strsql, dbFailOnError
Next
Next
Set db = Nothing
DoCmd.Close acForm, "frm_LV_dupl"
MsgBox "LV (ID " & Forms!frm_LvArchiv!LV_Wahl & " nach " & LVID & ") dupliziert!"
End Sub


Vielleicht bekommt man es auch einfacher hin, aber der Code tut letztendlich, was er soll.

Gruß
Max
Win 10 pro 64 bit, Access 2003