Discussion:
INSERT in Mehrere Tabellen gleichzeitig mit INNER JOIN?
(zu alt für eine Antwort)
Revo909
2006-03-15 12:41:40 UTC
Permalink
Hallo Liebe Mitglieder,

ich habe eine Frage zum INSERT Statement und will die erstmal an einem
UPDATE Statement verdeutlichen:

strSQL = "UPDATE T_Anfrage INNER JOIN T_Person ON T_Anfrage.Pers_ID =
T_Person.ID_Pers" _
& " SET T_Person.PersName = '" & nameSupport & "'," _
& " T_Person.PersVorname = '" & vornameSupport & "'," _
& " T_Person.PersTel = " & telSupport & "," _
& " T_Person.PersEmail = '" & emailSupport & "'," _
& " T_Anfrage.solved = " & solvedSupport * -1 & "," _
& " T_Anfrage.Beschr_kurz = '" & summeSupport & "'," _
& " T_Anfrage.beschr_lang = '" & beschrSupport & "'" _
& " WHERE T_Anfrage.ID = " & idSupport & ";"


Mit diesem Statement aktualiesiere ich zwei Tabellen Gleichzeitig, die
über den Primary Key der Tabelle T_Person verknüpft sind. Die Werte
werden aus Textfeldern eines Formulars übernommen.
Jetzt meine Frage zu INSERT, geht sowas ähnliches auch mit einem neuen
Datensatz?
Ich Fülle die Tabellen nämlich jeweils mit einem einzelnen INSERT
für jede Tabelle, finde ich irgendwie nicht die beste Lösung. Wäre
für Hilfe und oder Anregungen sehr dankbar.

Viele Grüße

Wazlav
Henry Habermacher [MVP Access]
2006-03-15 12:50:46 UTC
Permalink
Hallo Revo909

Bitte verwende hier den Realnamen
Post by Revo909
Jetzt meine Frage zu INSERT, geht sowas ähnliches auch mit einem neuen
Datensatz?
Ich Fülle die Tabellen nämlich jeweils mit einem einzelnen INSERT
für jede Tabelle, finde ich irgendwie nicht die beste Lösung. Wäre
für Hilfe und oder Anregungen sehr dankbar.
Das geht schon, wenn Du die Beziehungen richtig definiert hast und die
Schlüsselfelder beider Tabellen (Sowohl Primary, als auch Foreign Key
Schlüsselfelder) in der Abfrage mit drin hast.
Am einfachsten geht es, wenn Du Dir zuerst eine Abfrage im Query Editor
aufbaust. Einfach zuerst mal zwei Tabellen da rein nehmen und alle
Schlüsselfelder, sowie Felder, welche nicht NULL sein dürfen oder
sonstwelche Regeln befolgt werden müssen aus beiden Tabellen drin aufnimmst.
Mach zuerst einfach eine Select Abfrage draus. In dieser siehst Du dann, ob
diese Aktualisierbar, rsp. ob es möglich ist, in diese Abfrage auch
Datensätze hinzuzufügen. Dannach änderst Du diese in eine Insert Abfrage um,
indem Du einfach ISERT INTO ..... Values(...) statt SELECT .... schreibst.

Details zu aktualisierbaren Abfragen findest Du auch in der OH und in der
KB. Wann eine Abfrage aktualisierbar ist hängt übrigens nicht zuletzt von
der scheinbar ziemlich geheimen Jet und Access Version ab.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Wazlav
2006-03-15 15:02:36 UTC
Permalink
Hallo Henry,

Den Nickname Habe ich geändert. Habe deinen Ratschlag befolgt und in
der Antwurfsansicht eine Beispiel INSERT Abfrage zusammengeklickt, dann
SQL Ansicht und die anhand des Beispiels eine SQL INSERT Abfrage
geschrieben, allerdings bekomme ich die Meldung " Syntax Fehler in
INSERT INTO Anweisung", habe schon eltliche Versuche den Fehler zu
finden hinter mir, aber irgendwie komme ich nicht drauf. Vielleicht
kannst du mir da helfen.

