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
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.
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
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 (http://www.dbwiki.net/wiki/Datei:AccSampleDivideTable.zip)
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
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