PDA

Vollständige Version anzeigen : Anfügen an Fremdtabelle A97


Ohnesorg
21.06.2001, 14:22
Hallo,

Hier gleich die Fakten, weil ich tierisch im Stress bin:

1) Datenbank mit zwei Tabellen.
2) Eine Tabelle soll quasi kopiert werden in die zweite.
3) Ich darf keine Anfüge- oder Tabellenerstellungsabfrage verwenden, kopieren und einfügen fällt ebenfalls flach.

Kann ich mittels VBA-Code eine Tabelle in eine andere Tabelle kopieren, wenn die Datenfelder beider Tabellen genauestens gleich sind, in dem ich eine For Each Next Anweisung einsetze?

Wäre ganz praktisch, denn es handelt sich um 122 Datenfelder und die alle per Hand einzutippen... Nein Danke.

Da ich mit For Each noch nie gearbeitet habe, die Online Hilfe von Access auch nicht allzuviel hergibt üder dieses Thema wäre es ganz gut, wenn ich Hilfe hier im Forum erhalten könnte.

In der Originaltabelle habe ich irgendwo einen "Bock". Dieser seltsame Fehler läßt keine Erstellungs- Anfügeabfragen und Kopieraktionen zu. Deshalb möchte ich wenigstens einen Großteil der Daten auf diese Art retten.

Ich danke Euch schon im Voraus für die Hilfe bei der netten For-Eac-Next...
ach ja.. und Gruß natürlich auch!! :D

Kurt aus Kienitz
21.06.2001, 14:46
Hallo,

Ist nur so eine Idee, aber versuch doch mal

DoCmd.RunSQL "INSERT INTO Tabelle1 (SELECT * FROM Tabelle2);"

oder so ähnlich, ich glaube daß ist sogar Standard-SQL.

Morli
21.06.2001, 15:10
Hi Ohnesorg,

probiers mal mit dem folgenden Code:

Function KopierenTabelle()
Dim rstQuelle, rstZiel As Recordset
Dim db As Database
Dim fld As Field
Dim i As Long

Set db = CurrentDb

Set rstQuelle = db.OpenRecordset("tabelle3")

Set rstZiel = db.OpenRecordset("tabelle4")

Do Until rstQuelle.EOF
rstZiel.AddNew
For i = 0 To rstQuelle.Fields.Count - 1
rstZiel.Fields(rstQuelle.Fields(i).Name) = rstQuelle.Fields(i)
Next
rstZiel.Update
rstQuelle.MoveNext

Loop

rstQuelle.Close
rstZiel.Close
db.Close

Set rstQuelle = Nothing
Set rstZiel = Nothing
Set db = Nothing

End Function

Funktioniert aber nur dann einwandfrei, wenn die Feldnamen wirklich übereinstimmen.

Gruß

Rainer ;)

Ohnesorg
21.06.2001, 15:41
Hallo,

ersteinmal... Danke, Kurt und Danke, Morli!

Manchmal sind die einfachsten Lösungen diejenigen, auf die man nicht kommt.
Der SQL-String, Kurt wird - glaube ich nicht funktionieren. Immer wenn ich versuche über eine Funktion ganze Datenmasse zu 'schaufeln', bekomme ich die Fehlermeldung, dass angeblich ein User bereits diesen Datensatz bearbeitet und damit sperrt.

Ich werde es aber dennoch probieren, denn vom Glauben hat noch niemand Wissen erlangt! :D

Ich danke Euch jedenfalls, bin aber dennoch für alle möglichen Lösungsvorschläge dankbar, denn ich drehe hier langsam aber sicher am Rad! ;(

Ohnesorg
21.06.2001, 15:59
Hallo, ein letztes Mal... ;o)

Alsoooo ich denke mal es ist das mindeste, was ich tun kann...
Der SourceCode von Morli rennt wie eine Eins!
Also... Danke noch mal!

Ich denke mal, dass ich mir den Code gut aufheben werde... :D

Kurt aus Kienitz
22.06.2001, 07:59
Hallo,

Freut mich, daß es so gut funktioniert (habe mit den Code von Morli auch gleich gesichert ;) ).

Eine Kleinigkeit hätte ich da aber noch.
Wenn in den Tabellen ein AutoWert als Primärschlüssel enthalten ist, bekomme ich bei der zweiten Ausführung eine Fehlermeldung (Schlüsselverletzung).

Kann man beim Kopieren die AutoWert-Felder irgendwie erkennen und aussparen ?

Morli
22.06.2001, 08:40
Hallo Kurt,

ja, daß geht auch:

For i = 0 To rstQuelle.Fields.Count - 1
If rstQuelle.Fields(i).Attributes <> dbAutoIncrField Then
rstZiel.Fields(rstQuelle.Fields(i).Name) = rstQuelle.Fields(i)
End If
Next

Gruß

Rainer :)

Kurt aus Kienitz
22.06.2001, 08:55
Hallo Rainer,

Daß klappt leider nicht.

Meine Funktion sieht so aus:

Function KopierenTabelle(SrcTable As String, TarTable As String)

Dim rstQuelle, rstZiel As Recordset
Dim db As Database
Dim fld As Field
Dim i As Long

Set db = CurrentDb

' Recordset für die Source-Tabelle öffnen
Set rstQuelle = db.OpenRecordset(SrcTable)
' Recordset für die Target-Tabelle öffnen
Set rstZiel = db.OpenRecordset(TarTable)

' Schleife über alle Zeilen der Source-Tabelle
Do Until rstQuelle.EOF
' neue Zeile in der Target-Tabelle anlegen (leere Zeile)
rstZiel.AddNew
' Schleife über alle alle Spalten der Source-Tabelle
For i = 0 To rstQuelle.Fields.Count - 1
' Daten aus Source-Tabelle in Ziel-Tabelle übertragen
If rstQuelle.Fields(i).Attributes <> dbAutoIncrField Then
rstZiel.Fields(rstQuelle.Fields(i).Name) = rstQuelle.Fields(i)
End If
Next
' Aktualisieren der Target-Tabelle
rstZiel.Update
' zum nächsten Datensatz der Source-Tabelle gehen
rstQuelle.MoveNext
Loop

' schön alles zu machen
rstQuelle.Close
rstZiel.Close
db.Close

' schön den Speicherbereich wieder freigeben.
Set rstQuelle = Nothing
Set rstZiel = Nothing
Set db = Nothing

End Function

Ich bekomme beim zweiten Aufruf den Laufzeitfehler 3022 in der Zeile rstZiel.Update.

Beim Debug habe ich festgestellt, daß die Prüfung auf dbAutoIncrField auch für das AutoWert-Feld negativ ausfällt.

Woran kann daß liegen ?

Ohnesorg
22.06.2001, 10:21
Hi Ihr Zwei! :)

das Thema sorgt ja für richtig Diskussionsstoff... freut mich! :D

In der Zieltabelle bin ich hergegangen und habe den Autowert durch einen Long Integer Zahlenwert ersetzt.
Nach dem kopiervorgang kann man ja hergehen und per Script das Feld löschen und mit einem Autowert neu erstellen.

Sollen allerdings auch die AutoWerte übernommen werden, sollte man das Löschen sein und den einfachen Zahlwert stehen lassen.

Ein Lösungsansatz von mir? Zu einem Problem von mir? Ich werde Alt! :D