strSQL = "INSERT INTO T_Person, T_Anfrage" _
& "(T_Person.PersName, T_Person.PersVorname," _
& " T_Person.PersTel, T_Person.PersEmail,
T_Anfrage.Pers_ID," _
& " T_Anfrage.Datum, T_Anfrage.Beschr_kurz,
T_Anfrage.Beschr_lang," _
& " T_Anfrage.Kategorie_KZ, T_Anfrage.solved)" _
& " SELECT " _
& " '" & Me.nachname.Value & "','" & Me.Vorname.Value &
"','" _
& Me.Telefon.Value & "','" & Me.epost.Value & "'," _
& " T_Person.ID_Pers,'" & Me.Datum.Value & "','" &
Me.beschr_kurz.Value & "','" _
& Me.beschr_lang.Value & "'," & varX & "," & check _
& " FROM T_Anfrage INNER JOIN T_Person ON T_Anfrage.Pers_ID
= T_Person.ID_Pers;"

Vielen Dank, Wazlav
Henry Habermacher [MVP Access]
2006-03-15 15:33:41 UTC
Permalink
Hallo Wazlav
Post by Wazlav
Den Nickname Habe ich geändert.
Aber noch nicht vollständig
Post by Wazlav
Habe deinen Ratschlag befolgt und in
der Antwurfsansicht eine Beispiel INSERT Abfrage zusammengeklickt,
dann SQL Ansicht und die anhand des Beispiels eine SQL INSERT Abfrage
geschrieben, allerdings bekomme ich die Meldung " Syntax Fehler in
INSERT INTO Anweisung", habe schon eltliche Versuche den Fehler zu
finden hinter mir, aber irgendwie komme ich nicht drauf. Vielleicht
kannst du mir da helfen.
Da hast Du aber nicht sehr sorgfältig gearbeitet. Ein bisschen gewurstelt,
würde ich mal behaupten.
Da fehlen Konkatenationszeichen, zudem
Strings müssen in ' ' gepackt werden
Post by Wazlav
"','" _
& Me.Telefon.Value & "','" & Me.epost.Value & "'," _
& " T_Person.ID_Pers,'" & Me.Datum.Value & "','" &
----------------------------------^ ID_Pers & ",'" &
------------------------------------------------------^ Datum!
Post by Wazlav
Me.beschr_kurz.Value & "','" _
& Me.beschr_lang.Value & "'," & varX & "," & check _
& " FROM T_Anfrage INNER JOIN T_Person ON
T_Anfrage.Pers_ID = T_Person.ID_Pers;"
Musst halt Dein SQL Statement schon sauber aufbauen, sonst geht das nicht.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Wazlav
2006-03-16 14:09:33 UTC
Permalink
Hallo Henry,

Also die Strings habe ich alle in ' ' gepackt, die Tabellenfelder sind
alle Textfelder ausser das Datum = Datum und Ketegorie_KZ = Zahl,
solved = Zahl. Das Formular Feld Datum habe ich schon so formatiert,
dass mur ein Datum eigegeben werden kann. Also wenn ich in die Tabellen
einzeln, nacheinander die Datensätze schreibe, dann geht das. Liegt
das Problem vielleicht bei dem verknüpften Feld
"T_Person.ID_Pers"(Auto Wert) der Wert existiert ja nicht, solange der
Datensatz nicht vollständig angelegt wurde, deswegen habe ich im
Statement dieTab. T_Person ja auch als erste eingegeben und dann die
Tab. T_Anfrage. Wenn ich zwei Statemenst nacheinander absetze dann geht
es. Wie gesagt, die Felder in den beiden einzelnen Insert Statements
habe ich identisch angegeben und da klappt es. Ist Mein Vorhaben
vielleicht nicht durchführbar?

So sieht der String aus:

strSQL = "INSERT INTO T_Person, T_Anfrage" _
& "(T_Person.PersName, T_Person.PersVorname," _
& " T_Person.PersTel, T_Person.PersEmail," _
& "T_Anfrage.Pers_ID," _
& " T_Anfrage.Datum, T_Anfrage.Beschr_kurz," _
& "T_Anfrage.Beschr_lang," _
& " T_Anfrage.Kategorie_KZ, T_Anfrage.solved)" _
& " SELECT " _
& "'" & Me.nachname.Value & "','" _
& " Me.Vorname.Value & "','" _
& Me.Telefon.Value & "','" _
& Me.epost.Value & "'," _
& " T_Person.ID_Pers,'" _
& Me.Datum.Value & "','"
& "Me.beschr_kurz.Value & "','" _
& Me.beschr_lang.Value & "'," _
& varX & "," _
& check _
& " FROM T_Person INNER JOIN T_Anfrage" _
& " ON T_Person.ID_Pers = T_Anfrage.Pers_ID;"

So sieht das Ergebnis in der Abfrage aus:


INSERT INTO T_Person, T_Anfrage(T_Person.PersName,
T_Person.PersVorname, T_Person.PersTel, T_Person.PersEmail,
T_Anfrage.Pers_ID, T_Anfrage.Datum, T_Anfrage.Beschr_kurz,
T_Anfrage.Beschr_lang, T_Anfrage.Kategorie_KZ, T_Anfrage.solved) SELECT
'Gizycki','Wazlav','27164566','***@goldmail.de',
T_Person.ID_Pers,'16.03.06','Versuch eines Insert Statements','Ein
INSERT über zwei Tabellen, die Datensätze sind über ein Feld
Verkmüpft.',1,1 FROM T_Person INNER JOIN T_Anfrage ON T_Person.ID_Pers
= T_Anfrage.Pers_ID;


Das sieht für mich eigentlich alles richtig aus, oder? Danke für die
Hilfe!

Gruß, Wazlav
Henry Habermacher [MVP Access]
2006-03-16 14:18:25 UTC
Permalink
Hallo Wazlav
Post by Wazlav
Also die Strings habe ich alle in ' ' gepackt, die Tabellenfelder sind
alle Textfelder ausser das Datum = Datum und Ketegorie_KZ = Zahl,
solved = Zahl. Das Formular Feld Datum habe ich schon so formatiert,
Das Format auf dem Formular ist irrelevant. Du musst es im im SQL Statement
richtig formatieren.
Post by Wazlav
dass mur ein Datum eigegeben werden kann. Also wenn ich in die
Tabellen einzeln, nacheinander die Datensätze schreibe, dann geht
das. Liegt das Problem vielleicht bei dem verknüpften Feld
"T_Person.ID_Pers"(Auto Wert) der Wert existiert ja nicht, solange der
Datensatz nicht vollständig angelegt wurde, deswegen habe ich im
Darum muss auch die Foreign Key Spalte der gelinkten Tabelle drin sein.
Abfüllen sollst Du aber beide nicht.
Post by Wazlav
Statement dieTab. T_Person ja auch als erste eingegeben und dann die
Tab. T_Anfrage. Wenn ich zwei Statemenst nacheinander absetze dann
geht es. Wie gesagt, die Felder in den beiden einzelnen Insert
Statements habe ich identisch angegeben und da klappt es. Ist Mein
Vorhaben vielleicht nicht durchführbar?
Klappt es denn im Query Editor mit dem Einfügen, wenn Du untiges SQL
Statement auführst? Du kannst ja einfach mal einen Stop nach der Zuweisung
zum SQL Statement machen, dann im Direktfenster

? strSQL
eintippen und das Ergebnis mittels Copy/Paste in eine neue leere Query in
der SQL Ansicht einfügen. Dann findest Du schnell heraus, wo was nicht
richtig ist.
Post by Wazlav
strSQL = "INSERT INTO T_Person, T_Anfrage" _
& "(T_Person.PersName, T_Person.PersVorname," _
& " T_Person.PersTel, T_Person.PersEmail," _
& "T_Anfrage.Pers_ID," _
& " T_Anfrage.Datum, T_Anfrage.Beschr_kurz," _
& "T_Anfrage.Beschr_lang," _
& " T_Anfrage.Kategorie_KZ, T_Anfrage.solved)" _
& " SELECT " _
& "'" & Me.nachname.Value & "','" _
& " Me.Vorname.Value & "','" _
& Me.Telefon.Value & "','" _
& Me.epost.Value & "'," _
& " T_Person.ID_Pers,'" _
& Me.Datum.Value & "','"
& "Me.beschr_kurz.Value & "','" _
& Me.beschr_lang.Value & "'," _
& varX & "," _
& check _
& " FROM T_Person INNER JOIN T_Anfrage" _
& " ON T_Person.ID_Pers = T_Anfrage.Pers_ID;"
INSERT INTO T_Person, T_Anfrage(T_Person.PersName,
T_Person.PersVorname, T_Person.PersTel, T_Person.PersEmail,
T_Anfrage.Pers_ID, T_Anfrage.Datum, T_Anfrage.Beschr_kurz,
T_Anfrage.Beschr_lang, T_Anfrage.Kategorie_KZ, T_Anfrage.solved)
T_Person.ID_Pers,'16.03.06','Versuch eines Insert Statements','Ein
INSERT über zwei Tabellen, die Datensätze sind über ein Feld
Verkmüpft.',1,1 FROM T_Person INNER JOIN T_Anfrage ON T_Person.ID_Pers
= T_Anfrage.Pers_ID;
Nein, der ist definitiv falsch! Das Datum habe ich Dir doch geschrieben,
dass das in der DAtums Konvention geschickt werden muss, also hier:

, #03/16/2006#,

Da gehören einfach keine ' hin und zuerst kommt entweder der Monat, dann der
Tag und das Jahr, oder zuerst das Jahr, dann der Monat und dann der Tag.
Sonst geht es nicht.

Und wo ist das Primary Key Feld? Ich sehe nur das Foreign Key Feld in der
Abfrage.

Gruss
Henry
Wazlav
2006-03-16 14:44:47 UTC
Permalink
Hallo Henry,

habe deinen Ratschlag berolgt(Entwurfsansicht), einen Fehler habe ich
gefunden, aber wenn ich ihn behebe funktioniert das Statement trotzdem
nicht.
Acces bildet das Insert in der Entwurfsansicht ab, wenn ich nach dem
INSERT INTO nur eine Tabelle eintrage: INSERT INTO T_Anfrage (...
Aber beim ausführen kommt dieFehlermeldung, dass er die Felder aus der
Tab. T_Person nicht kennt.
Die Primary Keys sind in beiden Tabellen (Auto Wert) = Zahlen die muss
ich beim Statement nicht mit angeben, Access 2000 erhöht die ja
automatisch.
Deinen Vorschlag mit dem Datum habe ich auch befolgt = ", #" &
Me.Datum.Value & "#," aber das war nicht der Fehler.
Danke für die Hilfe.

Beste Grüße

Wazlav
Henry Habermacher [MVP Access]
2006-03-17 03:23:28 UTC
Permalink
Hallo Wazlav
Post by Wazlav
habe deinen Ratschlag berolgt(Entwurfsansicht), einen Fehler habe ich
gefunden, aber wenn ich ihn behebe funktioniert das Statement trotzdem
nicht.
Acces bildet das Insert in der Entwurfsansicht ab, wenn ich nach dem
INSERT INTO nur eine Tabelle eintrage: INSERT INTO T_Anfrage (...
Aber beim ausführen kommt dieFehlermeldung, dass er die Felder aus der
Tab. T_Person nicht kennt.
Die Primary Keys sind in beiden Tabellen (Auto Wert) = Zahlen die muss
ich beim Statement nicht mit angeben, Access 2000 erhöht die ja
automatisch.
Deinen Vorschlag mit dem Datum habe ich auch befolgt = ", #" &
Me.Datum.Value & "#," aber das war nicht der Fehler.
Danke für die Hilfe.
Hab' mir das Statement nochmals angeschaut:
INSERT INTO T_Person, T_Anfrage(T_Person.PersName,
T_Person.PersVorname, T_Person.PersTel, T_Person.PersEmail,
T_Anfrage.Pers_ID, T_Anfrage.Datum, T_Anfrage.Beschr_kurz,
T_Anfrage.Beschr_lang, T_Anfrage.Kategorie_KZ, T_Anfrage.solved) SELECT
'Gizycki','Wazlav','27164566','***@goldmail.de',
T_Person.ID_Pers,'16.03.06','Versuch eines Insert Statements','Ein
INSERT über zwei Tabellen, die Datensätze sind über ein Feld
Verkmüpft.',1,1 FROM T_Person INNER JOIN T_Anfrage ON T_Person.ID_Pers
= T_Anfrage.Pers_ID;

Da fehlt doch noch der Zwoin zwischen T_Person und T_Abfrage.
Mach doch bitte zuerst mal eine Abfrage, welche die gewünschten Felder, die
Du einfügen willst, enthält, inkl. allen Joins, etc.
Danach füge noch alle PK und FK Felder hinzu, sowie alle, bei denen
irgendwelche Unique oder Not Null Restriktionen vorhanden sind. Wechsle nun
in die Datenblatt Ansicht und kontrolliere, ob Du nun unten eine leere Zeile
bekommen hast, wo Du neue Records eingeben kannst. Wenn ja, dann geht's. Du
musst nun nur noch dieses Select Statement in ein Insert Statement umändern.
Wenn Du das nicht hinkriegst, dann speichere die Abfrage ab und füge
anschliessend folgendermassen ein:

INSERT INTO EinfügbareAbfrage(....) SELECT (...)

Alles klar?
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Loading...